Deployment
Each deployment generates a unique ID. View logs in the console.
Call Logs
You can click into a call and view any logging statements generated by your reasoning code.Transcripts
Each call has a transcript with independently separated transcribed audio and text to be generated. When you export these transcripts with the API or CLI, these include more granular turn level timestamps.
Loggable Events
Record events without tying them to tool calls.SDK
In the SDK, yieldLogMessage events from your agent or tools to record custom events:
Websocket
If you’re not using the SDK and instead just relying on the bare websocket, logging events will look like this:Playground
You can view these events in the Playground under theTranscript tab of the call.
Loggable Metrics
Record metrics at any point in your workflow.SDK
In the context of the SDK, we can log a metric by broadcasting theLogMetric event.
Here’s a snippet from the form filling template that exhibits this:
LogMetric event by default, and it will
log it over the websocket by default when it sees that LogMetric has been broadcast.
Websocket
If you’re not using the SDK and instead just relying on the bare websocket, logging metrics will look like this:Playground
You can view these events in the Playground under theTranscript tab of the call.

Call Recordings
Call recordings can be downloaded from the playground.
Webhooks
Cartesia sends webhook events to your HTTPS endpoint throughout the call lifecycle. ExposePOST + application/json and verify the x-webhook-secret header matches your stored secret.

Verify the webhook secret
- Python
- TypeScript
Event types
| Event | When | Typed field |
|---|---|---|
call_started | Call session begins | call |
call_completed | Call ends normally | call |
call_failed | Call ends with error | call |
call_turn | Each conversational turn | turn |
post_call_analysis | After async analysis completes | analysis |
Envelope fields
Every webhook event includes these top-level fields:| Field | Description |
|---|---|
type | Event type (see table above). |
call_id | Call identifier. |
agent_id | Agent that handled the call. |
webhook_id | Webhook config id. |
timestamp | RFC 3339 event time. |
call
Present on call_started, call_completed, and call_failed events. Matches the GET /agents/calls/{call_id} response. Some events (e.g. call_started) may omit fields like end_time that do not yet have a valid value.
| Field | Description |
|---|---|
id | Call identifier. |
agent_id / agent_name | Agent details. |
status | started, completed, or failed. |
start_time / end_time | RFC 3339 timestamps. |
end_reason | Why the call ended (e.g. client_hangup, agent_hangup, inactivity). See EndReason for all values. |
transcript | Array of turns (see turn below). |
telephony_params | from, to, direction, call_sid, connection_type. |
telephony_account_type | cartesia, twilio, or sip_trunk. |
deployment_id / deployment_version_id | Deployment that served the call (when applicable). |
deployment_region | US, EU, or APAC. |
error_message | Error detail (failed calls only). |
metadata | User-supplied metadata passed at call start. |
summary | Call summary (if available at event time). |
turn
Present on call_turn events. One turn per agent or user utterance.
| Field | Description |
|---|---|
role | assistant or user. |
text | Turn text. |
start_timestamp / end_timestamp | Seconds from call start. |
stt_ttfb | User speech-to-text time-to-first-byte (seconds), when present. |
tts_ttfb | Agent TTS time-to-first-byte (seconds), when present. |
tool_calls | Tool calls made during this turn, when present. |
analysis
Present on post_call_analysis events. Sent after async analysis completes (currently summary generation; evaluations and metrics will be added here in the future).
| Field | Description |
|---|---|
summary | 1-2 sentence call summary. |
Example: call_completed
Example: post_call_analysis
Test your endpoint
For backwards compatibility:
call_completedandcall_failedevents also include a top-levelbody(transcript array) and a top-levelend_reason. Usecall.transcriptandcall.end_reasoninstead.call_turnevents also include a top-levelbodycontaining the raw turn payload. Useturninstead.