Conventions
Async task model, status polling, billing rules and error codes
Async task model
Most generation endpoints are asynchronous:
POST create → returns task_id
GET status → poll until completed / failedflowchart LR
A[POST create] --> B(task_id)
B --> C{GET poll status}
C -- processing --> C
C -- completed --> D[get result URL]
C -- failed --> E[read error]Status values
Four normalized statuses are exposed (each model's upstream states map into these):
| status | Meaning | What to do |
|---|---|---|
pending / queued | Accepted, queued | Keep polling |
processing | In progress | Keep polling |
completed / succeeded | Done | Read the result URL |
failed | Failed | Read error / errorMessage |
Polling guidance
2s after submit → first status check
then → every 3–5s
video/podcast → may take several minutesBilling
- Per character (audio): CJK char = 2, others = 1; some capabilities have a minimum (e.g. voice design ≥10).
- Per second (video):
rate-per-second × duration, rounded up. - Fixed: some models charge a flat amount per call.
- Refund on failure: credits are auto-refunded when a task fails (Seedance, Sora2, Drama, …).
- Credits settle on completion — failed tasks are not charged.
Error codes
| HTTP | Scenario |
|---|---|
400 Bad Request | Missing required field / malformed parameter |
401 Unauthorized | Missing or invalid API key |
402 Payment Required | Insufficient credits |
404 Not Found | task_id does not exist |
429 Too Many Requests | Concurrency limit exceeded |
5xx | Server error (read message) |
{ "error": "insufficient_credits", "message": "Not enough credits." }Pagination
List endpoints share:
| Param | Meaning |
|---|---|
page / offset | Page number / offset |
limit | Items per page |
total (response) | Total count |