Get Conversation
Authentication
Enter your API key with the Bearer prefix, e.g. ‘Bearer sk_…’.
Path parameters
Response
Prefixed wire identifier (conv_<26 char Crockford base32>).
URL paths accept only this
prefixed form; legacy UUID path parameters are rejected with
404.
Prefixed wire identifier (agent_<26 char Crockford base32>)
for the agent that answers this conversation.
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.
How the caller reached the agent. web is the browser /
SDK realtime path; the sip_* and phone variants come
from the telephony stack.
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.
Populated only on the list endpoint via a correlated subquery. Zero on single-row reads where the join cost isn’t paid.
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.
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.
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 SIPparticipant_disconnectedevent (stamped immediately); otherwise stamped server-side ~10s afterroom_finishedas 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 afailedconversation with NULLduration_ms.null— pre-rollout calls only (anything that landed after the rollout completes without a stamp getscaller_hangupfrom the post-call goroutine).
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.
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.
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.
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.
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.
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”).
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.