Developers

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

BytePlusFirst-party international. $0.15 per output minute, 300 free minutes on activation. Business verification required. Best unit economics at volume
Volcano EngineFirst-party China. Invited beta via the Ark console; requires a China-verified account. Production pricing unpublished
fal.aiLicensed partner, self-serve signup, $0.1875 per output minute. Fastest way to a working key for individuals

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);

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.