API Seedance 2.0
Integre a geração de vídeo em seu produto com criação de tarefas assíncronas, consulta de status, webhooks e faturamento com controle de crédito.
https://api.seedance2.aiNesta página
Introdução
A API permite enviar tarefas de geração de vídeo do Seedance 2.0 programaticamente. A geração é assíncrona: crie uma tarefa, receba um ID de tarefa imediatamente e, em seguida, obtenha o vídeo finalizado consultando o endpoint da tarefa ou recebendo um webhook.
Tarefas assíncronas
A consulta funciona bem para desenvolvimento e integrações simples.
Pronto para Webhook
Webhooks são recomendados para produção porque evitam consultas agressivas e notificam seu serviço quando uma tarefa atinge um estado final.
Consciente de crédito
Os créditos são reservados no envio. Tarefas bem-sucedidas são cobradas dessa reserva; tarefas falhas ou com tempo esgotado são reembolsadas automaticamente.
Autenticação
Crie uma chave de API no painel e envie-a como um token de portador em cada requisição. A chave completa é mostrada apenas uma vez no momento da criação.
Authorization: Bearer sk_live_xxxxxxxxUse as chaves sk_live_ para tráfego de produção.
Use as chaves sk_test_ para testes de integração em ambiente de sandbox com o mesmo contrato de API.
Chaves ausentes, inválidas ou revogadas retornam invalid_api_key com HTTP 401.
Guia Rápido
Primeiro, envie uma tarefa. Após a tarefa ser aceita, escolha um método de entrega de resultado: consulte o endpoint da tarefa ou receba o resultado final via webhook.
Crie uma tarefa de vídeo assíncrona e receba um ID de tarefa imediatamente.
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'Recupere o endpoint de status da tarefa quando sua integração preferir consulta explícita.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Passe callback_url ao enviar a tarefa e, em seguida, receba retornos de chamada de conclusão ou falha e atualize seu próprio registro de tarefa.
export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Criar uma tarefa de vídeo
Crie uma tarefa de vídeo com POST /v1/videos/generations. O corpo da requisição tem um modelo de nível superior, uma callback_url opcional e um objeto de entrada contendo as configurações de prompt e geração.
/v1/videos/generationscurl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'Modos de geração
generation_type controla quais entradas de mídia são aceitas e como o modelo as interpreta.
| Modo | Mídia obrigatória | Mídia opcional | Notas |
|---|---|---|---|
text-to-video | prompt | duração, proporção, resolução, semente | Apenas prompt de texto. image_urls, video_urls e audio_urls não são necessários. |
image-to-video | array de prompt + image_urls (1-2 URLs de imagem) | duração, proporção, resolução, semente | image_urls deve ser um array. Forneça 1 URL de imagem para o primeiro quadro, ou 2 URLs de imagem para o primeiro e último quadros. Vídeo e áudio são ignorados. |
reference-to-video | prompt + pelo menos uma imagem ou vídeo | imagens, vídeos e áudio dentro dos limites de material | O áudio não pode ser usado sozinho com texto. Adicione pelo menos uma imagem ou vídeo quando o áudio for fornecido. |
text-to-videoUse texto para vídeo quando o prompt for a única entrada criativa. (text-to-video)
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'image-to-videoUse imagem para vídeo quando input.image_urls for um array com 1-2 URLs de imagem: uma URL define o primeiro quadro, e duas URLs definem o primeiro e o último quadros. Vídeo e referências de áudio são ignorados neste modo. (image-to-video)
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"input": {
"prompt": "the subject turns toward camera, soft studio motion",
"generation_type": "image-to-video",
"image_urls": ["https://your.cdn.com/first-frame.jpg"],
"duration": 5,
"resolution": "720p"
}
}'reference-to-videoUse referência para vídeo para uma direção mais rica com imagens, vídeos e áudio de referência. O áudio não pode ser usado sozinho com texto; inclua pelo menos uma imagem ou vídeo quando o áudio for fornecido. (reference-to-video)
Limites de material
- Até 9 imagens de referência
- Até 3 vídeos de referência, duração total <= 15 segundos
- Até 3 áudios de referência, duração total <= 15 segundos
- Máximo de 12 materiais no total em todos os tipos
Combinações de entrada suportadas
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"input": {
"prompt": "use the product from image 1 and the camera motion from the reference video",
"generation_type": "reference-to-video",
"image_urls": ["https://your.cdn.com/product.jpg"],
"video_urls": ["https://your.cdn.com/camera-motion.mp4"],
"audio_urls": [],
"duration": 8,
"resolution": "1080p"
}
}'Parâmetros de requisição
Nomes de parâmetros, valores de enum, caminhos de endpoint e exemplos fazem parte do contrato da API. As descrições abaixo explicam como cada campo se comporta.
Cabeçalhos
| Cabeçalho | Obrigatório | Descrição | Exemplo |
|---|---|---|---|
Authorization | Sim | Chave de API Bearer usada para autenticar a requisição. | Bearer sk_live_xxx |
Content-Type | Sim | Todas as requisições de escrita usam JSON. | application/json |
Campos de nível superior
| Campo | Tipo | Obrigatório | Padrão | Intervalo / Enum | Modos | Exemplo |
|---|---|---|---|---|---|---|
modelVariante do modelo usada para geração. | string | Sim | - | seedance-2-0 | seedance-2-0-fast | todos | seedance-2-0 |
callback_urlEndpoint HTTPS que recebe retornos de chamada de conclusão e falha da tarefa. | string | Não | - | URL HTTPS, sem redes privadas | todos | https://your-domain.com/hook |
inputConfigurações de geração e referências de mídia. | object | Sim | - | - | todos | - |
input.* campos
| Campo | Tipo | Obrigatório | Padrão | Intervalo / Enum | Modos | Exemplo |
|---|---|---|---|---|---|---|
input.promptPrompt de texto descrevendo o vídeo a ser criado. | string | Sim | - | texto não vazio | todos | a cat surfing |
input.generation_typeModo de geração. O padrão é texto para vídeo. (text-to-video) | string | Não | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURLs de imagem publicamente acessíveis. Para imagem para vídeo, envie 1 imagem para o primeiro quadro ou 2 imagens para o primeiro e último quadros. Para referência para vídeo, envie até 9 imagens como referências visuais. (image-to-video) (reference-to-video) | string[] | Condicional | [] | Imagem para vídeo: 1 ou 2 imagens. Referência para vídeo: até 9 imagens. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsVídeos de referência publicamente acessíveis apenas para referência para vídeo. Você pode enviar até 3 arquivos de vídeo, e o tempo de reprodução combinado deve ser de 15 segundos ou menos. (reference-to-video) | string[] | Não | [] | Até 3 vídeos. O comprimento combinado dos vídeos deve ser de 15 segundos ou menos. | reference-to-video | [] |
input.audio_urlsArquivos de áudio de referência publicamente acessíveis apenas para referência para vídeo. Você pode enviar até 3 arquivos de áudio, e o tempo de reprodução combinado deve ser de 15 segundos ou menos. (reference-to-video) | string[] | Não | [] | Até 3 arquivos de áudio. O comprimento combinado dos áudios deve ser de 15 segundos ou menos. | reference-to-video | [] |
input.durationDuração do vídeo de saída em segundos. | int | Não | 5 | 4-15 segundos | todos | 5 |
input.aspect_ratioProporção de vídeo de saída. adaptative permite que o serviço infira a melhor proporção. | string | Não | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptativo | todos | 16:9 |
input.resolutionNível de resolução de saída. | string | Não | 720p | 480p | 720p | 1080p | todos | 720p |
input.generate_audioSe o modelo deve gerar áudio quando suportado. | boolean | Não | true | verdadeiro | falso | todos | true |
input.watermarkSe deve adicionar uma marca d'água. | boolean | Não | false | verdadeiro | falso | todos | false |
input.web_searchSe deve permitir o aumento da pesquisa na web quando suportado. | boolean | Não | false | verdadeiro | falso | todos | false |
input.return_last_frameSe deve retornar a URL do último quadro quando disponível. | boolean | Não | false | verdadeiro | falso | todos | false |
input.seedSemente determinística. Use -1 para uma semente aleatória. | int | Não | -1 | -1 ou 0-4294967295 | todos | -1 |
Os créditos variam de acordo com a resolução, duração, modelo e se a referência para vídeo inclui referências de vídeo. O valor dos créditos retornado pela resposta de criação é a quantia real reservada para essa tarefa. (reference-to-video)
Ver preços de créditoResposta
Esta é a resposta de sucesso de POST /v1/videos/generations. Isso significa que a tarefa foi aceita e os créditos foram reservados. Use o taskId retornado para consultar GET /v1/tasks/:id ou para corresponder a um retorno de chamada de conclusão ou falha.
Resposta de sucesso POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 60
}Obter status da tarefa
Use GET /v1/tasks/:id para recuperar o estado atual da tarefa. Não consulte mais de uma vez a cada 10 segundos. Para sistemas de produção, prefira webhooks.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Resposta de tarefa concluída
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "charged",
"credits": 60,
"failed_reason": null,
"data": {
"results": ["https://cdn.seedance2.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Resposta de tarefa falha
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Valor | Significado |
|---|---|
status=queued | Aceita e aguardando para ser enviada ou processada. |
status=generating | O provedor está processando a geração. |
status=completed | Vídeo concluído e data.results contém a URL do resultado. |
status=failed | A geração falhou ou o tempo esgotou. |
billing_status=reserved | Os créditos são reservados enquanto a tarefa está em andamento. |
billing_status=charged | Tarefa bem-sucedida e a reserva é liquidada. |
billing_status=refunded | Tarefa falha ou com tempo esgotado e créditos foram devolvidos. |
billing_status=refund_failed | A transação de reembolso falhou e precisa de tratamento manual. |
Após video_expires_at, data.results está vazio. Baixe e armazene o arquivo antes que a janela de validade termine.
Webhooks
Quando callback_url está presente, o Seedance chama seu endpoint quando a tarefa é concluída ou falha, e envia dados JSON descrevendo o resultado final. Se seu endpoint retornar uma resposta não-2xx ou não responder em 15 segundos, a entrega é tentada novamente por até 5 vezes. As retentativas usam o mesmo ID de tarefa, então deduplique por ID. Retorne uma resposta 200 assim que tiver registrado os dados de retorno de chamada com segurança.
Retorno de chamada de conclusão de tarefa
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-0",
"data": {
"results": ["https://cdn.seedance2.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Retorno de chamada de falha de tarefa
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 60
}
}export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Valide a forma dos dados de retorno de chamada, deduplique por ID, atualize seu próprio registro de tarefa e responda rapidamente.
callback_url deve ser HTTPS e não deve apontar para redes privadas, de loopback ou de link-local.
Erros
POST /v1/videos/generations e GET /v1/tasks/:id retornam esta forma de erro quando a própria requisição da API falha, como parâmetros inválidos, chave de API inválida, créditos insuficientes, limite de taxa ou tarefa não encontrada. Alguns erros incluem campos extras, como 'required', 'available' ou 'retry_after', dependendo da situação.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Código | HTTP | Significado | Tentar novamente? |
|---|---|---|---|
invalid_request | 400 | Parâmetros ausentes ou inválidos. | Não, corrija a requisição. |
invalid_api_key | 401 | A chave de API está ausente, inválida ou revogada. | Não, use uma chave válida. |
insufficient_credits | 402 | Créditos insuficientes. A tarefa não é aceita ou cobrada. | Após recarregar. |
forbidden | 403 | A chave de API não possui o escopo necessário. | Não. |
not_found | 404 | A tarefa não existe ou não pertence ao proprietário da chave. | Não. |
rate_limited | 429 | Limite de taxa de requisição excedido. | Sim, siga o Retry-After. |
internal_error | 500 | Erro do servidor. | Sim, tente novamente mais tarde. |
Limites de taxa
Os limites de taxa são aplicados por chave de API com uma janela deslizante. A geração padrão é de 60 requisições por minuto; as consultas de status são mais flexíveis. As respostas HTTP 429 incluem Retry-After.
Geração
60/min
Consultas de status
Mais flexível
Cabeçalho 429
Retry-After
Faturamento e créditos
A API usa o sistema de reserva no envio, cobrança no sucesso e reembolso na falha. As páginas de uso do painel mostram o histórico de crédito da API, registros de tarefas e estatísticas de uso baseadas no tempo.
Reservado
Os créditos são verificados e reservados quando a tarefa é aceita.
Cobrado
Tarefas concluídas liquidam a reserva existente.
Reembolsado
Tarefas falhas ou com tempo esgotado devolvem os créditos reservados automaticamente.
Inspecione o uso no painel
Visualize logs da API, linhas do tempo de tarefas, histórico de créditos e métricas de uso baseadas no tempo.