Short answerDawnwood Models is a per-second Seedance video API at https://models.dawnwood.ai/v1. Create a task with POST /v1/video/generations (or the ModelArk-compatible alias /v1/contents/generations/tasks), then poll GET /v1/video/generations/{id} until it succeeds. Authenticate with a Dawnwood personal access token that has the model_api scope. Only successful generations are charged, from purchased credits only. It is separate from the production pipeline API at console.dawnwood.ai/api.
https://models.dawnwood.ai/v1Authorization: Bearer dw_pat_v1_…model_api scope. Mint one in the console under Developers; tokens minted elsewhere for the pipeline API have the pipeline scope and get 403 here.| Method | Path | What it does |
|---|---|---|
| POST | /v1/video/generations | Create a generation task. Returns the new task; its id looks like cgt-dw-… |
| GET | /v1/video/generations/{id} | Get a task |
| POST | /v1/contents/generations/tasks | Alias of the create call (ModelArk path) |
| GET | /v1/contents/generations/tasks/{id} | Alias of the get call (ModelArk path) |
| GET | /v1/models | Models, limits and prices. No authentication |
| GET | /v1/models/usage | Your usage and spend for a date range: totals, per day, per model, per key. format=csv for one row per request |
POST /v1/video/generations
Authorization: Bearer dw_pat_v1_...
Idempotency-Key: shot-0001
{"model": "seedance-2.0-fast",
"content": [{"type": "text", "text": "..."},
{"type": "image_url", "image_url": {"url": "https://..."}, "role": "reference_image"}],
"resolution": "720p", "ratio": "9:16", "duration": 5, "generate_audio": true, "seed": 42}
| Field | Values |
|---|---|
model | seedance-2.0-fast, seedance-2.0-mini, seedance-2.0, seedance-2.5. Official dreamina-seedance-… ids are accepted and echoed back as the short id |
content[] | At most one text item. image_url items with role first_frame, last_frame or reference_image (up to 9 on the 2.0 models, 30 on 2.5). audio_url items with role reference_audio (up to 3 on 2.0, 10 on 2.5). First/last frames and reference images cannot be mixed in one task. video_url is not supported yet |
resolution | 480p or 720p |
ratio | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive |
duration | Whole seconds: 4–15 on the 2.0 models, 4–30 on 2.5. You are billed on this value |
generate_audio | true or false |
seed | Optional integer |
Send an Idempotency-Key header: a retried request with the same key returns the same task and is not charged again.
{"id": "cgt-dw-...", "model": "seedance-2.0-fast",
"status": "queued | running | succeeded | failed | cancelled",
"content": {"video_url": "https://..."},
"usage": {"completion_tokens": 108500, "total_tokens": 108500},
"resolution": "720p", "ratio": "9:16", "duration": 5,
"created_at": 1760000000, "updated_at": 1760000060,
"error": {"code": "...", "message": "..."},
"billing": {"credits": 7.5, "usd": 0.75, "refunded": false}}
Poll about every 10 seconds. content.video_url appears when status is succeeded and stays valid for 24 hours, so download it. error is set when the task failed. billing.refunded is true when the reserved credits were returned.
Error bodies have ModelArk's shape: {"error": {"code": "…", "message": "…"}}.
| Status | Code | Meaning |
|---|---|---|
| 400 | InvalidParameter | A field is missing or out of range |
| 400 | unsupported_content | A content type not supported yet, such as video_url |
| 401 | Token missing, malformed, expired or revoked | |
| 402 | paid_credits_required | Not enough purchased credits. Signup, gift and subscription-included credits cannot be spent on the API |
| 403 | Token lacks the model_api scope | |
| 429 | concurrency_limit | Your key's concurrency limit is reached. Wait for Retry-After seconds and resubmit |
| 429 | spend_limit_reached | The request would go over a spend limit you set (see below). scope is day, month or key; Retry-After is the time until that limit resets. Nothing is charged |
| 503 | models_not_open | Model access is not open for this account yet |
When the upstream model's moderation rejects a request, you get that rejection as-is — either as an error on the create call or as a failed task with the rejection in error — and the credits are refunded. There is no way around upstream moderation. A 502 upstream_error on create means the upstream model refused the submission for another reason; nothing is charged.
USD per second of output, billed on the requested duration, only for successful generations. 1 credit = $0.10.
| Model | 480p | 720p |
|---|---|---|
| seedance-2.0-fast | $0.07 | $0.15 |
| seedance-2.0-mini | $0.047 | $0.10 |
| seedance-2.0 | $0.078 | $0.167 |
| seedance-2.5 | $0.118 | $0.254 |
Live prices are also returned by GET /v1/models. Comparison with other providers: dawnwood.ai/models.
The console's Developers tab shows spend for the last 7, 30 or 90 days: totals, a bar per day, a table per model, a filter by API key, and a Download CSV button with one row per request. Days are UTC.
The same report is available over the API:
curl "https://models.dawnwood.ai/v1/models/usage?start=2026-10-01&end=2026-10-31" \
-H "Authorization: Bearer $DAWNWOOD_API_KEY"
| Parameter | Meaning |
|---|---|
start, end | UTC dates, both included. Default: the last 30 days. At most 92 days per call |
key_id | Only requests made with that key |
format | csv returns one row per request: created_at, id, model, status, resolution, ratio, duration_s, billed_seconds, credits, usd, refunded, key_id, key_name |
The JSON has totals, daily (every day in the range, including days with no requests), by_model and by_key. Each has requests, succeeded, failed, in_progress, billed_seconds, credits and usd. Spend counts every request that wasn't refunded. A running request counts until it settles. If it then fails, it is refunded and drops out.
In the console's Developers › Limits & alerts you can set, in USD:
A request that would go over any of them is refused with 429 spend_limit_reached before anything is charged. A request that fails is refunded and stops counting against the limit. Limits can only be changed in the console, not with an API key, so a leaked key can't raise its own cap.
The same card has a low-balance email: we send one email when your API balance drops below the amount you choose ($5 unless you change it; leave it empty to turn it off). It sends again only after a top-up brings the balance back above that amount.
Auto-recharge tops your balance up from your card on file when it drops below an amount you choose. For example, "below $10, add $50". Each recharge is $10–$1,000, credited at the same rate as a top-up (1 credit = $0.10), and you get a Stripe receipt by email. If a request would cost more than your balance, we recharge first and then run it. There are at most 5 recharges a day, and only one at a time. If a payment fails, auto-recharge turns itself off and we email you, so a declined card isn't retried. To add a card, use Add a card on the same card. It's a $0 check.
Dawnwood has two APIs on the same account and wallet. Dawnwood Models (this page) sells raw Seedance generations per second. The pipeline API at console.dawnwood.ai/api (see connecting your agent over MCP) runs whole series — bible, scripts, characters, rendering with QC — and is billed per result. A token can carry both scopes.
Still stuck? Email support@dawnwood.ai with your account email, the series, the episode and the segment or group — see what to include.