Api.Airforce
API REFERENCE

Video

Genera clip video con un modello di attività asincrono: invia un prompt, esegui un sondaggio sullo stato e recupera il risultato.

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 lavoro e restituisce un ID attività. Il costo viene addebitato in anticipo in base alla durata × al prezzo al secondo del modello scelto.

POSThttps://api.airforce/v1/video/generations

Modelli video

· live
ParameterTypeRequiredDescription
modelstringRequiredVideo model ID. Use /v1/models and filter by output_modalities.includes("video").
promptstringRequiredScene description.
modestringOptional"text" (default), "image" (animate a first-frame image), "reference" (style transfer from one or more frames).
duration_secondsintegerOptionalClip length. Range depends on the model — typically 5, 8 or 10 s. Defaults to the model's minimum.
aspect_ratiostringOptional"16:9", "9:16", "1:1", "4:3" — must be in the model's supported list.
qualitystringOptional"480p", "720p", "1080p" — must be in the model's supported list.
input_imagesarrayOptional[{ url? } | { b64_json? }] — required for "image" and "reference" modes.
seedintegerOptionalReproducibility seed where supported.
soundbooleanOptionalEnable native audio track on models that produce sound (e.g. wan).

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

ParameterTypeRequiredDescription
task_idstringOptionalPersistent task identifier. Use it on every follow-up endpoint.
statusstringOptional"queued" right after creation.
modelstringOptionalEcho of requested model.
createdintegerOptionalUnix timestamp.
expires_atintegerOptionalUnix timestamp after which the result is purged (typically created + 86400).
cost_centsnumberOptionalUp-front cost debited from your balance. Refunded if the task ultimately fails.
{
  "task_id": "vid_01HXY1234ABCD",
  "status": "queued",
  "model": "wan-2.6",
  "created": 1715000000,
  "expires_at": 1715086400,
  "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".

GEThttps://api.airforce/v1/video/tasks/:task_id
ParameterTypeRequiredDescription
statusstringOptional"queued" | "running" | "completed" | "failed" | "expired".
progressintegerOptional0–100 while running. Absent for queued tasks.
result_urlstringOptionalMP4 download URL once status is "completed". Pre-signed; valid until expires_at.
thumbnail_urlstringOptionalOptional poster frame.
errorobjectOptionalSet when status is "failed". { type, message }.
cost_centsnumberOptionalFinal cost. Equals the create-time cost on success.
{
  "task_id": "vid_01HXY1234ABCD",
  "status": "completed",
  "progress": 100,
  "result_url": "https://cdn.api.airforce/video/vid_01HXY1234ABCD.mp4",
  "thumbnail_url": "https://cdn.api.airforce/video/vid_01HXY1234ABCD.jpg",
  "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.

GEThttps://api.airforce/v1/video/tasks/:task_id/stream
event: progress
data: {"task_id":"vid_01HXY...","status":"running","progress":12}

event: progress
data: {"task_id":"vid_01HXY...","status":"running","progress":58}

event: completed
data: {"task_id":"vid_01HXY...","status":"completed","progress":100,"result_url":"https://cdn.api.airforce/video/vid_01HXY....mp4"}

3. Elenca ed elimina

GEThttps://api.airforce/v1/video/tasks

Restituisce le attività recenti (prima la più recente). Utile per il dashboard per eseguire il rendering di una visualizzazione della cronologia.

ParameterTypeRequiredDescription
limitintegerOptionalMax items returned. Default 50, max 200. Pass as a query string.
statusstringOptionalFilter to one status, e.g. ?status=running.
curl "https://api.airforce/v1/video/tasks?limit=20&status=completed" \
  -H "Authorization: Bearer sk-air-YOUR_API_KEY"
DELETEhttps://api.airforce/v1/video/tasks/:task_id

Rimuove l'attività dalla cronologia. Anche l'MP4 viene eliminato dall'archivio CDN. Nessun rimborso: il costo era già stato addebitato.


Costi e vincoli

Ogni modello video espone metadati di funzionalità da cui è possibile leggere /v1/models:

ParameterTypeRequiredDescription
video_caps.aspect_ratiosarrayOptionalAllowed aspect_ratio values.
video_caps.qualitiesarrayOptionalAllowed quality values.
video_caps.min_duration_s / max_duration_sintegerOptionalAllowed range for duration_seconds.
video_caps.modesarrayOptionalSubset of ["text", "image", "reference"] supported.
video_caps.price_per_second_centsintegerOptionalCost = duration_seconds × this value.
  • Cost is debited at task creation. Failed tasks (status "failed" or "expired") refund the cost.
  • 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?.message ?? task.status);
    }
  }
}