Pular para o conteúdo principal

O reference-to-video Seedance 2.0 Mini da ByteDance constrói uma tomada com o seu material: até 9 imagens, 3 clipes de vídeo e 3 faixas de áudio, sem primeiro quadro. A saída tem 4 a 15 segundos em 480p ou 720p, com som na mesma passada.

A partir de $0.011/s

Playground

Enviar uma requisição

Início rápido

Os exemplos usam as definições públicas de parâmetros do endpoint selecionado. Troque a chave de API e as mídias de exemplo e envie a requisição a partir do seu servidor.

SDKs e integrações
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticação da API

Guarde a chave de API na variável de ambiente do servidor SPICY_API_KEY. Use autenticação Bearer e Content-Type: application/json nas requisições JSON.

Authorization: Bearer $SPICY_API_KEY
Resultado de exemploUsar este exemplo
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "bytedance/seedance-2.0-mini/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "enable_web_search": false,
    "generate_audio": true,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ]
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Gerado a partir do schema de entrada deste modelo — o mesmo que a API usa para validar cada requisição.

Parâmetros de entrada

Coloque estes campos no objeto input do corpo da requisição. Nomes e tipos são os mesmos da API. Quando nenhum valor padrão estiver indicado, não presuma que exista um.

Este modelo tem dependências entre campos. Os campos marcados como obrigatórios sob condição dependem de outras entradas; as regras completas estão no JSON Schema abaixo.

promptstringObrigatório

Obrigatório, e aqui ele também faz o casting. As referências são citadas na ordem de envio, então diga qual imagem é qual personagem, o que cada clipe contribui e para que serve o áudio. Briefings não são revisados do nosso lado; onde a camada do próprio Seedance recusa a formulação, um primeiro quadro no image-to-video é a rota que ainda chega lá.

Valor padrão
Não especificado
Restrições
minLength:1
watermarkbooleanOpcional

Adiciona ao vídeo a marca-d’água visível “AI generated” do próprio modelo. Desligado por padrão; ligue quando o lugar onde você publica exigir a identificação de conteúdo feito com IA. Não altera o preço.

Valor padrão
false
bitrate_modestringOpcional

Taxa de bits do arquivo entregue: `standard` (padrão) ou `high`. `high` mantém texturas finas e movimentos rápidos mais nítidos na mesma resolução e gera um arquivo bem maior; resolução, taxa de quadros e duração não mudam. Não altera o preço.

Valor padrão
"standard"
Valores permitidos
"standard""high"
return_last_framebooleanOpcional

Devolve também o último quadro do clipe como imagem separada, junto com o vídeo. Mande-o ao image-to-video como próximo quadro inicial para encadear planos sem exportar o quadro você mesmo. Desligado por padrão; não altera o preço.

Valor padrão
false
seedintegerOpcional

Seed inteiro; omita e cada execução sorteia o seu. Fixe com todo o resto constante para julgar o que uma edição de prompt realmente mudou. É ferramenta de comparação, não promessa de repetição quadro a quadro.

Valor padrão
Não especificado
Restrições
minimum:0
maximum:2147483647
enable_web_searchbooleanOpcionalAfeta o preço

Desligado por padrão. Quando ligado, o modelo pode buscar na web informações relacionadas ao seu prompt antes de renderizar. Solicitações com a busca na web ligada são cobradas pela tarifa de busca na web, mais alta que a padrão; a estimativa mostrada antes do envio já considera isso.

Valor padrão
false
generate_audiobooleanOpcional

Se uma trilha nativa é renderizada em sincronia com a imagem. Vem ligada; desligar não reduz a tarifa nesta versão. Desligue para loops mudos e para material que você vai musicar na pós.

Valor padrão
true
duration_secondsintegerOpcionalAfeta o preço

Duração do clipe final em segundos inteiros, de 4 a 15, padrão 5; com -1 o modelo escolhe e a estimativa considera 15 segundos. Somada aos segundos dos seus clipes de referência, forma a quantidade cobrada. Quanto mais referências uma tomada precisa conciliar, menos 4 segundos dão conta de mostrá-las — mas confirme a combinação em versão curta antes de pagar por 15.

Valor padrão
5
Valores permitidos
-1456789101112131415
resolutionstringOpcionalAfeta o preço

Resolução de saída: 480p ou 720p por padrão. Ela seleciona uma faixa de preço e não vai deixar referências de baixa resolução mais nítidas. Confira se as referências combinam numa faixa baixa e depois suba para o take final.

Valor padrão
"720p"
Valores permitidos
"480p""720p"
aspect_ratiostringOpcional

Enquadramento de saída, adaptive por padrão: o clipe assume a forma da referência principal. Quando as referências não combinam ou o posicionamento é fixo, escolha uma das seis proporções, de 21:9 a 9:16, e diga no prompt como os sujeitos devem se acomodar dentro dela. Não afeta o que você paga.

Valor padrão
"adaptive"
Valores permitidos
"16:9""9:16""4:3""3:4""1:1""21:9""adaptive"
reference_audio_urlsarray<string>Opcional

Até 3 arquivos de áudio, de 2 a 15 segundos cada e 15 no total, cada um abaixo de 15 MB, que dão à tomada uma âncora sonora — entonação, andamento, uma frase musical — com a qual movimento e pontos de corte se alinham. O áudio não pode ser a única referência: envie pelo menos uma imagem ou um clipe junto. É uma entrada, não a faixa de saída: quem decide se o clipe final tem som continua sendo `generate_audio`.

Valor padrão
Não especificado
Restrições
maxItems:3
reference_video_urlsarray<string>Obrigatório sob condiçãoAfeta o preço

Até 3 clipes que trazem movimento, ritmo ou linguagem de câmera. Cada clipe deve ter de 2 a 15 segundos, e todos juntos no máximo 15; mantenha cada arquivo abaixo de 50 MB e em 1080p ou menos, senão a requisição é recusada. Os segundos deles são cobrados além da duração de saída, então corte-os na parte que você realmente quer citar.

Valor padrão
Não especificado
Restrições
maxItems:3
reference_image_urlsarray<string>Obrigatório sob condição

Até 9 imagens que você tem autorização para usar, para um personagem, um produto, um estilo ou um cenário. Dois ou três ângulos do mesmo sujeito rendem mais que uma pilha de quadros quase idênticos. Toda requisição precisa de pelo menos uma imagem ou um clipe de referência; só áudio é recusado. Este endpoint não tem campo de quadro inicial nem final: quando a imagem de abertura precisa ser exata, use image-to-video. Cada lado precisa ter entre 300 e 6000 pixels; abaixo disso, a verificação de entrada recusa a imagem antes de qualquer cobrança.

Valor padrão
Não especificado
Restrições
maxItems:9

Acompanhar tarefa

HTTP 202 quer dizer que a tarefa foi aceita, não que terminou. Guarde o taskId devolvido e consulte essa tarefa. Não crie outra enquanto espera o resultado.

Requisição aceita
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

A resposta de aceitação já traz a estimativa, para que o seu aplicativo mostre o mesmo valor no histórico de tarefas e na cobrança.

Consultar a tarefa
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comece consultando a cada 2 segundos, mais ou menos, e vá espaçando. Pare em um estado final. Se a conexão cair, consulte o taskId original. Só recrie a tarefa com a chave de idempotência e o corpo originais.

Ou receba o resultado por callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Passe callBackUrl ao criar a tarefa e o registro concluído chega até você via POST — sem nenhum laço de polling. Toda entrega traz X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. A assinatura é um HMAC-SHA256 em base64 sobre taskId.timestamp.sha256(body), então confira contra os bytes brutos: se você analisar o JSON e serializar de novo, os bytes mudam e a verificação falha. Entregas com erro são repetidas, ou seja, o mesmo taskId pode chegar duas vezes — deixe seu handler idempotente. Responda 2xx primeiro e faça o trabalho depois; um handler lento conta como entrega falha.

Ler resultado

Só consuma output quando state for succeeded. Em caso de falha, use errorCode, errorMessage e request_id para investigar. Os custos e estados de exemplo não representam uma cobrança real.

Exemplo de resposta concluída
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "bytedance/seedance-2.0-mini/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Para cada arquivo disponível, abra ou baixe assets[].url direto, sem o cabeçalho Authorization da API. O link assinado expira em expiresAt: consulte a tarefa de novo para renovar enquanto o arquivo estiver dentro do prazo de retenção. Arquivo pendente ou indisponível não tem URL. Trate os links assinados como dado privado.

SDKs e integrações

Use a SpicyAPI no seu app, terminal, assistente de IA ou fluxo visual. Escolha um guia de configuração.

Use no ComfyUI

Instale os nós da SpicyAPI pelo ComfyUI Manager ou com o comando abaixo e procure por Seedance 2.0 Mini · Reference to Video no canvas. O nó tem as mesmas opções desta página e mostra o preço antes da execução.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi