Truy cập các model tạo video Seedance 2.0 của ByteDance thông qua API hợp nhất của TokenHub. Hỗ trợ text-to-video, image-to-video, chỉnh sửa video, tạo theo âm thanh và hơn thế nữa. Hướng dẫn này sẽ dẫn bạn qua toàn bộ quy trình tích hợp.
th-xxxxxxxxxxxx...)https://tokenhub.store/api/v1Tất cả yêu cầu đều cần một API Key trong header:
Authorization: Bearer th-your-api-keyPOST/videos/generationsTạo một tác vụ tạo video, trả về task ID
GET/videos/generations/{task_id}Truy vấn trạng thái tác vụ, trả về video URL khi thành công
| ID model | Đầu vào | Giá | Mô tả |
|---|---|---|---|
| doubao-seedance-2.0 | Không có đầu vào video | $6.970/1M (1080p $7.727) | model chủ lực, chất lượng cao nhất. Hỗ trợ 1080p. |
| Có đầu vào video | $4.242/1M (1080p $4.697) | model chủ lực với đầu vào video, tiết kiệm chi phí. | |
| doubao-seedance-2.0-fast | Không có đầu vào video | $5.606/1M | model nhanh, tạo nhanh hơn. |
| Có đầu vào video | $3.333/1M | model nhanh với đầu vào video, rẻ nhất. |
Chi tiết thanh toán:
Ví dụ: doubao-seedance-2.0 không có đầu vào video (≤720p), tạo video 5s với khoảng ~1M tokens → chi phí ≈ $6.970
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| model | string | Bắt buộc | Model ID, ví dụ "doubao-seedance-2.0" |
| prompt | string | Bắt buộc | Văn bản mô tả video. Prompt bằng tiếng Anh thường cho kết quả tốt hơn |
| duration | number | Tùy chọn | Thời lượng video (giây), phạm vi 4–15, mặc định 5 |
| resolution | string | Tùy chọn | "480p", "720p", hoặc "1080p" (mặc định 720p; 1080p chỉ dành cho doubao-seedance-2.0) |
| aspect_ratio | string | Tùy chọn | Tỷ lệ khung hình: "adaptive" (mặc định), "16:9", "9:16", "1:1", v.v. |
| image_url | string | Tùy chọn | URL ảnh tham chiếu (image-to-video) |
| image_urls | string[] | Tùy chọn | Mảng các URL ảnh tham chiếu |
| video_url | string | Tùy chọn | URL video tham chiếu (chỉnh sửa video / video-to-video) |
| video_urls | string[] | Tùy chọn | Mảng các URL video tham chiếu (tối đa 3) |
| video_durations | number[] | Tùy chọn | Mảng thời lượng của từng video tính bằng giây, ví dụ [3, 5] |
| input_video_duration | number | Tùy chọn | Tổng thời lượng video đầu vào tính bằng giây (tùy chọn thay cho video_durations) |
| audio_url | string | Tùy chọn | URL âm thanh tham chiếu (nhạc nền / SFX) |
| audio_urls | string[] | Tùy chọn | Mảng các URL âm thanh tham chiếu (tối đa 3) |
| generate_audio | boolean | Tùy chọn | Có tạo âm thanh hay không, mặc định true |
| watermark | boolean | Tùy chọn | Có thêm watermark hay không, mặc định false |
| content | array | Tùy chọn | Mảng tài nguyên media. Mỗi mục: { type: "image_url", image_url: { url }, role }. Các role được hỗ trợ: first_frame (tối đa 1), last_frame (tối đa 1), reference_image, reference_video, reference_audio |
Bạn có thể kết hợp tự do văn bản, hình ảnh, video và âm thanh làm đầu vào. Lưu ý các giới hạn sau:
Cách dùng cơ bản nhất — mô tả một cảnh bằng văn bản để tạo video.
curl -X POST https://tokenhub.store/api/v1/videos/generations \
-H "Authorization: Bearer th-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2.0",
"prompt": "A golden retriever running on a sunny beach, waves crashing in the background, cinematic slow motion, 4K quality",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"watermark": false
}'Phản hồi:
{
"id": "xxxxxx-task-id",
"object": "video.generation.task",
"model": "doubao-seedance-2.0",
"status": "queued",
"created": 1719900000
}Tạo video là bất đồng bộ — hãy thăm dò trạng thái cho đến khi hoàn tất.
# Poll task status using the task_id from creation response
curl https://tokenhub.store/api/v1/videos/generations/YOUR_TASK_ID \
-H "Authorization: Bearer th-your-api-key"Tác vụ đang xử lý:
{
"id": "YOUR_TASK_ID",
"object": "video.generation.task",
"model": "doubao-seedance-2.0",
"status": "running",
"created": 1719900000
}Tác vụ đã hoàn tất (đã nhận được URL video):
{
"id": "YOUR_TASK_ID",
"object": "video.generation.task",
"model": "doubao-seedance-2.0",
"status": "succeeded",
"created": 1719900000,
"data": [
{
"video_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID.mp4",
"cover_image_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID_cover.jpg"
}
],
"usage": {
"video_duration": 5
}
}import requests
import time
API_BASE = "https://tokenhub.store/api/v1"
API_KEY = "th-your-api-key"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Step 1: Create video generation task
payload = {
"model": "doubao-seedance-2.0",
"prompt": "A majestic eagle soaring over snow-capped mountains, golden hour lighting, cinematic aerial shot",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"watermark": False
}
resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task = resp.json()
task_id = task["id"]
print(f"Task created: {task_id}, status: {task['status']}")
# Step 2: Poll for result
while True:
resp = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers)
result = resp.json()
status = result["status"]
print(f"Status: {status}")
if status == "succeeded":
video_url = result["data"][0]["video_url"]
duration = result["usage"]["video_duration"]
print(f"Video ready! Duration: {duration}s")
print(f"URL: {video_url}")
break
elif status == "failed":
print(f"Failed: {result.get('error', {}).get('message', 'Unknown error')}")
break
time.sleep(5)const API_BASE = "https://tokenhub.store/api/v1";
const API_KEY = "th-your-api-key";
const headers = {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
};
// Step 1: Create task
const createResp = await fetch(`${API_BASE}/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "doubao-seedance-2.0",
prompt: "A majestic eagle soaring over snow-capped mountains, cinematic aerial shot",
duration: 5,
resolution: "720p",
aspect_ratio: "16:9",
watermark: false,
}),
});
const task = await createResp.json();
console.log("Task created:", task.id);
// Step 2: Poll for result
const poll = async () => {
while (true) {
const resp = await fetch(`${API_BASE}/videos/generations/${task.id}`, { headers });
const result = await resp.json();
console.log("Status:", result.status);
if (result.status === "succeeded") {
console.log("Video URL:", result.data[0].video_url);
console.log("Duration:", result.usage.video_duration, "seconds");
return result;
}
if (result.status === "failed") {
console.error("Failed:", result.error?.message);
return result;
}
await new Promise(r => setTimeout(r, 5000));
}
};
await poll();import requests, time
API_BASE = "https://tokenhub.store/api/v1"
headers = {
"Authorization": "Bearer th-your-api-key",
"Content-Type": "application/json"
}
# Image-to-Video with a single reference image
payload = {
"model": "doubao-seedance-2.0",
"prompt": "The woman in the photo turns to face the camera and smiles warmly, her hair gently blowing in the wind",
"duration": 5,
"resolution": "720p",
"image_url": "https://your-bucket.com/portrait.jpg",
"watermark": False
}
resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task_id = resp.json()["id"]
print(f"Task: {task_id}")
# Poll for result
while True:
r = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers).json()
if r["status"] == "succeeded":
print(f"Done: {r['data'][0]['video_url']}")
break
elif r["status"] == "failed":
print(f"Error: {r.get('error', {}).get('message')}")
break
time.sleep(5)Khi ảnh đầu vào của bạn chứa một người thật, TokenHub tự động chuyển yêu cầu sang upstream hỗ trợ tạo nội dung cho người thật. Không cần thay đổi ở client.
Tự động kích hoạt khi bộ lọc nội dung của upstream phát hiện một người thật trong ảnh đầu vào.
Cấu trúc request giống hệt image-to-video thông thường — cùng body POST /v1/videos/generations.
Việc polling GET là giống nhau — gọi /v1/videos/generations/{id} với id mà POST trả về, cho đến khi status là succeeded hoặc failed. Việc rewrite id được xử lý ở phía server; bạn luôn thấy cùng một id trong suốt vòng đời của request.
Trả về với status 400 khi account của bạn chưa cấu hình provider hỗ trợ người thật. Hãy liên hệ quản trị viên để bật một provider được hỗ trợ.
Trả về qua GET với status: failed khi chuẩn bị asset của upstream vượt quá 5 phút. Có thể thử lại request một cách an toàn.
pat-id là giá trị ẩn đối với client của bạn — tiếp tục polling cho đến khi status thay đổi.
# POST
curl -X POST https://tokenhub.store/api/v1/videos/generations \
-H "Authorization: Bearer $TH_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2.0",
"prompt": "let her dance and spin",
"duration": 8,
"resolution": "480p",
"content": [
{ "type": "image_url", "image_url": { "url": "https://example.com/portrait.png" }, "role": "first_frame" }
]
}'
# → {"id":"pat-abc123","status":"queued"}
# GET (asset still uploading)
curl https://tokenhub.store/api/v1/videos/generations/pat-abc123 -H "Authorization: Bearer $TH_KEY"
# → {"id":"pat-abc123","status":"queued"}
# GET (upstream task running)
# → {"id":"pat-abc123","status":"running"}
# GET (complete — id stays pat-, video_url in data)
# → {"id":"pat-abc123","status":"succeeded","data":[{"video_url":"..."}]}Định dạng khuyến nghị: [Chủ thể] + [Hành động] + [Môi trường/Nền] + [Camera/Phong cách]
"A young woman walking through a cherry blossom garden, petals falling in slow motion, soft natural lighting, cinematic 35mm film look""Close-up of hands pouring latte art into a ceramic cup, steam rising, warm cafe ambiance, shallow depth of field""Aerial drone shot of a winding river through autumn forest, golden and red leaves, morning mist, 4K cinematic"Đăng ký TokenHub và bắt đầu dùng API tạo video Seedance 2.0 ngay hôm nay
© 2026 TokenHub · Powered by ByteDance Seedance 2.0 · support@tokenhub.store