API guide
Seedance API
Working curl, Python and JavaScript for the Seedance 2.0 API, the cost of each call, and the price on every provider.
One call below makes a 4 s 480p Seedance 2.0 clip and costs $0.2844 on Sume. All options: Seedance pricing.
Code examples
Set your key first: export SUME_API_KEY=.... Each example prints the video's URL when it is ready; copy the file, because provider links can expire.
curl
Tested: we ran this exact code once on Nov 1, 2026, and it returned a video.
# The parentheses keep an error from closing your terminal if you paste this.
(
# Start the job. This is the call that costs money.
RESPONSE=$(curl -sS -X POST https://api.sume.com/v1/video-router/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"model": "seedance-2",
"prompt": "A glass of iced coffee on a wooden table, condensation running down the glass, slow push-in, soft morning light",
"resolution": "480p",
"duration": 4,
"aspect_ratio": "16:9",
"mode": "async"
}')
JOB_ID=$(echo "$RESPONSE" | jq -r '.data.job.id // empty' 2>/dev/null)
if [ -z "$JOB_ID" ]; then echo "Could not start the job: $RESPONSE" >&2; exit 1; fi
echo "Job: $JOB_ID"
# Wait for it. If this stops, read the same job again: don't start a new one.
while true; do
JOB=$(curl -sS https://api.sume.com/v1/jobs/$JOB_ID -H "Authorization: Bearer $SUME_API_KEY")
STATUS=$(echo "$JOB" | jq -r '.data.job.status // empty' 2>/dev/null)
case "$STATUS" in
completed) echo "$JOB" | jq -r '.data.job.result.artifacts[0].url'; exit 0 ;;
failed|canceled) echo "Job $JOB_ID $STATUS: $(echo "$JOB" | jq -c '.data.job.error')" >&2; exit 1 ;;
queued|processing) sleep 5 ;;
*) echo "Could not read job $JOB_ID: $JOB" >&2; exit 1 ;;
esac
done
)
Python
Tested: we ran this exact code once on Nov 1, 2026, and it returned a video.
import json, os, time, urllib.request, uuid
API = "https://api.sume.com"
HEADERS = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"], "Content-Type": "application/json"}
def call(path, body=None, headers={}):
data = None if body is None else json.dumps(body).encode()
request = urllib.request.Request(API + path, data=data, headers={**HEADERS, **headers})
with urllib.request.urlopen(request) as response:
return json.load(response)["data"]
# Start the job. This is the call that costs money.
job_id = call("/v1/video-router/generate", {
"model": "seedance-2",
"prompt": "A glass of iced coffee on a wooden table, condensation running down the glass, slow push-in, soft morning light",
"resolution": "480p",
"duration": 4,
"aspect_ratio": "16:9",
"mode": "async"
}, {"Idempotency-Key": str(uuid.uuid4())})["job"]["id"]
print("Job:", job_id)
# Wait for it. If this loop stops, read the same job again: don't start a new one.
while True:
job = call("/v1/jobs/" + job_id)["job"]
if job["status"] == "completed":
print(job["result"]["artifacts"][0]["url"])
break
if job["status"] in ("failed", "canceled"):
raise SystemExit(job["error"])
time.sleep(5)
JavaScript
Tested: we ran this exact code once on Nov 1, 2026, and it returned a video.
// Save this as video.mjs and run it with Node 20 or newer: node video.mjs
const API = "https://api.sume.com";
const headers = { Authorization: `Bearer ${process.env.SUME_API_KEY}`, "Content-Type": "application/json" };
async function call(path, init) {
const response = await fetch(API + path, { headers, ...init });
const json = await response.json();
if (!response.ok) throw new Error(JSON.stringify(json.error));
return json.data;
}
// Start the job. This is the call that costs money.
const { job: started } = await call("/v1/video-router/generate", {
method: "POST",
headers: { ...headers, "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({
"model": "seedance-2",
"prompt": "A glass of iced coffee on a wooden table, condensation running down the glass, slow push-in, soft morning light",
"resolution": "480p",
"duration": 4,
"aspect_ratio": "16:9",
"mode": "async"
}),
});
console.log("Job:", started.id);
// Wait for it. If this loop stops, read the same job again: don't start a new one.
while (true) {
const { job } = await call(`/v1/jobs/${started.id}`);
if (job.status === "completed") {
console.log(job.result.artifacts[0].url);
break;
}
if (job.status === "failed" || job.status === "canceled") throw new Error(JSON.stringify(job.error));
await new Promise((resolve) => setTimeout(resolve, 5000));
}
What you need
A Sume API key. Keep it on your server: never put it in a browser or an app.
The curl example also needs jq and uuidgen; the Python example uses only the standard library.
When a job fails
A job can fail after it starts, even with a prompt that worked before. One of our test runs on November 1, 2026 was refused with the message “the output audio may be related to copyright restrictions”. Sume refunded that job, and the same code worked when we ran it again.
Settings
model:seedance-2,seedance-2-fast,seedance-2-miniorseedance-2.5.duration: 4 to 15 seconds on Seedance 2.0, 4 to 30 on 2.5.resolution:480p,720por1080p, and4Kon Seedance 2.0.
The examples use the cheapest Seedance 2.0 settings, so a first test costs little. More about each model: Seedance 2.5, Seedance 2.0, Seedance 1.5 Pro.
Seedance 2.0 API price
Per second of video
| Provider | Option | Price | 5 s clip | Source |
|---|---|---|---|---|
| Sume | 480p | $0.0711 / s | $0.3555 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| Sume | 720p | $0.1538 / s | $0.769 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| Sume | 1080p | $0.3846 / s | $1.923 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| Sume | 4K | $0.78 / s | $3.90 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| fal | 720p | $0.3034 / s | $1.517 | fal: Seedance 2.0, checked |
| fal | 1080p | $0.682 / s | $3.41 | fal: Seedance 2.0, checked |
| Replicate | 480p | $0.08 / s | $0.40 | Replicate: bytedance/seedance-2.0, checked |
| Replicate | 720p | $0.18 / s | $0.90 | Replicate: bytedance/seedance-2.0, checked |
| Replicate | 1080p | $0.45 / s | $2.25 | Replicate: bytedance/seedance-2.0, checked |
| Replicate | 4K | $1.00 / s | $5.00 | Replicate: bytedance/seedance-2.0, checked |
| kie.ai | 480pPaid in kie.ai credits | $0.095 / s | $0.475 | kie.ai pricing, checked |
| kie.ai | 720pPaid in kie.ai credits | $0.205 / s | $1.025 | kie.ai pricing, checked |
| kie.ai | 1080pPaid in kie.ai credits | $0.51 / s | $2.55 | kie.ai pricing, checked |
| WaveSpeedAI | 720pList price; a temporary discount may show on the page | $0.24 / s | $1.20 | WaveSpeedAI: Seedance 2.0, checked |
| WaveSpeedAI | 1080pList price; a temporary discount may show on the page | $0.60 / s | $3.00 | WaveSpeedAI: Seedance 2.0, checked |
| PiAPI | 720p | $0.20 / s | $1.00 | PiAPI docs: Seedance 2, checked |
| PiAPI | 1080p | $0.50 / s | $2.50 | PiAPI docs: Seedance 2, checked |
Per clip, or in the provider's own unit
| Provider | Option | Price | Source |
|---|---|---|---|
| BytePlus ModelArk (ByteDance) | 480p, 5 s clipBilled per token; BytePlus's own 5 s example | $0.35 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
| BytePlus ModelArk (ByteDance) | 720p, 5 s clipBilled per token; BytePlus's own 5 s example | $0.76 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
| BytePlus ModelArk (ByteDance) | 1080p, 5 s clipBilled per token; BytePlus's own 5 s example | $1.87 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
| BytePlus ModelArk (ByteDance) | 4K, 5 s clipBilled per token; BytePlus's own 5 s example | $3.89 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
In a provider's own credits
| Provider | Option | Price | Source |
|---|---|---|---|
| Higgsfield | Website, 720p, 5 s clipHiggsfield shows this as approximate (~) | 22 credits | Higgsfield pricing page, as a browser visitor sees it (Higgsfield shows different prices to different visitors), checked |
| Higgsfield | Website, 1080p, 5 s clipHiggsfield shows this as approximate (~) | 60 credits | Higgsfield pricing page, as a browser visitor sees it (Higgsfield shows different prices to different visitors), checked |
Seedance 2.5 API price
Per second of video
| Provider | Option | Price | 5 s clip | Source |
|---|---|---|---|---|
| Sume | 480p | $0.1028 / s | $0.514 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| Sume | 720p | $0.2312 / s | $1.156 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| Sume | 1080p | $0.5686 / s | $2.843 | Sume pricing (live from Sume's API catalog, 0% markup), checked |
| fal | 480pfal says "roughly": billed per token | $0.2205 / s | $1.1025 | fal: Seedance 2.5, checked |
| fal | 720pfal says "roughly": billed per token | $0.473 / s | $2.365 | fal: Seedance 2.5, checked |
| fal | 1080pfal says "roughly": billed per token | $1.164 / s | $5.82 | fal: Seedance 2.5, checked |
| Replicate | 480p | $0.1028 / s | $0.514 | Replicate: bytedance/seedance-2.5, checked |
| Replicate | 720p | $0.2312 / s | $1.156 | Replicate: bytedance/seedance-2.5, checked |
| kie.ai | 480pPaid in kie.ai credits | $0.14 / s | $0.70 | kie.ai pricing, checked |
| kie.ai | 720pPaid in kie.ai credits | $0.315 / s | $1.575 | kie.ai pricing, checked |
| kie.ai | 1080pPaid in kie.ai credits | $0.79 / s | $3.95 | kie.ai pricing, checked |
| WaveSpeedAI | 720pList price; a temporary discount may show on the page | $0.36 / s | $1.80 | WaveSpeedAI: Seedance 2.5, checked |
| WaveSpeedAI | 1080pList price; a temporary discount may show on the page | $0.90 / s | $4.50 | WaveSpeedAI: Seedance 2.5, checked |
| PiAPI | 720p | $0.35 / s | $1.75 | PiAPI: Seedance 2.5, checked |
| PiAPI | 1080p | $0.80 / s | $4.00 | PiAPI: Seedance 2.5, checked |
| Higgsfield | API, 480p (list)Before account discounts; its catalog showed 30% off with no end date | $0.2056 / s | $1.028 | Higgsfield API: Seedance 2.5 text-to-video, checked |
| Higgsfield | API, 720p (list)Before account discounts; its catalog showed 30% off with no end date | $0.4622 / s | $2.311 | Higgsfield API: Seedance 2.5 text-to-video, checked |
| Higgsfield | API, 1080p (list)Before account discounts; its catalog showed 30% off with no end date | $1.1372 / s | $5.686 | Higgsfield API: Seedance 2.5 text-to-video, checked |
Per clip, or in the provider's own unit
| Provider | Option | Price | Source |
|---|---|---|---|
| BytePlus ModelArk (ByteDance) | 480p, 5 s clipBilled per token; BytePlus's own 5 s example | $0.514 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
| BytePlus ModelArk (ByteDance) | 720p, 5 s clipBilled per token; BytePlus's own 5 s example | $1.156 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
| BytePlus ModelArk (ByteDance) | 1080p, 5 s clipBilled per token; BytePlus's own 5 s example | $2.843 / video | BytePlus ModelArk: model pricing (5 s, 16:9 examples), checked |
Questions
- Is there an official Seedance API?
- Yes. ByteDance sells it through BytePlus ModelArk outside China and Volcengine in China. The resellers in the tables below sell it pay-as-you-go.
- Is the Seedance 2.0 API free?
- No. We found no free API tier: BytePlus's launch page lists paid plans, and the resellers charge per second or per clip. Our Seedance 2.0 page covers the free credits on Dreamina, which is a website rather than an API.
- Which Seedance model should I call?
- Seedance 2.5 costs more per second than 2.0 at the same resolution: $0.2312 / s against $0.1538 / s at 720p on Sume. Use 2.5 when you need clips over 15 seconds. To call it, change the model to seedance-2.5.
- Which provider should I use for the Seedance API?
- Compare the tables below for the resolution you need. We use Sume because it is the API Glidezo runs on, not because it is the cheapest for every option. On Replicate, 720p Seedance 2.0 costs $0.18 / s, and on fal $0.3034 / s.
- How long does a Seedance API call take?
- It's a job, not an instant answer: you start it, then read its status until it finishes. Don't start the job again because your wait timed out, or you may pay twice. Read the same job id again instead.
Sources
- Sume: Video Router (request fields) (checked 2026-11-01)
- Sume: jobs and results (status and polling) (checked 2026-11-01)
- BytePlus: Seedance 2.0 API launch page (checked 2026-11-01)