Pular para o conteúdo principal

O referência para vídeo do P-Video 2 Pro monta um clipe de 5 a 15 segundos em 480p ou 768p a partir de até 3 vídeos e 3 clipes de áudio de referência, citados no prompt como video 1 e audio 1, além de um quadro inicial e final opcionais. Sem filtro de conteúdo.

A partir de $0.018/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": "pruna-ai/p-video-2-pro/reference-to-video",
  "input": {
    "aspect_ratio": "auto",
    "duration_seconds": 5,
    "generation_mode": "speed",
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "prompt_optimization_mode": "off",
    "resolution": "768p"
  }
}'

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

promptstringObrigatório

Diga o que tirar de cada referência. Escreva video 1, video 2 para vídeos de referência e audio 1, audio 2 para clipes de áudio, numerados na ordem do upload.

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

Mantém as execuções comparáveis enquanto você muda o prompt. Não garante um clipe idêntico quadro a quadro.

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

off (padrão) envia o seu prompt palavra por palavra; turbo e max deixam o serviço reescrevê-lo antes. Não altera o preço.

Valor padrão
"off"
Valores permitidos
"off""turbo""max"
duration_secondsintegerOpcionalAfeta o preço

Segundos inteiros, de 5 a 15 (padrão 5). Define o preço.

Valor padrão
5
Restrições
minimum:5
maximum:15
keep_reference_audiobooleanOpcional

Desligado por padrão. Ligado usa o seu clipe de áudio como trilha sonora no lugar de gerar um som novo; exige exatamente um clipe de áudio.

Valor padrão
false
generation_modestringOpcionalAfeta o preço

cost (mais barato, um pouco mais lento) ou speed (padrão, mais rápido com a mesma qualidade).

Valor padrão
"speed"
Valores permitidos
"cost""speed"
resolutionstringOpcionalAfeta o preço

480p ou 768p (padrão 768p). 768p custa mais por segundo.

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

auto (padrão) se adapta às referências; ou escolha 16:9, 9:16, 4:3, 3:4, 3:2, 2:3 ou 1:1. Não altera o preço.

Valor padrão
"auto"
Valores permitidos
"auto""16:9""9:16""4:3""3:4""3:2""2:3""1:1"
reference_audio_urlsarray<string>OpcionalAfeta o preço

Até 3 clipes de áudio, 15 segundos no total, para uma voz, diálogo ou música. Exige também um quadro inicial ou um vídeo de referência. Adiciona uma taxa fixa.

Valor padrão
Não especificado
Restrições
minItems:1
maxItems:3
reference_video_urlsarray<string>OpcionalAfeta o preço

Até 3 vídeos, de 2 segundos ou mais cada e 15 segundos no total, para movimento, câmera e ritmo. Os segundos deles são cobrados, mais um segundo para arredondamento.

Valor padrão
Não especificado
Restrições
minItems:1
maxItems:3
last_image_urlstringOpcionalAfeta o preço

Quadro final opcional em que o clipe termina. Adiciona uma pequena cobrança.

Valor padrão
Não especificado
Restrições
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
image_urlstringOpcionalAfeta o preço

Quadro inicial opcional: quem e onde o plano começa. Adiciona uma pequena cobrança.

Valor padrão
Não especificado
Restrições
format:"uri"
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]

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": "pruna-ai/p-video-2-pro/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 P-Video 2 Pro · 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