Get one call's full internal lifecycle event log

One bounded page of this call's call_events rows, oldest first, each with its raw event payload. This is the platform's own internal bookkeeping log, not a webhook replay: it includes types never delivered to any webhook endpoint at all (e.g. wallet.reserved, call.authorization, call.policy_evaluated, number.matched), and every row here is this row's own id/type/payload, never the signed webhook envelope. call.failed is written here too (payload shape varies by writer -- see CallEvent.payload), always thinner than the richer result body its webhook delivers separately. call.completed is the one terminal type NEVER written here at all -- it is derived from the call's final status and delivered only to webhooks; look at status on GET /v1/calls/{call_id} for that outcome instead. The response body is the plain array it has always been; the paging state is in headers. Do NOT read one page as the whole history: check X-Has-More, and continue with after=<the last row's page_cursor> until it is false. A long-running call with many agent tool invocations (each is its own call.agent_tool_call row) is exactly the case that needs more than one page.

get/v1/calls/{call_id}/events

Request

  • Base URL: https://api.skysay.ai
  • URL: https://api.skysay.ai/v1/calls/{call_id}/events
  • Auth: HTTP bearer

Path parameters

call_idstring required

Query parameters

limitinteger

Maximum events to return in this page.

afterstring

Continue after a row you already hold: pass its page_cursor. Treat the value as opaque. Unlike an offset it does not move when new events are written mid-walk.

Response

One page of call events, oldest first

call_idstring required
created_atstring date-time required
idstring required
organization_idstring required
page_cursorstring required

This row's position in the timeline. Pass the LAST row's value as after to continue from here. Opaque: its encoding is not part of the contract, and it is not the row's id.

payloadobject required

Event-specific detail; shape varies by writer, not just by type -- call.failed alone has at least four shapes: a policy block carries {reason, reasons}; local/queued-origination failure carries {reason} (the worker-queue originate failure adds worker_job_id and error); a reconciler repair carries {source, reason, previous_status, evidence, observed_at}; a gateway-lifecycle failure (SIP/room) carries an unrelated {gateway_event_id, gateway_id, source_component, source, observed_at, details}. Always thinner than the richer result body the call.failed webhook delivers separately.

typestring required

e.g. call.created, call.queued, call.dialing, call.answered, media.started, call.ended, call.failed, call.canceled, call.live_blocked, plus internal-only bookkeeping types such as wallet.reserved, wallet.settled, call.authorization, call.policy_evaluated, number.matched. call.completed is the one terminal type never written here -- it is only ever delivered to webhooks.

Changes

No recorded changes to this operation across all 1 revision of this API.