Seed Audio 2.0 API Documentation
Create complete audio scenes and poll generated results through one stable asynchronous API.
Last updated: July 21, 2026The Seed Audio 2.0 API is asynchronous. Submit a generation request, save the returned task ID, and poll the status endpoint until the task succeeds or fails. Dialogue, ambience, background music, and sound effects are composed behind one consistent interface.
Base URL
https://api.seedaudio.co/v2Authentication
Create an API key from your account settings. Send it as a Bearer token with every request.
Authorization: Bearer YOUR_API_KEYBilling
- Web and API requests use the same credit wallet.
- Audio is billed at 5 credits per generated minute, calculated from actual output duration.
- The minimum charge for a completed generation is 5 credits.
- Credits are reserved before generation; unused credits are returned after success.
- Failed tasks receive a full refund of their reservation.
Create a generation
POST /audio/generations
curl -X POST 'https://api.seedaudio.co/v2/audio/generations' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: seed-audio-request-001' \
-d '{
"model": "seed-audio-2.0",
"prompt": "Create a cinematic midnight radio scene with two quiet speakers, soft rain, distant traffic, and a restrained ambient score.",
"output_format": "mp3",
"sample_rate": 24000,
"speed": 1,
"volume": 1,
"pitch": 0
}'Successful submission returns HTTP 202:
{
"id": "audio_task_xxx",
"object": "audio.generation",
"model": "seed-audio-2.0",
"status": "processing",
"billing": { "reserved_credits": 5 },
"output": null,
"usage": null,
"error": null
}Request fields
| Field | Type | Required | Description |
|---|---|---|---|
model | string | yes | Must be seed-audio-2.0 |
prompt | string | yes | Audio-scene prompt, up to 2,048 characters |
voice | string | no | Supported preset voice ID |
audio_urls | string[] | no | Up to three public audio reference URLs |
image_url | string | no | One public image URL; cannot be combined with audio references |
output_format | string | no | mp3, wav, pcm, or ogg_opus; default mp3 |
sample_rate | number | no | 8000, 16000, 24000, 32000, 44100, or 48000 |
speed | number | no | Playback speed from 0.5 to 2 |
volume | number | no | Output volume from 0.5 to 2 |
pitch | number | no | Pitch adjustment from -12 to 12 |
Idempotency-Key is optional but strongly recommended. Reusing the same key with the same request returns the original task without another charge.Query task status
GET /audio/generations/{task_id}
curl 'https://api.seedaudio.co/v2/audio/generations/audio_task_xxx' \
-H 'Authorization: Bearer YOUR_API_KEY'Poll every 3–5 seconds. A successful task returns:
{
"id": "audio_task_xxx",
"object": "audio.generation",
"model": "seed-audio-2.0",
"status": "succeeded",
"output": {
"url": "https://cdn.seedaudio.co/v2/output.mp3",
"duration_seconds": 43.2,
"format": "mp3"
},
"usage": { "credits": 5 },
"error": null
}Possible statuses are queued, processing, succeeded, failed, and canceled.
JavaScript example
const headers = {
Authorization: `Bearer ${process.env.SEED_AUDIO_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
};
const created = await fetch("https://api.seedaudio.co/v2/audio/generations", {
method: "POST",
headers,
body: JSON.stringify({
model: "seed-audio-2.0",
prompt: "Build a cinematic city sound scene after midnight.",
output_format: "mp3",
}),
}).then((response) => response.json());
const task = await fetch(
`https://api.seedaudio.co/v2/audio/generations/${created.id}`,
{ headers: { Authorization: headers.Authorization } }
).then((response) => response.json());Python example
import os
import uuid
import requests
base_url = "https://api.seedaudio.co/v2"
headers = {
"Authorization": f"Bearer {os.environ['SEED_AUDIO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
}
created = requests.post(
f"{base_url}/audio/generations",
headers=headers,
json={
"model": "seed-audio-2.0",
"prompt": "Create a layered documentary sound scene.",
"output_format": "mp3",
},
).json()
task = requests.get(
f"{base_url}/audio/generations/{created['id']}",
headers={"Authorization": headers["Authorization"]},
).json()Errors
Errors use real HTTP status codes and a consistent response body.
{
"error": {
"code": "insufficient_credits",
"message": "At least 5 credits are required",
"request_id": "request_xxx"
}
}| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Invalid request parameters |
| 401 | invalid_api_key | Missing, invalid, or deleted API key |
| 402 | insufficient_credits | Not enough available credits |
| 403 | api_access_required | A paid plan or credit purchase is required |
| 404 | task_not_found | Task not found or belongs to another account |
| 409 | idempotency_conflict | Idempotency key reused with another request |
| 429 | rate_limit_exceeded | Requests are too frequent |