Halloween sale · up to 40% off your first month + bonus credits, claimable daily

Claim it

Official BytePlus partnerBuilt on BytePlus, ByteDance's official AI platform

API

Text-to-speech API: turn text into speech with one request

A text-to-speech API with 45 voices in 14 languages and your own cloned voices: POST /v1/audio, $0.10 per 1,000 characters, mp3 or wav, with code.

KreatorFlow6 min read
A vintage studio microphone in a dark room with glowing golden sound waves flowing through the air
On this page
  1. Short answer
  2. Make your first voice clip in five steps
  3. What text to speech costs on the API
  4. What is the KreatorFlow text-to-speech API?
  5. Which voices and languages can you use?
  6. Can you use a cloned voice through the API?
  7. What goes in a /v1/audio speech request?
  8. How do you call the text-to-speech API with curl?
  9. How do you generate speech from Node.js?
  10. How do you generate speech from Python?
  11. How do you handle text longer than the limit?
  12. Can the same endpoint make sound effects and music?
  13. How is the text-to-speech API billed?
  14. How do you add the voice to a generated video?
  15. Frequently asked questions

Short answer

KreatorFlow's text-to-speech API is POST /v1/audio with model kreator-speech: send up to 5,000 characters of text and a voice id from GET /v1/voices, and get back an mp3 or wav. As of 17 October 2026 it costs $0.10 per 1,000 characters, started, from prepaid tokens, with 45 preset voices in 14 languages plus your own cloned voices.

Updated:

Make your first voice clip in five steps

  1. 1

    Create an API key and top up

    In the developer console, create a key with the audio:create, models:read and jobs:read scopes and top up prepaid tokens (1 token = $0.05, from $20).

  2. 2

    List the voices

    Call GET /v1/voices. It returns every usable preset voice with its id, name, language and description, plus your workspace's ready cloned voices.

  3. 3

    POST the text to /v1/audio

    Send model kreator-speech, a voice id and the text (up to 5,000 characters). Add format mp3 or wav; wav is the default for speech.

  4. 4

    Read the job

    Speech is made in the same call, so the 202 response usually already holds a completed job. If it is still processing, poll GET /v1/jobs/{job_id} or pass webhook_url.

  5. 5

    Download the audio

    Fetch GET /v1/jobs/{job_id}/output with your API key and save the file in your own storage.

What text to speech costs on the API

Speech is billed per started 1,000 characters (2 tokens each), the same rate the studio charges in credits. Prices as of 17 October 2026.

Text lengthTokensPrice
1,000 characters2 tokens$0.10
2,500 characters6 tokens$0.30
5,000 characters10 tokens$0.50

What is the KreatorFlow text-to-speech API?

It is a REST endpoint for voiceovers, narration, notifications and in-app speech. One endpoint, POST https://kreatorflow.ai/v1/audio, covers two models: kreator-speech for text to speech and kreator-sound for sound effects and music from a prompt. The model field picks which one runs.

It uses the same key, job object, status call and signed webhooks as the video and image endpoints, so voice can sit next to your Seedance video and Seedream images without a second provider. KreatorFlow is an official BytePlus partner, and the speech model runs on BytePlus.

Which voices and languages can you use?

GET /v1/voices lists 45 preset voices as of 17 October 2026, across English, Mandarin, Japanese, Spanish, Portuguese, Indonesian, French, German, Korean, Arabic, Russian, Italian, Vietnamese and Thai. English has 13, Mandarin has 8, Japanese has 3, Spanish has 3 and Portuguese has 3.

Some voices list emotions: Mira (neutral, happy, excited, calm) and Bianca (neutral, happy, sad, angry, surprised). Pass one in the emotion field, and emotion_scale to set its strength.

Each voice has a stable id, and that id is what the voice field takes. Call the endpoint at start-up and cache the list rather than hard-coding ids.

List voices

curl https://kreatorflow.ai/v1/voices \ -H "Authorization: Bearer $KREATORFLOW_API_KEY"

Can you use a cloned voice through the API?

Yes. Clone a voice once in the KreatorFlow audio studio (a one-time 60 credits there), and when it is ready it appears in GET /v1/voices with an id that starts with cloned:. Pass that id in the voice field like any preset voice.

Only clone a voice you own or have written permission to use. Cloned voices belong to your workspace and do not appear for anyone else.

What goes in a /v1/audio speech request?

model, voice and text are what most requests need. The rest is optional.

  • model: kreator-speech for speech (the default), or kreator-sound for sound effects and music.
  • text (or prompt): what to say, up to 5,000 characters. An empty text is refused with prompt_required.
  • voice (or voice_id): an id from GET /v1/voices. Speech without a voice is refused with voice_required.
  • format (or response_format): mp3 or wav. Speech defaults to wav, sound to mp3.
  • speed, volume and pitch: optional numbers to adjust the delivery.
  • emotion and emotion_scale: for voices that list emotions.
  • webhook_url (or callback_url): an HTTPS address for the finished job.
  • Idempotency-Key header: makes a retry safe, so a network error never bills the same clip twice.

How do you call the text-to-speech API with curl?

The response is a 202 with the job in data.job. For speech it is normally completed already; download it from the output endpoint.

curl

curl https://kreatorflow.ai/v1/audio \ -H "Authorization: Bearer $KREATORFLOW_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: welcome-vo-0001" \ -d '{ "model": "kreator-speech", "voice": "mira", "text": "Welcome back. Here is what is new in your workspace this week.", "format": "mp3" }'

How do you generate speech from Node.js?

This function sends the text, waits for the job if it is still running and returns the audio bytes, ready to save or stream to your player.

Node.js (18+)

const KEY = process.env.KREATORFLOW_API_KEY; const headers = { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" }; async function speak(text, voice) { const res = await fetch("https://kreatorflow.ai/v1/audio", { method: "POST", headers: { ...headers, "Idempotency-Key": crypto.randomUUID() }, body: JSON.stringify({ model: "kreator-speech", voice, text, format: "mp3" }), }).then((r) => r.json()); if (!res.success) throw new Error(res.code + ": " + res.error); let job = res.data.job; while (!["completed", "failed", "canceled", "blocked"].includes(job.status)) { await new Promise((resolve) => setTimeout(resolve, 2000)); job = (await fetch(`https://kreatorflow.ai/v1/jobs/${job.id}`, { headers }).then((r) => r.json())).data.job; } if (job.status !== "completed") throw new Error(job.errorCode ?? job.status); const audio = await fetch(`https://kreatorflow.ai/v1/jobs/${job.id}/output`, { headers }); return Buffer.from(await audio.arrayBuffer()); }

How do you generate speech from Python?

The same flow with the requests library.

Python

import os, time, uuid, requests H = {"Authorization": f"Bearer {os.environ['KREATORFLOW_API_KEY']}"} job = requests.post( "https://kreatorflow.ai/v1/audio", headers={**H, "Idempotency-Key": str(uuid.uuid4())}, json={"model": "kreator-speech", "voice": "mira", "text": "Your order has shipped.", "format": "wav"}, ).json()["data"]["job"] while job["status"] not in ("completed", "failed", "canceled", "blocked"): time.sleep(2) job = requests.get(f"https://kreatorflow.ai/v1/jobs/{job['id']}", headers=H).json()["data"]["job"] if job["status"] == "completed": open("shipped.wav", "wb").write(requests.get(f"https://kreatorflow.ai/v1/jobs/{job['id']}/output", headers=H).content)

How do you handle text longer than the limit?

Split it. One request takes up to 5,000 characters (10 tokens, $0.50), so cut longer scripts at sentence or paragraph boundaries, send each part with the same voice and settings, and join the files in order.

Billing rounds up per 1,000 characters started in each request, so parts close to a multiple of 1,000 characters waste nothing. Splitting at paragraph breaks also gives natural pauses where the files meet.

Can the same endpoint make sound effects and music?

Yes. Set model to kreator-sound and describe the sound in prompt (up to 3,000 characters): rain, a crowd, a whoosh, a short music bed. It costs $0.05 per 10 seconds of estimated output, with a $0.10 minimum per clip, and the quote is in the create response before anything runs.

Sound request body

{ "model": "kreator-sound", "prompt": "Gentle rain on a tin roof, distant thunder, no music", "format": "mp3" }

How is the text-to-speech API billed?

From prepaid tokens, with no subscription: 2 tokens ($0.10) per 1,000 characters started. One token is $0.05 and top-ups start at $20. The price is the same for every voice, preset or cloned, and for mp3 or wav.

It reuses the studio's own credit price, so a clip costs the same through the API as in the KreatorFlow audio studio. Reserved tokens are released if a job fails.

How do you add the voice to a generated video?

Two ways. Generate the speech here and lay it over your clip in your own editing pipeline, or upload the audio with POST /v1/uploads and pass it as an audio reference on a Seedance 2 video request, so the video is made to fit the track.

Frequently asked questions

How much does the KreatorFlow text-to-speech API cost?

$0.10 per 1,000 characters started (2 tokens at $0.05 each), from prepaid tokens with top-ups from $20. A full 5,000-character request costs $0.50.

How many voices does the API have?

45 preset voices in 14 languages as of 17 October 2026, plus any voices your workspace has cloned. GET /v1/voices returns the current list.

Which audio formats can I get?

mp3 or wav. Set format to choose; speech defaults to wav.

What is the maximum text length per request?

5,000 characters. Split longer scripts into several requests with the same voice.

Can I use my own voice?

Yes. Clone it in the KreatorFlow audio studio, then use its cloned: id from GET /v1/voices in the voice field. Only clone voices you own or have permission to use.

Is the speech generated synchronously?

Usually. The create call returns a 202 with the job, which is normally completed already. Handle the processing case by polling GET /v1/jobs/{job_id} or using a webhook.

Can I make sound effects with the same API?

Yes. Use model kreator-sound with a text prompt; it costs $0.05 per 10 seconds of estimated output, minimum $0.10.

Which API key scope does audio need?

audio:create to make clips, models:read for GET /v1/voices and jobs:read to check jobs and download the output.

Add a voice to your app

Create an API key, top up from $20 and send your first /v1/audio request. Every clip is quoted before it runs.

More guides