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.
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.
- 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.
$ hotato connect vapi$ hotato capture --stack vapi --call-id <id>$ hotato sweep --stack vapi --since 7dNo 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.
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.
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
| Capability | Vapi | Basis |
|---|---|---|
| Capture a recorded call | Yes | Auto-pull stereoUrl with your API key, by call id |
| Drive a live call | Gated | Creds 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.
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 timing — did_yield, seconds_to_yield, talk_over_sec — from speech energy. No speaker identification, diarization scoring, transcription grading, emotion or intent. Energy is not intent.