Pular para o conteúdo principal

Solução de API de vídeo

De um prompt ou de um quadro parado para vídeo pronto.

Vídeo é o resultado mais caro da maioria dos produtos e o que mais demora a voltar. Três campos do corpo decidem as duas coisas, e a tarefa continua viva muito depois de a requisição que a iniciou ter sumido.

O desafio

O que separa vídeo de qualquer outra tarefa

Uma requisição de vídeo não é uma requisição de imagem mais lenta. Duração, resolução e a chave de áudio definem quanto você paga e quanto espera, e definem antes de existir um único quadro.

01

Duração e resolução são botões de preço, não padrões

A maioria dos endpoints de vídeo cobra por segundo produzido na resolução escolhida. Passar duration_seconds de 5 para 10 dobra o valor aproximadamente; subir um degrau de resolução dobra de novo. Ambos vêm marcados como relevantes para o preço no esquema, então a estimativa fica ao lado do controle, não na fatura.

02

Áudio gerado é outra tarifa

Onde existe generate_audio, esse booleano move a requisição para outra tarifa. Um formulário que o esconde vai enviar caladamente a versão mais cara toda vez.

03

A resposta HTTP não é o vídeo

createTask responde 202 Accepted com um taskId em queued. A geração segue no servidor por minutos. Qualquer código que espere no socket original vai estourar o tempo enquanto a tarefa, e a cobrança, continuam.

A abordagem

Primeiro feche o preço, depois envie uma única vez

Peça a estimativa do corpo exato com POST /api/v1/jobs/quote, mostre o valor e envie esse mesmo corpo para createTask com quoteId, expectedCost e uma Idempotency-Key guardada. Um preço que mudou entre as duas chamadas falha com o código de negócio 40901 em vez de aparecer depois na fatura.

Uma chamada de criação carrega o modelo, a entrada validada e um retorno opcional. HTTP 202 significa aceito, não concluído.

POST /api/v1/jobs/createTask

POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Idempotency-Key: 7b1f0c2e-9a4d-4f31-8c67-2b5e0d9a1c44
Content-Type: application/json
{
  "model": "<publisher>/<model>/text-to-video",
  "input": {
    "prompt": "A slow aerial drift over a misty pine forest at sunrise",
    "duration_seconds": 5,
    "resolution": "1080p",
    "generate_audio": true
  },
  "callBackUrl": "https://example.com/hooks/spicyapi"
}

202 Accepted

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"
  }
}

Contrato

O que vale fixar logo de início

API de vídeo generativo: testar e integrar — O que vale fixar logo de início
Campo ou cabeçalhoValor ou limite
POST /api/v1/jobs/createTask202 Accepted · state queued
duration_seconds · resolution · generate_audioprice-affecting fields
Idempotency-Key24 h · scoped to one API key
output.assets[].expiresAtsigned URL · results kept 14 days

Deslize horizontalmente para ver todas as colunas.

Integração

Da primeira chamada até produção

  1. 01Escolha o endpoint na página do modelo e copie o valor model exatamente; o sufixo da tarefa faz parte dele.
  2. 02Estime o corpo que pretende enviar e mostre estimatedCost, quantity e unit ao lado do botão de envio.
  3. 03Envie do backend com Idempotency-Key, guarde data.taskId no seu registro e responda ao cliente na hora.
  4. 04Encerre pelo retorno assinado, mantenha recordInfo com backoff exponencial como reserva e baixe o arquivo antes de a URL expirar.

Adequação

Quando este caminho é o certo

Escolha se

  • Você precisa de arquivos de vídeo prontos — anúncios, trailers, loops, cortes sociais — e aceita minutos de latência por clipe.
  • Duração, resolução e áudio precisam ser escolhidos pelo usuário, e toda combinação precisa ter preço antes da confirmação.

Procure outro caminho se

  • Você precisa de resposta dentro do ciclo da requisição. Modelos de texto transmitem; vídeo não.
  • Você pretende cancelar no meio da geração. Uma tarefa aceita vai até um estado terminal e só volta a reserva não usada.

Evidências

O que você mesmo pode verificar

Todo campo vem do esquema publicado

O formulário de cada página de modelo é gerado do input_schema daquele endpoint, e o servidor valida contra o mesmo documento. Um campo não declarado devolve 400 em vez de ser descartado em silêncio.

A estimativa é um teto, não um palpite

createTask reserva o valor estimado e o devolve em cost com settled: false. A cobrança final nunca ultrapassa a reserva, e falha ou expiração libera tudo.

Cada chave tem o próprio teto de gasto

Limite uma chave por dia, por mês e ao longo de toda a vida dela, restrinja a modelos específicos e a IPs de origem, e envie cada escrita com a mesma chave de idempotência.

Antes de lançar

Comportamentos da plataforma a confirmar

  • Confirme que o endpoint pode ser chamado hoje; a disponibilidade é publicada por endpoint, não por família.
  • Guarde taskId e Idempotency-Key juntos, fora da sessão do navegador.
  • Verifique a assinatura do retorno antes de ler o corpo e trate entregas como repetíveis.
  • Copie a mídia pronta para o seu armazenamento; resultados ficam guardados por 14 dias.

Perguntas frequentes

O que mais perguntam nesta página

Depende do endpoint, da duração pedida e da fila do momento — por isso a API é assíncrona. Trate o 202 como o fim da sua requisição e o retorno ou uma consulta limitada como o fim do trabalho. Não existe endpoint de vídeo síncrono.