Pular para o conteúdo principal

O reference-to-video Wan 3.0 da Alibaba mantém identidade, figurino, locação ou voz consistentes com até 10 imagens, 5 vídeos e 5 áudios. Entrega 2 a 30 segundos de 480p a 1080p, e o prompt é opcional.

A partir de $0.045/s10% abaixo do preço oficial

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": "alibaba/wan-3.0/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ],
    "resolution": "720p"
  }
}'

# 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.

seedintegerOpcional

De 0 a 2147483647. Mantenha fixo para comparar um campo alterado por vez; tire para ter variedade.

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

Desligada por padrão. Ligada, o prompt é reescrito antes da geração, o que ajuda briefings magros e briga com você nos detalhados. Se você não definir e anexar reference_file_url ou reference_link_url, ela liga nessa requisição, porque o documento ou a página é lido nessa etapa. Se você definir false de forma explícita, o arquivo ou a página ainda é lido, só que sem reescrever o prompt.

Valor padrão
Não especificado
generate_audiobooleanOpcional

Ligado por padrão. O clipe volta com som já travado à imagem. Ponha false quando você mesmo for sonorizar o plano.

Valor padrão
true
duration_secondsintegerOpcionalAfeta o preço

Qualquer número inteiro de 2 a 30, ou -1 para duração inteligente. Padrão 5. Com vídeos de referência, a duração total deles somada a este valor precisa ficar dentro de 30 segundos, e esses segundos são cobrados além da saída. Resolva a aparência em 5 segundos antes de estender.

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

480p, 720p ou 1080p. Padrão 720p. A resolução muda tanto o preço quanto o tempo que a tarefa leva para voltar.

Valor padrão
"720p"
Valores permitidos
"480p""720p""1080p"
enable_thinkingbooleanOpcional

Faz o modelo analisar o pedido e o material de referência antes de gerar. Ajuda com documentos extensos, páginas web e imagens de referência complexas, e deixa a geração mais lenta. Desligado por padrão; liga sozinho quando você passa um arquivo ou link de referência. Não muda o preço.

Valor padrão
false
aspect_ratiostringOpcional

16:9, 9:16, 1:1, 4:3, 3:4 ou adaptive, que deixa o modelo escolher. O padrão é 16:9.

Valor padrão
"16:9"
Valores permitidos
"16:9""9:16""1:1""4:3""3:4""adaptive"
reference_link_urlstringObrigatório sob condição

Uma página web pública que o modelo lê como referência, por exemplo um artigo, uma página de produto ou um perfil de personagem. Ela precisa abrir sem login. Alguns sites bloqueiam leitores automáticos e uma página com pouco texto não serve; nos dois casos a tarefa falha com uma mensagem dizendo que a URL não pôde ser lida, e tarefas com falha não são cobradas. Não combina com reference_file_url; se você não definir enable_prompt_expansion, anexar um link também liga a expansão do prompt. Links não são cobrados.

Valor padrão
Não especificado
Restrições
format:"uri"
reference_file_urlstringObrigatório sob condição

Um documento que o modelo lê antes de dirigir a cena: uma ficha de personagem, um roteiro, uma lista de planos ou um briefing de produto. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES ou NUMBERS, até 100 MB e 50 páginas. Funciona sozinho ou junto com imagens, vídeos e áudio de referência, mas não junto com reference_link_url. Se você não definir enable_prompt_expansion, anexar um arquivo liga a expansão do prompt nessa requisição, porque o documento é lido nessa etapa. Arquivos não são cobrados.

Valor padrão
Não especificado
Restrições
format:"uri"
contentMediaType:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.apple.keynote","application/vnd.apple.pages","application/vnd.apple.numbers","text/plain","text/markdown"]
reference_audio_urlsarray<string>Obrigatório sob condição

Até 5 clipes, cada um de 1 a 15 segundos e 15 segundos no total — uma voz, a leitura de uma fala ou o som ambiente que o plano precisa acompanhar. Áudio de referência não é cobrado. WAV ou MP3, até 15 MB por clipe. Assim como no vídeo, esses limites são verificados durante a geração, não quando a tarefa é aceita.

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

Até 5 clipes, cada um de 1 a 15 segundos e 15 segundos no total. Use-os para movimento e estilo de câmera, não para um rosto. A duração deles é cobrada junto com a saída, e vídeo de referência mais saída precisam caber em 30 segundos. MP4 ou MOV, no mínimo 16 fps, de 240 a 4096 px por lado, proporção de no máximo 8:1 e até 100 MB por clipe. Esses limites são verificados durante a geração, não quando a tarefa é aceita, então confira a duração dos clipes antes de enviar.

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

De 1 a 10 imagens como referências de identidade, figurino e cenário. Nomeie cada uma no prompt — personagem, peça, cenário —, senão elas viram uma média. Imagens de referência não são cobradas. JPEG, PNG sem transparência, BMP ou WEBP; de 240 a 8000 px por lado, proporção de no máximo 8:1 e até 20 MB por imagem. A verificação de rostos deste modelo costuma recusar fotos de pessoas reais, e a tarefa falha com "The input content is suspected to include real human faces.". Use personagens ilustrados ou renderizados em 3D; tarefas recusadas não são cobradas.

Valor padrão
Não especificado
Restrições
minItems:1
maxItems:10
promptstringOpcional

Opcional. Se escrever um, diga primeiro o que cada referência controla e depois o plano: sujeito, uma ação, um movimento de câmera, luz e som. Uma ação clara mexe mais no resultado do que listas longas de adjetivos.

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

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": "alibaba/wan-3.0/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 Wan 3.0 · 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