Skip to navigation

Text-to-Speech API

Turn text into natural speech with one API call; the product page at speechify.ai/text-to-speech-api covers models, latency and pricing

Wire up the Speechify TTS API
Integrate the Speechify text-to-speech API into my codebase. Cover the request shape, voice and model selection, audio format options, and error handling for the limits that apply. Follow [https://docs.speechify.ai/build/text-to-speech-api.md](https://docs.speechify.ai/build/text-to-speech-api.md).

The text-to-speech API turns text into natural-sounding audio from a single request. This page takes you from an API key to saved audio in a few minutes, then points to the streaming, voice, and SSML guides once you have the basics working.

If you are still deciding, the Text-to-Speech API product page covers models, latency and pricing in one place; this guide is the build path.

1

Get your API key

  1. Sign up at platform.speechify.ai
  2. Go to API Keys
  3. Copy your default API key (or create a new one)
export SPEECHIFY_API_KEY="your-api-key-here"

API keys are sensitive. Never expose them in client-side code or public repositories. See the Authentication guide for security best practices.

2

Install the SDK

pip install speechify-api
Prefer raw HTTP? No install needed. Use the cURL tab in the examples below.
3

Generate speech

Send text to POST /v1/audio/speech. These examples come straight from the SDKs and the live spec:

POST
/v1/audio/speech
from speechify import Speechify
client = Speechify(
token="YOUR_TOKEN_HERE",
)
client.audio.speech(
audio_format="mp3",
input="Hello! This is the Speechify text-to-speech API.",
model="simba-3.2",
voice_id="geffen_32",
)

A successful call returns the audio payload:

Response
{
"audio_data": "example",
"audio_format": "wav",
"billable_characters_count": 10,
"speech_marks": {
"chunks": [
{}
],
"end": 1,
"end_time": 1,
"start": 1,
"start_time": 1,
"type": "example",
"value": "example"
}
}
The audio_data field is a base64-encoded string in the Python and TypeScript SDKs, same as in the raw HTTP response. Decode it before saving.

Request essentials

The speech endpoint takes a small, predictable set of fields.

FieldRequiredNotes
inputYesThe text (or SSML) to speak. Up to 2,000 spoken characters on the speech endpoint; SSML tags don’t count.
voice_idYesA built-in, curated, or cloned voice ID.
modelNoDefaults to simba-3.0. Use simba-3.2 for new English integrations.
audio_formatNoContainer for the audio: wav (default), mp3, ogg, aac or pcm.
output_formatNoContainer, sample rate and bitrate together, e.g. mp3_24000_128. Overrides audio_format. See Audio Formats.
For new integrations, set model: "simba-3.2". It serves every English voice in the catalog — your workspace’s cloned voices included — so any English voice_id from GET /v1/voices works (for example geffen_32). See Models.

Choose a voice

Call GET /v1/voices to list the voices your workspace can use - the shared catalog plus any voices you’ve cloned - then pass a voice’s id as the voice_id:

GET
/v1/voices
from speechify import Speechify
client = Speechify(
token="YOUR_TOKEN_HERE",
version="string",
)
client.voices.list(
cursor="string",
limit=50,
)

Popular built-in voices: george, henry, carly, sabrina.

Filter the list

Four optional query parameters narrow the results. Combine them freely. They are applied before pagination, so pages stay full.

ParameterValuesReturns
typepersonal, sharedYour cloned voices (personal) or the public catalog (shared). Omit for both.
localeA BCP-47 range, e.g. en or en-USVoices whose locale matches the range. Prefix-matched and case-insensitive: en matches en-US and en-GB; en-US matches en-US.
gendermale, female, not_specifiedVoices of that gender.
modelA model ID, e.g. simba-3.2Voices that advertise the model in their models[].

For example, list the catalog voices that speak English and support simba-3.2:

curl "https://api.speechify.ai/v1/voices?type=shared&locale=en&model=simba-3.2" \
-H "Authorization: Bearer $SPEECHIFY_API_KEY"

Page through the catalog

GET /v1/voices supports cursor pagination. For callers using API version 2026-07-16 or later, it returns a page even when limit is omitted (default page size 50, max 200). Each response carries a next_cursor and a has_more flag. To read the full catalog, request the next page with cursor set to the previous response’s next_cursor, and stop once has_more is false. Don’t assume a single response holds every voice - always follow has_more.

# First page
curl "https://api.speechify.ai/v1/voices?limit=100" \
-H "Authorization: Bearer $SPEECHIFY_API_KEY"
# Next page, using next_cursor from the previous response
curl "https://api.speechify.ai/v1/voices?limit=100&cursor=NEXT_CURSOR" \
-H "Authorization: Bearer $SPEECHIFY_API_KEY"

Next steps