Cheaper Gen.
ByteDanceTutorial

How to Use Seedance 2.0 API

A step-by-step Seedance 2.0 API tutorial with Python, Node.js and cURL: submit a text to video job, poll it or receive a webhook, and download the video. The example below costs $0.61.

Endpoints
3
Text to Video · Image to Video · Reference to Video
Example request
$0.61
Text to Video
Languages
3
Python · Node.js · cURL
Failed runs
$0
refunded automatically
1

Get an API key

Create an account, add credits (from $10) and create a key in Dashboard → API keys. Store it as CHEAPERGEN_API_KEY on your server. Every request sends it as a bearer token.

How to get a Seedance 2.0 API key
2

Choose a Seedance 2.0 endpoint

Each task has its own endpoint. All of them take a JSON body and return a generation you can poll.

Seedance 2.0 API endpoints, required inputs and prices
TaskEndpointRequiredFrom
Text to Videobytedance/seedance-2.0/text-to-videoprompt$0.0569/s
Image to Videobytedance/seedance-2.0/image-to-videoprompt, image_url$0.0569/s
Reference to Videobytedance/seedance-2.0/reference-to-videoprompt$0.0569/s
3

Submit a text to video job

This program submits the job, polls every 3 seconds until it finishes and prints the video URL. Swap the prompt and settings for your own.

import os, time, requests

API = "https://cheapergen.com/api/v1"
headers = {"Authorization": f"Bearer {os.environ['CHEAPERGEN_API_KEY']}"}

# 1. Submit the job
job = requests.post(f"{API}/run/bytedance/seedance-2.0/text-to-video", headers=headers, json={
    "prompt": "A slow dolly-in on a ceramicist shaping a vase at golden hour, dust in the light, shallow depth of field",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 5
}).json()

# 2. Poll until it finishes (or pass "webhook_url" and skip polling)
while job["status"] in ("queued", "running"):
    time.sleep(3)
    job = requests.get(f"{API}/generations/{job['id']}", headers=headers).json()

print(job["status"], job["output"]["video"]["url"] if job["status"] == "succeeded" else job["error"])
4

Set the parameters that matter

The settings for bytedance/seedance-2.0/text-to-video, with what each one does to the price.

Seedance 2.0 Text to Video parameters and their effect on price
ParameterType · defaultWhat it doesPrice effect
aspect_ratiostring (enum) · 16:9Output frame shape.
16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9
16:9: $0.0569/s
resolutionstring (enum) · 720pOutput resolution. Higher resolutions cost more per second.
480p · 720p · 1080p · 4k
480p: $0.0569/s
720p: $0.1223/s
1080p: $0.3049/s
4K: $0.6218/s
durationinteger · 5Length of the generated clip in seconds (4–15s). You pay per second.Billed per second
generate_audioboolean · trueGenerate synchronized sound, ambience and dialogue. No extra cost.None
seedintegerUse the same seed and settings to reproduce a result. Leave empty for random.None

Other Seedance 2.0 endpoints take the same shape with their own inputs:

POST /api/v1/run/bytedance/seedance-2.0/image-to-video

{
  "prompt": "The camera pushes in as she turns and smiles; hair moves in the wind",
  "image_url": "https://cdn.cheapergen.com/samples/portrait.jpg",
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "duration": 5
}

POST /api/v1/run/bytedance/seedance-2.0/reference-to-video

{
  "prompt": "@Image1 unboxes the product from @Image2 on a marble desk, copying the camera move of @Video1",
  "reference_image_urls": [
    "https://cdn.cheapergen.com/samples/reference-1.jpg",
    "https://cdn.cheapergen.com/samples/reference-2.jpg"
  ],
  "reference_video_urls": [
    "https://cdn.cheapergen.com/samples/reference-1.mp4"
  ],
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "duration": 5
}
5

Get the result

A job moves from queued to running to succeeded, failed or canceled. Poll GET /api/v1/generations/{id}, or pass webhook_url and we POST the result to you. Download the output and store it yourself.

200 — succeeded
{
  "id": "gen_8c2QmX1nq0k4",
  "object": "generation",
  "model": "bytedance/seedance-2.0",
  "endpoint": "bytedance/seedance-2.0/text-to-video",
  "mode": "text-to-video",
  "status": "succeeded",
  "input": {
    "prompt": "A slow dolly-in on a ceramicist shaping a vase at golden hour, dust in the light, shallow depth of field",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 5
  },
  "output": {
    "video": {
      "url": "https://cdn.cheapergen.com/outputs/gen_8c2Q.mp4",
      "content_type": "video/mp4",
      "duration": 5,
      "width": 1280,
      "height": 720
    }
  },
  "error": null,
  "cost": {
    "amount_usd": 0.2255,
    "currency": "usd",
    "estimated": false,
    "official_usd": 0.264,
    "saved_usd": 0.0385
  },
  "source": "api",
  "created_at": "2026-10-15T09:21:04Z",
  "started_at": "2026-10-15T09:21:06Z",
  "completed_at": "2026-10-15T09:22:31Z"
}
Verify webhook signatures
6

Price a request before you run it

The quote endpoint is free and needs no key. It returns the price, the official price and your discount for exactly the input you send.

curl -X POST https://cheapergen.com/api/v1/quote/bytedance/seedance-2.0/text-to-video \
  -H "Content-Type: application/json" \
  -d '{"prompt":"A slow dolly-in on a ceramicist shaping a vase at golden hour, dust in the light, shallow depth of field","aspect_ratio":"16:9","resolution":"720p","duration":5}'
API errors and what to do
StatusCodeMeaning
400invalid_requestA parameter is missing or out of range — the message names it.
401unauthorizedMissing, malformed or revoked API key.
402insufficient_balanceNot enough credits for the quoted price; top up or enable auto top-up.
429rate_limitedToo many requests or generations in progress; back off and retry.
502upstream_errorThe model provider failed; the hold is refunded and you can retry.
503model_unavailableNo healthy route right now; retry later or pick another model.
Full Seedance 2.0 API documentation

FAQ

Seedance 2.0 API questions

No. The API is plain HTTPS with JSON, so the Python (requests) and Node.js (fetch) examples on this page are complete programs. Any language that can send an HTTP request works.

Yes. Add "webhook_url" to the request body and we POST the finished generation to it, signed with a CheaperGen-Signature header (HMAC-SHA256 of the timestamp and raw body). Polling GET /api/v1/generations/{id} works too.

Pass public URLs in "image_url", "end_image_url", "reference_image_urls", "reference_video_urls", "reference_audio_urls". Files without a public URL can be uploaded first with POST /api/v1/uploads, which returns a URL to use in the request.

Typical 5-second clips finish in about one to three minutes depending on resolution and queue load. You can poll the task or receive a webhook when it completes.

Text to Video starts at $0.0569/s; the example request on this page costs $0.61, 19% below the official price. Failed generations are refunded automatically.