Text-to-Speech APIs
Published September 2, 2026 · Every figure below was read from the vendor’s own API documentation, OpenAPI or discovery specification on September 2, 2026. One note on Resemble AI: it appears throughout because its API is still documented and existing customers still use it, but the company no longer sells voice generation — treat its rows as a record rather than as a buying option. This page compares integration constraints, not output. No listening test has been run, so nothing here says how any of these sound.
The short answer
The number that decides your architecture is concurrency, and most comparisons never mention it. Cartesia’s free tier allows 2 concurrent text-to-speech requests. Speechify’s allows 1. Amazon Polly supports up to 26 concurrent long-form requests. Those are different products for different jobs, and price tells you none of it.
Per-request character caps differ by a factor of ten. OpenAI hard-caps at 4,096 characters. Speechify’s non-streaming endpoint caps at 2,000 and its streaming endpoint at 20,000. ElevenLabs runs 5,000 to 40,000 depending on model. If you synthesize long documents, this is the constraint you hit first.
“Streaming” means four incompatible things here. HTTP chunked, WebSocket, gRPC bidirectional and HTTP/2 event streams. Google’s streaming is gRPC-only, marked Pre-GA, and limited to one voice family. Amazon’s requires the generative engine and an SDK supporting HTTP/2 event streams.
And you will hit documentation defects. Murf’s OpenAPI spec declares no security schemes at all. Resemble’s docs contradict themselves twice on authentication. OpenAI’s own example sends a parameter its reference does not document.
Basis: vendor API documentation and machine-readable specifications only, checked September 2, 2026 — no accounts created, no API calls made (how we verify).
On this page
Concurrency: the number that decides it
If you are building anything that serves more than one user at a time, concurrency is the constraint that determines your architecture. It is published in wildly different units across these ten, and three vendors do not publish it for speech at all.
| Provider | Published limit | Unit and notes |
|---|---|---|
| Speechify | Free 1 · Starter 15 · Pro 30 · Scale 60 · Enterprise 100 | Simultaneous text-to-speech requests, per plan — not the same meter as the “concurrent calls” figure Speechify publishes for voice agents, which runs 3/6/12/30 across the same plans. Returns 429 with a Retry-After header |
| Cartesia | Free 2 · Pro 3 · Startup 5 · Scale 15 · Enterprise custom | Concurrent TTS requests. Parallel WebSocket connections capped at 10× that limit |
| ElevenLabs | Multilingual v2: Free 2 · Starter 3 · Creator 5 · Pro 10 · Scale 15 · Business 15 Flash: Free 4 · Starter 6 · Creator 10 · Pro 20 · Scale 30 · Business 30 | Concurrent requests, published per plan and per model family — Flash allows double throughout. Enterprise reads “Elevated” rather than a number. Re-verified September 2, 2026 |
| Amazon Polly | Up to 26 concurrent long-form · up to 18 concurrent neural | Derived by Amazon from transactions per second: neural is 8 tps with a burst limit of 10 |
| Azure Speech | S0: 30 TPS default, adjustable to 1,000 | Transactions per second per resource. F0 tier not available for batch |
| Google Cloud | 100 | A named quota, ConcurrentStreamingSessionsPerProject — streaming sessions, not requests |
| Resemble AI | “generally allows 40 requests per second per API token” | Requests per second, not concurrency. One endpoint row published: Audio Enhancement at 10 per minute |
| Murf AI | Free 5 · Pay-as-you-go 5 | Concurrency, alongside 1,000 and 10,000 requests per minute respectively |
| MiniMax | 60 RPM for speech models | No concurrency figure published for speech — though its Music table has a CONN column and Video publishes max inflight tasks |
| OpenAI | Not public | Per-model RPM and TPM for the speech models appear to sit behind account login |
Read the units before comparing the numbers. Concurrent requests, transactions per second, requests per minute and streaming sessions are four different things, and a vendor publishing a large number in a generous unit is not necessarily more capable than one publishing a small number in a strict one.
Two vendors document behaviour that changes what the number means. ElevenLabs queues rather than fails when you exceed concurrency, describing queued requests as typically adding about 50ms of latency, and publishes two response headers so you can monitor concurrency in-band. It also meters concurrency differently by transport: HTTP counts each request, the TTS WebSocket counts only generation time, and Text to Dialogue reserves a session per open connection from a separate pool. Cartesia publishes a canonical 429 body with an explicit concurrency_limited error code.
MiniMax’s omission is conspicuous rather than accidental-looking. Its rate-limit tables publish a concurrency column for Music and a max-inflight-tasks figure for Video, but the speech rows have neither — only 60 RPM. The vendor demonstrably publishes concurrency where it chooses to; for speech it does not.
Per-request character caps
The second constraint you hit, usually while building rather than while planning. Every one of these is a hard limit that forces client-side splitting.
| Provider | Limit | Detail |
|---|---|---|
| ElevenLabs | 5,000–40,000 | Published per model in a table. The vendor’s stated remedy for exceeding it is client-side splitting |
| Speechify | 2,000 / 20,000 | /v1/audio/speech 2,000; /v1/audio/stream 20,000. “Character counts include SSML tags” |
| Amazon Polly | 6,000 | Default SynthesizeSpeech total character count. Async tasks allow 200,000 total, 100,000 billed |
| OpenAI | 4,096 | A hard input cap per speech request, stated plainly |
| Resemble AI | 3,000 | Synchronous cap |
| Murf AI | 3,000 | “The API supports up to 3,000 characters per request. For longer text, split it into multiple requests.” |
Speechify’s SSML note is the one to internalize. If your input carries markup, your usable text budget is smaller than the number suggests — and on a 2,000-character endpoint, a heavily marked-up passage can lose a meaningful fraction of it to tags. Google applies the same principle to billing rather than to limits: it counts all SSML tags except <mark> as billable characters, which our pricing comparison covers.
The 10× gap between OpenAI’s 4,096 and Speechify’s streaming 20,000 is the practical difference between splitting a chapter into dozens of requests and sending it whole. If you are narrating long-form text, check this before you check price.
Streaming means four different things
Every vendor here advertises streaming. They do not mean the same thing by it, and the differences are load-bearing.
| Provider | Transports | Constraint you should know |
|---|---|---|
| ElevenLabs | HTTP chunked; WebSocket (single-context); WebSocket (multi-context) | The TTS WebSocket does not support the eleven_v3 model. Multi-context contexts time out after a default 20 seconds of inactivity |
| Murf AI | HTTP chunked; WebSocket | No Server-Sent Events anywhere — confirmed absent from its OpenAPI, AsyncAPI, docs index and changelog |
| Cartesia | WebSocket | Parallel WebSocket connections capped at 10× your concurrency limit |
| MiniMax | Bidirectional WebSocket | Region-bound endpoints; region mismatch is a documented source of 401s |
| Resemble AI | WebSocket; HTTP stream | They live on different hosts from the main API |
| Speechify | HTTP stream endpoint | The streaming endpoint carries the 10× larger character cap |
| OpenAI | stream_format: sse or audio | sse is not supported for tts-1 or tts-1-hd — only the newer model |
| Amazon Polly | Bidirectional streaming | Requires the generative engine and an SDK supporting HTTP/2 event streams, on a narrower SDK matrix than Polly’s general list |
| Google Cloud | gRPC bidirectional only | Marked Preview / Pre-GA, available for only one named voice family, with a Python client-library sample and no raw HTTP path |
| Azure Speech | Speech SDK | Streaming is via the SDK rather than a documented raw transport |
Google is the outlier and it matters. Its live v1 discovery document contains exactly seven methods and none of them is a streaming method — streaming exists only as gRPC bidirectional, documented in a guide marked Pre-GA, restricted to one voice family, with only a Python sample invoked through the generated client. If your stack is not gRPC-friendly or your voice is outside that family, Google’s streaming is not available to you regardless of what its marketing says.
Amazon’s constraint is a stack of three. Bidirectional streaming needs the generative engine, an SDK that supports HTTP/2 event streams, and one of a narrower set of SDKs than Polly’s general 10-language list. Each is documented; together they rule out a lot of existing integrations.
OpenAI’s is a version trap. Choosing the cheaper tts-1 or tts-1-hd models means giving up SSE streaming entirely — the parameter exists but those two models do not accept it.
One thing this page deliberately does not compare is latency. Every vendor publishes a figure, they measure different quantities, and most name no metric at all — our real-time comparison sets out why those numbers cannot be ranked, and compares barge-in, turn detection and telephony instead.
Authentication
Three schemes, and knowing which you are dealing with determines how you handle secrets, key rotation and client-side calls.
- Custom API-key header. ElevenLabs uses
xi-api-key. Murf usesapi-key, and additionally publishes a short-lived bearer token endpoint for client-side use, minted with the api-key header. - Bearer token. OpenAI, MiniMax (single scheme, HTTP bearer), Resemble AI (
Authorization: Bearer <API_KEY>, a single static key with no OAuth, no scoped or rotating tokens and no per-key permission model documented), and Cartesia. - Cloud IAM. Google requires the single OAuth scope
https://www.googleapis.com/auth/cloud-platform, with gcloud CLI credentials or Application Default Credentials for REST. Amazon and Azure authenticate through their platform mechanisms and SDKs.
Cartesia publishes the most interesting enforcement detail on this page. Verbatim: “All endpoints use HTTPS. HTTP is not supported. API keys that call the API over HTTP may be subject to automatic rotation.” The penalty for a plaintext call is not a refused request — it is your key being rotated out from under you. Cartesia also runs three credential types, including an admin key prefixed sk_car_admin_ required for usage and key management, which is a sensible separation few here offer.
Speechify sends a build-date Speechify-Version header by default from its SDKs, and documents that raw HTTP callers can send the same header to pin a dated response shape. That is a genuinely useful thing to publish and nobody else here does it.
Several of these APIs also run your text through a normalizer, a pronunciation layer and a prosody layer before synthesis, each with its own parameters and defaults — and one vendor documents the same normalization parameter with opposite defaults on two of its own endpoints. Our guide to how AI voice generators work covers those stages.
SDK coverage
Whether an official SDK exists in your language is often the whole decision, and the spread here is wide.
| Provider | Official SDKs | Note |
|---|---|---|
| Amazon Polly | Ten languages listed on Polly operations | The bidirectional streaming matrix is narrower than this list |
| Azure Speech | Many, via the Speech SDK | Explicitly: “C isn’t a supported programming language for the Speech SDK”; Swift shares libraries with Objective-C |
| OpenAI | TypeScript/JavaScript, Python, Ruby and others | Labelled official, with the vendor’s own hedges intact |
| Google Cloud | Per-language client libraries | Source repositories published per language |
| ElevenLabs | Two for the REST API: Python and JavaScript | Seven more exist for the Agents Platform, which is a different product. Three further libraries — Vercel AI SDK, .NET and Unity — are explicitly disclaimed as not officially supported |
| Cartesia | Two: JavaScript/TypeScript and Python | No Go, Java, C#, Rust, PHP or Ruby SDK, and no community libraries named |
| Speechify | Two: Python and TypeScript | The older @speechify/api-sdk package is documented as deprecated |
| Resemble AI | Two | Node.js is described as TypeScript-first with streaming helpers |
| Murf AI | One: Python | The only official SDK Murf lists |
| MiniMax | None first-party for speech | It publishes compatibility base URLs so third-party SDKs can be pointed at it instead |
ElevenLabs’ count is easy to overstate. The large SDK list belongs to the Agents Platform, not to the REST text-to-speech API, which has two. And the three libraries most likely to appear in a JavaScript or game-engine stack — Vercel AI SDK, .NET and Unity — sit in a table the vendor explicitly marks as not officially supported.
MiniMax’s approach is different in kind rather than merely thinner. Rather than publishing speech SDKs, it publishes compatibility base URLs you point an existing third-party SDK at. That works, and it means no first-party client to file issues against.
Async and batch
For long documents, an async endpoint is usually the right integration, and five vendors publish one.
- ElevenLabs —
POST /v1/flows/text-to-speech, positioned as the async alternative to the synchronous endpoint, completed by a polling GET that returns a signed download URL expiring in about an hour, with webhook delivery as an alternative to polling. Its output format enum is restricted to MP3 only — no PCM, WAV, opus, ulaw or alaw. If you need lossless async output, this endpoint cannot give it to you. - Google Cloud — an async long-audio method in both v1 and v1beta1, polled through dedicated long-running-operations methods, writing output to a Cloud Storage URI you supply. That storage dependency is an architectural requirement, not a convenience.
- Amazon Polly —
StartSpeechSynthesisTask, allowing 200,000 total characters against 100,000 billed, with task listing and retrieval capped at 10 tps combined. - Azure Speech — batch synthesis at 100 requests per 10 seconds on S0, a 2 MB maximum JSON payload, up to 10,000 text inputs per job, no stated limit on concurrent active jobs, and a job time-to-live of up to 31 days.
- MiniMax —
/v1/t2a_async_v2with a separate query endpoint, on both platforms.
Azure’s 10,000 text inputs per job is the largest documented batch unit here, and its 31-day job TTL is the only retention figure any of these vendors publishes for async output.
Documentation defects you will hit
These are not editorial complaints. Each one costs a developer time, and each is verifiable in the vendor’s own published material.
- Murf’s OpenAPI spec declares no security schemes at all. The docs authenticate every curl example with an
api-keyheader, but a generated client built from the spec will not know that. Its AsyncAPI binding, separately, names the credentialapi_keyin both the query and headers objects. - Resemble AI’s documentation contradicts itself twice on authentication — Bearer against a bare key on the same endpoint, and two different URLs for obtaining an API key. It also publishes no error-code taxonomy, no documented 429 semantics, no
Retry-After, no rate-limit response shape and no backoff guidance beyond a single WebSocket line. - OpenAI’s guide sends parameters its reference does not document. The custom-voice example posts
"language": "fr"and"format": "wav"to the speech endpoint, while the reference’s body-parameter list contains onlyinput,model,voice,instructions,response_format,speedandstream_format. A case-insensitive search of that reference for “language” returns nothing. - Google’s auth documentation and its discovery document disagree. The authentication page presents OAuth bearer tokens as the general REST pattern and shows no API-key header anywhere, while the live v1 discovery document declares an API key as a query parameter named
key, described as required unless an OAuth token is supplied. - ElevenLabs’ regional hosts are published inconsistently. The Servers block listing one default plus four regional data-residency hosts appears on the REST endpoint reference pages but on neither WebSocket reference page, and no statement says which plans may use the regional hosts.
- ElevenLabs’ streaming and non-streaming format enums differ. The non-streaming endpoint accepts 28 output formats; the streaming endpoint accepts 21 and contains no
wav_*format at all. Code that works against one endpoint can fail against the other on format alone. - Murf’s WebSocket hosts differ between its own documents. Its AsyncAPI default server is
wss://global.api.murf.ai/v1/speechwhile the working code sample connects towss://global.api.murf.ai/v1/speech/stream-input. - A deprecated parameter still appears in ElevenLabs’ reference.
optimize_streaming_latencyis documented as deprecated on both the convert and stream endpoints.
Two vendors deserve credit against this list. ElevenLabs exposes character cost, request ID and trace ID as response headers, which makes cost attribution and support escalation straightforward. Cartesia and Speechify both publish a canonical 429 shape — Cartesia with a named concurrency_limited error code, Speechify with a Retry-After header — which is the difference between implementing backoff correctly and guessing at it.
Choosing for your workload
- Start with concurrency, not price. Work out your peak simultaneous requests and check it against the table above, in the vendor’s own unit. A free tier allowing 1 or 2 concurrent requests will not serve a product regardless of how many characters it includes.
- Check the per-request cap against your longest input. If you exceed it you are writing a splitter, and splitting introduces prosody seams no vendor document discusses.
- Confirm the streaming transport matches your stack before assuming streaming exists. gRPC-only, SSE-on-newer-models-only and HTTP/2-event-streams-only are all real constraints here.
- Check whether an official SDK exists in your language, and whether the SDK you found belongs to the product you are integrating — ElevenLabs’ large SDK list is for a different product.
- If you are synthesizing long documents, use the async endpoint, and check its format restrictions. ElevenLabs’ async path is MP3-only; Google’s requires Cloud Storage.
- Read the 429 documentation before you need it. Two vendors publish a canonical shape; one publishes no 429 semantics at all.
- Then check price — in our pricing comparison, where every rate is normalized to one unit — and language coverage in our multilingual comparison, where no vendor’s advertised count survives a recount.
Frequently asked questions
Which text-to-speech API is best for developers?
It depends on the constraint that binds you. For raw concurrency headroom, Azure publishes the highest adjustable ceiling at 1,000 TPS and Amazon Polly documents up to 26 concurrent long-form requests. For documentation quality, ElevenLabs publishes the most complete parameter surface, per-model caps, in-band concurrency headers and cost headers. For the fewest surprises in a small stack, Cartesia and Speechify both publish canonical error shapes. We have not tested output quality, so none of this is a judgment about how they sound.
What is the maximum text I can send in one request?
It ranges from 2,000 characters on Speechify’s non-streaming endpoint to 40,000 on ElevenLabs’ largest-cap model. OpenAI hard-caps at 4,096, Amazon Polly defaults to 6,000, and Resemble caps synchronous requests at 3,000. Speechify counts SSML tags toward the limit.
Do all of these support streaming?
All advertise it, but they mean four incompatible transports. Google’s is gRPC bidirectional only, marked Pre-GA and limited to one voice family. Amazon’s requires the generative engine and an SDK supporting HTTP/2 event streams. OpenAI’s SSE format is not supported on tts-1 or tts-1-hd. Murf publishes no Server-Sent Events at all.
Which providers publish concurrency limits?
Seven publish a usable figure. MiniMax publishes rate limits but no concurrency for speech, despite publishing concurrency columns for its music and video products. OpenAI’s per-model limits appear to sit behind account login. Resemble publishes a requests-per-second figure rather than a concurrency limit.
Is there an SDK for my language?
If you work in Python or JavaScript, yes, everywhere that publishes an SDK at all. Outside those two the field narrows fast: Murf publishes only Python, MiniMax publishes none first-party for speech, and Cartesia explicitly has no Go, Java, C#, Rust, PHP or Ruby SDK. The cloud platforms are the broadest.
What happens when I exceed a rate limit?
It varies, and this is worth knowing in advance. ElevenLabs queues rather than failing, adding roughly 50ms by its own account. Cartesia and Speechify both return a documented 429 shape. Resemble AI publishes no 429 semantics, no Retry-After and no backoff guidance.
Can I call these APIs from a browser?
Not safely with a static key, which is what most of these use. Murf publishes a short-lived bearer token endpoint for client-side use, minted server-side with the api-key header, which is the pattern to look for. Cartesia goes further in the other direction: calling it over plain HTTP may get your key automatically rotated.
Sources and what we could not verify
Every figure on this page was read on September 2, 2026 from vendor API documentation, published OpenAPI and AsyncAPI specifications, and live discovery documents. Where a machine-readable specification was available we parsed it directly rather than relying on the rendered documentation. Per-provider detail is in the ten reviews linked throughout, and the method is on the methodology page.
What we could not verify
Honesty about gaps beats a page that looks complete. Genuinely unresolved as of September 2, 2026:
- Whether any of these APIs behaves as documented. We read specifications; we did not create accounts or make API calls. Every limit here is a published figure, not a measured one.
- OpenAI’s per-model rate limits. RPM and TPM for the speech models are not on the public pages and appear to require an account.
- MiniMax’s speech concurrency. Not published, though the vendor publishes concurrency figures for its other media products.
- ElevenLabs’ numeric rate limit. A rate limit distinct from concurrency exists and is signalled by its own error code, but the docs give no numeric threshold; the vendor explicitly deprioritises requests-per-minute in favour of concurrency.
- ElevenLabs’ Enterprise concurrency. That row of the table publishes words rather than numbers.
- Which plans may use ElevenLabs’ regional hosts. The Servers block lists them with no statement of eligibility.
- Per-request character caps for Azure, Google, Cartesia and MiniMax. We did not find a published per-request input limit for these in the documentation we read; absence in what we read is not proof none exists.
- Whether Murf’s OpenAPI omission of security schemes is deliberate. The spec declares none while every documented example uses a header.
- Latency of any kind. This page publishes no latency figures. Vendor latency claims exist and are not measurements; our benchmark does not yet cover them.
Change log
September 2, 2026 — First publication. All figures read from official vendor API documentation and machine-readable specifications on September 2, 2026 and dated accordingly.
Published September 2, 2026 · This page compares documented integration constraints and reports no measurements — we made no API calls and ran no listening test. API limits and specifications change frequently; corrections are recorded with their date on the corrections page. Independence note: this page contains no affiliate links, and no vendor paid for placement or influenced the order — see how we make money and our editorial policy.