Vai al contenuto principale

Il reference-to-video Kling O3 (Kling 3.0 Omni) riunisce in una nuova ripresa fino a 7 immagini di riferimento, come una persona, un abito o un luogo. Clip da 3 a 15 secondi a 720p, 1080p o 4K, con audio nativo facoltativo.

Da $0.067/s

Playground

Invia una richiesta

Guida rapida

Gli esempi usano le definizioni pubbliche dei parametri dell’endpoint selezionato. Sostituisci la chiave API e i media di esempio, poi invia la richiesta dal tuo server.

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

Autenticazione dell’API

Tieni la chiave API nella variabile d’ambiente del server SPICY_API_KEY. Per le richieste JSON usa l’autenticazione Bearer e Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Risultato di esempioUsa questo esempio
# 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"

Generato dallo schema di input di questo modello, lo stesso su cui l’API valida ogni richiesta.

Parametri di input

Metti questi campi dentro l’oggetto input del corpo della richiesta. Nomi e tipi corrispondono all’API. Quando un valore predefinito non è indicato, non darlo per scontato.

Questo modello ha dipendenze tra i campi. I campi segnati come obbligatori a certe condizioni dipendono da altri input; le regole sono nel JSON Schema completo qui sotto.

reference_image_urlsarray<string>Obbligatorio

Fino a 7 foto di riferimento per personaggi, oggetti, abiti o luoghi. JPEG o PNG. Riferisciti a ciascuna nel prompt come <<<image_1>>>, <<<image_2>>>, ecc.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:7
promptstringObbligatorio

Di' cos'è ogni riferimento numerato (<<<image_1>>>, <<<image_2>>> e così via) e descrivi l'inquadratura che dovrebbero produrre insieme. Nominare il compito di ogni foto è ciò che le impedisce di fondersi con le altre.

Predefinito
Non specificato
Vincoli
minLength:1
maxLength:2500
multi_promptarray<object>Obbligatorio a certe condizioni

La lista di inquadrature per shot_type customize: fino a 6 inquadrature in ordine, ognuna con il proprio prompt (fino a 512 caratteri) e la propria durata in secondi interi. Le durate devono sommarsi a duration_seconds, che resta la base di fatturazione.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:6
shot_typestringFacoltativo

single chiede un’unica ripresa continua (non una garanzia assoluta). multi lascia che il modello divida la scena in più inquadrature da solo. customize segue la lista di inquadrature che indichi in multi_prompt. Nessuna delle tre cambia il prezzo.

Predefinito
"single"
Valori ammessi
"single""multi""customize"
duration_secondsintegerFacoltativoIncide sul prezzo

Secondi interi, da 3 a 15. Determina il prezzo insieme alla risoluzione e all'audio.

Predefinito
5
Vincoli
minimum:3
maximum:15
keep_original_audiobooleanFacoltativo

Mantiene nel risultato l’audio originale del video di riferimento. Attivo per impostazione predefinita; conta solo se fornisci un video di riferimento. Non cambia il prezzo.

Predefinito
true
generate_audiobooleanFacoltativoIncide sul prezzo

Aggiunge una colonna sonora generata nello stesso passaggio, dialogo tra virgolette, effetti, ambiente. In 720p e 1080p costa di più al secondo di un'esecuzione silenziosa; in 4K il prezzo è lo stesso con o senza audio. Non disponibile insieme a un video di riferimento.

Predefinito
false
resolutionstringFacoltativoIncide sul prezzo

720p, 1080p o 4K. I livelli più alti costano di più al secondo.

Predefinito
"720p"
Valori ammessi
"720p""1080p""4k"
aspect_ratiostringFacoltativo

16:9, 9:16 o 1:1. Scegli prima di scrivere l'inquadratura così la composizione si adatta.

Predefinito
"16:9"
Valori ammessi
"16:9""9:16""1:1"
elementsarray<object>Facoltativo

Un soggetto con nome per le esecuzioni in 4K: dagli un nome, una descrizione di una riga e da 2 a 4 foto della stessa persona o dello stesso oggetto (i campioni vocali da 5 a 30 secondi sono facoltativi), poi scrivi @nome nel prompt o nella lista di inquadrature dove il soggetto deve comparire. Un soggetto per richiesta; conta nel limite di 7 riferimenti condiviso con reference_image_urls. Non cambia il prezzo.

Predefinito
Non specificato
Vincoli
maxItems:1
reference_video_urlsarray<string>FacoltativoIncide sul prezzo

Video di riferimento facoltativo, una sola clip, da cui la nuova ripresa prende movimento, camera o personaggi; indicalo nel prompt come <<<video_1>>>. Con un video puoi usare fino a 4 immagini di riferimento e generate_audio deve restare spento. Un’esecuzione con video di riferimento è fatturata a una tariffa al secondo più alta di una senza; non è disponibile in 4K.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:1

Segui l’attività

HTTP 202 significa che l’attività è stata accettata, non che sia finita. Salva il taskId restituito e interroga quell’attività. Non crearne un’altra mentre aspetti il risultato.

Risposta di accettazione
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 risposta di accettazione include la stima, così la tua applicazione può mostrare lo stesso importo nella cronologia delle attività e nella fatturazione.

Leggi l’attività
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comincia a interrogare ogni 2 secondi circa e allunga l’intervallo man mano. Fermati a uno stato terminale. Dopo una caduta di connessione, interroga il taskId originale. Ripeti la creazione solo con la chiave di idempotenza e il corpo originali.

Oppure lascia che sia la callback a trovarti
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);
});

Passa callBackUrl quando crei l’attività e il record finito ti arriva via POST: nessun ciclo di polling. Ogni consegna porta X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. La firma è un HMAC-SHA256 in base64 su taskId.timestamp.sha256(body), quindi va verificata sui byte grezzi: se analizzi il JSON e lo riserializzi i byte cambiano e la verifica fallisce. Le consegne fallite vengono ritentate, quindi lo stesso taskId può arrivare due volte: rendi idempotente il gestore. Rispondi prima con un 2xx e fai il lavoro dopo; un gestore lento viene trattato come una consegna fallita.

Leggi il risultato

Usa l’output solo quando lo stato è succeeded. In caso di fallimento, indaga con errorCode, errorMessage e request_id. Costi e stati degli esempi non rappresentano un addebito reale.

Esempio di risposta completata
{
  "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"
  }
}

Per ogni asset disponibile, apri o scarica assets[].url direttamente, senza l’header Authorization dell’API. L’URL firmato scade a expiresAt; interroga di nuovo l’attività per rinnovarlo finché l’asset resta entro il periodo di conservazione. Un asset in attesa o non disponibile non ha URL. Tratta gli URL firmati come privati.

SDK e integrazioni

Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.

Usalo in ComfyUI

Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Kling O3 · Reference to Video sulla tela. Il nodo ha le stesse opzioni di questa pagina e mostra il prezzo prima dell’esecuzione.

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