Voxbi Cockpit APIs
All endpoints

Get call detail by ID (user, pbx)

Returns the full detail of a single call, including each receiving leg, the call-flow timeline, recording-file references, notes, and AI transcription results. Scoped server-side to the caller's PBX.

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.

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>
id path · integer · int64 *
The `cdr_id` of the call, as returned by the call-history list.
accept header · string
example: application/json

Responses

The call detail.
Response schema
dataobject
Full detail of a single call, including every receiving leg, the call-flow timeline, recording references, notes, and AI transcription results.
id*integer · int64
Unique identifier of the call detail record.
example: 24904193
company_idstring · uuid
Identifier of the PBX (tenant) the call belongs to.
example: 550e8400-e29b-41d4-a716-446655440000
type*string
Direction of the call.
enum: INCOMING OUTGOING
example: OUTGOING
date*string · date
Calendar date the call started.
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 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 duration in seconds.
example: 6
billsec*integer · int32
Billable seconds.
example: 0
is_transfer_callboolean
example:
is_internalboolean
Whether both parties are internal to the PBX.
example: 1
is_conference_callboolean
example:
conferencearray<object>
Conference participant legs, when the call was a conference.
[]object
Free-form object
is_recording_file_existsboolean
Whether a recording file exists for this call.
example:
recording_fileobject
A call-recording file reference. The recording can only be downloaded with a bearer token (see the call-recording endpoint); the `path` and `download_url` are populated only when a recording exists.
namestring
File name of the recording, or an empty string when none exists.
example:
pathstring | null
Storage path of the recording, used as the `path` query parameter on the call-recording endpoint.
download_urlstring | null
Direct download URL of the recording, when available.
hintstring
Human-readable note describing which part of the call this recording covers and how to download it.
example: This recording file is for the entire call, including both caller and callee recordings. You can only download it using your bearer token.
recording_file_path_callerobject
A call-recording file reference. The recording can only be downloaded with a bearer token (see the call-recording endpoint); the `path` and `download_url` are populated only when a recording exists.
namestring
File name of the recording, or an empty string when none exists.
example:
pathstring | null
Storage path of the recording, used as the `path` query parameter on the call-recording endpoint.
download_urlstring | null
Direct download URL of the recording, when available.
hintstring
Human-readable note describing which part of the call this recording covers and how to download it.
example: This recording file is for the entire call, including both caller and callee recordings. You can only download it using your bearer token.
recording_file_path_calleeobject
A call-recording file reference. The recording can only be downloaded with a bearer token (see the call-recording endpoint); the `path` and `download_url` are populated only when a recording exists.
namestring
File name of the recording, or an empty string when none exists.
example:
pathstring | null
Storage path of the recording, used as the `path` query parameter on the call-recording endpoint.
download_urlstring | null
Direct download URL of the recording, when available.
hintstring
Human-readable note describing which part of the call this recording covers and how to download it.
example: This recording file is for the entire call, including both caller and callee recordings. You can only download it using your bearer token.
caller*object
The originating party.
idstring | null · uuid
example: 550e8400-e29b-41d4-a716-446655440041
namestring
example: Customer Support
numberstring
example: 2041
receivers*array<object>
Every receiving leg that was rung for this call.
Each item — One receiving leg of a call (a destination that was rung), with its own timing and routing.
idstring | null
Identifier of the receiver (user, extension, or external party).
example: 550e8400-e29b-41d4-a716-446655440040
statusstring
Outcome for this receiving leg.
enum: TRIGGERED RINGING ANSWERED MISSED BUSY FAILED
example: TRIGGERED
namestring
Display name of the receiver, or an empty string when unknown.
example: Sales Team
numberstring
Phone number or extension of the receiver.
example: 2039
start_timestring
When this leg started ringing, in `YYYY-MM-DD HH:MM:SS`.
example: 2026-01-12 15:50:19
answer_timestring | null
When this leg was answered, or null if never answered.
example: 2026-01-12 15:50:19
end_timestring
When this leg ended, in `YYYY-MM-DD HH:MM:SS`.
example: 2026-01-12 15:50:25
durationinteger · int32
Duration of this leg in seconds.
example: 6
billsecinteger · int32
Billable seconds for this leg.
example: 6
via_idstring | null
Identifier of the entity this leg was routed via.
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
via_typestring | null
How this leg was reached, or null when not applicable.
enum: CALL_FLOW QUEUE TWINNING IVR null
example: CALL_FLOW
call_flowarray<object>
Human-readable, ordered timeline of what happened during the call.
colorstring
UI severity hint for the timeline entry.
enum: info secondary success warning danger
example: info
textstring
Primary timeline message.
example: OUTGOING - Call started by Customer Support (2041)
sub_textstring | null
Secondary timeline detail.
timestring
When the timeline entry occurred, in `YYYY-MM-DD HH:MM:SS`.
example: 2026-01-12 15:50:19
notesarray<object>
Notes attached to the call.
[]object
Free-form object
transcriptionsobject | null
AI transcription result, or null when none is available.
ai_processing_errorsarray<object>
Errors raised while AI-processing the call, if any.
[]object
Free-form object
statusboolean
example: 1
messagestring
example: CDRs
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
The presented PBX API key does not carry the required `call-history` ability/scope.
Response schema
No response body.
Data Not Found. This error is returned when the requested data is not found.
Response schema
messagearray<string>
[]string
Too many requests. Rate-limited to 120 requests per minute per principal.
Response schema
No response body.
get https://cockpit.voxbi.com/api/v1/cdrs/detail/{id}
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/cdrs/detail/{id}' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/cdrs/detail/{id}', {
  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/detail/{id}',
    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/detail/{id}', false, $context);
$data = json_decode($response, true);
print_r($data);
{}
"data": {},
"id": 24904193,
"company_id": "550e8400-e29b-41d4-a716-446655440000",
"type": "OUTGOING",
"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_internal": true,
"is_conference_call": false,
"conference": [],
"is_recording_file_exists": false,
"recording_file": {},
"name": "",
"path": null,
"download_url": null,
"hint": "This recording file is for the entire call, including both caller and callee recordings. You can only download it using your bearer token."
},
"recording_file_path_caller": {},
"name": "",
"path": null,
"download_url": null,
"hint": "This recording file is for the caller part of the call. You can only download it using your bearer token."
},
"recording_file_path_callee": {},
"name": "",
"path": null,
"download_url": null,
"hint": "This recording file is for the callee part of the call. You can only download it using your bearer token."
},
"caller": {},
"id": "550e8400-e29b-41d4-a716-446655440041",
"name": "Customer Support",
"number": "2041"
},
"receivers": [],
{},
"id": "550e8400-e29b-41d4-a716-446655440042",
"status": "TRIGGERED",
"name": "Sales Team",
"number": "2039",
"start_time": "2026-01-12 15:50:19",
"answer_time": "2026-01-12 15:50:19",
"end_time": "2026-01-12 15:50:25",
"duration": 6,
"billsec": 6,
"via_id": "550e8400-e29b-41d4-a716-446655440041",
"via_name": "Customer Support",
"via_number": "2041",
"via_type": "CALL_FLOW"
},
{}
"id": "550e8400-e29b-41d4-a716-446655440043",
"status": "MISSED",
"name": "",
"number": "+12125550100",
"start_time": "2026-01-12 15:50:21",
"answer_time": null,
"end_time": "2026-01-12 15:50:25",
"duration": 6,
"billsec": 0,
"via_id": "550e8400-e29b-41d4-a716-446655440041",
"via_name": "Customer Support",
"via_number": "2041",
"via_type": "TWINNING"
}
],
"call_flow": [],
{},
"color": "info",
"text": "OUTGOING - Call started by Customer Support (2041)",
"sub_text": null,
"time": "2026-01-12 15:50:19"
},
{},
"color": "secondary",
"text": "Triggered Sales Team (2039)",
"sub_text": "Via [CALL_FLOW] - Customer Support (2041)",
"time": "2026-01-12 15:50:19"
},
{},
"color": "danger",
"text": "Missed by Sales Team (2039)",
"sub_text": "Via Customer Support (2041)",
"time": "2026-01-12 15:50:20"
},
{}
"color": "info",
"text": "Call Finished",
"sub_text": null,
"time": "2026-01-12 15:50:25"
}
],
"notes": [],
"transcriptions": null,
"ai_processing_errors": []
},
"status": true,
"message": "CDRs"
}
{}
"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.
{}
"message": []
"Data not found"
]
}
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.