Ir al contenido principal

Solución de API de vídeo

De una indicación o un fotograma fijo a un vídeo terminado.

El vídeo es lo más caro que genera la mayoría de los productos y lo que más tarda en volver. Tres campos del cuerpo deciden ambas cosas, y la tarea sigue viva mucho después de que desaparezca la petición que la lanzó.

El reto

Qué distingue al vídeo de cualquier otra tarea

Una petición de vídeo no es una petición de imagen más lenta. La duración, la resolución y el interruptor de audio fijan lo que pagas y lo que esperas, y lo hacen antes de que exista un solo fotograma.

01

Duración y resolución son mandos de precio, no valores por defecto

La mayoría de endpoints de vídeo cobran por segundo producido en la resolución elegida. Pasar duration_seconds de 5 a 10 duplica aproximadamente el cargo; subir un escalón de resolución lo vuelve a hacer. Ambos están marcados como relevantes para el precio en el esquema, así que la estimación va junto al control, no en la factura.

02

El audio generado es otra tarifa

Donde existe generate_audio, ese booleano mueve la petición a otra tarifa. Un formulario que lo oculta enviará en silencio la versión más cara cada vez.

03

La respuesta HTTP no es el vídeo

createTask responde 202 Accepted con un taskId en estado queued. La generación continúa en el servidor durante minutos. Cualquier código que espere en el socket original agotará el tiempo mientras la tarea, y el cargo, siguen adelante.

El enfoque

Primero fija el precio, después envía una sola vez

Pide una estimación del cuerpo exacto con POST /api/v1/jobs/quote, muestra el importe y envía ese mismo cuerpo a createTask con quoteId, expectedCost y una Idempotency-Key guardada. Un precio que cambió entre ambas llamadas falla con el código de negocio 40901 en lugar de aparecer más tarde en la factura.

Una llamada de creación lleva el modelo, la entrada validada y una devolución opcional. HTTP 202 significa aceptado, no terminado.

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

Lo que conviene fijar desde el principio

API de vídeo generativo: comparar e integrar — Lo que conviene fijar desde el principio
Campo o cabeceraValor o límite
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

Desliza horizontalmente para ver todas las columnas.

Integración

De la primera llamada a producción

  1. 01Elige el endpoint en su página de modelo y copia el valor model tal cual; el sufijo de tarea forma parte de él.
  2. 02Estima el cuerpo que vas a enviar y muestra estimatedCost, quantity y unit junto al botón de envío.
  3. 03Envía desde el backend con una Idempotency-Key, guarda data.taskId en tu propio registro y responde de inmediato al cliente.
  4. 04Cierra con la devolución firmada, deja recordInfo con retroceso exponencial como respaldo y descarga el archivo antes de que caduque la URL.

Encaje

Cuándo este camino es el adecuado

Elígelo si

  • Necesitas archivos de vídeo terminados —anuncios, tráileres, bucles, cortes sociales— y aceptas minutos de latencia por clip.
  • La duración, la resolución y el audio deben poder elegirse, y cada combinación tiene que tener precio antes de confirmar.

Busca otra vía si

  • Necesitas una respuesta dentro del ciclo de la petición. Los modelos de texto transmiten en flujo; el vídeo no.
  • Piensas cancelar a mitad de generación. Una tarea aceptada llega a un estado terminal y solo vuelve la reserva no usada.

Comprobaciones

Lo que puedes verificar tú mismo

Cada campo procede del esquema publicado

El formulario de cada página de modelo se genera desde el input_schema de ese endpoint, y el servidor valida contra el mismo documento. Un campo no declarado devuelve 400 en vez de descartarse en silencio.

La estimación es un techo, no una conjetura

createTask reserva el importe estimado y lo devuelve en cost con settled: false. El cargo final nunca supera la reserva, y un fallo o caducidad la libera por completo.

Cada clave tiene su propio techo de gasto

Limita una clave por día, por mes y durante toda su vida, restríngela a modelos concretos y a IP de origen, y envía cada escritura con la misma clave de idempotencia.

Antes del lanzamiento

Comportamientos de la plataforma que conviene confirmar

  • Comprueba que el endpoint se puede llamar hoy; la disponibilidad se publica por endpoint, no por familia.
  • Guarda juntos taskId e Idempotency-Key, fuera de la sesión del navegador.
  • Verifica la firma de la devolución antes de leer el cuerpo y trata las entregas como repetibles.
  • Copia el material terminado a tu propio almacenamiento; los resultados se conservan 14 días.

Preguntas frecuentes

Lo que más se pregunta en esta página

Depende del endpoint, de la duración pedida y de la cola del momento: por eso la API es asíncrona. Trata el 202 como el final de tu petición y la devolución o un sondeo acotado como el final del trabajo. No existe un endpoint de vídeo síncrono.