Skip to content

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-mini or seedance-2.5.
  • duration: 4 to 15 seconds on Seedance 2.0, 4 to 30 on 2.5.
  • resolution: 480p, 720p or 1080p, and 4K on 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

Seedance 2.0 price per second, per provider
ProviderOptionPrice5 s clipSource
Sume480p$0.0711 / s$0.3555Sume pricing (live from Sume's API catalog, 0% markup), checked
Sume720p$0.1538 / s$0.769Sume pricing (live from Sume's API catalog, 0% markup), checked
Sume1080p$0.3846 / s$1.923Sume pricing (live from Sume's API catalog, 0% markup), checked
Sume4K$0.78 / s$3.90Sume pricing (live from Sume's API catalog, 0% markup), checked
fal720p$0.3034 / s$1.517fal: Seedance 2.0, checked
fal1080p$0.682 / s$3.41fal: Seedance 2.0, checked
Replicate480p$0.08 / s$0.40Replicate: bytedance/seedance-2.0, checked
Replicate720p$0.18 / s$0.90Replicate: bytedance/seedance-2.0, checked
Replicate1080p$0.45 / s$2.25Replicate: bytedance/seedance-2.0, checked
Replicate4K$1.00 / s$5.00Replicate: bytedance/seedance-2.0, checked
kie.ai480pPaid in kie.ai credits$0.095 / s$0.475kie.ai pricing, checked
kie.ai720pPaid in kie.ai credits$0.205 / s$1.025kie.ai pricing, checked
kie.ai1080pPaid in kie.ai credits$0.51 / s$2.55kie.ai pricing, checked
WaveSpeedAI720pList price; a temporary discount may show on the page$0.24 / s$1.20WaveSpeedAI: Seedance 2.0, checked
WaveSpeedAI1080pList price; a temporary discount may show on the page$0.60 / s$3.00WaveSpeedAI: Seedance 2.0, checked
PiAPI720p$0.20 / s$1.00PiAPI docs: Seedance 2, checked
PiAPI1080p$0.50 / s$2.50PiAPI docs: Seedance 2, checked

Per clip, or in the provider's own unit

Seedance 2.0 price per clip or provider unit, per provider
ProviderOptionPriceSource
BytePlus ModelArk (ByteDance)480p, 5 s clipBilled per token; BytePlus's own 5 s example$0.35 / videoBytePlus 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 / videoBytePlus 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 / videoBytePlus 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 / videoBytePlus ModelArk: model pricing (5 s, 16:9 examples), checked

In a provider's own credits

Seedance 2.0 price in a provider's credits
ProviderOptionPriceSource
HiggsfieldWebsite, 720p, 5 s clipHiggsfield shows this as approximate (~)22 creditsHiggsfield pricing page, as a browser visitor sees it (Higgsfield shows different prices to different visitors), checked
HiggsfieldWebsite, 1080p, 5 s clipHiggsfield shows this as approximate (~)60 creditsHiggsfield 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

Seedance 2.5 price per second, per provider
ProviderOptionPrice5 s clipSource
Sume480p$0.1028 / s$0.514Sume pricing (live from Sume's API catalog, 0% markup), checked
Sume720p$0.2312 / s$1.156Sume pricing (live from Sume's API catalog, 0% markup), checked
Sume1080p$0.5686 / s$2.843Sume pricing (live from Sume's API catalog, 0% markup), checked
fal480pfal says "roughly": billed per token$0.2205 / s$1.1025fal: Seedance 2.5, checked
fal720pfal says "roughly": billed per token$0.473 / s$2.365fal: Seedance 2.5, checked
fal1080pfal says "roughly": billed per token$1.164 / s$5.82fal: Seedance 2.5, checked
Replicate480p$0.1028 / s$0.514Replicate: bytedance/seedance-2.5, checked
Replicate720p$0.2312 / s$1.156Replicate: bytedance/seedance-2.5, checked
kie.ai480pPaid in kie.ai credits$0.14 / s$0.70kie.ai pricing, checked
kie.ai720pPaid in kie.ai credits$0.315 / s$1.575kie.ai pricing, checked
kie.ai1080pPaid in kie.ai credits$0.79 / s$3.95kie.ai pricing, checked
WaveSpeedAI720pList price; a temporary discount may show on the page$0.36 / s$1.80WaveSpeedAI: Seedance 2.5, checked
WaveSpeedAI1080pList price; a temporary discount may show on the page$0.90 / s$4.50WaveSpeedAI: Seedance 2.5, checked
PiAPI720p$0.35 / s$1.75PiAPI: Seedance 2.5, checked
PiAPI1080p$0.80 / s$4.00PiAPI: Seedance 2.5, checked
HiggsfieldAPI, 480p (list)Before account discounts; its catalog showed 30% off with no end date$0.2056 / s$1.028Higgsfield API: Seedance 2.5 text-to-video, checked
HiggsfieldAPI, 720p (list)Before account discounts; its catalog showed 30% off with no end date$0.4622 / s$2.311Higgsfield API: Seedance 2.5 text-to-video, checked
HiggsfieldAPI, 1080p (list)Before account discounts; its catalog showed 30% off with no end date$1.1372 / s$5.686Higgsfield API: Seedance 2.5 text-to-video, checked

Per clip, or in the provider's own unit

Seedance 2.5 price per clip or provider unit, per provider
ProviderOptionPriceSource
BytePlus ModelArk (ByteDance)480p, 5 s clipBilled per token; BytePlus's own 5 s example$0.514 / videoBytePlus 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 / videoBytePlus 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 / videoBytePlus 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