List the calls in progress right now
Returns the calls that are up on your PBX at this instant — ringing, connected or
on hold. A call appears the moment the phone system starts it and disappears the
moment it ends; nothing is retained here. For calls that have already finished, and
for recordings, use the CDR endpoints under /cdrs-utility/ instead.
Authentication and scope
Send an Integrations API key carrying the Call history scope, or a user bearer
token. It is the same call-history scope the /cdrs-utility/ endpoints use — one
scope covers your PBX's calls both while they are up and after they end, so a key
that can already read CDRs needs no change to read this.
Tenancy
The PBX is resolved from your token. There is no path or query parameter to name one,
and any pbx_id you send is ignored — a key can only ever see its own PBX's calls.
Request
A plain GET. No path parameters, no query parameters and no request body; anything
you send is ignored. Poll it when you need fresh state — a few seconds apart is
normal, and the endpoint shares the standard customer API rate limit.
Response
A JSON array, one object per call in progress, ordered as the phone system
reports them. [] means nothing is up right now — that is a success, not an error,
so check the array's length rather than treating an empty body as a failure.
The call objects are passed through from the phone system exactly as it reports them, so treat them as an open shape: read the fields you need by name, ignore the ones you do not recognise, and expect new fields to appear without a new API version. Cockpit adds, removes and renames nothing.
Implementing against it
linkedididentifies a call for its whole life. Key your own state on it to tell a call you have already seen from a new one between two polls, and to join a live call to the CDR that appears under/cdrs-utility/once it ends.calleesis a list, not a single party: a ring group, a twinned mobile or a transfer all add legs to the same call.status,directionandcall_typeare open sets of strings. Match the values you handle and fall through on anything else rather than switching exhaustively.attended_transfer_infoanddata_source_infoare JSON documents inside strings — parse them a second time before reading their fields.eventtimeisYYYY-MM-DD HH:MM:SS.ffffffin server local time, with no timezone offset. Parse it with an explicit format; it is not RFC 3339.
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>
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
application/jsonResponses
1789711164.415472answeredoutgoinginternal2026-09-18 07:59:24.149687callerobject
calleesarray<object>
event_typesarray<string>
PJSIP/sd_9ff7b6e5-599c-428a-9332-cdc59cf0b5ba-0001c971all_channamesarray<string>
203.0.113.24/32ACCOUNTCODE_UUID{"is_attended_transfer": false}{"callee_id_source": "CALLEES_LOGIC", "caller_id_source_summary": "CALLER_INFO_LOGIC", "source_transfer_linkedid": null}Authorization Token is missinghttps://cockpit.voxbi.com/api/v1/calls/live
curl -X GET 'https://cockpit.voxbi.com/api/v1/calls/live' \
-H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/calls/live', {
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/calls/live',
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/calls/live', false, $context);
$data = json_decode($response, true);
print_r($data);
cockpit.voxbi.comMon, 16 Oct 2023 14:08:48 GMTcloseno-cache, privateapplication/json6059Origin{ … }
private, must-revalidatekeep-aliveapplication/jsonOrigin6057{ … }
application/json{ … }
{ … }
application/json{ … }
application/json