Ir al contenido principal

El reference-to-video de Kling O3 (Kling 3.0 Omni) reúne hasta 7 imágenes de referencia, como una persona, un atuendo o un lugar, en una misma toma nueva. Los clips duran de 3 a 15 segundos a 720p, 1080p o 4K, con audio nativo opcional.

Desde $0.067/s

Playground

Enviar una solicitud

Inicio rápido

Los ejemplos usan las definiciones públicas de parámetros del endpoint seleccionado. Sustituye la clave de API y los medios de ejemplo, y envía la solicitud desde tu servidor.

SDK e integraciones
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticación de API

Guarda la clave de API en la variable de entorno del servidor SPICY_API_KEY. Usa autenticación Bearer y Content-Type: application/json en las solicitudes JSON.

Authorization: Bearer $SPICY_API_KEY
Resultado de ejemploUsar este ejemplo
# 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": "kling/o3/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "generate_audio": false,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ],
    "resolution": "720p",
    "shot_type": "single"
  }
}'

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

Generado a partir del esquema de entrada de este modelo: el mismo con el que la API valida cada solicitud.

Parámetros de entrada

Incluye estos campos en el objeto input del cuerpo de la solicitud. Los nombres y tipos coinciden con la API. No supongas un valor predeterminado si no está indicado.

Este modelo tiene dependencias entre campos. Los marcados como obligatorios según condición dependen de otras entradas; abajo, en el JSON Schema completo, están las reglas.

reference_image_urlsarray<string>Obligatorio

Hasta 7 fotos de referencia para personajes, objetos, atuendos o lugares. JPEG o PNG. Refiérete a cada una en el prompt como <<<image_1>>>, <<<image_2>>>, etc.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:7
promptstringObligatorio

Di qué es cada referencia numerada (<<<image_1>>>, <<<image_2>>>, y así sucesivamente) y describe la toma que deberían producir juntas. Nombrar la función de cada foto es lo que evita que se mezcle con las demás.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
maxLength:2500
multi_promptarray<object>Obligatorio según condición

La lista de tomas para shot_type customize: hasta 6 tomas en orden, cada una con su propio prompt (hasta 512 caracteres) y su duración en segundos enteros. Las duraciones deben sumar duration_seconds, que sigue siendo lo que se cobra.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:6
shot_typestringOpcional

single pide una sola toma continua (no es garantía estricta). multi deja que el modelo divida la escena en varias tomas por su cuenta. customize sigue la lista de tomas que das en multi_prompt. Ninguna cambia el costo.

Valor predeterminado
"single"
Valores permitidos
"single""multi""customize"
duration_secondsintegerOpcionalAfecta al precio

Segundos completos, de 3 a 15. Determina el precio junto con la resolución y el audio.

Valor predeterminado
5
Restricciones
minimum:3
maximum:15
keep_original_audiobooleanOpcional

Conserva el sonido propio del video de referencia en el resultado. Activo por defecto; solo cuenta cuando das un video de referencia. No cambia el costo.

Valor predeterminado
true
generate_audiobooleanOpcionalAfecta al precio

Agrega una banda sonora generada en la misma pasada: diálogo entre comillas, efectos, ambiente. En 720p y 1080p cuesta más por segundo que una corrida silenciosa; en 4K el precio es el mismo con o sin sonido. No está disponible junto con un video de referencia.

Valor predeterminado
false
resolutionstringOpcionalAfecta al precio

720p, 1080p o 4K. Los niveles más altos cuestan más por segundo.

Valor predeterminado
"720p"
Valores permitidos
"720p""1080p""4k"
aspect_ratiostringOpcional

16:9, 9:16 o 1:1. Elígela antes de escribir la toma para que la composición encaje.

Valor predeterminado
"16:9"
Valores permitidos
"16:9""9:16""1:1"
elementsarray<object>Opcional

Un sujeto con nombre para ejecuciones en 4K: dale un nombre, una descripción de una línea y de 2 a 4 fotos de la misma persona u objeto (las muestras de voz de 5 a 30 segundos son opcionales), y luego escribe @nombre en el prompt o en la lista de tomas donde deba aparecer el sujeto. Un sujeto por solicitud; cuenta para el límite de 7 referencias que comparte con reference_image_urls. No cambia el costo.

Valor predeterminado
Sin especificar
Restricciones
maxItems:1
reference_video_urlsarray<string>OpcionalAfecta al precio

Video de referencia opcional, un solo clip, del que la nueva toma toma el movimiento, la cámara o los personajes; menciónalo en el prompt como <<<video_1>>>. Con video puedes usar hasta 4 imágenes de referencia y generate_audio debe quedar apagado. Una ejecución con video de referencia se cobra a una tarifa por segundo más alta que sin él; no está disponible en 4K.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:1

Seguir la tarea

HTTP 202 significa que la tarea se aceptó, no que haya terminado. Guarda el taskId devuelto y consulta esa tarea. No crees otra mientras esperas el resultado.

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

La respuesta de aceptación incluye la estimación para que tu aplicación pueda mostrar el mismo importe en el historial de tareas y en la facturación.

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

Empieza consultando cada 2 segundos aproximadamente y ve espaciando los intentos. Párate en un estado final. Si se cae la conexión, consulta el taskId original. Vuelve a crear la tarea solo con la clave de idempotencia y el cuerpo originales.

O recibe el 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);
});

Pasa callBackUrl al crear la tarea y recibirás el registro terminado por POST, sin un bucle de consultas de estado. Cada entrega lleva X-Webhook-Timestamp, X-Webhook-Signature y X-Webhook-Payload-Version. La firma es un HMAC-SHA256 en base64 sobre taskId.timestamp.sha256(body), así que debes verificarla con los bytes originales: si analizas el JSON y vuelves a serializarlo, los bytes cambian y la verificación falla. Las entregas fallidas se reintentan, de modo que el mismo taskId puede llegar dos veces; haz que tu manejador sea idempotente. Responde 2xx primero y haz el trabajo después: un manejador lento se trata como una entrega fallida.

Leer el resultado

Procesa output solo cuando state sea succeeded. Si falla, consulta errorCode, errorMessage y request_id. Los costos y estados de ejemplo no representan una factura real.

Ejemplo de respuesta completada
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "kling/o3/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 archivo disponible, abre o descarga assets[].url directamente, sin la cabecera Authorization de la API. El enlace firmado expira en expiresAt: vuelve a consultar la tarea para renovarlo mientras el archivo siga dentro del periodo de conservación. Un archivo pendiente o no disponible no trae URL. Trata los enlaces firmados como datos privados.

SDK e integraciones

Usa SpicyAPI en tu app, terminal, asistente de IA o flujo visual. Elige una guía de configuración.

Úsalo en ComfyUI

Instala los nodos de SpicyAPI desde ComfyUI Manager o con el comando de abajo y busca Kling O3 · Reference to Video en el lienzo. El nodo tiene las mismas opciones que esta página y muestra su precio antes de ejecutarse.

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