CX-Engine stores every phone call it receives from the PBX (through CRM Lookup or by fetching it from the PBX) before processing it and pushing it to the connected CRM. This endpoint lists those stored calls.
GET /api/crm/phone-callsreads the calls stored in CX-Engine.GET /api/crm/lookup/phone-callsreads the calls stored in the connected CRM (see CRM Lookup).
Headers: Authorization: Bearer {workspace-token}
#GET /api/crm/phone-calls
Returns a paginated list of the calls of the selected customer, most recent first.
Requires the client OAuth scope and the crm-phone-call.view permission. The customer is selected with the customer_account query parameter (see Selecting the customer account).
Query parameters
| Parameter | Description |
|---|---|
customer_account |
Required. Customer account code |
filter[direction] |
inbound, outbound or internal |
filter[status] |
completed, failed, busy or no-answer |
filter[answered] |
Whether the call was answered (1 or 0) |
filter[processing_status] |
pending, queued, in_progress, completed, skipped or failed |
filter[number_from] |
Caller number |
filter[number_to] |
Callee number |
filter[number_did] |
DID number |
filter[start_time] |
Call start time |
filter[end_time] |
Call end time |
filter[duration] |
Duration in seconds |
filter[subject] |
Call subject |
filter[body] |
Call notes |
filter[agent_first_name] |
Agent first name |
filter[agent_last_name] |
Agent last name |
filter[agent_email] |
Agent email address |
filter[pbx3cx_host_id] |
ID of the 3CX host the call comes from |
filter[pbx3cx_call_id] |
Call ID on the 3CX PBX |
include |
Comma-separated relations to load: segments, logs |
sort |
start_time, end_time, created_at or updated_at. Prefix with - for descending. Default: -start_time |
per_page |
Results per page (default: 20) |
page |
Page number |
Text filters match partial values (filter[agent_email]=acme.com matches every agent of that domain).
Response 200 — paginated response
{
"current_page": 1,
"data": [
{
"id": 1842,
"uuid": "9b1d6c1e-6f0a-4c7e-9a43-2f5d8a7b1c20",
"source": "3cx",
"ingested_via": "webhook",
"customer_id": 12,
"pbx3cx_host_id": 3,
"pbx3cx_call_id": "48211",
"processing_status": "completed",
"processing_step": "complete",
"number_from": "+33612345678",
"number_to": { "number": "201" },
"number_did": "+33142000000",
"direction": "inbound",
"status": "completed",
"answered": true,
"start_time": "2026-10-08T09:15:02.000000Z",
"end_time": "2026-10-08T09:19:40.000000Z",
"duration": {
"y": 0, "m": 0, "d": 0, "h": 0, "i": 0, "s": 278, "f": 0,
"invert": 0, "days": false, "from_string": false
},
"subject": "Support call",
"body": null,
"recording_url": null,
"agent_first_name": "Bob",
"agent_last_name": "Smith",
"agent_email": "bob@acme.com",
"queue_extension": "800",
"created_at": "2026-10-08T09:19:41.000000Z",
"updated_at": "2026-10-08T09:20:05.000000Z"
}
],
"first_page_url": "https://acme.cx-engine.app/api/crm/phone-calls?page=1",
"from": 1,
"last_page": 12,
"last_page_url": "https://acme.cx-engine.app/api/crm/phone-calls?page=12",
"links": [...],
"next_page_url": "https://acme.cx-engine.app/api/crm/phone-calls?page=2",
"path": "https://acme.cx-engine.app/api/crm/phone-calls",
"per_page": 20,
"prev_page_url": null,
"to": 20,
"total": 231
}
Field notes
| Field | Description |
|---|---|
source |
PBX the call comes from: 3cx or yeastar |
ingested_via |
How CX-Engine received the call: webhook (pushed through the API) or pbx_pull (fetched from the PBX) |
processing_status |
Progress of the processing pipeline (recordings, transcription, CRM push…) |
processing_step |
Current step of the pipeline, complete once done |
number_from, number_to, number_did |
External numbers are E.164 strings; internal extensions are objects such as { "number": "201" } |
duration |
Interval object; the duration in seconds is in s |
Response 403 — no customer selected, or not authorized