Home/Docs/Retell

Capture from Retell

Multichannel recording export is built in: capture pulls the call’s per-party recording by call id and scores it offline, preferring the PII-scrubbed file.

The recording you capture feeds a five-dimension conversation-test: separated caller and agent channels are what the Conversation (turn-taking) and Speech (timing) dimensions read, and the same file drops into hotato test run beside a transcript and trace for the Outcome and Policy checks.

StackAutomatic pullSeparate channelsContract-grade defaultNetwork use
VapiYes: capture fetches by call idYes, out of the boxYesOne call: fetch the recording
TwilioYes: capture fetches by recording SIDNo by default: must request RecordingChannels=dual at creationNo, opt-inOne call: fetch the recording
RetellYes: capture fetches by call idYes, once call recording is turned onOpt-in: enable recording firstOne call: fetch the recording
LiveKitNo: egress runs in your own infraYes, if egress records both tracksOpt-in: configure egress for two tracksNone from Hotato
PipecatNo: the setup recorder runs in your pipelineYes, the scaffold writes caller ch0 / agent ch1Yes, once the recorder is addedNone: local recorder, no network call

Automatic pull: does hotato capture fetch it for you. Separate channels: is caller/agent separation what you get. Contract-grade default: is that separation on without extra setup. Network use: what capture calls out to, not your infrastructure.

Enable call recording

  • Turn on call recording for your agent; Retell exposes per-party (multichannel) recordings on the call object after the call ends.
  • Grab the call id from the dashboard or the call webhook payload.

Score it: auto-pull

Set RETELL_API_KEY + call id: capture fetches the recording (only network call: that download), scores offline. --stack retell = fix knobs; --expect yield/hold = interruption vs. backchannel.

bash
export RETELL_API_KEY=...
uvx hotato capture --stack retell --call-id <call-id>

Under the hood: GET /v2/get-call/<call-id>, then scrubbed_recording_multi_channel_url (preferred) or recording_multi_channel_url, each party on its own channel.

The plain recording_url is a mono mix; Hotato rejects it unless you pass --allow-mono: indicative only; no contract-grade talk-over attribution.

scrubbed_recording_multi_channel_url (preferred) agent caller overlap two lanes: overlap is attributable, caller vs agent recording_url (mono mix) mixed ? one lane, same span: not attributable, rejected unless --allow-mono
Same call, two exports. The multi-channel file keeps caller and agent on separate channels, so an overlap has an owner. recording_url flattens both onto one mono track: the same overlap can’t be attributed. --allow-mono opts out of that gate.

Or score a WAV you already have

Downloaded the multichannel file? Point Hotato at it: caller on channel 0, agent on channel 1.

bash
uvx hotato run --stereo call.wav --stack retell --expect yield

Channels flipped? Pass --caller-channel 1 --agent-channel 0.

Pulling more than one call?

hotato connect retell --api-key <key> stores the key once, locally (0600); Retell has no list endpoint to check it against up front, so the check runs on the first pull instead. From there, Hotato pulls exactly the calls you name by --call-id: pull bulk-fetches those recordings, and sweep pulls, then ranks the worst turn-taking moments across them in one offline dashboard. Every stack’s pull support →

bash
uvx hotato pull --stack retell --call-id c1 --call-id c2
uvx hotato sweep --stack retell --call-id c1 --call-id c2
The dual-channel gate

Separated caller and agent audio is what makes overlap attributable; speech activity comes from exposed VAD thresholds, frame-inspectable. The scorer takes one two-channel WAV or two aligned mono WAVs.