Get Conversation

Retrieve a conversation by ID.

Authentication

AuthorizationBearer

Enter your API key with the Bearer prefix, e.g. ‘Bearer sk_…’.

Path parameters

idstringRequired

Response

The requested conversation.
idstring

Prefixed wire identifier (conv_<26 char Crockford base32>). URL paths accept only this prefixed form; legacy UUID path parameters are rejected with 404.

agent_idstring

Prefixed wire identifier (agent_<26 char Crockford base32>) for the agent that answers this conversation.

room_namestring

LiveKit room name. Equals the conversation id for web and sip_outbound transports; sip_inbound rooms use a sip_<e164>_<random> name assigned by the SIP dispatch rule.

statusenum
transportenum

How the caller reached the agent. web is the browser / SDK realtime path; the sip_* and phone variants come from the telephony stack.

created_atdatetime

When the conversation row was created (the call was initiated). Always present, including for conversations that never started — unlike started_at — so it is the timestamp to display and sort pending calls by.

metadatamap from strings to any
message_countinteger

Populated only on the list endpoint via a correlated subquery. Zero on single-row reads where the join cost isn’t paid.

room_sidstring
started_atdatetime or null

Set when the first user participant joins the realtime voice session. Null between CreateConversation and the participant-joined event, and stays null if no user ever joins.

ended_atdatetime or null
duration_msinteger or null
cost_centsinteger or null
recording_urlstring or null
recording_started_atdatetime or null

When the recording file actually began capturing audio (LiveKit egress file started_at). Anchor transcript message offsets on this — not started_at — when seeking the recording: the file’s first frame trails the participant join by the egress recorder’s spin-up (~1-2s). Null when there is no recording or the row pre-dates the field.

end_reasonenum

Coarse termination category. Worker-stamped reasons arrive before terminate_call fires; caller_hangup has two emit sites (worker-observed SIP disconnect, plus a server-side post-call catch-all). The dial_* reasons are server-stamped on a failed conversation for an outbound call that never connected (no worker session ran).

  • voicemail_message_left — AMD machine-vm + we spoke the configured drop-message.
  • voicemail_hangup — AMD machine-vm + we terminated silently (action=hangup or empty-message bypass).
  • ivr_hangup — AMD machine-ivr + action=hangup.
  • unavailable_hangup — AMD machine-unavailable (mailbox full / disconnected).
  • agent_ended — LLM-driven end_call builtin.
  • inactivity_timeout — worker’s inactivity handler fired terminate after the configured silence window.
  • loop_detected — worker’s runtime loop guard force-ended the call after N consecutive near-identical user turns (typically an IVR replaying its menu while the LLM kept reacting instead of calling end_call).
  • max_duration_reached - worker’s max-call-duration watchdog force-ended the call at the platform ceiling (a safety bound on runaway calls).
  • over_capacity — inbound call refused because the workspace was over its active-call concurrency cap; the busy message played and the call hung up. Stamped server-side and excluded from billing.
  • caller_hangup — caller’s leg went away. Precise when the worker observed the SIP participant_disconnected event (stamped immediately); otherwise stamped server-side ~10s after room_finished as a catch-all (web tab close, network blip, worker crash, etc.).
  • dial_no_answer — outbound dial: callee did not pick up (SIP 408/480/487, the ringing timeout expired).
  • dial_busy — outbound dial: the line was busy (SIP 486/600).
  • dial_rejected — outbound dial: the call was actively refused (SIP 401/403/407 carrier auth/permission, or 603/607/608 callee decline).
  • dial_failed — outbound dial: any other failure to connect (invalid number, carrier 5xx, malformed trunk address, TLS requirement, transport error). On a failed conversation with NULL duration_ms.
  • null — pre-rollout calls only (anything that landed after the rollout completes without a stamp gets caller_hangup from the post-call goroutine).
caller_identitystring

Stable caller key (LiveKit participant identity) persisted at session start so the post-call memory extractor can pivot memories by (agent_id, caller_identity). Empty string for anonymous widget sessions.

from_numberstring or null

E.164 of the phone number that placed the call. For sip_outbound this is the workspace number used as the caller ID; for sip_inbound it is the external caller’s number. Null for web conversations and for older outbound rows, where the dialing caller id was not recorded before this field existed.

to_numberstring or null

E.164 of the phone number that received the call. For sip_outbound this is the external callee; for sip_inbound it is the workspace number the caller dialed. Null for web conversations and for legacy inbound rows whose room name did not embed the dialed number.

agent_snapshotobject

Frozen snapshot of the agent’s configuration at create time. Populated only on detail responses; list responses intentionally skip the column to keep the row small.

dynamic_variablesmap from strings to any

Customer-facing dynamic variables this call ran with: the agent’s stored variable defaults overlaid with the per-session dynamic_variables overrides, resolved to their values. Reserved system__* keys are excluded — they are runtime-derived and not part of the audit snapshot. Omitted for SIP inbound calls (which take no per-session variables) and for any pre-rollout conversation. Populated only on detail responses; the list endpoint skips it, mirroring agent_snapshot.

ivr_menu_idstring or null

Audit pointer at the cached IVR menu the navigator consulted on this call. NULL when the navigator never engaged OR after the referenced menu was invalidated (FK is ON DELETE SET NULL).

ivr_path_takenlist of maps from strings to any or null

Ordered log of the navigator’s per-call presses: [{fingerprint, dtmf, label}, ...]. Empty array means “navigator engaged but pressed nothing” (distinct from NULL = “navigator never engaged”).

ivr_surrender_reasonenum

Canonical code the worker emits when the IVR navigator gave up. NULL when the navigator completed cleanly OR never started a plan.

  • no_goal - the goal extractor returned empty.
  • no_cached_menu - AMD-time cache miss for the root fingerprint.
  • below_threshold - cached menu loaded but confidence < threshold.
  • fingerprint_mismatch - in-call prompt diverged from the cached menu fingerprint.
  • goal_ambiguous - cached options matched the goal more than once or not at all.
  • child_cache_miss - sub-menu fingerprint had no cached row.
  • dtmf_send_failure - DTMF press could not be delivered.
  • matched_option_missing_dtmf - defensive shape guard.
  • disabled - per-agent toggle off OR operator kill switch on.
  • repeated_prompt_max_retries - bounded press-retry on the same fingerprint hit its cap of 1.

Errors

401
Unauthorized Error
404
Not Found Error