Skip to main content

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

ModelResolutionsNotes
doubao-seedance-2480p, 720p, 1080pFull feature support
doubao-seedance-2-fast480p, 720pFaster generation, lower resolution cap

Create Task

POST /api/v3/contents/generations/tasks

Request Headers

HeaderRequiredExample
Content-TypeYesapplication/json
AuthorizationYesBearer <YOUR_API_KEY>

Request Parameters

ParameterTypeRequiredDescription
modelstringYesModel name: doubao-seedance-2 or doubao-seedance-2-fast
contentobject[]YesMulti-modal input array. See content Parameter
durationnumberConditionalVideo duration in seconds (5–15). Required for per-second billing models
framesnumberConditionalTotal frame count. Alternative to duration for per-frame billing
resolutionstringNo480p, 720p, 1080p (2-fast only supports 480p/720p)
ratiostringNo16:9, 9:16, 1:1
seednumberNoRandom seed. Use -1 for random. Default: -1
generate_audiobooleanNoGenerate synchronized audio. Default: false
watermarkbooleanNoAdd AI generation watermark. Default: false
return_last_framebooleanNoReturn last frame image URL in query response. Default: false
service_tierstringNoService tier. Default: default
execution_expires_afternumberNoTask timeout in seconds
toolsobject[]NoTool 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:
TypeRequired FieldsDescription
texttextText prompt describing the desired video
image_urlimage_url.urlImage URL, Base64 data URI, or asset ID (asset://<ASSET_ID>)
video_urlvideo_url.urlVideo URL or asset ID (asset://<ASSET_ID>)
audio_urlaudio_url.urlAudio URL, Base64 data URI, or asset ID (asset://<ASSET_ID>)
draft_taskdraft_task.idReference 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

TyperoleDescription
image_urlfirst_frameFirst frame for image-to-video. Single image without role also treated as first frame
image_urllast_frameLast frame. Requires first_frame alongside it
image_urlreference_imageReference image (1–9 images for Seedance 2.0)
video_urlreference_videoReference video (max 3, total duration ≤ 15s)
audio_urlreference_audioReference audio (max 3 clips, total duration ≤ 15s)

tools Parameter

The tools parameter specifies tools available during video generation. Currently, only web_search is supported.

web_search Tool

PropertyTypeDescription
tools[].typestringFixed 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

ParameterTypeRequiredDescription
idstringYesTask ID returned from the create endpoint

Request Headers

HeaderRequiredExample
AuthorizationYesBearer <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

FieldTypeDescription
idstringTask ID
modelstringActual upstream model used for generation
statusstringTask status: queued, running, succeeded, failed, expired, cancelled
errorobject / nullError details when status is failed
created_atnumberCreation timestamp (Unix seconds)
updated_atnumberLast update timestamp (Unix seconds)
content.video_urlstringGenerated video URL (signed, time-limited — download promptly)
content.last_frame_urlstringLast frame image URL (only if return_last_frame was true)
seednumberRandom seed used for generation
resolutionstringVideo resolution
ratiostringAspect ratio
durationnumberVideo duration in seconds
framesnumberFrame count (per-frame billing models)
framespersecondnumberFrame rate (FPS)
generate_audiobooleanWhether synchronized audio was generated
service_tierstringService tier used
execution_expires_afternumberResult retention period in seconds
usage.completion_tokensnumberTokens consumed for generation
usage.total_tokensnumberTotal token consumption
usage.tool_usageobjectTool usage statistics. Only returned when tools was set in the create request and a tool was triggered
usage.tool_usage.web_searchnumberNumber 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

ParameterSupported Values
duration5 to 15 seconds
ratio16:9, 9:16, 1:1
resolution480p, 720p, 1080p
content.image_url.urlPublic URL, data:image/<format>;base64,<BASE64>, or asset://<ASSET_ID>
content.video_url.urlPublic URL or asset://<ASSET_ID>
content.audio_url.urlPublic 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
ParameterTypeRequiredDescription
NamestringYesAsset group name, max 64 characters
DescriptionstringNoAsset group description, max 300 characters
GroupTypestringYesAsset group type, use AIGC
ProjectNamestringNoProject 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
ParameterTypeRequiredDescription
Filter.NamestringNoFuzzy search by group name
Filter.GroupIdsstring[]NoFilter by group IDs
Filter.GroupTypestringYesAsset group type, use AIGC
PageNumbernumberNoPage number, starts from 1, default 1
PageSizenumberNoPage size, max 100, default 20
SortBystringNoCreateTime or UpdateTime
SortOrderstringNoDesc 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
ParameterTypeRequiredDescription
GroupIdstringYesParent asset group ID
URLstringYesPublicly accessible URL. Base64 is not supported
NamestringNoAsset name, max 64 characters
AssetTypestringYesImage, Video, or Audio
ProjectNamestringNoProject 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
ParameterTypeRequiredDescription
Filter.GroupIdsstring[]NoFilter by group IDs
Filter.GroupTypestringYesAsset group type, use AIGC
Filter.Statusesstring[]NoActive, Processing, Failed
Filter.NamestringNoFuzzy search by asset name
PageNumbernumberYesPage number, starts from 1
PageSizenumberYesPage size, max 100
SortBystringNoCreateTime, UpdateTime, or GroupId
SortOrderstringNoDesc 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

StatusDescription
ProcessingBeing preprocessed, not yet available for video generation
ActiveReady for use in video generation
FailedProcessing 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
ParameterTypeRequiredDescription
CallbackURLstringYesPublicly accessible URL to redirect after verification
ProjectNamestringNoProject 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
ParameterTypeRequiredDescription
BytedTokenstringYesToken from CreateVisualValidateSession, valid for 120 seconds
ProjectNamestringNoProject 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>

Format Comparison

FeatureOpenAI Compatible (/v1/videos)Seedance Native (/api/v3/...)
Content inputprompt + images[] + videos[]content[] with typed items
Audio referenceNot supportedaudio_url type
Draft taskNot supporteddraft_task type
Resolution format1280x720, 1920x1080720p, 1080p, 480p
Aspect ratiosize fieldratio field (16:9, 9:16, 1:1)
Watermark controlNot supportedwatermark boolean
Last frame retrievalNot supportedreturn_last_frame boolean
Seed controlNot directly exposedseed 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.