Vai al contenuto principale

Soluzione API video

Da un prompt o da un fotogramma fisso al video finito.

Il video è la generazione più costosa e più lenta della maggior parte dei prodotti. Tre campi nel corpo della richiesta decidono entrambi i numeri, e l’attività continua a girare molto dopo che la richiesta che l’ha avviata è sparita.

La sfida

Cosa distingue il video da ogni altra attività

Una richiesta video non è una richiesta immagine più lenta. Durata, risoluzione e l’interruttore dell’audio stabiliscono quanto paghi e quanto aspetti, e lo fanno prima che esista un solo fotogramma.

01

Durata e risoluzione sono leve di prezzo, non preimpostazioni

La maggior parte degli endpoint video fattura al secondo di output alla risoluzione scelta. Portare duration_seconds da 5 a 10 raddoppia più o meno l’addebito, e uno scatto di risoluzione lo raddoppia di nuovo. Entrambi sono marcati come campi che influiscono sul prezzo nello schema dell’endpoint, quindi la stima sta accanto al comando, non sulla fattura.

02

L’audio generato è una fascia tariffaria diversa

Dove esiste, generate_audio è un booleano che sposta la richiesta su un’altra tariffa. Un modulo che lo nasconde spedisce in silenzio la versione più cara di ogni richiesta.

03

La risposta HTTP non è il video

createTask risponde 202 Accepted con un taskId in stato queued. La generazione prosegue lato server per minuti. Tutto ciò che resta in attesa sul socket originale va in timeout mentre l’attività, e l’addebito, proseguono.

L’approccio

Prima fissa il prezzo, poi invia una volta sola

Chiedi il preventivo del corpo esatto con POST /api/v1/jobs/quote, mostra la stima restituita, poi manda lo stesso corpo a createTask con quoteId, expectedCost e una Idempotency-Key salvata. Un prezzo cambiato fra le due chiamate fallisce con il codice applicativo 40901 invece di riapparire dopo come sorpresa.

Una sola chiamata di creazione porta il modello, l’input validato e una callback facoltativa. HTTP 202 significa accettata, non completata.

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

Contratto

Cosa conviene fissare fin dall’inizio

API di generazione video: confronta e integra — Cosa conviene fissare fin dall’inizio
Campo o headerValore o 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

Scorri in orizzontale per vedere tutte le colonne.

Integrazione

Dalla prima chiamata alla produzione

  1. 01Scegli l’endpoint nella sua pagina del modello e copia il valore di model esatto: il suffisso dell’attività ne fa parte.
  2. 02Chiedi il preventivo del corpo che intendi inviare e mostra estimatedCost, quantity e unit accanto al pulsante di invio.
  3. 03Invia dal tuo backend con una Idempotency-Key, salva data.taskId insieme al tuo record e rispondi subito al client.
  4. 04Chiudi sulla callback firmata, ripiega su recordInfo con backoff esponenziale e scarica il file prima che il suo URL scada.

Scelta

Quando questa strada è quella giusta

Scegli questa via se

  • Ti servono file video finiti – spot, trailer, loop, tagli per i social – e puoi accettare minuti di attesa per clip.
  • Durata, risoluzione e audio devono restare nelle mani dell’utente, e ogni combinazione va quotata prima che l’utente confermi.

Cerca altrove se

  • Ti serve una risposta dentro un solo ciclo di richiesta. I modelli di testo fanno streaming, il video no.
  • Conti di annullare a metà generazione. Un’attività accettata corre fino a uno stato finale e torna indietro solo la parte di importo non usata.

Verifiche

Cosa puoi verificare in autonomia

Ogni campo viene dallo schema pubblicato

Il modulo di ogni pagina del modello è generato dall’input_schema di quell’endpoint, e il server valida sullo stesso documento. Un campo che il modello non dichiara restituisce 400 invece di essere scartato.

La stima è un tetto, non un’ipotesi

createTask blocca la stima e la restituisce come cost con settled: false. L’addebito finale non supera mai il blocco, e un’attività fallita o scaduta lo libera per intero.

Ogni chiave porta il proprio limite di spesa

Limita una chiave al giorno, al mese e per tutta la sua vita, restringila a modelli e IP di origine indicati, e manda ogni scrittura con la stessa chiave di idempotenza.

Prima del lancio

Comportamenti della piattaforma da confermare

  • Verifica che l’endpoint sia richiamabile oggi: la disponibilità è pubblicata per endpoint, non per famiglia di modelli.
  • Conserva taskId e Idempotency-Key insieme, fuori dalla sessione del browser.
  • Verifica la firma della callback prima di leggere il corpo, e considera le consegne ripetibili.
  • Copia i media finiti nel tuo archivio: i risultati generati restano 14 giorni.

Domande frequenti

Cosa ci chiedono su questa pagina

Dipende dall’endpoint, dalla durata richiesta e dalla coda del momento: per questo l’API è asincrona. Considera il 202 la fine della tua richiesta, e la callback o un polling limitato la fine del lavoro. Non esiste un endpoint video sincrono.