Voice Billing
How voice requests are priced and surfaced on invoices: provider passthrough per minute and per character, prepaid credits, limits, and metering.
Voice requests use the same API key and the same prepaid credit balance as chat. What differs is the pricing unit: voice components are metered in minutes and characters rather than tokens.
Like everything on Xantly, voice usage is billed at exact provider cost. There is no per-minute platform fee and no markup on voice usage; the only platform fee is the 3% charged when you top up credits.
This page documents how Xantly bills voice, enforces limits, and surfaces costs back to you.
Cost breakdown
A single voice turn is billed as the sum of up to three components:
| Component | Pricing model | Where the cost comes from |
|---|---|---|
| Speech-to-Text (STT) | Per minute of input audio | Provider passthrough |
| LLM inference | Per token (same as chat) | The model dispatched inside the voice pipeline |
| Text-to-Speech (TTS) | Per 1M characters | Provider passthrough |
All three are pure provider passthrough: Xantly debits your credit balance exactly what the underlying provider charged, at the provider's own rates.
Chat models called inside the voice pipeline are priced per token like any other chat completion, and voice responses served from the semantic cache are billed at the flat cache rate of $0.25 per million tokens instead of the provider price.
Limits and overrides
Voice limits are operational guardrails, not pricing tiers. Every organization gets default limits for voice RPM, monthly audio minutes, and concurrent sessions, and each one can be adjusted per organization via org_settings:
voice_monthly_minutes_limit, override the monthly minutes capvoice_concurrent_session_limit, override the concurrency limitvoice_rpm_limit, override the requests-per-minute limitvoice_monthly_budget_usd, a hard USD ceiling for voice spend regardless of minutes
Need higher limits? Raise them from the dashboard or through an enterprise contract; the metered rate does not change.
Limit enforcement order
For every voice request, Xantly runs these checks in order. The first one that fails returns an error and the request does not count toward any other limit:
- Monthly budget cap: the same
budget:usage:{org_id}:general:{YYYY-MM}pool as chat. Returns402 Payment Requiredwhen exceeded. - Monthly voice minutes limit: the org's configured limit, if set. Returns
429 Too Many Requests("Voice audio minutes quota exceeded"). - Credit floor: your balance must be at least $0.05 to start a voice request. Returns
402 Payment Required. - Concurrent session limit: the org's concurrency limit. Returns
429("Voice concurrent session limit reached"). - Voice RPM (sliding window): enforced by the rate limit middleware.
When a voice request fails mid-pipeline (e.g. STT succeeds, TTS fails), Xantly bills for the stages that completed via the partial cost accumulator. You are never charged for work the provider never did, but you are also never refunded for work that was successfully billed upstream.
Cost visibility headers
Every successful voice response includes detailed cost + routing metadata headers:
| Header | Example value | Meaning |
|---|---|---|
X-Xantly-Cost-USD | 0.00324 | Total charge for this request (provider cost) |
X-Xantly-STT-Provider | deepgram | Which STT provider actually ran |
X-Xantly-STT-Model | deepgram/nova-2 | Which STT model was dispatched |
X-Xantly-TTS-Provider | elevenlabs | Which TTS provider actually ran |
X-Xantly-TTS-Model | elevenlabs/eleven_flash_v2_5 | Which TTS model was dispatched |
X-Xantly-STT-Latency-Ms | 82.4 | STT stage latency |
X-Xantly-Inference-Latency-Ms | 147.2 | LLM inference latency |
X-Xantly-TTS-Latency-Ms | 54.1 | TTS stage latency |
X-Xantly-Model-Used | groq/llama-3.3-70b | The chat model that served inference inside the pipeline |
X-Xantly-Lane-Used | FastLane | Whether BaRP routed through the fast lane or delegation lane |
X-Xantly-Cache-Hit | true | true when the voice semantic cache served the response (billed at the flat cache rate, not the provider price) |
Anomaly thresholds
Xantly runs automatic cost-anomaly detection on every voice request. If a request exceeds either of the thresholds below, a warning is logged to the Admin Portal for operator review. The thresholds are configurable at deploy time:
| Environment variable | Default | Meaning |
|---|---|---|
VOICE_ANOMALY_COST_PER_MIN_THRESHOLD | 0.66 | Maximum provider cost per minute of audio before firing an alert (3x premium stack expected max) |
VOICE_ANOMALY_SINGLE_REQUEST_THRESHOLD | 5.0 | Maximum provider cost for a single voice request before firing an alert |
A third sanity check, "STT completed in <10ms for >5 seconds of audio", is always enabled and not tunable. It catches broken duration tracking in STT provider responses.
Usage metering
Voice minutes are metered continuously from the gateway and drawn from the same prepaid credit balance as chat. There is no separate voice subscription and nothing to activate: if you have an API key and a positive balance, you can call voice. Voice line items appear in the same usage ledger and dashboards as chat, broken down per stage (STT, inference, TTS).
Next steps
- Voice Agents, full voice API reference with curl examples
- Voice Models Catalog, all 30+ voice models and their pricing units
- Billing & Credits, general billing reference