2026-09-05 The first real calls have been placed: five ended normally, six failed. Here is what broke.

Cost and pricing

What a voice AI minute actually costs, and where the milliseconds go

A minute is four things bought from other people plus one of ours, billed in four different units. Itemised against a real 32-second call.

Contents
  1. The four units
  2. Why we cannot just add the four up
  3. The real call
  4. The ten-cent floor
  5. Where the milliseconds go
  6. What this means for your budget

"How much does a minute of AI voice cost" has an honest answer and a comfortable one. The comfortable one is a number. The honest one is that a minute is made of four things bought from other people plus one of our own, and the four are billed in four different units. This piece takes them apart, using a real 32-second call placed on 5 September 2026.

The four units

This is where the confusion lives. Nobody sells you a minute of voice agent. You are sold four things:

component unit how it is calculated
Language model (LLM) tokens, input and output separately price per million tokens, applied separately to input and output
Transcription (STT) seconds of audio price per minute, divided by 60 and multiplied by the seconds
Speech synthesis (TTS) characters of text price per thousand characters
Telephony whole minutes minutes rounded up, times the destination rate

The last row surprises everyone. Twilio and effectively every other carrier bill whole minutes, rounded up. A 32-second call costs, in telephony, exactly what a 59-second one costs. The constant in the calculator is named after that fact, with a comment explaining why.

Nothing else is rounded. Transcription is calculated on real seconds, synthesis on real characters, the model on real tokens.

Why we cannot just add the four up

Because not all of them have a price. The rule in CallCostCalculator is strict: a stage is priced only from a registry row marked as verified. If no published price exists, a row is still written — with the quantity, the unit, a cost of zero, and a flag saying it was not priced.

There are four unpriced reasons, each a word in the database: the model is not in the registry, it is in the registry but has no published price, the gateway reported no usage, or there is no rate for that country.

Which means a zero on a cost line is not a discount. It is a gap. On the real call below, two lines are zero for exactly that reason, and we paid that cost.

The real call

32 seconds, through Twilio, to a Romanian number. Five cost lines written into usage_events.

Provider components came to $0.0204. On top of that the platform added €0.0533.

The second figure deserves explaining, because it is not a percentage.

The ten-cent floor

Component costs vary enormously. A short call on a small model costs almost nothing; a long one on a large model costs a hundred times more. A percentage markup alone would have left short calls below the cost of keeping them alive.

So there is a floor: €0.10 per minute. If the component margin clears the floor on its own, the floor does nothing. If it does not, it is topped up to it.

On the 32-second call the component margin was zero — two components were unpriced — so the floor paid for everything. 32 seconds of €0.10 a minute is €0.0533. That is where the figure comes from.

Two details that matter:

The floor applies to real billable seconds, not to minutes rounded up. A 32-second call is charged as 32 seconds even though the telephony underneath is charged as a minute.

The floor is a price row in the catalogue, not a config constant. That lets it carry an effective date, be overridden per customer, name its currency explicitly, and be edited from the platform console without a deploy.

Where the milliseconds go

Cost and latency are two different questions, but people ask them together, so here is the second one.

The latency budget has five targets, identical in the control plane's configuration and in the gateway's contract:

  • first partial transcript: 300 ms
  • first token from the model: 600 ms
  • first frame of synthesised audio: 400 ms
  • from "the caller stopped" to "audio leaving for the caller": 1200 ms
  • from barge-in to audio stopping: 120 ms

Here is the trap, and I state it because it is easy to misread: 300 + 600 + 400 is 1300, which is more than 1200. The three targets do not sum into the total. The first partial transcript overlaps the caller still speaking — it is not dead time after they finish. The 1200 ms budget starts at the moment we decided they were done, not at the start of their sentence.

Exceeding a target is a monitored issue, not a crash. The call carries on.

What this means for your budget

Three practical things.

If your calls are short, telephony dominates. Rounding up to a whole minute on a 20-second call effectively triples that line. It is worth asking whether calls can be batched, or whether a short IVR resolves the case without opening a call at all.

If your calls are long, the model dominates. Output tokens cost several times what input tokens cost at most providers, and an agent that talks a lot produces more output tokens — and, separately, more characters to synthesise.

If you bring your own provider keys, you pay the providers directly and pay us only the floor. The components that accept your own key are transcription, the model, synthesis, telephony and a few more. The platform floor does not accept one — it is what is left.

And so it is not a surprise: the wallet has to cover at least 60 seconds of call before one can start. A call that dies halfway through because the credit ran out is worse than a call that never started.