OpenAI TTS Pricing and the 02:10 Overrun Alert
OpenAI TTS pricing per model, checked today
OpenAI bills tts-1 and tts-1-hd by the character and gpt-4o-mini-tts by the token, so one script costs different amounts on each. Retries and a missing spend cap then decide whether the invoice matches the quote. I re-read OpenAI's pricing and model pages on 2026-11-11.

Here's the failure that makes this matter. Take a modelled, illustrative workflow: a nightly job, built in a workflow tool, reads each client's daily summary aloud and emails the audio.
At 02:10 an overrun alert fires. A timeout on one client's long summary triggered a retry loop, and every retry re-sent the full text.
All clients share one API key, so the agency absorbed the spend for the one client whose summary caused the loop. No cap stopped it, because the alert came from a billing check, not from the workflow.

Every OpenAI TTS model in one table
Read the table for which model bills on text length and which on tokens.
| Model | Price unit | Published rate | What's included | Free tier | Rate limits |
|---|---|---|---|---|---|
| tts-1 | Per character of input text | Unverified | Standard-quality speech, built for speed | Unverified | Unverified; varies by account tier |
| tts-1-hd | Per character of input text | Unverified | Higher-quality speech than tts-1 | Unverified | Unverified; varies by account tier |
| gpt-4o-mini-tts | Per token | Unverified | Speech steerable by text instructions on tone and delivery | Unverified | Unverified; varies by account tier |
Prices and plan limits checked against docs.claude.com and claude.com and openai.com and gemini.google on November 10, 2026.
What the free tier does and does not include
I couldn't confirm any free TTS allowance for the API on the checked date, so budget as if every generated second is billed. The ChatGPT app's free plan is a separate product from API billing.
If you are running this arithmetic for your own team, see what the same workload costs on Activepieces.
What 1,000, 10,000 and 100,000 Minutes Cost
Whatever the client will accept on an invoice is a per-minute number, and OpenAI doesn't quote one. You have to build it yourself from the unit each model actually bills in.
Converting OpenAI TTS characters and tokens to minutes
Because tts-1 and tts-1-hd bill per character of input text, their minute cost depends on how fast the voice reads.
Pick a characters-per-minute figure from your own scripts: time a few finished clips, divide their character counts by their running time, and use that number instead of a generic speaking rate.
Switch to gpt-4o-mini-tts and there is a second conversion, because it bills in tokens. OpenAI counts text going in as input tokens and audio coming out as output tokens, so you need a tokens-per-minute figure for each side.
Monthly cost at three volumes, by model
Read the chart for the gap between the models at each volume, because that gap is what the model choice costs you. It prices 1,000, 10,000 and 100,000 minutes for tts-1, tts-1-hd and gpt-4o-mini-tts, using the stated characters-per-minute and tokens-per-minute assumptions.
(chart)
The chart shows clean, first-pass minutes only. Retries add billed minutes on top, and a failed or regenerated clip is charged like a good one.
Add a retry allowance to each bar before quoting, and put a spend cap in the workflow so an overrun stops at the cap instead of landing on the shared account.
Hidden Costs and Limits That Broke the Estimate
You will not find any of the five limits below in a per-character or per-token price: each one adds cost or caps what a client can be promised.
How OpenAI TTS retries cause duplicate billing
When a timed-out or failed request is resent, it carries the whole text again, so you pay for the full input a second time. Retrying a 2,000-character script after a late failure doubles that script's cost.

Retry per chunk rather than per document, and count each retry against the cap, or an overrun lands on the shared account instead of the client who caused it.
Because each request accepts only a limited amount of input, a long script must be split before it's sent. Splitting means more requests, more retry exposure, and audible seams if chunks break mid-sentence.
Cut at sentence boundaries and price the job as chunks, not as one document.
Chunking, per-chunk retries and a character check make the workflow itself longer, and that shouldn't raise what the workflow costs to run.
Activepieces charges 1 credit per run however many steps it has, so a ten-step job with the count, the budget branch and a capped retry per chunk costs the same as a bare two-step call.
Zapier bills per task, so the same safeguards would be metered one by one; here the run is the meter, not the steps inside it.
Rate limits by usage tier
On a new account the limits start low and rise with usage tier. Converted to monthly requests, as quoted in an OpenAI Developer Community thread:
- The free tier allows 129,600 requests a month.
- Tiers 1-2 allow 2,160,000 requests a month.
- Tiers 3-4 allow 4,320,000 requests a month.
- Tier 5 allows 21,600,000 requests a month.
These are ceilings for nonstop use, so a 100,000-minute month fits even under the free figure only if each request carries about a minute of audio. Chunk into short sentences and the request count multiplies, which is when the lower tiers start to pinch.
OpenAI TTS voices, languages and disclosure rules
If a client wants a specific brand voice, they won't get it from these models, because OpenAI offers a fixed set of built-in voices. Check the language list against the client's markets before promising any.
Because OpenAI's usage policies also expect listeners to be told the voice is AI-generated, put a disclosure line in the deliverable and in the quote. Confirm commercial-use terms in OpenAI's current terms before you resell the audio.
Worth checking against a plan that does not meter every step: one credit covers a whole run on Activepieces.
OpenAI TTS Against ElevenLabs, Google and Azure
OpenAI is the simplest of the four to budget for plain narration, and the other three win when you need voice choice, language coverage or a contractual quota.
The table shows each vendor's billing unit and the limit most likely to push you off the entry plan.
| Vendor | Billing basis | Free allowance | Concurrency | Voices and languages | Commercial terms |
|---|---|---|---|---|---|
| OpenAI | Per character on tts-1; per token on gpt-4o-mini-tts | Pay as you go; do not plan around a standing free tier | Account rate limits that rise with usage tier | A fixed set of built-in voices | Governed by OpenAI's terms |
| ElevenLabs | Monthly character credits set by plan | A free plan with a small credit pool | Rises with plan level | Large voice library; cloning on higher plans | License depends on plan; confirm before resale |
| Google Cloud TTS | Per character, priced by voice type | Monthly free quota per voice type | Per-project quotas, raisable on request | Broad voice tiers and wide language coverage | Cloud terms apply |
| Azure Speech | Per character, priced by voice type | Free resource tier with a monthly cap | Throttled per resource | Broad neural voice and language catalog | Azure terms apply |
ElevenLabs pricing plans and character credits
Because ElevenLabs bills through a monthly credit pool, cost depends on how much of the pool you burn.
When a retry regenerates a clip, it spends credits twice, and on a shared account that spend lands on whoever holds the plan.
Google Cloud Text-to-Speech pricing by voice type
Pick a premium voice for one client and the cost of the whole run changes, because Google prices per character, with the rate set by voice type.
The monthly free quota is per voice type, which makes it easy to overstate how much of your volume is free.
Give each client a project, since quotas apply per project, and the spend separates cleanly.
On Azure AI Speech, billing is also per character by voice type, with a capped free resource tier. Throttling applies per resource, which means a busy client can slow a quiet one if they share a resource.
Pick OpenAI for English-first narration where one voice set is enough and you can cap spend in the workflow. Pick ElevenLabs when the client is paying for voice quality or cloning.
Pick Google or Azure when language breadth or a per-client quota matters more than the lowest rate.
Setting an OpenAI TTS spend cap in workflows
If you stay on OpenAI, the bill holds only when the cap and the checks sit in the workflow itself. The account won't stop a runaway job for you. Every rule below exists so one client's loop can't be billed to the shared account and quietly subsidized by the others.
**The account won't stop a runaway job for you.
- Set a monthly spend limit on the project, one project per client, so a bad run can't draw on another client's budget.
- Count the characters in the text before each call, since that count is what you price against.
- Branch to stop if the job is over its budget, and route it to a person instead of the API.
- Call the speech endpoint only when the check passes.
- Cap retries at a small fixed number, because a retried call is billed again like a fresh one.
- Cache the audio by a hash of the text, voice and model, so identical text is never paid for twice.
- Send a budget alert before the limit is reached, so the overage conversation with the client happens before the invoice, not after.
Calling the OpenAI TTS speech endpoint
To make the call, send a single authenticated POST to the speech endpoint, carrying the model, the voice and the text, and it returns audio. Put the cache lookup in front of it and the character count and budget check ahead of that.
Treat any non-success response as one of your capped retries, not a reason to loop.
Prevent voice cost overruns with checks
In Activepieces, the workflow builder, this maps onto three integrations. An HTTP step makes the speech call.
When a job is over budget, it never reaches the HTTP step: a branch step reads the character count against a stored budget and sends the job to a notification instead.
A stored counter keeps the monthly running total per client, so the alert fires from your own numbers rather than from the invoice.
Monday actions:
- Create a separate project for each client and set its monthly limit.
- Add the character check and the budget branch ahead of every speech call.
- Set the retry cap and turn on the text-hash cache.
- Wire the alert to whoever owns the client relationship.
What Activepieces does about this
The overrun at 02:10 happened because the only control sat in a billing dashboard, outside the job. Activepieces puts the control in the flow.
The character count, the budget branch and the retry cap are steps that run before the speech call, so a job that is over its allowance never reaches OpenAI.
Nothing in OpenAI's pricing can do that for you, and the account-level limit only trips after the money is spent.
The flow uses three integrations. A code or data step counts characters in each client's summary. Activepieces' storage holds a running monthly total per client, so the alert fires from your own numbers rather than from the invoice.
A branch compares the two and sends an over-budget job to an email or Slack message for a person to decide. Only a job that passes reaches the HTTP step that posts to OpenAI's speech endpoint, and the text-hash cache sits in front of that.
A loop like the 02:10 one hits the retry cap on that one client's job and stops.
The cost of building this in Activepieces is the 1 credit per run, however many steps the run has. The safeguards in this article add steps, and on a per-task meter each one would add cost.
Here the run is the meter, so the checks cost nothing extra to keep. The core is open source under the MIT licence and can be self-hosted.
If a client's data can't pass through a hosted tool, you can run the same flow on your own server and keep the same checks.
I haven't tested this against a live OpenAI account, and the per-minute figures still depend on the characters-per-minute and tokens-per-minute assumptions on your quote. Activepieces doesn't change what OpenAI charges.
It makes sure a job that blows its allowance gets stopped and routed to a person before it is billed.
Frequently asked questions
Before you quote a client, re-verify against the page named in each answer below; each rests on an OpenAI page, checked 2026-11-11.
Treat tts-1 as fully billed from the first call. OpenAI's pricing page lists a per-character rate for it with no standing free allowance, so any trial credit on your account is a one-off, not a monthly budget.
Put test runs on the same cost line as production, or a client's project quietly absorbs your experiments.
Whether gpt-4o-mini-tts is cheaper than tts-1 is not automatic, because the two bill in different units. OpenAI's pricing page charges tts-1 per character and gpt-4o-mini-tts by tokens, so the headline rates can't be compared directly.
Convert both to cost per minute of finished audio using your own typical script length, then compare. Until you do, you're quoting a client a price you haven't computed.
Can I use OpenAI TTS audio commercially?
Yes, you can use the audio in products and client work, with one condition on how you present it. OpenAI's usage policies and its text-to-speech guide require that listeners be told the voice is AI-generated, not a human recording.
Build that disclosure into the deliverable itself, such as an on-screen note or a line in the intro, so it doesn't depend on someone remembering at handoff.
How do I cap my OpenAI TTS spending?
Set the limits OpenAI offers in the billing and usage-limits section of your dashboard, but don't rely on them as the only brake. Those settings are controls on the account, and a shared account spreads one client's runaway loop across everyone's budget.
Add your own ceiling inside the workflow: count characters before each call, keep a running total per client, and stop the job when it reaches the monthly allowance you quoted.
Does OpenAI TTS charge for failed requests?
When a request returns an error before any audio is produced, it is the case least likely to cost you. OpenAI's API reference and pricing page don't promise that every retry is free.
When a client-side timeout hits, the audio may have been generated and billed while your workflow never received it, and the retry then bills it again.
Cap the number of retries per job, and log each attempt against the client so duplicate generations show up on your side before they show up on the invoice.
Related reading
References
Running the numbers
See what the same workload costs here.
Free forever plan, and every paid plan self-hosts at no extra cost.
See pricing Talk to sales


