API Get key

ByteDanceVideo

Seedance 2.0

4 to 15 s video with audio, from 480p to 4K.

Price
154 crper clip · 5 s · 720p
Usual time
≈ 3 min
Model id
video.seedance-2

Playground

Playground

4 - 15

Resolution

First frame

Sign in to upload a file.

More settings

Last frame

Sign in to upload a file.

Reference images

Sign in to upload a file.

Reference video

Sign in to upload a file.

Sign up to run it

Change the settings: the price and the code follow. You need an account to run it.

A real result from Seedance 2.0.

# 1. Create the job. It is charged once and refunded if it fails.
JOB_ID=$(curl -s -X POST https://staglight.ai/api/v1/jobs \
  -H "Authorization: Bearer $STAGLIGHT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "op": "video.seedance-2",
    "params": {
      "prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
      "duration": 5,
      "resolution": "720p",
      "aspect_ratio": "9:16"
    },
    "max_credits": 154
  }' | jq -r .id)

# 2. Poll until it finishes. Each call waits up to 30 seconds.
while :; do
  JOB=$(curl -s "https://staglight.ai/api/v1/jobs/$JOB_ID?wait=30" -H "Authorization: Bearer $STAGLIGHT_API_KEY")
  case "$(echo "$JOB" | jq -r .status)" in queued|running) ;; *) break ;; esac
done

# 3. Download the result from outputs[0].download_url.
DOWNLOAD_URL=$(echo "$JOB" | jq -r '.outputs[0].download_url')
curl -L -o result.mp4 "$DOWNLOAD_URL"
import os, uuid, requests

BASE = "https://staglight.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['STAGLIGHT_API_KEY']}"}

# 1. Create the job. It is charged once and refunded if it fails.
r = requests.post(f"{BASE}/jobs", timeout=60,
                  headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
                  json={
                    "op": "video.seedance-2",
                    "params": {
                      "prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
                      "duration": 5,
                      "resolution": "720p",
                      "aspect_ratio": "9:16"
                    },
                    "max_credits": 154
                  })
r.raise_for_status()
job = r.json()

# 2. Poll until it finishes. Each call waits up to 30 seconds.
while job["status"] in ("queued", "running"):
    job = requests.get(f"{BASE}/jobs/{job['id']}", headers=HEADERS,
                       params={"wait": 30}, timeout=60).json()

# 3. Download the result from outputs[0].download_url.
print(job["outputs"][0]["download_url"] if job["outputs"] else job["data"] or job["error"])
// Node 18 or newer. Save as run.mjs: top-level await needs a module.
const BASE = "https://staglight.ai/api/v1";
const headers = { Authorization: `Bearer ${process.env.STAGLIGHT_API_KEY}` };

// 1. Create the job. It is charged once and refunded if it fails.
let res = await fetch(`${BASE}/jobs`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({
    "op": "video.seedance-2",
    "params": {
      "prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
      "duration": 5,
      "resolution": "720p",
      "aspect_ratio": "9:16"
    },
    "max_credits": 154
  }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
let job = await res.json();

// 2. Poll until it finishes. Each call waits up to 30 seconds.
while (job.status === "queued" || job.status === "running") {
  job = await (await fetch(`${BASE}/jobs/${job.id}?wait=30`, { headers })).json();
}

// 3. Download the result from outputs[0].download_url.
console.log(job.outputs[0]?.download_url ?? job.data ?? job.error);
{
  "id": "job_19a2b3c4d5e6f7a8b9c0d1",
  "op": "video.seedance-2",
  "status": "queued",
  "credits": 154,
  "title": "",
  "params": {
    "prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "9:16"
  },
  "progress": null,
  "outputs": [],
  "data": null,
  "error": null,
  "run_id": null,
  "source": "api",
  "created_at": "2026-11-06T12:00:00Z",
  "finished_at": null,
  "eta_seconds": 182
}

What it costs

Duration (s)480p720p1080p4k
4 s57 cr123 cr306 cr624 cr
5 s72 cr154 cr383 cr780 cr
10 s143 cr308 cr765 cr1,560 cr
15 s214 cr462 cr1,148 cr2,340 cr

The playground shows the exact price for your settings. A job is charged once when it is accepted, and refunded if it fails. The price is checked again with your file before it runs.

Parameters

NameTypeDefaultAllowed
promptrequiredDescription string Up to 20,000 characters
durationDuration (s) integer 5 4 - 15
resolutionResolution enum 720p 480p, 720p, 1080p, 4k
aspect_ratioAspect ratio enum 9:16 9:16, 16:9, 1:1, 4:3, 3:4, 21:9, adaptive
soundSound boolean true
first_frameFirst frame media id Image
last_frameLast frame media id Image
reference_imagesReference images media id[] Image, up to 9
reference_videoReference video media id Video

Send these inside params. Files are media ids from POST /api/v1/uploads. View documentation

More models