Overview
The Seedance native endpoint format provides direct compatibility with the Volcano Engine Seedance video generation API. Unlike the OpenAI-compatible format (/v1/videos), this format uses content arrays with typed multi-modal items, giving you finer-grained control over reference materials, audio, draft tasks, and generation parameters.
Supported Models
| Model | Resolutions | Notes |
|---|
doubao-seedance-2 | 480p, 720p, 1080p | Full feature support |
doubao-seedance-2-fast | 480p, 720p | Faster generation, lower resolution cap |
Create Task
POST /api/v3/contents/generations/tasks
| Header | Required | Example |
|---|
Content-Type | Yes | application/json |
Authorization | Yes | Bearer <YOUR_API_KEY> |
Request Parameters
| Parameter | Type | Required | Description |
|---|
model | string | Yes | Model name: doubao-seedance-2 or doubao-seedance-2-fast |
content | object[] | Yes | Multi-modal input array. See content Parameter |
duration | number | Conditional | Video duration in seconds (5–15). Required for per-second billing models |
frames | number | Conditional | Total frame count. Alternative to duration for per-frame billing |
resolution | string | No | 480p, 720p, 1080p (2-fast only supports 480p/720p) |
ratio | string | No | 16:9, 9:16, 1:1 |
seed | number | No | Random seed. Use -1 for random. Default: -1 |
generate_audio | boolean | No | Generate synchronized audio. Default: false |
watermark | boolean | No | Add AI generation watermark. Default: false |
return_last_frame | boolean | No | Return last frame image URL in query response. Default: false |
service_tier | string | No | Service tier. Default: default |
execution_expires_after | number | No | Task timeout in seconds |
tools | object[] | No | Tool list. Currently supports web_search for internet search. See tools Parameter |
content Parameter
Each item in content must have a type and the corresponding payload fields:
| Type | Required Fields | Description |
|---|
text | text | Text prompt describing the desired video |
image_url | image_url.url | Image URL, Base64 data URI, or asset ID (asset://<ASSET_ID>) |
video_url | video_url.url | Video URL or asset ID (asset://<ASSET_ID>) |
audio_url | audio_url.url | Audio URL, Base64 data URI, or asset ID (asset://<ASSET_ID>) |
draft_task | draft_task.id | Reference a draft task to generate the final video |
Supported content combinations:
- Text
- Text (optional) + Image
- Text (optional) + Video
- Text (optional) + Image + Audio
- Text (optional) + Image + Video
- Text (optional) + Video + Audio
- Text (optional) + Image + Video + Audio
role Values
| Type | role | Description |
|---|
image_url | first_frame | First frame for image-to-video. Single image without role also treated as first frame |
image_url | last_frame | Last frame. Requires first_frame alongside it |
image_url | reference_image | Reference image (1–9 images for Seedance 2.0) |
video_url | reference_video | Reference video (max 3, total duration ≤ 15s) |
audio_url | reference_audio | Reference audio (max 3 clips, total duration ≤ 15s) |
The tools parameter specifies tools available during video generation. Currently, only web_search is supported.
| Property | Type | Description |
|---|
tools[].type | string | Fixed value web_search to enable internet search |
When enabled, the model autonomously decides whether to search the internet (e.g., for products, weather) based on the prompt. This improves timeliness of generated videos but may increase latency.
The actual search count is returned in the usage.tool_usage.web_search field of the query response. A value of 0 means no search was triggered.
Web Search Example
curl --location --request POST 'https://api.wisgate.ai/api/v3/contents/generations/tasks' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"model": "doubao-seedance-2",
"content": [
{
"type": "text",
"text": "Generate a short unboxing video of the latest 2026 iPhone."
}
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"tools": [
{
"type": "web_search"
}
]
}'
First-frame image-to-video, first-last-frame image-to-video, and multi-modal reference generation are mutually exclusive. Do not mix these modes in a single request.
Text-to-Video
curl --location --request POST 'https://api.wisgate.ai/api/v3/contents/generations/tasks' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"model": "doubao-seedance-2",
"content": [
{
"type": "text",
"text": "一只小猫在清晨阳光里伸懒腰,镜头缓慢推进,画面温暖自然。"
}
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"seed": -1,
"generate_audio": true,
"watermark": false
}'
Reference-to-Video
curl --location --request POST 'https://api.wisgate.ai/api/v3/contents/generations/tasks' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"model": "doubao-seedance-2",
"content": [
{
"type": "text",
"text": "全程使用视频1的第一视角构图,全程使用音频1作为背景音乐。第一人称视角果茶宣传广告。"
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/reference.jpg" },
"role": "reference_image"
},
{
"type": "video_url",
"video_url": { "url": "https://example.com/reference.mp4" },
"role": "reference_video"
},
{
"type": "audio_url",
"audio_url": { "url": "https://example.com/reference.mp3" },
"role": "reference_audio"
}
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"generate_audio": true,
"return_last_frame": true
}'
First/Last Frame Image-to-Video
{
"model": "doubao-seedance-2",
"content": [
{
"type": "text",
"text": "让画面从首帧自然过渡到尾帧,镜头保持平稳推进。"
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/first-frame.png" },
"role": "first_frame"
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/last-frame.png" },
"role": "last_frame"
}
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5
}
Create Response
{
"id": "cgt-20260518175249-8x55h"
}
Query Task
GET /api/v3/contents/generations/tasks/{id}
Path Parameters
| Parameter | Type | Required | Description |
|---|
id | string | Yes | Task ID returned from the create endpoint |
| Header | Required | Example |
|---|
Authorization | Yes | Bearer <YOUR_API_KEY> |
Query Example
curl --location --request GET 'https://api.wisgate.ai/api/v3/contents/generations/tasks/cgt-20260518175249-8x55h' \
--header 'Authorization: Bearer <YOUR_API_KEY>'
Success Response
{
"id": "cgt-20260518175249-8x55h",
"model": "doubao-seedance-2-0-260128",
"status": "succeeded",
"error": null,
"created_at": 1778756838,
"updated_at": 1778757081,
"content": {
"video_url": "https://example.com/generated-video.mp4?signature=<SIGNED_URL_PARAMS>",
"last_frame_url": "https://example.com/last-frame.png?signature=<SIGNED_URL_PARAMS>"
},
"seed": 29545,
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"framespersecond": 24,
"generate_audio": true,
"service_tier": "default",
"execution_expires_after": 172800,
"usage": {
"completion_tokens": 173700,
"total_tokens": 173700,
"tool_usage": {
"web_search": 2
}
}
}
Response Fields
| Field | Type | Description |
|---|
id | string | Task ID |
model | string | Actual upstream model used for generation |
status | string | Task status: queued, running, succeeded, failed, expired, cancelled |
error | object / null | Error details when status is failed |
created_at | number | Creation timestamp (Unix seconds) |
updated_at | number | Last update timestamp (Unix seconds) |
content.video_url | string | Generated video URL (signed, time-limited — download promptly) |
content.last_frame_url | string | Last frame image URL (only if return_last_frame was true) |
seed | number | Random seed used for generation |
resolution | string | Video resolution |
ratio | string | Aspect ratio |
duration | number | Video duration in seconds |
frames | number | Frame count (per-frame billing models) |
framespersecond | number | Frame rate (FPS) |
generate_audio | boolean | Whether synchronized audio was generated |
service_tier | string | Service tier used |
execution_expires_after | number | Result retention period in seconds |
usage.completion_tokens | number | Tokens consumed for generation |
usage.total_tokens | number | Total token consumption |
usage.tool_usage | object | Tool usage statistics. Only returned when tools was set in the create request and a tool was triggered |
usage.tool_usage.web_search | number | Number of internet searches performed. 0 means no search was triggered |
Complete Workflow
import requests
import time
BASE_URL = "https://api.wisgate.ai"
HEADERS = {
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
}
# Step 1: Create task
response = requests.post(
f"{BASE_URL}/api/v3/contents/generations/tasks",
headers=HEADERS,
json={
"model": "doubao-seedance-2",
"content": [{"type": "text", "text": "A cat walking on a sunny street"}],
"resolution": "720p",
"ratio": "16:9",
"duration": 5
}
)
task_id = response.json()["id"]
print(f"Task created: {task_id}")
# Step 2: Poll for status and download
while True:
result = requests.get(
f"{BASE_URL}/api/v3/contents/generations/tasks/{task_id}",
headers={"Authorization": HEADERS["Authorization"]}
).json()
status = result["status"]
print(f"Status: {status}")
if status == "succeeded":
video_url = result["content"]["video_url"]
video = requests.get(video_url, stream=True)
with open("generated_video.mp4", "wb") as f:
for chunk in video.iter_content(chunk_size=8192):
f.write(chunk)
print("Video downloaded successfully!")
break
elif status in ("failed", "expired", "cancelled"):
print(f"Task ended: {status}, Error: {result.get('error')}")
break
time.sleep(10)
Parameter Limits
| Parameter | Supported Values |
|---|
duration | 5 to 15 seconds |
ratio | 16:9, 9:16, 1:1 |
resolution | 480p, 720p, 1080p |
content.image_url.url | Public URL, data:image/<format>;base64,<BASE64>, or asset://<ASSET_ID> |
content.video_url.url | Public URL or asset://<ASSET_ID> |
content.audio_url.url | Public URL, data:audio/<format>;base64,<BASE64>, or asset://<ASSET_ID> |
Important Notes
API Key Security
Never expose real API keys in code, documentation, logs, or screenshots. Use environment variables or placeholder values.
Face Content Policy
Seedance 2.0 models do not support uploading reference images or videos containing real human faces. Use platform-compliant assets, virtual avatars, or licensed materials for portrait content.
Download Promptly
content.video_url is typically a signed URL with an expiration window. Download or transfer the video before it expires. Check execution_expires_after for the retention period.
Polling
If the task has not completed, poll the query endpoint at intervals of several seconds. Avoid tight polling loops to prevent rate limiting.
- Do not mix request body formats between
/v1/videos and /api/v3/contents/generations/tasks. The prompt/size fields belong to the OpenAI-compatible format; the Seedance native format uses content/ratio/resolution.
- Large files should use public URLs or asset IDs rather than Base64 encoding to keep request body sizes manageable.
- If an API key is exposed or compromised, rotate or revoke it immediately.
Assets
The Assets library allows you to pre-upload images, videos, and audio as trusted materials. Once an asset’s status becomes Active, you can reference it in video generation tasks using asset://<ASSET_ID>.
WisdomGate proxies the Volcano Engine Assets API with per-user isolation:
ListAssetGroups / ListAssets are served from the WisdomGate local database — you only see data belonging to your API Key.
CreateAssetGroup / CreateAsset / GetAssetGroup / GetAsset / UpdateAssetGroup / UpdateAsset / DeleteAsset call the upstream API and sync the local database.
CreateVisualValidateSession / GetVisualValidateResult are used for real-person face verification. Only supported on Volcano Engine channels with Assets SDK authentication enabled.
Assets endpoints support two entry points:
POST /api/v3/open/{Action}
POST /api/v3/assets?Action={Action}&Version=2024-01-01 (Volcano Engine Query Action format)
Both entry points share the same logic. Responses do not include the ResponseMetadata / Result wrapper.
Create Asset Group
POST /api/v3/open/CreateAssetGroup
| Parameter | Type | Required | Description |
|---|
Name | string | Yes | Asset group name, max 64 characters |
Description | string | No | Asset group description, max 300 characters |
GroupType | string | Yes | Asset group type, use AIGC |
ProjectName | string | No | Project name, default default |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/CreateAssetGroup' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Name": "MyAssetGroup",
"Description": "My video assets",
"GroupType": "AIGC"
}'
Response:
{
"Id": "group-20260520103710-f2hzc"
}
List Asset Groups
POST /api/v3/open/ListAssetGroups
| Parameter | Type | Required | Description |
|---|
Filter.Name | string | No | Fuzzy search by group name |
Filter.GroupIds | string[] | No | Filter by group IDs |
Filter.GroupType | string | Yes | Asset group type, use AIGC |
PageNumber | number | No | Page number, starts from 1, default 1 |
PageSize | number | No | Page size, max 100, default 20 |
SortBy | string | No | CreateTime or UpdateTime |
SortOrder | string | No | Desc or Asc |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/ListAssetGroups' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Filter": { "GroupType": "AIGC" },
"PageNumber": 1,
"PageSize": 10,
"SortBy": "CreateTime",
"SortOrder": "Desc"
}'
Response:
{
"TotalCount": 1,
"Items": [
{
"Id": "group-20260520103710-f2hzc",
"Name": "MyAssetGroup",
"Description": "My video assets",
"GroupType": "AIGC",
"ProjectName": "default",
"CreateTime": "2026-05-20T02:37:10.544Z",
"UpdateTime": "2026-05-20T02:37:10.544Z"
}
],
"PageNumber": 1,
"PageSize": 10
}
Get Asset Group
POST /api/v3/open/GetAssetGroup
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/GetAssetGroup' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Id": "group-20260520103710-f2hzc"
}'
Update Asset Group
POST /api/v3/open/UpdateAssetGroup
Only Name and Description can be updated.
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/UpdateAssetGroup' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Id": "group-20260520103710-f2hzc",
"Name": "MyAssetGroup2",
"Description": "Updated description"
}'
Create Asset
POST /api/v3/open/CreateAsset
| Parameter | Type | Required | Description |
|---|
GroupId | string | Yes | Parent asset group ID |
URL | string | Yes | Publicly accessible URL. Base64 is not supported |
Name | string | No | Asset name, max 64 characters |
AssetType | string | Yes | Image, Video, or Audio |
ProjectName | string | No | Project name, default default |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/CreateAsset' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"GroupId": "group-20260520103710-f2hzc",
"URL": "https://example.com/reference.png",
"Name": "reference-image",
"AssetType": "Image"
}'
Response:
{
"Id": "asset-20260520105344-gk4kd"
}
After creating an asset, poll GetAsset until the Status becomes Active. Only Active assets can be used for video generation.
List Assets
POST /api/v3/open/ListAssets
| Parameter | Type | Required | Description |
|---|
Filter.GroupIds | string[] | No | Filter by group IDs |
Filter.GroupType | string | Yes | Asset group type, use AIGC |
Filter.Statuses | string[] | No | Active, Processing, Failed |
Filter.Name | string | No | Fuzzy search by asset name |
PageNumber | number | Yes | Page number, starts from 1 |
PageSize | number | Yes | Page size, max 100 |
SortBy | string | No | CreateTime, UpdateTime, or GroupId |
SortOrder | string | No | Desc or Asc |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/ListAssets' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Filter": {
"GroupType": "AIGC",
"GroupIds": ["group-20260520103710-f2hzc"],
"Statuses": ["Active", "Processing"]
},
"PageNumber": 1,
"PageSize": 10
}'
Response:
{
"Items": [
{
"Id": "asset-20260520105344-gk4kd",
"Name": "reference-image",
"URL": "https://example.com/reference.png",
"GroupId": "group-20260520103710-f2hzc",
"AssetType": "Image",
"Status": "Active",
"ProjectName": "default",
"CreateTime": "2026-05-20T02:53:44.000Z",
"UpdateTime": "2026-05-20T02:54:10.000Z"
}
],
"TotalCount": 1,
"PageNumber": 1,
"PageSize": 10
}
Get Asset
POST /api/v3/open/GetAsset
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/GetAsset' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Id": "asset-20260520105344-gk4kd"
}'
Asset Status
| Status | Description |
|---|
Processing | Being preprocessed, not yet available for video generation |
Active | Ready for use in video generation |
Failed | Processing failed, not usable |
Update Asset
POST /api/v3/open/UpdateAsset
Only Name can be updated.
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/UpdateAsset' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Id": "asset-20260520105344-gk4kd",
"Name": "reference-image-v2"
}'
Delete Asset
POST /api/v3/open/DeleteAsset
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/DeleteAsset' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"Id": "asset-20260520105344-gk4kd"
}'
Returns an empty object on success:
Using Assets in Video Generation
Once an asset is Active, reference it in the content array using the asset:// scheme:
{
"type": "image_url",
"image_url": {
"url": "asset://asset-20260520105344-gk4kd"
},
"role": "reference_image"
}
Real-Person Face Verification
For real-person portrait assets, use the visual verification flow to obtain a GroupId for LivenessFace type groups.
Create Verification Session
POST /api/v3/open/CreateVisualValidateSession
| Parameter | Type | Required | Description |
|---|
CallbackURL | string | Yes | Publicly accessible URL to redirect after verification |
ProjectName | string | No | Project name, default default |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/CreateVisualValidateSession' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"CallbackURL": "https://www.example.com/callback"
}'
The response includes BytedToken, H5Link, and CallbackURL. Open H5Link on the end-user’s device to complete verification. When the callback receives resultCode=10000, call GetVisualValidateResult.
Response example:
{
"BytedToken": "20260609094027539BA348F9B7396F2839",
"CallbackURL": "http://localhost:3000/api/v3/callback",
"H5Link": "https://h5-v2.kych5.com?accessKeyId=AKTP0V8amxFATDZB4p2zHK4vkgDVsEIR8sNLJvKVQu1B2U&secretAccessKey=CCoKygvfps7Y3B7w2qNzdlXBxiuW6NwuGsw5VfERDDd&sessionToken=nChBNa0N4OURzamFsTGZrWVdo.CiQKEEFuM0M5UHh6TDF5cXQ5ZFESEMX9lEsZqkN5rYu521geDb4Qrdud0QYYs-Od0QYgvsLI8wcoBDC35IQvOiNSb2xlRm9yVmlzdWFsRmFjZS9Sb2xlRm9yVmlzdWFsRmFjZUIDYXJrUhFSb2xlRm9yVmlzdWFsRmFjZVgDegNhcms.dbToow9VioZIGuqqJp90s8_W76O45XwMHrjzskpfJSdKvudG1jQFFo9f3vi0DUmd2NUSEDEQEfLuTFTbCJZj7A&configId=ed90561e-9078-470f-ba83-b34460fa8283&bytedToken=20260609094027539BA348F9B7396F2839&lng=zh"
}
Get Verification Result
POST /api/v3/open/GetVisualValidateResult
| Parameter | Type | Required | Description |
|---|
BytedToken | string | Yes | Token from CreateVisualValidateSession, valid for 120 seconds |
ProjectName | string | No | Project name, default default |
curl --location --request POST 'https://api.wisgate.ai/api/v3/open/GetVisualValidateResult' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--data-raw '{
"BytedToken": "202603311449168C23BA26**************"
}'
Response:
{
"GroupId": "group-20260331145705-*****"
}
Using Volcano Engine Go SDK
If you use the Volcano Engine Go SDK’s universal.DoCall method, configure the SDK endpoint to point to WisdomGate:
WithEndpoint: https://api.wisgate.ai/api/v3/assets
Authorization header: use Bearer <YOUR_API_KEY> format
- AK/SK are not used for authentication but must be non-empty for the SDK
package main
import (
"context"
"fmt"
"net/http"
"github.com/bytedance/sonic"
"github.com/volcengine/volcengine-go-sdk/volcengine"
"github.com/volcengine/volcengine-go-sdk/volcengine/credentials"
"github.com/volcengine/volcengine-go-sdk/volcengine/session"
"github.com/volcengine/volcengine-go-sdk/volcengine/universal"
)
func main() {
platformApiKey := "<YOUR_API_KEY>"
config := volcengine.NewConfig().
WithCredentials(credentials.NewStaticCredentials("unused", "unused", "")).
WithRegion("cn-beijing").
WithEndpoint("https://api.wisgate.ai/api/v3/assets").
WithExtendHttpRequest(func(_ context.Context, req *http.Request) {
req.Header.Set("Authorization", "Bearer "+platformApiKey)
})
sess, err := session.NewSession(config)
if err != nil {
panic(err)
}
client := universal.New(sess)
resp, err := client.DoCall(
universal.RequestUniversal{
ServiceName: "ark",
Action: "GetAssetGroup",
Version: "2024-01-01",
HttpMethod: universal.POST,
ContentType: universal.ApplicationJSON,
},
&map[string]any{
"Id": "group-20260331145705-*****",
},
)
if err != nil {
panic(err)
}
respData, _ := sonic.Marshal(resp)
fmt.Println(string(respData))
}
This SDK example sends:
POST /api/v3/assets?Action=GetAssetGroup&Version=2024-01-01
Authorization: Bearer <YOUR_API_KEY>
| Feature | OpenAI Compatible (/v1/videos) | Seedance Native (/api/v3/...) |
|---|
| Content input | prompt + images[] + videos[] | content[] with typed items |
| Audio reference | Not supported | audio_url type |
| Draft task | Not supported | draft_task type |
| Resolution format | 1280x720, 1920x1080 | 720p, 1080p, 480p |
| Aspect ratio | size field | ratio field (16:9, 9:16, 1:1) |
| Watermark control | Not supported | watermark boolean |
| Last frame retrieval | Not supported | return_last_frame boolean |
| Seed control | Not directly exposed | seed field |
Use the OpenAI-compatible format for simpler text-to-video and basic image/video reference scenarios. Use the Seedance native format when you need audio references, draft tasks, watermark control, or last frame retrieval.