Readback
Source code on GitHub (opens in a new tab)

Cost and operations

What an open call costs by the vendor's rates, what the gate would cost an order, and how the sockets closed. Every reading here is derived only from figures that carry a command.

What an open call costs by the vendor's published rates

Rates, not measurements: AssemblyAI bills on socket lifetime, and both sockets are open for the whole call. Read from the vendor's pricing page.

Together USD 5.10 per hour, about USD 0.085 per minute of an open call: arithmetic over the rate table, not an invoice. Source: https://www.assemblyai.com/pricing (opens in a new tab)
ProductWhat it coversRate
Voice Agent APIThe agent socket. Billed for as long as the socket is open, whether anyone is speaking or not.USD 4.50 per hour
Streaming Universal-3.5 Pro RealtimeThe recognizer socket, which the browser holds at the same time as the agent one.USD 0.45 per hour
Medical Mode surchargeAdded on top of streaming for the medical vocabulary this domain needs.USD 0.15 per hour

The total actually spent is derived from the run ledger, never from this table: make spend

What the gate costs an order: not measured yet

Derived only from measured figures that carry a command, so both readings wait on live runs.

Re-ask costpharmacist seconds per order
—
not measured yet. Needs the seconds one re-ask costs on a live call and the number of re-asks per finished live order. Neither is measured: turn-to-turn time needs make measure, which has not been run, and no live order has been recorded.
Wrong values caughtcatches per 1000 orders
—
not measured yet. Needs how many wrong values reach the gate per finished live order. The recorded runs count errors per synthesised utterance, not per order, and scaling one into the other would be a number without a method.

No cost of a dispensing error is shown. Publishing one needs a cited source, and none is cited on this page.

How the sockets closed: observations, not specification

AssemblyAI documents no WebSocket close codes at all: its streaming API reference lists none. Every meaning below is therefore an observation, and the source column says whose.

  • npx tsx scripts/report/live-run-count.ts n = 236, sessions of 7 runs made before the spend ledger existed; 44 of them come from eval/REPORT.md's own account of two runs that left no file, which is weaker evidence
  • npx tsx scripts/measure/analyse-stress.ts n = 188, sessions of the stress run
  • npx tsx scripts/eer/report.ts eval/<set>, the close codes of one run
Every session with a recorded close, except the live smoke runs, which keep none per session; 1008, 3006, 3008 and 3009 are alert-worthy on the first occurrence because billing runs on socket lifetime, and a run containing any 1008 is not scored.
CodeObserved meaningSourceBefore the ledger, 7 runsStress runAll
1000Closed cleanly The session ended after session.end was acknowledged.Measured by us215186401
1006Closed with 1006 The socket closed without a documented reason.Measured by us, once, in the stress runnot seen11
1008alertRate limit, sent as a policy violation This is what the free tier actually sends when the five-new-sessions-per-minute limit is exceeded. The documented code for that condition is 3009, and we have never observed 3009; a sweep fired one second apart closed 21 of 40 sockets with 1008. Reading it as a transport fault rather than a rate limit is how a measurement sweep turns into a fabricated error rate.Measured by us: what the rate limiter actually sends21122
Named by vendor prose or by another team and not seen in any recorded session here, so none of them carries a count.
CodeObserved meaningSource
3006alertMalformed configuration parameter Reported by another submission for a keyterms_prompt sent as something other than a JSON array. We have not reproduced it ourselves, and the vendor documents no close codes at all, so this entry is a third-party observation rather than a specification.Another team's measurement, not reproduced by us
3007Malformed audio chunks A chunk fell outside the 50-1000 ms window the socket accepts, so the stream was rejected.Vendor prose, not a close-code table
3008alertThree-hour session cap A streaming session is closed automatically at three hours and is billed for the whole time the socket was open.Vendor prose, not a close-code table
3009alertSession limit exceeded The account allows five new sessions per minute on the free tier and this run exceeded it.Vendor prose, not a close-code table; never observed by us