Score your Vapi calls.

Vapi already records the caller and the assistant on separate channels. Hand capture a call id and your API key: it pulls that stereo recording and scores the turn-taking timing offline.

How capture works

Auto-pull, by call id.

GET https://api.vapi.ai/call/<id> returns artifact.recording.stereoUrl — a two-channel WAV, customer on channel 0, assistant on channel 1. Hotato downloads it and scores it locally.

The only network call is that one download from Vapi to your machine. Everything after it is offline. Older payloads fall back to the deprecated artifact.stereoRecordingUrl automatically.

capture pipelineoffline scoring
  • connect0600 key
  • capture--call-id
  • stereoUrl2 channels
  • scoreno egress
  • scorecard5 dimensions

One download in, one per-dimension scorecard out. Caller ch0, assistant ch1 — separated all the way to the WAV, so every overlap has an owner.

bashyour credentials
Connect once
$ hotato connect vapi
Score one call
$ hotato capture --stack vapi --call-id <id>
Sweep a window into one dashboard
$ hotato sweep --stack vapi --since 7d

No key yet? hotato capture --stack vapi --demo runs the whole loop on a bundled call. Already downloaded a WAV? hotato run --stereo call.wav --stack vapi --expect yield.

Run it

Three commands, then a dashboard.

connect stores the key. capture scores one call. sweep pulls a whole window through GET /call and ranks the worst turn-taking moments across all of them in one HTML dashboard.

--expect yield treats a caller who starts talking as an interruption the agent should yield to; --expect hold treats it as a backchannel to talk through.

Drive a live call

Place the test call, then score it — behind two gates.

Drive-a-call originates a live call from a staging clone of your assistant, waits for it to end, and feeds the recording into the same capture → score path.

  • credentials required
  • HOTATO_DRIVE_OPT_IN=1
  • bills a live call
Vapi · what Hotato does
CapabilityVapiBasis
Capture a recorded callYesAuto-pull stereoUrl with your API key, by call id
Drive a live callGatedCreds and HOTATO_DRIVE_OPT_IN=1; originates from a staging clone

Why two gatesEvery driven run costs a billed phone call, so Hotato refuses to dial unless both your credentials and the explicit opt-in are present. It issues only POST (create) and GET (poll, pull) — it can place a call but can never mutate a Vapi assistant or number. The origin records the caller side plainly and never claims a human placed the call.

Credentials & scope

Your key stays yours.

Local, 0600hotato connect vapi stores VAPI_API_KEY once at file mode 0600 in ~/.hotato/connections.json. It is sent only to Vapi's own API on a capture — never to Hotato.

ScopeHotato reads turn-taking timingdid_yield, seconds_to_yield, talk_over_sec — from speech energy. No speaker identification, diarization scoring, transcription grading, emotion or intent. Energy is not intent.