Comparison of Vapi, Retell, Bland, ElevenLabs Agents, Telnyx, LiveKit Agents and Pipecat — by what they let you control, not by feature lists. The short version: for a receptionist that takes phone numbers, most of them are structurally incapable of the one thing that matters most.

The Hard Gate: Custom VAD / Turn Detection

NO managed platform lets you upload or host your own VAD or turn-detection model

Not Vapi. Not Retell. Not Bland. Not ElevenLabs. Not Telnyx.

Only LiveKit Agents, Pipecat, or your own pipeline qualify.

Since turn detection is where the perceived-latency battle is fought (voice-agent-latency-budget-2026-07-21), and since even Sierra replaced their S2S model’s built-in turn detection with a custom-tuned VAD, this alone eliminates the managed tier for a serious build.

The onNumberSeconds Gap

Separate endpointing hold time for digit strings exists on only TWO platforms

onNumberSeconds — a distinct, longer silence threshold applied when the caller is speaking a digit string — exists only on Vapi and Telnyx.

Retell, Bland and ElevenLabs cannot do it.

For a receptionist this is the single highest-value knob on the board. Callers pause naturally mid-number:

“It’s oh-seven-nine … [pause] … four-double-two …”

Without a digit-aware hold time, the agent commits the turn during that pause and cuts the caller off mid-number. Then it either acts on a truncated phone number or asks them to repeat it, both of which are exactly the interaction failures that make an AI receptionist feel unusable.

This is not a nice-to-have. It’s the difference between “can take a phone number” and “cannot take a phone number.”

Owning the pipeline makes this trivially solvable

With Deepgram Flux, eot_threshold and eot_timeout_ms can be swapped per conversational state — raise the hold time the moment the agent asks for a number, drop it back afterwards. Managed platforms expose one global setting (or a single opaque dial); a custom pipeline exposes it per turn.

Control Surface, Platform by Platform

PlatformTurn-taking surfaceVerdict
VapionNumberSeconds + waitFunction — a user-supplied math expression mapping end-of-utterance probability → wait ms, default "200 + 8000 * x". The most powerful knob on any managed platform.Best managed surface; still no custom VAD
TelnyxonNumberSecondsHas the key knob
RetellOpaque 0–1 dials only: responsiveness, interruption_sensitivity. No millisecond visibility.See below
BlandThe entire turn-taking surface is three fieldsStructurally inadequate
ElevenLabs AgentsA 3-value enum plus a timeoutStructurally inadequate
LiveKit AgentsFull — custom VAD supportedQualifies, but see bugs below
PipecatFull — custom VAD supportedQualifies, but see cold start below

Vapi's waitFunction is genuinely good design

"200 + 8000 * x" where x is end-of-utterance probability: at high confidence you commit in 200ms; at low confidence you wait up to 8.2s. That’s the right shape for the problem and it’s user-editable. If a managed platform were viable at all, Vapi’s turn-taking surface would be the reason.

Retell's opaque dials explain its most-cited criticism

Exposing responsiveness as a 0–1 float with no millisecond visibility means you cannot reason about, measure, or debug your own latency. That is the same root cause as Retell’s most-cited criticism: weak observability. You can’t observe what the API refuses to name in real units.

Reliability Findings

Vapi — platform instability

~19+ hours of call-affecting degradation in a 10-week window

Per Vapi’s own status page, including a 4h07m critical outage from database connection exhaustion (2026-05-21).

They ship a weekly release channel — which mechanically explains the recurring community complaint that “working agents break when the platform updates.” You are on their release train whether or not you changed anything.

For a multi-tenant receptionist where downtime means every tenant’s phone goes unanswered, ~19 hours per 10 weeks is not an acceptable baseline.

LiveKit Agents — interruption bugs

The GitHub issue tracker is almost entirely interruption bugs

Two that matter:

  • #3702 — tool-call results lost on interruption → duplicate order creation in production. A correctness bug with real-world side effects, triggered by the most common event in a phone call.
  • #3685“Latency doubles in telephony contexts.” Telephony is a second-class path.

LiveKit passes the custom-VAD gate but the interruption handling is where a receptionist lives.

Pipecat — cold start and a fixed 1s tax

Two structural latency costs

  • 3–8s cold start from sequential service initialization. On inbound calls, the caller is already on the line during this.
  • aggregation_timeout=1.0 adds an unavoidable 1 second delay to every response. Not p95 — every response.

The 1s aggregation timeout is a large fraction of the entire latency budget, spent by default, on every turn.

This is also where the 480ms orchestration residual was measured — Pipecat + Twilio. The framework that produced the residual also carries a 1s fixed tax and a multi-second cold start.

Cost

Per-minute pricing for the managed tier, against a $0.0326/min DIY baseline — full breakdown in voice-agent-cost-model-2026-07-21.

Platform$/minvs DIY
DIY (this build)$0.0326
Pipecat Cloud~$0.040 – 0.058+23% to +78%
LiveKit Cloud~$0.045+38%
Retell$0.073 – 0.088+124% to +170%
Vapi$0.085+161%
ElevenLabs Agents$0.10 – 0.13+207% to +299%
Bland$0.11 – 0.14+237% to +329%

Verdict

The managed tier fails on capability before it fails on price

Even at equal cost, no managed platform can host a custom VAD, and three of five cannot handle a caller reading out a phone number. The +161% Vapi premium buys less control, not more.

Build the pipeline. Of the frameworks that pass the custom-VAD gate, LiveKit and Pipecat both carry structural telephony problems (interruption correctness bugs; 1s fixed aggregation delay + 3–8s cold start) — which pushes toward a own Rust runtime.

Sources

  • Vapi docs — onNumberSeconds, waitFunction default "200 + 8000 * x" [vendor]
  • Vapi status page — outage history incl. 2026-05-21 4h07m DB connection exhaustion [vendor, self-reported]
  • Retell API docs — responsiveness, interruption_sensitivity [vendor]
  • Bland, ElevenLabs Agents, Telnyx agent docs — turn-taking config surfaces [vendor]
  • LiveKit Agents GitHub issues #3702, #3685 [public issue tracker]
  • Pipecat docs — aggregation_timeout default, service initialization [vendor]
  • Platform pricing pages [vendor]