Acesse os modelos de geração de vídeo Seedance 2.0 da ByteDance por meio da API unificada do TokenHub. Suporta text-to-video, image-to-video, edição de vídeo, geração guiada por áudio e muito mais. Este guia mostra o processo completo de integração.
th-xxxxxxxxxxxx...)https://tokenhub.store/api/v1Todas as requisições exigem uma API Key no cabeçalho:
Authorization: Bearer th-your-api-keyPOST/videos/generationsCria uma tarefa de geração de vídeo e retorna o ID da tarefa
GET/videos/generations/{task_id}Consulta o status da tarefa e retorna a URL do vídeo em caso de sucesso
| ID do model | Entrada | Preço | Descrição |
|---|---|---|---|
| doubao-seedance-2.0 | Sem entrada de vídeo | $6.970/1M (1080p $7.727) | model principal, mais alta qualidade |
| Com entrada de vídeo | $4.242/1M (1080p $4.697) | Flagship com entrada de vídeo, mais econômico. | |
| doubao-seedance-2.0-fast | Sem entrada de vídeo | $5.606/1M | model rápido, geração mais ágil |
| Com entrada de vídeo | $3.333/1M | Opção mais acessível |
Detalhes de cobrança:
Exemplo: doubao-seedance-2.0 sem entrada de vídeo (≤720p), gerando um vídeo de 5s com ~1M tokens → custo ≈ $6.970
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| model | string | Obrigatório | ID do model, ex.: "doubao-seedance-2.0" |
| prompt | string | Obrigatório | Texto de descrição do vídeo. Prompts em inglês geralmente geram melhores resultados |
| duration | number | Opcional | Duração do vídeo (seg), intervalo de 4–15, padrão 5 |
| resolution | string | Opcional | "480p", "720p" ou "1080p" (padrão 720p; 1080p apenas para doubao-seedance-2.0) |
| aspect_ratio | string | Opcional | Proporção: "adaptive" (padrão), "16:9", "9:16", "1:1", etc. |
| image_url | string | Opcional | URL da imagem de referência (imagem para vídeo) |
| image_urls | string[] | Opcional | Array com várias URLs de imagens de referência |
| video_url | string | Opcional | URL do vídeo de referência (edição de vídeo / vídeo para vídeo) |
| video_urls | string[] | Opcional | Array com várias URLs de vídeos de referência (máx. 3) |
| video_durations | number[] | Opcional | Array com as durações de cada vídeo em segundos, ex.: [3, 5] |
| input_video_duration | number | Opcional | Duração total do vídeo de entrada em segundos (alternativa a video_durations) |
| audio_url | string | Opcional | URL do áudio de referência (música de fundo / SFX) |
| audio_urls | string[] | Opcional | Array com várias URLs de áudio de referência (máx. 3) |
| generate_audio | boolean | Opcional | Se deve gerar áudio, padrão true |
| watermark | boolean | Opcional | Se deve adicionar marca d’água, padrão false |
| content | array | Opcional | Array de ativos de mídia. Cada item: { type: "image_url", image_url: { url }, role }. Roles suportadas: first_frame (máx. 1), last_frame (máx. 1), reference_image, reference_video, reference_audio |
Você pode combinar livremente texto, imagens, vídeos e áudio como entrada. Observe os seguintes limites:
O uso mais básico — descreva uma cena em texto para gerar um vídeo.
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
}'Resposta:
{
"id": "xxxxxx-task-id",
"object": "video.generation.task",
"model": "doubao-seedance-2.0",
"status": "queued",
"created": 1719900000
}A geração de vídeo é assíncrona — consulte o status até concluir.
# 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"Tarefa em andamento:
{
"id": "YOUR_TASK_ID",
"object": "video.generation.task",
"model": "doubao-seedance-2.0",
"status": "running",
"created": 1719900000
}Tarefa concluída (URL do vídeo recebida):
{
"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)Quando a imagem de entrada contém uma pessoa real, TokenHub encaminha automaticamente a requisição para um upstream que oferece suporte à geração com pessoas reais. Nenhuma alteração no client é necessária.
É acionado automaticamente quando o filtro de conteúdo do upstream detecta uma pessoa real na imagem de entrada.
A estrutura da requisição é idêntica à de imagem para vídeo comum — mesmo corpo POST /v1/videos/generations.
O polling via GET é idêntico — chame /v1/videos/generations/{id} com o id retornado pelo POST, até o status ser succeeded ou failed. As reescritas de id são tratadas no servidor; você sempre vê o mesmo id durante a vida útil da requisição.
Retornado com status 400 quando nenhum provider compatível com pessoa real está configurado para sua conta. Entre em contato com seu administrador para habilitar um provider compatível.
Retornado via GET com status: failed quando a preparação do asset no upstream excede 5 minutos. É seguro tentar a requisição novamente.
O pat-id é opaco para o seu client — continue consultando até o status mudar.
# 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":"..."}]}Formato recomendado: [Assunto] + [Ação] + [Ambiente/Fundo] + [Câmera/Estilo]
"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"Crie sua conta no TokenHub e comece a usar a API de Geração de Vídeo Seedance 2.0 agora
© 2026 TokenHub · Powered by ByteDance Seedance 2.0 · support@tokenhub.store