Seed-Audio 1.0 API access, mapped.
There is no public SDK and no open weights. There are three legitimate ways to call the model today, and they differ in onboarding friction more than in capability.
The three routes
The request shape
All first-party routes share the same core contract: a synchronous POST that returns base64 audio. Only the host differs (Volcano is openspeech.bytedance.com; BytePlus is voice.ap-southeast-1.bytepluses.com). The raw HTTP form:
POST /api/v3/tts/create
X-Api-Key: <your key>
Content-Type: application/json
{
"model": "seed-audio-1.0",
"text_prompt": "A 1940s radio drama cold open...",
"audio_config": { "format": "mp3", "sample_rate": 48000 }
}
// response: { "audio": "<base64>", "original_duration": 15.1 }Python
import base64, json, os, urllib.request
req = urllib.request.Request(
"https://openspeech.bytedance.com/api/v3/tts/create",
data=json.dumps({
"model": "seed-audio-1.0",
"text_prompt": "A weary detective and a nervous officer trade "
"clipped lines in an interrogation room. Fluorescent "
"hum and distant traffic under the voices.",
"audio_config": {"format": "mp3", "sample_rate": 48000},
}).encode(),
headers={"X-Api-Key": os.environ["SEED_AUDIO_KEY"],
"Content-Type": "application/json"},
)
body = json.loads(urllib.request.urlopen(req, timeout=180).read())
open("scene.mp3", "wb").write(base64.b64decode(body["audio"]))
print("billed seconds:", body["original_duration"])Node.js
import { writeFileSync } from "node:fs";
const res = await fetch("https://openspeech.bytedance.com/api/v3/tts/create", {
method: "POST",
headers: {
"X-Api-Key": process.env.SEED_AUDIO_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "seed-audio-1.0",
text_prompt: "Two street vendors argue playfully over the last crate of "
+ "mangoes at a busy night market. Crowd chatter behind them.",
audio_config: { format: "mp3", sample_rate: 48000 },
}),
});
const body = await res.json();
writeFileSync("scene.mp3", Buffer.from(body.audio, "base64"));
console.log("billed seconds:", body.original_duration);- Billing follows
original_duration, by the second. - Takes are capped at 120 seconds; chain takes for long-form.
text_promptholds up to ~2,000 characters; voiced text reads best under about 400.- Reference audio for cloning: up to 3 clips of 30s, cited as @Audio1 to @Audio3 in the prompt.
- Explicit and metadata watermark flags exist and default to off on the first-party API.
- For self-serve without a Volcano or BytePlus account, fal.ai wraps the same model with its own client and queue; see fal’s docs for that request shape.
Before you build on a relay
Aggregators resell access below official rates, sometimes by billing input characters instead of output minutes. That pricing inverts their margin on exactly the prompts this model is best at, so treat any too-cheap rate as temporary. If uptime matters, hold a first-party key as fallback. The full math is on the pricing page.
No key yet? Evaluate first
Getting a first-party key takes account verification, and fal needs a signup. If you just want to hear whether the model fits your project, the playground renders real takes with no onboarding, and the prompt library shows the exact prompt behind every sample so you can copy a working structure into your own calls.