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 pricing

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.

Speechify models

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.

12 fields mapped, with a rollback plan

Prompt

Connect MCP
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.

  1. Speechify API

    POST https://api.speechify.ai/v1/audio/speech

    Cartesia
    POST https://api.cartesia.ai/tts/bytes
  2. Speechify API

    POST /v1/audio/stream (chunked bytes)

    Cartesia
    The TTS WebSocket
    Note
    Sonic sends audio chunks while it generates; the WebSocket reference has the message format.
  3. Speechify API

    Authorization: Bearer sk_...

    Cartesia
    X-API-Key and Cartesia-Version: 2026-08-14
  4. Speechify API

    input, text or SSML, up to 2,000 spoken characters

    Cartesia
    transcript
    Note
    Cartesia reads only the <break>, <spell>, <emotion>, <speed> and <volume> tags. Any other SSML has no effect.
  5. Speechify API

    voice_id

    Cartesia
    voice: {"id": "<voice id>"}
  6. Speechify API

    model: simba-3.0 (default), simba-3.2 or simba-3.5

    Cartesia
    model_id: sonic-3.6
    Note
    simba-english and simba-multilingual are retired. A workspace on API version 2026-09-21 or later gets 400 model_retired for either id.
  7. Speechify API

    language, such as en-US

    Cartesia
    language: en or en-US
  8. Speechify API

    audio_format: wav, mp3, pcm

    Cartesia
    output_format.container and encoding
    Note
    pcm is the raw container with pcm_s16le.
  9. Speechify API

    output_format: ulaw_8000

    Cartesia
    raw container, pcm_mulaw encoding, sample_rate 8000
  10. Speechify API

    pronunciations, up to 200 per request and outside English for now

    Cartesia
    pronunciation_dict_id
    Note
    Copy the entries into one Cartesia dictionary and pass its ID.
  11. Speechify API

    speech_marks in the response

    Cartesia
    add_timestamps on the TTS WebSocket
    Note
    /tts/bytes returns no timings. Word timestamps arrive as WebSocket events.
  12. Speechify API

    Response audio_data (base64)

    Cartesia
    Response 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.

  1. Speechify API

    Authorization: Bearer <key>

    Cartesia
    X-API-Key plus Cartesia-Version: 2026-08-14
    Note
    Keys come from the console at platform.speechify.ai, and the Speechify SDKs read SPEECHIFY_API_KEY on their own.
  2. Speechify API

    SPEECHIFY_API_KEY

    Cartesia
    CARTESIA_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.

  1. Model or plan

    Simba 3.0 and 3.2 on Starter ($10 a month)

    Speechify API
    $0.010
    Note
    1.9 million characters included each month
  2. Model or plan

    Simba 3.0 and 3.2 on Scale ($499 a month)

    Speechify API
    $0.006
    Note
    78 million characters included each month
  3. Model or plan

    Simba 3.5 on Starter

    Speechify API
    $0.020
    Note
    List price; billed at $0.010 until 21 Nov 2026
  4. Model or plan

    Simba 3.5 on Scale

    Speechify API
    $0.012
    Note
    List 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 pricing

Sources

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.

  1. Limit

    Free tier

    Cartesia
    20,000 credits a month on the Free plan (about 20,000 characters)
    Speechify API
    500,000 characters a month on the API's Free plan, with no card; Simba 3.5 drops to 250,000 after November 21, 2026
  2. Limit

    Request limit

    Cartesia
    No published maximum; stream long text over the TTS WebSocket
    Speechify API
    2,000 spoken characters on /v1/audio/speech; 20,000 on /v1/audio/stream
  3. Limit

    Languages

    Cartesia
    44 languages for text to speech
    Speechify API
    48 languages on simba-3.5; simba-3.2 is English only and simba-3.0 covers 6

Cartesia's figures come from its pricing page and voice library.

Cartesia pricing and plan limits

Sources

Limits read from each company's documentation in November 2026.

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.

  1. Create an API key in your Cartesia account.

  2. Pick voices in the voice library. Speechify voice IDs have no match on Cartesia.

  3. Swap the Speechify call for the request above and remove base64.b64decode. If your player reads speech_marks, move that path to the WebSocket.

  4. Set output_format for your player or phone line, then listen to the same passages on both vendors before cutover.

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.

Contact Sales

Start building.

Create an API key, then hand your coding agent the migration prompt and a few of your own scripts.

Try Cartesia