API: `pcm_16000` is 16 kHz audio from version `2026-09-30`
From API version 2026-09-30, output_format: pcm_16000 returns 16 kHz audio on every synthesis route: POST /v1/audio/stream, POST /v1/audio/stream/with-timestamps and POST /v1/audio/speech.
What was wrong. On the Simba 3 models, pcm_16000 returned 24 kHz audio while the Content-Type said rate=16000. Played at the labelled rate, speech ran 1.5x slow and pitched down.
API: voice cloning requires verified consent on every API version
The consent form field on POST /v1/voices is switched off, on every API version, whatever your workspace is pinned to. Creating a cloned voice now requires proof that the speaker agreed: a consent challenge, and a recording of the speaker reading the phrase it issues. This is the switch-off the 2026-08-13 entry announced and said would be dated here.
API: Simba 1.6 is retired at version `2026-09-21` and served by current models from 2026-11-21
simba-english and simba-multilingual - the Simba 1.6 pair - are being withdrawn in two steps:
- From API version
2026-09-21they are no longer selectable. Naming either returns400with the error codemodel_retired. - On 2026-11-21 both ids are served by our current models instead of their Simba 1.6 training. They keep answering on every API version that can still name them; what changes is the model behind the id, not your integration.
API: simba-3.2 serves every English voice
simba-3.2 no longer requires a voice to be registered for it. Every English voice in GET /v1/voices now synthesises on it, your workspace’s own cloned voices included, and each voice’s models array lists it. Before today it served eight registered voices out of a catalogue of nearly a thousand, and any other voice returned 400.
Nothing about the request changes, and nothing you already send breaks: the eight voices built for the model are served by exactly the training they were before, and every other voice is served by the model’s zero-shot training — the same one that has served cloned voices on simba-3.2 since 2026-08-26. Which training runs is an internal routing detail; the request, the response, the latency class and the audio format are identical either way.
API: watermark verification with no credential
A new endpoint answers whether a clip carries a Speechify watermark without any credential. POST /v1/audio/watermark/verify takes the same audio upload as POST /v1/audio/watermark/detect and returns a bare {"watermarked": true|false} — no key, no session, nothing to authenticate.
It is the API half of the public tool at speechify.ai/detect, and it exists because California’s AI Transparency Act (BPC 22757.2) requires a detection tool that is publicly accessible and invokable without visiting a website.
API: watermark detection with your API key
POST /v1/audio/watermark/detect now answers, for any credentialed workspace, whether a clip carries the watermark Speechify seals into the audio it generates. This check was previously operator-only; it is now on the API and in the console. Upload the clip as audio (multipart/form-data, at most 25MB) and get back WatermarkDetectionResponse — { watermarked, confidence }, with confidence a score in [0, 1]. Nothing about the upload is stored, and no voice is read or written.
API: `simba-3.2` voice cloning is now self-serve for every workspace
Cloned (personal) voices synthesize on simba-3.2 for every workspace, with no enablement step. The limited release announced on 2026-08-06 is over and the per-workspace allow-list behind it is gone; you no longer need to contact us.
Nothing else changes. The request and response are identical to a stock-voice call, and simba-3.2 remains English only, so a cloned voice with a non-English locale still returns 400 — use simba-3.0 for those. GET /v1/voices now names simba-3.2 on your cloned voices without any per-workspace condition, and driving a picker off each voice’s models array remains the right pattern. Cloning on simba-3.0, simba-english and simba-multilingual is unchanged.
API: Projects — group resources, scope credentials, and attribute spend
The /v1/projects endpoints are now in the public API reference. A project groups the resources you create inside a workspace and the spend you incur from them, so one workspace can run several environments or several end customers without splitting into separate accounts.
Every workspace has an implicit Default project: any resource with no project lives there, and nothing you already send changes — the surface is additive and opt-in.
API: default MP3 output is now 128 kbps
Requests that ask for MP3 without naming a bitrate now receive 128 kbps instead of 64 kbps. That is audio_format: "mp3" on POST /v1/audio/speech and POST /v1/audio/dialogue, and Accept: audio/mpeg on POST /v1/audio/stream and POST /v1/audio/stream/with-timestamps. The sample rate, channel count, duration and container are unchanged: 24 kHz mono MP3, as before.
API: maximum-fidelity mp3, and a fix for the 22.05 kHz formats
output_format gains mp3_22050_160 and mp3_24000_160, the highest-fidelity mp3 the format can carry: 160 kbps is the ceiling at these sample rates, so there is no higher mp3 to ask for. A request for mp3_22050_192 or mp3_24000_192 was always encoded at 160 kbps, and the response now reports the mp3_*_160 it actually delivered rather than echoing the 192 back. Nothing about those two requests changes on the wire except the reported value, and no existing integration has to move.
API: consent recordings are matched against the voice being cloned
Consent verification now checks who is speaking, not only what they said. A create whose consent_recording reads the phrase correctly but in a different voice from your sample is refused with 422 consent_speaker_mismatch and no voice is created.
This closes the gap the flow was always meant to close: the person consenting has to be the person being cloned, so permission relayed by somebody else - an account holder reading the phrase on a speaker’s behalf - does not pass.
API: voice cloning now verifies the speaker's consent
Creating a cloned voice now requires proof that the speaker agreed to it, in place of the consent object you used to send.
The flow adds one call in front of your existing create. POST /v1/voices/consent-challenges with the speaker’s full_name returns a phrase and an id. Show the phrase to the speaker exactly as it comes back, record them reading it aloud, and send that recording as consent_recording with consent_challenge_id on POST /v1/voices. Speechify transcribes the recording, checks it against the phrase it issued, and keeps it as the consent record for that voice.
API: text is screened before synthesis
Text you send for synthesis is now screened before Speechify produces audio from it. A request whose content is not permitted returns 400 content_policy_violation with no audio, and is not billed. This applies to /v1/audio/speech, /v1/audio/stream and /v1/audio/stream/with-timestamps.
Most published work is unaffected - fiction, journalism, true crime and court reporting routinely describe or quote violence, and depicting that material is treated differently from producing it.
API: `simba-3.2` voice cloning enters limited release
Cloned (personal) voices now synthesize on simba-3.2 for workspaces enabled for it, with no per-voice step. The earlier per-voice-key approval is gone: enablement is per workspace, and once yours is on, every clone you own works there. Contact us to be enabled.
Nothing else changes. The request and response are identical to a stock-voice call, and simba-3.2 remains English only, so a cloned voice with a non-English locale still returns 400 — use simba-3.0 for those. GET /v1/voices names simba-3.2 on your cloned voices once your workspace is enabled, so drive a picker off each voice’s models array rather than assuming. Cloning on simba-3.0, simba-english and simba-multilingual is unchanged.
API: `simba-3.0` becomes the default; `simba-3.2` is the newest model
simba-3.0 is the default model — the one you get when you don’t provide one — but the newest model is simba-3.2. We recommend simba-3.2 for English integrations; simba-3.0 stays the default for the compatibility reasons below. For the current list of every text-to-speech model live today, see Models.
POST /v1/audio/speech, POST /v1/audio/stream and POST /v1/audio/stream/with-timestamps now resolve a request that omits model to simba-3.0 instead of the legacy simba-english. GET /v1/audio/models marks the change on its default flag.
Models list now reports per-model endpoints and curated-voice flag
GET /v1/audio/models now returns two new fields for each model:
endpoints— the synthesis routes this model may be passed to. Passing a model to an endpoint itsendpointslist omits returns 400.curated_voices— whentrue, only voices that explicitly name this model in theirmodelsarray are accepted. Whenfalse, every catalogue voice works, including workspace clones.
API: Free tier gets a burst allowance on `/v1/audio/*`
The Free plan’s TTS rate limit no longer caps its burst bucket at the sustained rate. Previously Free was 1 request/second with a bucket capacity of 1, so a second request issued in the same second was rejected with 429. Free now gets a burst capacity of 10, so a normal opening burst of requests (a quickstart script, a first integration test) no longer trips the limiter.
API: canonical `Speechify-*` header names (legacy `X-` aliases still work)
Every header in Speechify’s public API surface now has one canonical, un-prefixed Speechify-* name (RFC 6648). The pre-2026 X--prefixed spellings are unaffected today - they’re still accepted on requests and still emitted on responses - and will keep working until 2027-07-24.
API: stream speech marks with `POST /v1/audio/stream/with-timestamps`
A new endpoint streams word-level speech marks alongside audio, so text highlighting, captions, and audio-text sync no longer need the batch POST /v1/audio/speech round trip. POST /v1/audio/stream is unchanged - same request body, still plain audio.
API: `simba-3.0` now synthesizes six European languages
simba-3.0 is no longer English-only. It now officially supports English plus German, Spanish (Spain and Mexico), French, Italian and Brazilian Portuguese:
Nothing changes in your request shape. Keep passing model: "simba-3.0" and set the language parameter to the language of your input; when you omit language, the voice’s own locale decides. English and non-English are served by two separate trainings behind the scenes, but that routing is internal, so the model ID you pass never changes.