how to use Seedance API: submit, poll, and handle the failure case
Submit
curl -X POST https://genace.ai/api/v1/video/generations \
-H "Authorization: Bearer $GENACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"seedance-2.0-fast","prompt":"..."}'
The model id is exactly seedance-2.0-fast — a typo here returns
400 UNKNOWN_MODEL naming what you sent.
You get 202 Accepted with a job, not a video:
{
"job_id": "abc123",
"state": "queued",
"model": "seedance-2.0-fast",
"credits_held": 25
}
credits_held is what this call reserved. It comes back in full if the job
fails or you cancel it.
Collect the result
curl "https://genace.ai/api/v1/jobs/abc123?wait=30" \
-H "Authorization: Bearer $GENACE_API_KEY"
wait blocks server-side for up to N seconds. There are three other ways to
collect — webhook, SSE and a cron backstop — and which to use depends on what
is calling you. See
webhook vs polling.
The failure that will not throw
A failed job is a successful HTTP response describing a failure:
{ "state": "failed", "error": { "code": "UPSTREAM_EMPTY_RESULT" } }
raise_for_status() and equivalents see a 200 and move on. Check state,
not the status code.
Parameters worth setting
duration_sec accepts 3–15. Setting resolution to 720p halves the cost while you iterate.
Full reference in Seedance 2.0 Fast API parameters.
Models covered on this page
Where these facts come from
- codebase: src/ai/providers/seedance.ts — pricing() and paramsSchema
- codebase: src/app/api/v1/video/generations/route.ts — request and response shape