Seedance 2.0 Fast via Dawnwood Models: $0.15/s at 720p, about 40% below fal.
In shortFour Seedance models — 2.0 Fast, 2.0 Mini, 2.0 and 2.5 — over one HTTP API that takes the BytePlus ModelArk request body as-is. You pay per second of generated video, only for generations that succeed. Sold by Dawnwood Inc., a US company, with Stripe invoices.
USD per second of output video, by resolution. Billed on the duration you request. 1080p and video-reference inputs are not offered yet.
| Model | 480p / s | 720p / s | 5 s clip, 720p | fal, 720p / s | vs fal |
|---|---|---|---|---|---|
| Seedance 2.0 Fast | $0.07 | $0.15 | $0.75 | $0.242 | 38% lower |
| Seedance 2.0 Mini | $0.047 | $0.10 | $0.50 | $0.155 | 35% lower |
| Seedance 2.0 | $0.078 | $0.167 | $0.835 | $0.303 | 45% lower |
| Seedance 2.5 | $0.118 | $0.254 | $1.27 | $0.473 | 46% lower |
fal prices are its public 720p rates as of 2026-10-13. Credits: 1 credit = $0.10, so a 5-second 720p Seedance 2.0 Fast clip is 7.5 credits. Full comparison across providers: Seedance API pricing compared.
Mint a key in the console under Developers (it is a Dawnwood personal access token, dw_pat_v1_…, with the model_api scope). Create a task, then poll it.
# 1. create a task
curl -s https://models.dawnwood.ai/v1/video/generations \
-H "Authorization: Bearer $DAWNWOOD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: shot-0001" \
-d '{
"model": "seedance-2.0-fast",
"content": [
{"type": "text", "text": "A woman in a red coat turns at the top of a rain-soaked stairwell, slow push-in"},
{"type": "image_url", "image_url": {"url": "https://example.com/lead.png"}, "role": "reference_image"}
],
"resolution": "720p", "ratio": "9:16", "duration": 5, "generate_audio": true
}'
# -> {"id": "cgt-dw-..."}
# 2. poll until status is succeeded / failed / cancelled
curl -s https://models.dawnwood.ai/v1/video/generations/cgt-dw-... \
-H "Authorization: Bearer $DAWNWOOD_API_KEY"
import os, time, requests
BASE = "https://models.dawnwood.ai/v1"
H = {"Authorization": f"Bearer {os.environ['DAWNWOOD_API_KEY']}"} # dw_pat_v1_...
task = requests.post(f"{BASE}/video/generations", headers=H, json={
"model": "seedance-2.0-fast",
"content": [{"type": "text", "text": "Two strangers share an umbrella at a night bus stop, handheld"}],
"resolution": "720p", "ratio": "9:16", "duration": 5, "generate_audio": True,
}).json()
while True:
t = requests.get(f"{BASE}/video/generations/{task['id']}", headers=H).json()
if t["status"] in ("succeeded", "failed", "cancelled"):
break
time.sleep(10)
print(t["content"]["video_url"] if t["status"] == "succeeded" else t["error"])
print(t["billing"]) # credits, usd, refunded
ModelArk: change the base URL and the key. POST /v1/contents/generations/tasks and GET /v1/contents/generations/tasks/{id} are aliases of the endpoints above, the body is the same model / content[] / resolution / ratio / duration / generate_audio, and the official dreamina-seedance-… model ids are accepted.
# before: BytePlus ModelArk
BASE = "https://ark.ap-southeast.bytepluses.com/api/v3"
KEY = os.environ["ARK_API_KEY"]
# after: Dawnwood Models (same path, same body, same task object)
BASE = "https://models.dawnwood.ai/v1"
KEY = os.environ["DAWNWOOD_API_KEY"] # dw_pat_v1_..., model_api scope
requests.post(f"{BASE}/contents/generations/tasks", headers={"Authorization": f"Bearer {KEY}"}, json=body)
fal: the prompt becomes a text item in content[], each image URL becomes an image_url item with a role, and aspect_ratio becomes ratio. Side-by-side code: Migrating Seedance from fal or ModelArk.
429 with a Retry-After header. Wait that many seconds and resubmit.Idempotency-Key header: a retried request with the same key returns the same task and is never charged twice.GET /v1/video/generations/{id} every 10 seconds or so; finished video URLs stay valid for 24 hours."refunded": true.402 paid_credits_required.Dawnwood Inc. is a US company and the API is sold under our Terms. They forbid generating a real person's likeness without authorization and sexual content. The upstream model runs its own moderation: when it rejects a request we return that rejection as-is and refund the credits. We do not offer a way around it.
$0.15 per output second at 720p and $0.07 at 480p. A 5-second 720p clip costs $0.75. Only successful generations are charged.
No. Credits are reserved when a task is created and returned in full if the task fails or is rejected upstream. The task's billing field shows refunded: true.
No. The API spends purchased credits only. Signup and gift credits and the credits included in a subscription are for the Dawnwood production pipeline and cannot be spent on the API; a request without enough purchased credits returns 402 paid_credits_required.
Yes. The request body and task object follow ModelArk's content-generation task format, and /v1/contents/generations/tasks is an alias of /v1/video/generations, so a ModelArk integration only changes its base URL and key. Official dreamina-seedance model ids are accepted too.
Each API key has a limit on tasks running at once. Past it, task creation returns 429 with a Retry-After header; wait that many seconds and resubmit with the same Idempotency-Key.
Dawnwood Inc., a US company. Credit purchases go through Stripe and come with Stripe receipts and invoices.
Our Terms forbid generating real people's likeness without authorization and sexual content. Requests rejected by the upstream model's moderation are returned with that rejection as-is; we do not offer a way around it.
Dawnwood is a studio for short-drama series: season bible, episode scripts, consistent characters and sets, rendering with QC, delivery. The same token that calls Dawnwood Models can drive that pipeline over its own API or MCP, so your agent works on episodes instead of stitching prompts together.