List call logs
Changed onList production call logs for an agent or project. Production-only — test/simulation runs triggered via run_scenarios_* do NOT create call logs; use results_list + runs_bulk_retrieve for simulation data instead.
Always pass agent_id or project_id to scope results — without one, the response may be very large. project_id is required when using an organization-level API key.
Time window: results default to the last 30 days when no timestamp range is given. A supplied range must not exceed 33 days (wider ranges return 400); pass timestamp_from/timestamp_to (ISO 8601) to select a window within that limit.
Filtering:
- timestamp_from / timestamp_to — ISO 8601 date range filter
- call_ids — comma-separated CallLog IDs (integer DB IDs of call logs in this list response), e.g. "123,456". Distinct from simulation run_ids and from each call log's own call_id field (which holds the provider's call identifier string).
- filters_v2 — structured JSON filter (same format as dashboard filters). Simple: {"field": "success", "op": "eq", "value": true}. Compound: {"operator": "and", "conditions": [{...}, {...}]}. Supported operators: eq, neq, gt, gte, lt, lte, contains, startswith, in, isnull.
Request
- Base URLhttps://api.cekura.ai
- URLhttps://api.cekura.ai/observability/v2/call-logs/
- Auth
- API key in header X-CEKURA-API-KEY
- or HTTP bearer
- or HTTP bearer
- or HTTP bearer
Query parameters
A page number within the paginated result set.
Number of results to return per page.
Filter results from this timestamp (e.g. 2025-01-01T00:00:00Z) Example: 2025-01-01T00:00:00Z
Filter results to this timestamp (e.g. 2025-01-31T23:59:59Z) Example: 2025-01-31T23:59:59Z
Comma-separated list of call log IDs to filter by. Example: "5181749,5181752"
Filter by agent ID. Either agent_id or project_id should be provided. Example: 2142
Filter by project ID. Either agent_id or project_id should be provided. Required when using an organization-level API key to scope results to a specific project. Example: 1376
Filter by assistant ID Example:
- "asst_1234567890"
- "agent_xyz789"
Advanced JSON filters using CallLogQueryFilter format (same as dashboard filters). Supports nested AND/OR conditions, field comparisons, and related field filtering.
Example - Simple filter: {"field": "success", "op": "eq", "value": true}
Example - AND conditions: {"operator": "and", "conditions": [{"field": "success", "op": "eq", "value": true}, {"field": "duration", "op": "gte", "value": 60}]}
Example - OR conditions: {"operator": "or", "conditions": [{"field": "call_ended_reason", "op": "eq", "value": "completed"}, {"field": "call_ended_reason", "op": "eq", "value": "hangup"}]}
Supported fields: success, duration, call_id, timestamp, created_at, call_ended_reason, customer_number, etc. Supported operators: eq, neq, gt, gte, lt, lte, contains, startswith, in, isnull
Select which fields each row carries by naming the ones you will read: {id,call_id,timestamp,success,call_ended_reason,metrics}.
MCP clients get one compact row shape whichever credential they connected with. transcript, transcript_object and evaluation (per-metric explanations) are left out of it unless ql names them; metrics already carries every metric's score. An exclusion ({-metadata}) or {*} starts from the whole row shape and so puts those three back — name the fields you want instead of the ones you don't. Per-call detail that is never on a list row — rubric, user-generated transcript, recording, waveform, dynamic variables — comes from the retrieve endpoint. Naming a field the row shape does not have returns 400.
When true, the response includes count — how many call logs match the filters — and count_capped. The count is capped at 10000; count_capped: true means the true total exceeds the cap.
Response
Example response
{
"count": 123,
"next": "https://api.cekura.ai/example/v1/example-external/?page=4",
"previous": "https://api.cekura.ai/example/v1/example-external/?page=3"
}Changes
- info
endpoint added
- info