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/jsonResponses
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:
24904193company_idstring · uuid
Identifier of the PBX (tenant) the call belongs to.
example:
550e8400-e29b-41d4-a716-446655440000type*string
Direction of the call.
enum:
INCOMING OUTGOINGexample:
OUTGOINGdate*string · date
Calendar date the call started.
example:
2026-01-12start_time*string
When the call started, in `YYYY-MM-DD HH:MM:SS`.
example:
2026-01-12 15:50:19answer_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:25duration*integer · int32
Total duration in seconds.
example:
6billsec*integer · int32
Billable seconds.
example:
0is_transfer_callboolean
example:
is_internalboolean
Whether both parties are internal to the PBX.
example:
1is_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-446655440041namestring
example:
Customer Supportnumberstring
example:
2041receivers*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-446655440040statusstring
Outcome for this receiving leg.
enum:
TRIGGERED RINGING ANSWERED MISSED BUSY FAILEDexample:
TRIGGEREDnamestring
Display name of the receiver, or an empty string when unknown.
example:
Sales Teamnumberstring
Phone number or extension of the receiver.
example:
2039start_timestring
When this leg started ringing, in `YYYY-MM-DD HH:MM:SS`.
example:
2026-01-12 15:50:19answer_timestring | null
When this leg was answered, or null if never answered.
example:
2026-01-12 15:50:19end_timestring
When this leg ended, in `YYYY-MM-DD HH:MM:SS`.
example:
2026-01-12 15:50:25durationinteger · int32
Duration of this leg in seconds.
example:
6billsecinteger · int32
Billable seconds for this leg.
example:
6via_idstring | null
Identifier of the entity this leg was routed via.
example:
550e8400-e29b-41d4-a716-446655440030via_namestring | null
Display name of the routing entity.
example:
Main Linevia_numberstring | null
Number of the routing entity.
example:
+12125550111via_typestring | null
How this leg was reached, or null when not applicable.
enum:
CALL_FLOW QUEUE TWINNING IVR nullexample:
CALL_FLOWcall_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 dangerexample:
infotextstring
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:19notesarray<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:
1messagestring
example:
CDRsAuthorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example:
Authorization Token is missingThe 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:
57No 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:
57No example for this status.