Request flow
Clients only call /v1/videos on new-api. new-api and ZeroFA handle model routing, protocol conversion, upstream submission, and polling.
Client
POST https://your-new-api.example.com/v1/videos
↓
new-api (DoubaoVideo conversion)
POST https://zerofa.ai/ark/api/v3/contents/generations/tasks
↓
ZeroFA (Ark passthrough with Volcano credentials)
POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasksConfigure the DoubaoVideo channel
Create a Volcano video channel in new-api, select the DoubaoVideo-compatible protocol, and use ZeroFA as its upstream.
Channel type: DoubaoVideo
Base URL: https://zerofa.ai/ark
API Key: sk-zerofa-xxx
Model: your-seedance-model-idDoubaoVideoChannel typeRequiredhttps://zerofa.ai/arkBase URLRequiredsk-zerofa-xxxAPI KeyRequiredyour-seedance-model-idModelRequired① Submit through new-api
Send the request to the other party's new-api host and authenticate with a Token issued by that new-api instance. The example below is text-to-video.
NEW_API_BASE="https://your-new-api.example.com"
NEW_API_KEY="sk-new-api-xxx"
curl -sS -X POST "${NEW_API_BASE}/v1/videos" \
-H "Authorization: Bearer ${NEW_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "your-seedance-model-id",
"prompt": "A shiba inu running through snow with cinematic camera movement and natural, realistic visuals",
"seconds": "5",
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"generate_audio": true,
"watermark": false
}
}'
# {"id":"task_xxx","task_id":"task_xxx","object":"video",
# "model":"your-seedance-model-id","status":"queued","progress":0}modelstringRequiredyour-seedance-model-idpromptstringRequiredA shiba inu running through snow with cinematic camera movement and natural, realistic visualsimagestringOptionalhttps://.../reference.pngimagesstring[]Optional["https://.../a.png","https://.../b.png"]secondsstringRequired5metadata.resolutionstringOptional720pmetadata.ratiostringOptional16:9metadata.generate_audiobooleanOptionaltrueSingle image, multiple images, and roles in new-api
Use top-level image for one reference and top-level images for multiple references. new-api creates Volcano image_url items in array order, so the prompt can describe each as image 1, image 2, and so on.
curl -sS -X POST "${NEW_API_BASE}/v1/videos" \
-H "Authorization: Bearer ${NEW_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "your-seedance-model-id",
"prompt": "Use image 1 for the character, image 2 for the outfit, and image 3 for the setting, then create a coherent cinematic shot",
"seconds": "5",
"images": [
"https://example.com/person.png",
"https://example.com/outfit.png",
"https://example.com/location.png"
],
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"generate_audio": true,
"watermark": false
}
}'Only when every material must retain an explicit role, place the native Volcano content array under metadata.content. new-api preserves those image items and appends the top-level prompt as the text item.
curl -sS -X POST "${NEW_API_BASE}/v1/videos" \
-H "Authorization: Bearer ${NEW_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "your-seedance-model-id",
"prompt": "Strictly follow the character, outfit, and setting in the three reference images and create a coherent shot",
"seconds": "5",
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"generate_audio": true,
"content": [
{
"type": "image_url",
"image_url": {"url": "https://example.com/person.png"},
"role": "reference_image"
},
{
"type": "image_url",
"image_url": {"url": "https://example.com/outfit.png"},
"role": "reference_image"
},
{
"type": "image_url",
"image_url": {"url": "https://example.com/location.png"},
"role": "reference_image"
}
]
}
}'② Query through new-api
Use the id returned by submission and query the same new-api instance. Status is queued, in_progress, completed, or failed.
TASK_ID="task_xxx"
curl -sS "${NEW_API_BASE}/v1/videos/${TASK_ID}" \
-H "Authorization: Bearer ${NEW_API_KEY}"
# Running: {"id":"task_xxx","status":"in_progress","progress":50,...}
# Completed: {"id":"task_xxx","status":"completed","progress":100,
# "metadata":{"url":"https://..."},...}Request and response bodies
Use the examples below to verify the request and response structures. To send a request, select Debug at the top of the page.
NEW_API_BASE="https://your-new-api.example.com"
NEW_API_KEY="sk-new-api-xxx"
curl -sS -X POST "${NEW_API_BASE}/v1/videos" \
-H "Authorization: Bearer ${NEW_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "your-seedance-model-id",
"prompt": "A shiba inu running through snow with cinematic camera movement and natural, realistic visuals",
"seconds": "5",
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"generate_audio": true,
"watermark": false
}
}'
# {"id":"task_xxx","task_id":"task_xxx","object":"video",
# "model":"your-seedance-model-id","status":"queued","progress":0}TASK_ID="task_xxx"
curl -sS "${NEW_API_BASE}/v1/videos/${TASK_ID}" \
-H "Authorization: Bearer ${NEW_API_KEY}"
# Running: {"id":"task_xxx","status":"in_progress","progress":50,...}
# Completed: {"id":"task_xxx","status":"completed","progress":100,
# "metadata":{"url":"https://..."},...}