observability

List 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.
get/observability/v2/call-logs/

Request

  • Base URL
    https://api.cekura.ai
  • URL
    https://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

pageinteger

A page number within the paginated result set.

page_sizeinteger

Number of results to return per page.

timestamp_fromstring date-time

Filter results from this timestamp (e.g. 2025-01-01T00:00:00Z) Example: 2025-01-01T00:00:00Z

timestamp_tostring date-time

Filter results to this timestamp (e.g. 2025-01-31T23:59:59Z) Example: 2025-01-31T23:59:59Z

call_idsstring

Comma-separated list of call log IDs to filter by. Example: "5181749,5181752"

agent_idinteger

Filter by agent ID. Either agent_id or project_id should be provided. Example: 2142

project_idinteger

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

assistant_idstring

Filter by assistant ID Example:

  • "asst_1234567890"
  • "agent_xyz789"
filters_v2string

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

qlstring

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.

include_countboolean

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

countinteger

Only present when the request passes include_count=true. Capped at 10000: when count_capped is true, the true total exceeds 10000.

count_cappedboolean

Only present alongside count.

nextstring uri nullable
previousstring uri nullable

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