Voxbi Cockpit APIs
All endpoints

List call history (CDRs) (user, pbx)

Returns the paginated call history (call detail records) for the authenticated principal, newest first. Results are scoped server-side to the caller's PBX (and, for a user token, to the caller's own extension), so the company scope can never be supplied or overridden by the client.

With a PBX-owned API key the request spans the whole PBX by default. Pass extension_id or extension to narrow it to the calls made or received by a single user's extension. The value is validated against the authenticated PBX before use, and the pair is always re-derived server-side, so a mismatched extension / extension_id combination cannot widen the scope. With a user personal access token both parameters are ignored: the query is always locked to the caller's own extension.

Authentication accepts either a user personal access token or a PBX-owned API key. A PBX API key must carry the call-history ability/scope.

Rate-limited to 120 requests per minute per principal (user, PBX or IP); exceeding the limit returns 429 Too Many Requests.

HTTP: bearerAuth

User bearer token. Default authentication for customer-facing endpoints. Obtain a token by calling POST /login with your credentials, then send it on every subsequent request as Authorization: Bearer <token>. The token inherits the permissions and PBX scope of the authenticated user.

HTTP Authorization Scheme
bearer
Bearer format
Bearer <token>
extension_id query · integer · int64
Internal ID of the extension whose calls should be returned (the extension of the user who made or received the call). PBX API key only, and validated to belong to the authenticated PBX; a foreign extension returns `403`. Takes precedence over `extension` when both are supplied. Omit to span every extension of the PBX. Ignored for user tokens.
extension query · string
Extension number of the user whose calls should be returned, as an alternative to `extension_id`. PBX API key only, and validated to belong to the authenticated PBX; a foreign extension returns `403`. Omit to span every extension of the PBX. Ignored for user tokens.
extras query · boolean
When `true`, each record includes the detailed `extras` payload (AI transcription availability and call-timeline data). Defaults to `false` for a lighter, faster response.
call_type[] query · array
Filter by call type. Repeatable. One or more of the listed values.
start_time query · string
Start of the date/time window (inclusive), in `YYYY-MM-DD HH:MM:SS` format.
end_time query · string
End of the date/time window (inclusive), in `YYYY-MM-DD HH:MM:SS` format.
search query · string
Full-text search across the call records (names, numbers, and similar fields).
id query · integer · int64
When supplied, only records with a `cdr_id` greater than this value are returned. Use it to fetch only records newer than the last one you saw, for cheaper incremental polling.
page query · integer
Page number (1-based).
page_size query · integer
Number of records per page.
remote_extension_number query · string
Filter to calls involving this remote party number or extension.
accept header · string
example: application/json

Responses

Paginated call history.
Response schema
dataarray<object>
Each item — A single call-history row as returned by the call-history list endpoint. Each record summarises one call leg from the authenticated principal's perspective.
cdr_id*string
Unique identifier of the call detail record. Pass it to the detail and call-recording endpoints.
example: 24904193
pbx_user_idstring | null
Identifier of the PBX user the record belongs to.
example: 550e8400-e29b-41d4-a716-446655440010
pbx_profile_idstring | null
Profile identifier, when the call is attributed to a specific user profile.
customer_pidstring | null
External customer identifier, when known.
type*string
Direction of the call relative to the PBX.
enum: INCOMING OUTGOING
example: INCOMING
is_missed_call*boolean
Whether the call was missed (never answered).
example: 1
is_answered*boolean
Whether the call was answered.
example:
remote_person_idstring | null
Identifier of the remote party (the other side of the call), when resolvable.
example: 550e8400-e29b-41d4-a716-446655440020
remote_person_namestring | null
Display name of the remote party.
example: Customer Support
remote_person_numberstring | null
Phone number or extension of the remote party.
example: +12125550100
via_idstring | null
Identifier of the entity the call was routed via (call flow, queue, or number).
example: 550e8400-e29b-41d4-a716-446655440030
via_namestring | null
Display name of the routing entity.
example: Main Line
via_numberstring | null
Number of the routing entity.
example: +12125550111
date*string · date
Calendar date the call started, in `YYYY-MM-DD`.
example: 2026-01-12
start_time*string
When the call started, in `YYYY-MM-DD HH:MM:SS`.
example: 2026-01-12 15:50:19
answer_timestring | null
When the call was answered, or null if it was never answered.
end_time*string
When the call ended, in `YYYY-MM-DD HH:MM:SS`.
example: 2026-01-12 15:50:25
duration*integer · int32
Total call duration in seconds (from start to end).
example: 6
billsec*integer · int32
Billable seconds (time the call was actually connected).
example: 0
is_transfer_call*boolean
Whether the call involved a transfer.
example:
is_conference_call*boolean
Whether the call was a conference.
example:
is_recorded*boolean
Whether a recording exists for this call.
example:
notes_count*integer · int32
Number of notes attached to this call.
example: 0
transcriptions_available*boolean
Whether an AI transcription is available for this call.
example:
extras*array<object>
Detailed extras (AI transcription and call-timeline data). Populated only when the request sets `extras=true`; otherwise an empty array.
[]object
Free-form object
paginationobject
Pagination metadata for the call-history list response.
current_pageinteger · int32
The current page number.
example: 1
first_page_urlstring | null
URL of the first page.
example: https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=1
prev_page_urlstring | null
URL of the previous page, or null on the first page.
next_page_urlstring | null
URL of the next page, or null on the last page.
example: https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=2
last_page_urlstring | null
URL of the last page.
example: https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=103
last_pageinteger · int32
The number of the last page.
example: 103
per_pageinteger · int32
Number of records per page.
example: 5
totalinteger · int32
Total number of records across all pages.
example: 515
pathstring | null
Base path of the paginated resource.
example: https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs
cache_hitboolean
Whether this response was served from the short-lived proxy cache.
example:
statusboolean
Whether the upstream request succeeded.
example: 1
messagestring
example: CDRs retrieved successfully.
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
Either the presented PBX API key does not carry the required `call-history` ability/scope, or the requested `extension_id` / `extension` does not belong to the authenticated PBX. A user token whose account has no extension assigned is rejected here as well.
Response schema
No response body.
Too many requests. The endpoint is rate-limited to 120 requests per minute per principal. Retry after the window indicated by the `Retry-After` response header.
Response schema
No response body.
get https://cockpit.voxbi.com/api/v1/cdrs
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/cdrs' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/cdrs', {
  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/cdrs',
    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/cdrs', false, $context);
$data = json_decode($response, true);
print_r($data);
{}
"data": [],
{},
"cdr_id": "24904193",
"pbx_user_id": "550e8400-e29b-41d4-a716-446655440010",
"pbx_profile_id": null,
"customer_pid": null,
"type": "INCOMING",
"is_missed_call": true,
"is_answered": false,
"remote_person_id": "550e8400-e29b-41d4-a716-446655440020",
"remote_person_name": "Customer Support",
"remote_person_number": "+12125550100",
"via_id": "550e8400-e29b-41d4-a716-446655440030",
"via_name": "Main Line",
"via_number": "+12125550111",
"date": "2026-01-12",
"start_time": "2026-01-12 15:50:19",
"answer_time": null,
"end_time": "2026-01-12 15:50:25",
"duration": 6,
"billsec": 0,
"is_transfer_call": false,
"is_conference_call": false,
"is_recorded": false,
"notes_count": 0,
"transcriptions_available": false,
"extras": []
},
{}
"cdr_id": "24890011",
"pbx_user_id": "550e8400-e29b-41d4-a716-446655440010",
"pbx_profile_id": null,
"customer_pid": null,
"type": "OUTGOING",
"is_missed_call": false,
"is_answered": true,
"remote_person_id": "550e8400-e29b-41d4-a716-446655440021",
"remote_person_name": "Sales Team",
"remote_person_number": "+12125550101",
"via_id": "550e8400-e29b-41d4-a716-446655440030",
"via_name": "Main Line",
"via_number": "+12125550111",
"date": "2026-01-05",
"start_time": "2026-01-05 15:33:09",
"answer_time": "2026-01-05 15:33:14",
"end_time": "2026-01-05 15:38:02",
"duration": 293,
"billsec": 293,
"is_transfer_call": false,
"is_conference_call": false,
"is_recorded": true,
"notes_count": 0,
"transcriptions_available": true,
"extras": []
}
],
"pagination": {},
"current_page": 1,
"first_page_url": "https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=1",
"prev_page_url": null,
"next_page_url": "https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=2",
"last_page_url": "https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs?page=103",
"last_page": 103,
"per_page": 5,
"total": 515,
"path": "https://cockpit.voxbi.com/api/v1/cdrs-utility/cdrs"
},
"cache_hit": false,
"status": true,
"message": "CDRs retrieved successfully."
}
{}
"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
No example for this status.
No example for this status.