Building blocks
Text-to-speech
Turn text into speech audio with one of your voices. Useful on its own, and the same voice model video jobs use when you pass them a script.
Synthesize speech
Costs 10 credits per started 1,000 characters (minimum 10), charged immediately and refunded if synthesis fails. The voice_id must be one of yourvoices — someone else's id returns 404.
Since 1.1.0, /tts uses the v4 voice model. The request is the same, but voices sound different from before — re-check anything you tuned by ear.
| Field | Type | Description |
|---|---|---|
| voice_id | string required | From POST /voices — cloned or library. |
| text | string ≤5000 required | What to say, spoken verbatim. |
| language | string | Spoken language — ISO code or name ("ar", "spanish"). |
| language_code | string | Older spelling of the language hint, e.g. en. Still accepted. |
| voice_settings | object | stability, similarity_boost, style (0–1), speed (0.7–1.2). Out-of-range values are clamped. Omit for tuned defaults. |
curl -X POST https://platform.promoat.ai/api/partner/v1/tts \
-H "Authorization: Bearer $PROMOAT_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_id": "VOICE_ID",
"text": "Welcome back! Here is what is new this week.",
"language": "en",
"voice_settings": { "stability": 0.4, "similarity_boost": 0.75, "style": 0.3, "speed": 1.1 }
}'{
"audio_url": "https://…/tts-audio.mp3",
"duration_sec": 4.02,
"asset_id": "…",
"characters": 44,
"credits_charged": 10
}A 600-character text costs 10 credits. If the voice no longer works (for example an expired clone), you get 409:
{ "error": "VOICE_UNAVAILABLE", "error_code": "VOICE_UNAVAILABLE", "code": "voice_not_found",
"message": "This voice is no longer available. Re-clone it or use another voice.", "voice_state": "expired" }voice_state is expired or missing. Fix an expired clone with re-clone.
When to call this directly
- Preview a voice before committing a video to it.
- Audio-only products — voice notes, IVR lines, podcast inserts.
- Reusable narration: pass the
audio_urlto a video, or theasset_idastts_asset_idto fix-sound.
For a one-off video you can skip this endpoint — POST /videos with a script makes the speech inside the job.