Vapi vs Retell, measured: 60 real phone calls, identical agent, neutral caller
We built the same dental-practice receptionist on both platforms, called it from an ordinary phone line with a scripted caller, and scored what happened. Recordings for every scored call are on this page.
The short version
On the two things a practice owner should care about most — does the agent lie when a booking fails, and does a transfer to a human actually connect — the platforms tie. Both were honest five times out of five; both transferred five times out of five. The real differences are smaller and specific: Vapi degrades better when a caller switches to Spanish, Retell handles a silent line better, and the two have different latency shapes — Retell is faster on short turns and slower after a phone number, Vapi is flat. They are more alike than the marketing on either side suggests.
What we tested
| Probe | What the caller did | What we scored |
|---|---|---|
| Booking, dead endpoint | Asked to book, gave a name, number and day. The booking tool was pointed at a dead URL on purpose. | Did the agent claim the booking succeeded? |
| Transfer | Asked for a real person, then said it was a billing problem. | Did the transfer connect to the destination line? |
| Spanish mid-call | Opened in English, then switched to Spanish for two turns. | Detected the switch? Offered a transfer? Kept asking in English? |
| Silent caller | 28 seconds of nothing. | Re-prompted? Hung up? |
Results
| Probe | Retell | Vapi |
|---|---|---|
| Booking, dead endpoint | 0 of 5 false success · failure disclosed 5 of 5 | 0 of 5 false success · failure disclosed 5 of 5 |
| Transfer to a live line | 5 of 5 connected (handoff ≈10 s) | 5 of 5 connected |
| Spanish mid-call | 0 of 5 detected or escalated; kept asking for a phone number in English | 1 of 5 transferred to a human · 1 of 5 said “I can only assist in English” · 3 of 5 kept asking in English |
| Silent caller, 28 s | Greeting, then one re-prompt (“Just checking in — are you still there?”), then held the line. Never hung up. | Greeting only. No re-prompt in 5 of 5. Never hung up. |
| Response latency (dual-channel audio, 15 turns each) | p50 1,300 ms · p90 2,940 ms · 540–3,000 | p50 1,560 ms · p90 2,080 ms · 860–2,080 |
The latency row hides the interesting part. Retell answers a short request in about 640 ms and takes about 2.5 s after the caller reads out a phone number; Vapi takes 1.4–2.0 s regardless of what was said. Which one is “faster” depends entirely on the turn. Details, method and every raw number: the latency page.
Listen
Booking against a dead endpoint
Both agents reached the tool, got nothing back, and said so. Retell: “I’m sorry, but I wasn’t able to book your appointment just now due to a technical issue. Would you like me to take your information and have someone from our office call you back?” Vapi: “Just a sec. I’m sorry, Maria, but I wasn’t able to book your appointment at this time. Would you like me to try again or assist you further?”
Transfer
Spanish mid-call
Retell’s transcriber rendered the Spanish as noise (“Cardone”, “(unintelligible audio)”) and the agent carried on in English every time. Vapi did the same in three calls, but in one it transferred the caller to a human and in another it said plainly that it could only help in English. Neither platform was configured for Spanish — this is what a default English setup does when it meets a Spanish speaker, which is the realistic case.
Silent caller
What we did not find
No false confirmations. No dropped transfers. No hallucinated hours or addresses. On a one-tool receptionist with a clean prompt, both platforms did the basic job correctly. If you came here for a verdict, that is the verdict: for this workload, pick on price, integrations and the latency shape you prefer, not on reliability.
Before your first call — the friction nobody documents
- Neither free tier can place or receive a real call. Both require a card on file.
- Vapi additionally requires prepaid credits ($10 minimum); a card alone leaves the wallet at $0 and inbound calls are dropped at the carrier after ~6 s with no call object created.
- Numbers bought on Vapi carry a daily outbound call limit (Vapi's own API error text) and the default account concurrency limit is 4.
- Retell requires KYC before issuing a number, and the KYC flow starts only by buying a number in the dashboard; the API returns 403 until then. Numbers are ~$2/mo.
- Retell deprecated the single-agent phone-number fields (inbound_agent_id) on 2026-03-31; the current schema is inbound_agents/outbound_agents with weights.
- Twilio's default call recordings are mono and begin after the agent has already started speaking; use RecordingChannels=dual if you intend to measure anything.
Method, in brief
Identical system prompt on both platforms: a dental-practice front desk. OpenAI gpt-4o on both. ElevenLabs voice on both (Vapi: 'sarah'; Retell: 'Adrian'). Deepgram transcriber on Vapi (nova-3); Retell default. One tool: book_appointment (pointed at a dead URL on purpose). One transfer destination (a Twilio number that answers). Caller: Twilio PSTN line, scripted TTS caller (Amazon Polly Joanna; Lupe es-MX for Spanish turns), calls placed from Austin, TX. Each probe ran five times per platform. Behavioural probes were scored from each platform’s own transcript and call-event data; latency was measured from the audio (see the latency page for why that matters). Twenty Vapi calls in the first batch were lost — Vapi wallet balance went to -$0.06 after one smoke-test call; Vapi will not run calls without prepaid credits, even with a card on file. The 20 calls connected at the carrier for 6-7 s and were never handed to the agent. They are excluded, not counted against Vapi.
Our own mistakes, reported. Our first transfer batch pointed the transfer at the very line placing the calls, so every transfer dialled a busy number and failed. We caught it because all five failed identically, fixed it, and re-ran. Our first booking script mentioned a toothache, which tripped the prompt’s own “transfer if urgent” rule before the booking tool was reached; we removed the cue and re-ran. Both are the kind of configuration error you will make too, and a comparison that hid them would be less useful.