Migration guides / Speechify API
Migrate the Speechify API to Cartesia
Cartesia returns raw audio bytes, so the base64 JSON envelope around every Speechify API response goes away.
Why migrate from Speechify API now
Dated changes on the Speechify API side, each linked to the page that announces it.
Simba 3.5 launch pricing ends
Simba 3.5 bills at $10, $8 and $6 per million characters on Starter, Pro and Scale until then, and at its list price of $20, $16 and $12 after. The Free plan's Simba 3.5 allowance drops from 500,000 to 250,000 characters a month on the same day.
Speechify API pricingSimba 1.6 voices change under the old model ids
simba-english and simba-multilingual stopped being selectable from API version 2026-09-21. Workspaces pinned to an older version keep the Simba 1.6 audio only until November 21, when current models start serving both ids and the audio changes.
Migrate from Speechify API with your coding agent
Paste this into Claude Code, Cursor or Codex in the repo that calls Speechify API. It carries the field mapping, the Cartesia request and a rollout that keeps Speechify API behind a flag until you switch.
Prompt
Move this codebase from Speechify API to Cartesia for text to speech. Keep Speechify API working behind a flag until I switch over.
November 21, 2026: Simba 3.5 launch pricing ends. Simba 3.5 bills at $10, $8 and $6 per million characters on Starter, Pro and Scale until then, and at its list price of $20, $16 and $12 after. The Free plan's Simba 3.5 allowance drops from 500,000 to 250,000 characters a month on the same day. (https://speechify.ai/pricing)
November 21, 2026: Simba 1.6 voices change under the old model ids. `simba-english` and `simba-multilingual` stopped being selectable from API version `2026-09-21`. Workspaces pinned to an older version keep the Simba 1.6 audio only until November 21, when current models start serving both ids and the audio changes. (https://docs.speechify.ai/docs/models)
## 1. Find the calls
Search for `api.speechify.ai` or `SPEECHIFY_API_KEY`. The request to replace is `POST https://api.speechify.ai/v1/audio/speech`. List every call site before you edit anything.
## 2. Target
- Request: `POST https://api.cartesia.ai/tts/bytes`
- Model: `model_id: "sonic-3.6"`
- Headers: `X-API-Key` read from the `CARTESIA_API_KEY` environment variable, and `Cartesia-Version: 2026-08-14`
- Auth swap: Speechify API sends the key in `Authorization: Bearer <key>` from `SPEECHIFY_API_KEY`. Replace it with `X-API-Key` from `CARTESIA_API_KEY` on the Cartesia path only, and keep `SPEECHIFY_API_KEY` for the Speechify API path. Keys come from the console at platform.speechify.ai, and the Speechify SDKs read `SPEECHIFY_API_KEY` on their own.
- Add `CARTESIA_API_KEY` wherever the project documents its environment (`.env.example`, README, deploy config). Never hardcode the key.
- Request size: Speechify API caps a request at 2,000 spoken characters on `/v1/audio/speech`; 20,000 on `/v1/audio/stream`. Cartesia publishes no per-request maximum, so keep any chunking the code already does and split at sentence boundaries; for long text, stream over the Cartesia TTS WebSocket.
- Concurrency: Speechify API allows 3 concurrent requests on Free, 15 on Starter, 30 on Pro, 60 on Scale, shared across every synthesis endpoint. Look up the Cartesia plan's concurrent request limit at https://www.cartesia.ai/pricing, cap parallel requests at it, and retry rate-limit errors with backoff.
- Voice IDs don't carry over. Keep each voice ID in one named constant or config value, put a placeholder where each Speechify API voice was, and list them for me so I can pick replacements at https://www.cartesia.ai/voices.
- Suggested starting points to put in those placeholders, for me to confirm by ear: A female voice for articles and long-form reading → `a33f7a4c-100f-41cf-a1fd-5822e8fc253f` (Lauren - Lively Narrator); A male voice for chapters and documentaries → `ed82c17b-4704-4d34-be43-5d19065acdf1` (Carl - Steady Storyteller); A conversational voice for an in-app assistant → `f786b574-daa5-4673-aa0c-cbe3e8534c02` (Katie - Friendly Fixer).
## 3. Field mapping, Speechify API → Cartesia
- `POST https://api.speechify.ai/v1/audio/speech` → `POST https://api.cartesia.ai/tts/bytes`
- `POST /v1/audio/stream` (chunked bytes) → The TTS WebSocket. Sonic sends audio chunks while it generates; the [WebSocket reference](https://docs.cartesia.ai/api-reference/tts/websocket) has the message format.
- `Authorization: Bearer sk_...` → `X-API-Key` and `Cartesia-Version: 2026-08-14`
- `input`, text or SSML, up to 2,000 spoken characters → `transcript`. Cartesia reads only the `<break>`, `<spell>`, `<emotion>`, `<speed>` and `<volume>` tags. Any other SSML has no effect.
- `voice_id` → `voice`: `{"id": "<voice id>"}`
- `model`: `simba-3.0` (default), `simba-3.2` or `simba-3.5` → `model_id`: `sonic-3.6`. `simba-english` and `simba-multilingual` are retired. A workspace on API version `2026-09-21` or later gets `400 model_retired` for either id.
- `language`, such as `en-US` → `language`: `en` or `en-US`
- `audio_format`: `wav`, `mp3`, `pcm` → `output_format.container` and `encoding`. `pcm` is the `raw` container with `pcm_s16le`.
- `output_format`: `ulaw_8000` → `raw` container, `pcm_mulaw` encoding, `sample_rate` 8000
- `pronunciations`, up to 200 per request and outside English for now → `pronunciation_dict_id`. Copy the entries into one Cartesia dictionary and pass its ID.
- `speech_marks` in the response → `add_timestamps` on the TTS WebSocket. `/tts/bytes` returns no timings. Word timestamps arrive as WebSocket events.
- Response `audio_data` (base64) → Response body is the audio bytes
## 4. Speechify API fields with no Cartesia equivalent
- `audio_format`: `ogg`, `aac`. What to do: Ask for `mp3` or `wav` and convert it yourself.
## 5. Reference request
Match the language and HTTP client the codebase already uses. This is the same request in Python:
```python
import os
import requests
text = "Chapter four begins on a cold morning in late November."
VOICE_ID = "6ccbfb76-1fc6-48f7-b71d-91ac6298247b" # from /voices
response = requests.post(
"https://api.cartesia.ai/tts/bytes",
headers={
"X-API-Key": os.environ["CARTESIA_API_KEY"],
"Cartesia-Version": "2026-08-14",
},
json={
"model_id": "sonic-3.6",
"transcript": text,
"voice": {"id": VOICE_ID},
"language": "en",
"output_format": {
"container": "wav",
"encoding": "pcm_s16le",
"sample_rate": 44100,
},
},
)
response.raise_for_status()
open("out.wav", "wb").write(response.content)
```
## 6. Roll out
1. Choose Speechify API or Cartesia per request from one config flag, defaulting to Speechify API.
2. Run the same scripts through both and save the clips side by side for me to listen to. Check that the container, encoding and sample rate match what downstream code expects.
3. Leave the Speechify API client, call and key in place so rollback is flipping the flag. Don't delete them in this change.
4. Run the existing tests, and add one that checks the Cartesia request body.
## Docs
- Speechify audio speech reference: https://docs.speechify.ai/api-reference/audio/speech
- Speechify audio stream reference: https://docs.speechify.ai/api-reference/audio/stream
- Speechify authentication: https://docs.speechify.ai/build/guides/get-started/authentication
- Cartesia TTS bytes API reference: https://docs.cartesia.ai/api-reference/tts/bytes
When you're done, tell me which files changed, which fields you couldn't map, and how to flip the flag.Every Speechify API field, mapped to Cartesia
The prompt carries this table. Each row is a field in your Speechify API request and the Cartesia field that replaces it.
- Speechify API
POST https:// api.speechify.ai/ v1/ audio/ speech CartesiaPOST https:// api.cartesia.ai/ tts/ bytes - Speechify API
POST /v1/audio/stream(chunked bytes)CartesiaThe TTS WebSocketNoteSonic sends audio chunks while it generates; the WebSocket reference has the message format. - Speechify API
Authorization: Bearer sk_...CartesiaX-API-KeyandCartesia-Version: 2026-08-14 - Speechify API
input, text or SSML, up to 2,000 spoken charactersCartesiatranscriptNoteCartesia reads only the<break>,<spell>,<emotion>,<speed>and<volume>tags. Any other SSML has no effect. - Speechify API
voice_idCartesiavoice:{"id": "<voice id>"} - Speechify API
model:simba-3.0(default),simba-3.2orsimba-3.5Cartesiamodel_id:sonic-3.6Notesimba-englishandsimba-multilingualare retired. A workspace on API version2026-09-21or later gets400 model_retiredfor either id. - Speechify API
language, such asen-USCartesialanguage:enoren-US - Speechify API
audio_format:wav,mp3,pcmCartesiaoutput_format.containerandencodingNotepcmis therawcontainer withpcm_s16le. - Speechify API
output_format:ulaw_8000Cartesiarawcontainer,pcm_mulawencoding,sample_rate8000 - Speechify API
pronunciations, up to 200 per request and outside English for nowCartesiapronunciation_dict_idNoteCopy the entries into one Cartesia dictionary and pass its ID. - Speechify API
speech_marksin the responseCartesiaadd_timestampson the TTS WebSocketNote/tts/bytesreturns no timings. Word timestamps arrive as WebSocket events. - Speechify API
Response
audio_data(base64)CartesiaResponse body is the audio bytes
Speechify API key and auth, mapped to Cartesia
Cartesia reads the key from the X-API-Key header and pins the API version with Cartesia-Version on every request.
- Speechify API
Authorization: Bearer <key>CartesiaX-API-KeyplusCartesia-Version: 2026-08-14NoteKeys come from the console atplatform.speechify.ai, and the Speechify SDKs readSPEECHIFY_API_KEYon their own. - Speechify API
SPEECHIFY_API_KEYCartesiaCARTESIA_API_KEY
Speechify API pricing per 1,000 characters
List prices per 1,000 characters from the vendor's own pricing page. Plans, regions and volume discounts change what you pay.
- Model or plan
Simba 3.0 and 3.2 on Starter ($10 a month)
Speechify API$0.010Note1.9 million characters included each month - Model or plan
Simba 3.0 and 3.2 on Scale ($499 a month)
Speechify API$0.006Note78 million characters included each month - Model or plan
Simba 3.5 on Starter
Speechify API$0.020NoteList price; billed at $0.010 until 21 Nov 2026 - Model or plan
Simba 3.5 on Scale
Speechify API$0.012NoteList price; billed at $0.006 until 21 Nov 2026
On Cartesia, usage draws from your plan's credits: 20,000 credits a month on the Free plan (about 20,000 characters). Enterprise pricing is custom.
Cartesia plans and pricingSources
Prices read from each company's pricing page in November 2026.
Speechify API limits compared with Cartesia
Published limits from both companies. Plans change them, so check both pages before you size a rollout.
- Limit
Free tier
Cartesia20,000 credits a month on the Free plan (about 20,000 characters)Speechify API500,000 characters a month on the API's Free plan, with no card; Simba 3.5 drops to 250,000 after November 21, 2026 - Limit
Request limit
CartesiaNo published maximum; stream long text over the TTS WebSocketSpeechify API2,000 spoken characters on/v1/audio/speech; 20,000 on/v1/audio/stream - Limit
Languages
Cartesia44 languages for text to speechSpeechify API48 languages onsimba-3.5;simba-3.2is English only andsimba-3.0covers 6
Cartesia's figures come from its pricing page and voice library.
Cartesia pricing and plan limitsSources
- Speechify API limitsdocs.speechify.ai
- Speechify API pricingspeechify.ai
- Speechify modelsdocs.speechify.ai
Limits read from each company's documentation in November 2026.
Speechify API voices and where to start on Cartesia
Speechify API voices have ids such as geffen_32; GET /v1/voices lists the catalog and your clones, filterable by locale and gender.
Each card is a starting point for a common Speechify API pick, matched by language and use. Listen before you choose.
What you get on Cartesia
What changes once the Speechify API call is gone.
No base64 to decode
/tts/bytes answers with the audio file itself, so you can delete the audio_data decode step.
Pronunciation dictionaries that work in English
Speechify's pronunciations field doesn't apply to English yet. A Cartesia pronunciation_dict_id fixes names and acronyms in English requests as well, on sonic-3 and newer.
How to migrate from Speechify API to Cartesia
The same changes the prompt makes, if you'd rather make them yourself.
Create an API key in your Cartesia account.
Pick voices in the voice library. Speechify voice IDs have no match on Cartesia.
Swap the Speechify call for the request above and remove
base64.b64decode. If your player readsspeech_marks, move that path to the WebSocket.Set
output_formatfor your player or phone line, then listen to the same passages on both vendors before cutover.
Sources
Request shapes checked against vendor documentation in November 2026.
Compare and read next
Frequently asked questions
Is the Speechify API free?
The API's Free plan includes 500,000 characters a month with no card, then pauses until the next month. The Speechify Reader app has its own plans, billed separately from the developer API. For comparison, Cartesia's Free plan is 20,000 credits a month, roughly 20,000 characters of Sonic.
Does Cartesia return base64?
No. /tts/bytes returns the audio bytes as the response body.
Can I get speech in the same languages?
Not in all of them. Speechify lists 48 languages for simba-3.5, and Sonic speaks 44. Compare Cartesia's list with the locales you serve before you plan the move.
What doesn't carry over?
Ogg and AAC output, SSML beyond the five supported tags, and speech marks on a plain HTTP call. Some simba-3.5 locales may have no Cartesia match, since Sonic speaks 4 fewer languages. Voice IDs start over too.
How do I roll out without risking the read-aloud experience?
Gate the TTS client behind a flag, send a share of new requests to Cartesia, and compare listening scores on the same passages. If a language or voice falls short, set its flag back to Speechify.
Get started today
Talk to an expert.
Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.
Start building.
Create an API key, then hand your coding agent the migration prompt and a few of your own scripts.