call_sid. Where
webhooks give you the live stream of
lifecycle events as they
happen, a trace is the assembled view: those same events folded into a
readable timeline you pull up when a call went wrong, a customer disputes what
happened, or you’re auditing an AI→human handoff.
This page is how to read that timeline — its segment model, how a transfer
reshapes it — and how to pull it two ways: in the console call detail and
over the control-plane API.
How a trace is assembled
Every transition a call makes on the wire is emitted as a lifecycle event —initiated at the INVITE, delivered when the far end is alerting,
established on answer, held / retrieved on hold and resume, transferred
on a REFER, and cleared on the final BYE (carrying the Q.850 cause and the
billable duration). You don’t assemble anything yourself: the events pipeline
collects those transitions for a call_sid and folds them into segment
rows, computing the per-stage durations (ring, queue, talk, hold, wrap-up) as it
goes. A trace is that ordered set of segments plus the roll-up totals.
The trace is derived from the signalling timeline — when the call rang, was
answered, held, transferred, cleared. For the media side of the same call —
MOS, jitter, packet loss — see
MOS, jitter & loss; for
where the latency went inside a turn, see
latency breakdown.
Segments: one sid, one or many stretches
A simple call — one caller, one handler, start to finish — is a single segment. The interesting case is a call that changed hands. A transfer or handoff opens a new segment. Thecall_sid never changes (it’s one call, one
CDR, one recording context), but the timeline splits at each hand-off so you can
see exactly who owned which stretch and for how long.
The canonical example is a warm AI→human handoff:
What opens a new segment. A change of handler — a
transferred (REFER)
transfer, or a warm AI→human handoff.
Holds, resumes (held / retrieved), and mid-call media renegotiation
(reinvited) do not open a new segment — they’re recorded within the
current segment as hold time and flags. A handler is tagged llm (an AI
agent owned the stretch) or human, so you can split talk time by who was
actually on the line.What each segment tells you
| Field on a segment | What it means |
|---|---|
handlerKind / handlerDisplayName | Who owned this stretch — an AI agent (llm) or a named human (human). |
ringTimeSec | Time the leg spent alerting before it was answered. |
queueTimeSec | Time waiting in an ACD skill queue before a handler picked up (human segments). |
talkTimeSec | Two-way audio time — the part of the call that was actually a conversation. |
holdTimeSec | Time this segment spent on hold (summed across every hold). |
acwTimeSec | After-call work / wrap-up time a human agent spent after the caller left. |
durationSec | Wall-clock length of the segment. |
transferred / held / conference | Flags: did this stretch end in a transfer, get held, or fan out to a supervisor. |
disposition / hangupReason | The wrap-up code applied and the Q.850 clearing cause. |
recordingUrl | Link to the segment’s recording, when recording is enabled. |
Pull a trace in the console
The console call detail is the fastest way to read one call.Open the calls report
In the voice console at agent.telequick.dev, go to Reports → All
Calls. Filter to the window and the number, agent, or direction you’re
chasing.
Open the call
Click the call to open Call Detail. The header shows the
call_sid,
direction, caller/callee, and the roll-up totals (total talk, hold, and
duration; whether it was transferred).Read the segment timeline
The body renders the segments oldest-first, top to bottom. Each row names
its handler (AI or human), its stage timings, and its disposition. A
multi-segment call shows the transfer hop inline — AI segment, then the
human segment it handed to.
In-flight calls. A call that’s still on the wire hasn’t been folded into
segments yet. Call detail still renders a live view for it — direction,
tenant, the bound agent, and when it started — so an active call isn’t a blank
page. The full segment timeline appears once the call clears.
Pull a trace over the API
The same assembled trace is a control-plane read, keyed bycall_sid and
scoped to your workspace by your API key. Use it to feed a QA tool, a dispute
workflow, or your own reporting — anything that needs the structured timeline
rather than the raw event firehose.
This is a control-plane reporting read, distinct from
calls.get, which returns a
point-in-time Call snapshot (current status), not the historical
timeline. Fetch the trace from the control-plane API host with your API key; the
response is the same data the console renders.Response shape
The
call_sid this trace belongs to.The ordered segments, oldest first. Each carries
segment (index), startedAt
/ endedAt, handlerId / handlerKind (llm | human) /
handlerDisplayName, the stage timings (ringTimeSec, queueTimeSec,
talkTimeSec, holdTimeSec, acwTimeSec, durationSec), the flags
(transferred, held, conference), disposition, hangupReason, and
recordingUrl.Roll-up across all segments:
segments (count), talkTimeSec, holdTimeSec,
ringTimeSec, queueTimeSec, durationSec, and whether the call was
transferred or conferenced anywhere.Present only while the call is still on the wire — direction, bound agent, and
start time for an in-flight call whose segments haven’t been assembled yet.
null once the call has cleared and segments exist.When a trace looks wrong
| Symptom | Likely cause | What to check |
|---|---|---|
Trace is empty / live is null | The call_sid never landed, or belongs to another workspace | Confirm the sid from the calls list; a trace is tenant-scoped — a sid from another workspace returns not-found. |
| Call shows one segment but you expected a transfer | The transfer was a held/reinvited (same handler), not a handler change | Only a handler change (transferred / handoff) splits segments; holds stay in-segment. |
| Segments exist but timings are zero | The call is still assembling, or never reached two-way media | An in-flight call surfaces as live first; a call that failed before answer has no talk time. |
| Peer transfer acknowledged but the onward leg is missing | Executing an outbound leg from a peer-initiated REFER is only partially wired | Prefer operator-initiated transfers; the peer-REFER onward leg may not complete. |
| Recording link missing on a segment | Recording wasn’t enabled for that leg, or hasn’t finished uploading | Confirm recording is on for the trunk/agent; recordings land shortly after cleared. |
Related
Call lifecycle
The signalling state machine every event in a trace comes from.
Webhooks & events
The live event stream a trace is assembled from.
Handoffs
How a transfer or warm AI→human handoff opens a new segment.
MOS, jitter & loss
The media-quality side of the same call.
Dashboards
Fleet-wide views built from the same call data.
Calls API
Originate, get, transfer, and hang up — the live control plane.