Seedance
Beyond the standard video protocols, the Doubao Seedance series (doubao-seedance-*) can also be called over Volcengine Ark's own paths, with request and response bodies following Ark's content-generation protocol:
| Method | Path | Use |
|---|---|---|
POST | /ark/api/v3/contents/generations/tasks | Create a content generation (video) task |
GET | /ark/api/v3/contents/generations/tasks/{task_id} | Poll task status and result |
DELETE | /ark/api/v3/contents/generations/tasks/{task_id} | Cancel an unfinished task and release its preauthorization (upstream-dependent, see below) |
This is a platform-managed lane: the path is Ark's own, but the request runs on the gateway's standard async task pipeline — the very same one behind Generic Async Content Generation Tasks, just spelled with Ark's path. It therefore keeps per-dimension metering, task persistence, artifact delivery, and preauthorize/settle intact.
Create a task
The body follows Ark's content-generation protocol, and model is the platform logical model name (e.g. doubao-seedance-2.0-mini):
curl https://api.modelgo.ai/ark/api/v3/contents/generations/tasks \
-H "Authorization: Bearer $MODELGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<model>",
"content": [
{ "type": "text", "text": "a neon city cat" },
{ "type": "image_url", "image_url": { "url": "https://example.com/first.jpg" }, "role": "first_frame" }
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5
}'Beyond text, the content array can carry images/videos, tagged by role; the media combination determines the generation mode, and the mode determines which parameters are legal:
| content element | role | Generation mode |
|---|---|---|
text only | — | Text-to-video (t2v) |
image_url | first_frame | First-frame image-to-video (i2v) |
image_url | first_frame + last_frame | First/last-frame (flf2v) |
image_url / video_url | reference_image / reference_video | Multimodal reference-to-video |
Parameter and mode constraints
Valid values for resolution / ratio / duration vary by model — the Fast and Mini variants of Seedance 2.0, for instance, do not support 1080p, and duration has a floor of 4 seconds. Ark extension parameters such as camera_fixed, generate_audio, return_last_frame and watermark also vary by generation mode. Sending a parameter the current model/mode does not support is rejected by the upstream at create time (400 provider_invalid). One known case:
camera_fixedis not supported in the first/last-frame (flf2v) scenario — a request carrying
both first_frame and last_frame is refused when it also sets camera_fixed (camera_fixed ... must be empty). First/last-frame already constrains the camera; if you need a locked-off camera, use a mode that supports it (e.g. text-to-video or single first-frame).
Because this lane does not pin an upstream family (the same logical model is served by several suppliers), whether a parameter is accepted also depends on the supplier and model version actually serving the call. Treat the model capability notes plus the mode constraints above as authoritative, and do not assume a parameter that works in one mode works in another.
Poll a task
curl https://api.modelgo.ai/ark/api/v3/contents/generations/tasks/{task_id} \
-H "Authorization: Bearer $MODELGO_API_KEY"Create and poll answer with exactly the Ark task object documented under Generic Async Content Generation Tasks — it is the same pipeline, so the response payload and every field's meaning (status values, content.video_url, error, when usage is omitted) are identical to that page and are not repeated here.
Cancel a task
curl -X DELETE https://api.modelgo.ai/ark/api/v3/contents/generations/tasks/{task_id} \
-H "Authorization: Bearer $MODELGO_API_KEY"A successful cancel voids the preauthorization; nothing is settled.
Not every upstream supports cancelling, though. Whether a task can be cancelled depends on whether the supplier serving it implements cancellation, and because this lane does not pin an upstream family, two calls on the same logical model may differ — one cancellable, one not. Two failure shapes:
| Case | Response |
|---|---|
| The supplier serving the task cannot cancel | 400 / 4003 provider_unsupported, endpoint not supported by provider |
The task already reached a terminal state (succeeded / failed) | 409 task_already_terminal, task already finished; nothing to cancel |
When a cancel fails the preauthorization is not released early — it follows the normal settle/expiry path once the task reaches a terminal state. So do not treat "create then cancel" as a reliable way to back out of a charge.
Key conventions
idis the gateway task id, not the upstream one. Polling and cancelling only accept that id,- The response shape is fixed. Whichever upstream actually serves the request, create and poll
- The lane does not pin an upstream family. The URL spelling plays no part in routing: whoever
- The only content endpoint is the OpenAI-compatible one (
GET /v1/videos/{task_id}/content); there - Whether a model is offered on this lane depends on its catalog
public_protocolsincluding
so hold on to the id returned by create.
both answer with the same Ark task object — it does not change when routing changes.
the logical model behind model routes to serves it. Seedance is carried by several suppliers on the platform, so two calls on the same logical model may land on different upstreams — that is expected.
is no equivalent under the Ark paths — use content.video_url from the response.
content_generation; without it the call is refused with 4005. Check with GET https://api.modelgo.ai/v1/models.
If you do not need Ark's path and field style, OpenAI-Compatible Video Flow is the more standardized choice.