Video
Genera clip video con un modello di attività asincrono: invia un prompt, esegui un sondaggio sullo stato e recupera il risultato.
La generazione di video è asincrona: invii un prompt, ricevi un task id, fai il polling del suo status, poi recuperi il clip finito. Text-to-video, image-to-video e le modalità di riferimento condividono tutte un'unica struttura di richiesta.
Le durate, le risoluzioni e gli aspect ratio che puoi richiedere dipendono dal modello scelto — leggili dall'endpoint dei modelli invece di presumere un insieme fisso.
La generazione del video viene eseguita in background: non è disponibile alcun rendering in streaming. Il flusso è sempre: crea attività → stato sondaggio → scarica MP4. Le attività scadono dopo 24 ore.
1. Crea un'attività
Invia il job e restituisce un task ID. Il costo è stimato da durata × prezzo al secondo del modello e addebitato quando il job viene elaborato.
https://api.airforce/v1/video/generationsModelli video
…· live| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Video model ID. Use /v1/models and filter by output_modalities.includes("video"). |
| prompt | string | Required | Scene description. |
| mode | string | Optional | "text" (default), "image" (animate a first-frame image), "reference" (style transfer from one or more frames). |
| duration_seconds | integer | Optional | Clip length. Range depends on the model — typically 5, 8 or 10 s. Defaults to the model's minimum. |
| aspect_ratio | string | Optional | "16:9", "9:16", "1:1", "4:3" — must be in the model's supported list. |
| quality | string | Optional | "480p", "720p", "1080p" — must be in the model's supported list. |
| input_images | array | Optional | [{ url? } | { b64_json? }] — required for "image" and "reference" modes. |
Qualsiasi altra chiave (es. seed, sound) viene inoltrata al provider upstream così com'è — non viene validata qui e il supporto dipende dal modello.
Esempi
Da testo a video
curl https://api.airforce/v1/video/generations \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-2.6",
"prompt": "A red fox darting across snowy hills at dawn",
"duration_seconds": 8,
"aspect_ratio": "16:9",
"quality": "720p",
"sound": true
}'Da immagine a video (primo fotogramma)
curl https://api.airforce/v1/video/generations \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-1",
"mode": "image",
"prompt": "Camera pulls back as the dragon takes off",
"duration_seconds": 5,
"aspect_ratio": "16:9",
"input_images": [{"url": "https://example.com/dragon.jpg"}]
}'Risposta
| Parameter | Type | Required | Description |
|---|---|---|---|
| task_id | string | Optional | Persistent task identifier. Use it on every follow-up endpoint. |
| status | string | Optional | "queued" right after creation. |
| model | string | Optional | Echo of requested model. |
| created | integer | Optional | Unix timestamp. |
| expires_at | integer | Optional | Unix timestamp after which the result is purged (exactly created + 86400). |
| progress | integer | Optional | 0 right after creation. |
| cost_cents | number | Optional | Estimated cost for the job. Final billing is settled when the job is processed. |
{
"task_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"status": "queued",
"model": "wan-2.6",
"created": 1715000000,
"expires_at": 1715086400,
"progress": 0,
"cost_cents": 320
}2. Sondaggio per lo stato
Sondaggio ogni 5-15 secondi. Le attività vengono solitamente completate in 30 secondi – 4 minuti a seconda della durata e del modello. Lo stesso endpoint restituisce l'URL del risultato quando lo stato passa a "completato".
https://api.airforce/v1/video/tasks/:task_id| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | Optional | "queued" | "processing" | "completed" | "failed" | "expired". |
| progress | integer | Optional | 0–100 while processing. |
| result_url | string | Optional | MP4 download URL once status is "completed", set by the upstream provider. Valid until expires_at. |
| error | string | Optional | Failure message. Set (non-null) when status is "failed". |
| cost_cents | number | Optional | Cost for the job, settled when it is processed. |
{
"task_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"status": "completed",
"progress": 100,
"result_url": "https://.../video.mp4",
"model": "wan-2.6",
"duration_seconds": 8,
"expires_at": 1715086400,
"cost_cents": 320
}2b. Avanzamento dello streaming (facoltativo)
Salta il ciclo di polling con un flusso di eventi inviati dal server. Emette un evento per ogni modifica di avanzamento e si chiude una volta che l'attività è in uno stato terminale. Stessa forma del carico utile dell'endpoint GET.
https://api.airforce/v1/video/tasks/:task_id/streamevent: state
data: {"task_id":"f47ac10b-...","status":"processing","progress":12}
event: state
data: {"task_id":"f47ac10b-...","status":"processing","progress":58}
event: state
data: {"task_id":"f47ac10b-...","status":"completed","progress":100,"result_url":"https://.../video.mp4"}
event: done
data: [DONE]3. Elenca ed elimina
https://api.airforce/v1/video/tasksRestituisce le attività recenti (prima la più recente). Utile per il dashboard per eseguire il rendering di una visualizzazione della cronologia.
Restituisce fino ai tuoi 100 task più recenti, dal più nuovo, come { "data": [ ...tasks ] }. Non ci sono parametri di query — filtra e pagina lato client.
curl https://api.airforce/v1/video/tasks \
-H "Authorization: Bearer sk-air-YOUR_API_KEY"https://api.airforce/v1/video/tasks/:task_idRimuove il record dell’attività dalla cronologia.
Idempotente — restituisce sempre { "deleted": true }. Questo elimina solo il tuo record nella cronologia; non elimina separatamente i media memorizzati.
Costi e vincoli
Ogni modello video espone metadati di funzionalità da cui è possibile leggere /v1/models:
| Parameter | Type | Required | Description |
|---|---|---|---|
| video_caps.aspect_ratios | array | Optional | Allowed aspect_ratio values. |
| video_caps.qualities | array | Optional | Allowed quality values. |
| video_caps.min_duration_s / max_duration_s | integer | Optional | Allowed range for duration_seconds. |
| video_caps.modes | array | Optional | Subset of ["text", "image", "reference"] supported. |
| video_caps.price_per_second_cents | integer | Optional | Cost = duration_seconds × this value. |
- Cost is estimated at creation and settled when the job is processed; failed or expired tasks are not charged.
- Max 4 concurrent video tasks per API key.
- Result URLs are pre-signed and stop working at
expires_at. Download or copy the MP4 to your own storage if you need it longer.
Script end-to-end
async function generateVideo(prompt) {
const create = await fetch('https://api.airforce/v1/video/generations', {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'wan-2.6',
prompt,
duration_seconds: 8,
aspect_ratio: '16:9',
quality: '720p',
}),
}).then(r => r.json());
const { task_id } = create;
// Poll until done.
while (true) {
await new Promise(r => setTimeout(r, 8_000));
const task = await fetch(
`https://api.airforce/v1/video/tasks/${task_id}`,
{ headers: { Authorization: `Bearer ${API_KEY}` } },
).then(r => r.json());
if (task.status === 'completed') return task.result_url;
if (task.status === 'failed' || task.status === 'expired') {
throw new Error(task.error ?? task.status);
}
}
}