Navigation
CX-Engine API · 3 min read

Call History

List the phone calls CX-Engine has received for a customer account, with filters, sorting and pagination.

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-calls reads the calls stored in CX-Engine. GET /api/crm/lookup/phone-calls reads 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