Skip to content

List the Odoo-activated users (pbx)

Returns the roster the Voxbi Installer module provisions into Odoo: every user of the authenticated PBX who is activated for Odoo (an operator switch on the user's own edit page or the integration's "Activate Odoo for users" screen), still enabled, and still holding an extension.

Each row's email is the EFFECTIVE address: the operator's override when one was set, otherwise the user's own Cockpit email. The real address is always available as cockpit_email, kept for support and debugging even when an override is in effect.

The PBX is resolved from the authenticated API key, exactly like the other four odoo-installer endpoints, so no PBX id is ever part of the request.

Returns an empty array, not an error, when the PBX has no Odoo integration or its integration is not both active and connected (job_status = success).

Requires an API key carrying the odoo-installer ability.

HTTP: IntegrationApiKey

API key created on the Cockpit Integrations page (an "API key" integration). It is a bearer token owned by the customer's PBX and limited to the scopes selected when the key was created (e.g. phone-numbers, push-configuration).

Send it in the Authorization header:

Authorization: Bearer <api_key>

Manage keys (create / reveal / revoke) from Integrations → New integration → API key.

HTTP Authorization Scheme
bearer
accept header · string
example: application/json

Responses

OK. An empty array when no user is currently activated for Odoo.
Response schema
idstring · uuid
first_namestring
last_namestring | null
statusstring
Always `enabled` in practice; a disabled user is excluded from this list entirely.
enum: enabled disabled
extension_numberstring
emailstring · email
The effective address; the operator's override when one is set, otherwise `cockpit_email`.
cockpit_emailstring · email
The user's real Cockpit email, always present regardless of any override.
voip_configurationsobject
SIP connection details for this employee. Present ONLY when the PBX's "Sync Sip Connection configurations to odoo for all users?" setting is enabled (it is off by default). When that setting is off the key is omitted entirely rather than sent as null, so a client cannot mistake it for an empty credential. Per-user activation controls which employees appear in this list; this setting controls whether their SIP credentials travel with them.
sip_usernamestring
sip_passwordstring
The SIP authentication secret — a SHA-256 derivation of the user's WebRTC password; the raw password is never sent. This value authenticates against the PBX, so treat it as a live credential: store it encrypted and never log it.
pbx_serverstring
voip_websocketstring · uri
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
Authenticated, but the API key does not carry the `odoo-installer` ability. Thrown by Sanctum's ability check before the controller runs.
Response schema
messagestring
The PBX behind the authenticated API key no longer exists.
Response schema
messagestring
Rate limited: 30 requests per minute, keyed by PBX rather than by IP, so every installation shares one budget regardless of which machine polls it.
Response schema
messagestring
Server error. An unexpected condition was encountered on the server and the request could not be completed. The body is a generic JSON envelope with a `message` field. The response is logged on the server side; quote the request URL + timestamp when reporting an issue.
Response schema
messagestring
exceptionstring
Only present in non-production environments.
filestring
Only present in non-production environments.
lineinteger
Only present in non-production environments.
get https://cockpit.voxbi.com/api/v1/odoo-installer/users
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/odoo-installer/users' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/odoo-installer/users', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${YOUR_TOKEN}`,
  },
});

const data = await response.json();
console.log(data);
import requests

response = requests.get('https://cockpit.voxbi.com/api/v1/odoo-installer/users',
    headers={'Authorization': f'Bearer {YOUR_TOKEN}'}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
    'http' => [
        'method'  => 'GET',
        'header'  => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
    ],
]);

$response = file_get_contents('https://cockpit.voxbi.com/api/v1/odoo-installer/users', false, $context);
$data = json_decode($response, true);
print_r($data);
[]
{},
"id": "550e8400-e29b-41d4-a716-446655440010",
"first_name": "Jane",
"last_name": "Smith",
"status": "enabled",
"extension_number": "2039",
"email": "jane.odoo@example.com",
"cockpit_email": "jane.smith@example.com",
"voip_configurations": {}
"sip_username": "webrtc_550e8400-e29b-41d4-a716-446655440010",
"sip_password": "b5e2caab6d7cae6d37c7edb8dc270678f5d6f0e601ea09eac8687f544bc7e4ca",
"pbx_server": "203.0.113.10",
"voip_websocket": "wss://example-instance.voxbi.cloud:8089/pbx/ws"
}
},
{},
"id": "550e8400-e29b-41d4-a716-446655440011",
"first_name": "John",
"last_name": "Doe",
"status": "enabled",
"extension_number": "2040",
"email": "john.doe@example.com",
"cockpit_email": "john.doe@example.com",
"voip_configurations": {}
"sip_username": "webrtc_550e8400-e29b-41d4-a716-446655440011",
"sip_password": "6dc6a04104d3711637783908721c79a1d1826b974dd23797070ce839ed9a83b0",
"pbx_server": "203.0.113.10",
"voip_websocket": "wss://example-instance.voxbi.cloud:8089/pbx/ws"
}
},
{}
"id": "550e8400-e29b-41d4-a716-446655440012",
"first_name": "Mia",
"last_name": "Fischer",
"status": "enabled",
"extension_number": "2041",
"email": "mia.odoo@example.com",
"cockpit_email": "mia.fischer@example.com"
}
]
{}
"error": "Authorization Token is missing"
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57
{}
"message": "Invalid ability provided."
}
{}
"message": "No query results for model [App\Models\Pbx]."
}
{}
"message": "Too Many Attempts."
}
Retry-After integer
Seconds until the bucket refills.
example: 12
{}
"message": "Server Error"
}