Api.Airforce
API REFERENCE

Vidéo

Générez des clips vidéo avec un modèle de tâche asynchrone : soumettez une invite, interrogez le statut, récupérez le résultat.

La génération de vidéo est asynchrone : soumettez un prompt, recevez un task id, interrogez son status, puis récupérez le clip terminé. Les modes text-to-video, image-to-video et reference partagent tous une même forme de requête.

Les durées, résolutions et aspect ratios que vous pouvez demander dépendent du modèle choisi — relisez-les depuis l'endpoint models plutôt que de supposer un ensemble fixe.

La génération vidéo s’exécute en arrière-plan – il n’y a pas de rendu en streaming. Le flux est toujours : créer une tâche → statut du sondage → télécharger MP4. Les tâches expirent après 24 heures.

1. Créez une tâche

Soumet la tâche et renvoie un task ID. Le coût est estimé à partir de durée × prix par seconde du modèle et réglé lorsque la tâche est traitée.

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

Modèles vidéo

· 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.

Toute autre clé (p. ex. seed, sound) est transmise telle quelle au fournisseur en amont — elle n'est pas validée ici et la prise en charge dépend du modèle.

Exemples

Texte vers vidéo

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

Image vers vidéo (première image)

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

Réponse

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 (exactly created + 86400).
progressintegerOptional0 right after creation.
cost_centsnumberOptionalEstimated 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. Sondage pour le statut

Sondez toutes les 5 à 15 secondes. Les tâches sont généralement terminées en 30 s à 4 minutes selon la durée et le modèle. Le même point de terminaison renvoie l'URL du résultat lorsque le statut passe à « terminé ».

GEThttps://api.airforce/v1/video/tasks/:task_id
ParameterTypeRequiredDescription
statusstringOptional"queued" | "processing" | "completed" | "failed" | "expired".
progressintegerOptional0–100 while processing.
result_urlstringOptionalMP4 download URL once status is "completed", set by the upstream provider. Valid until expires_at.
errorstringOptionalFailure message. Set (non-null) when status is "failed".
cost_centsnumberOptionalCost 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. Progression du flux (facultatif)

Évitez la boucle d'interrogation avec un flux d'événements envoyés par le serveur. Émet un événement par changement de progression et se ferme une fois que la tâche est dans un état terminal. Même forme de charge utile que le point de terminaison GET.

GEThttps://api.airforce/v1/video/tasks/:task_id/stream
event: 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. Liste et suppression

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

Renvoie vos tâches récentes (les plus récentes en premier). Utile pour que le tableau de bord affiche une vue historique.

Renvoie jusqu'à vos 100 tâches les plus récentes, les plus récentes en premier, sous la forme { "data": [ ...tasks ] }. Il n'y a aucun paramètre de requête — filtrez et paginez côté client.

curl https://api.airforce/v1/video/tasks \
  -H "Authorization: Bearer sk-air-YOUR_API_KEY"
DELETEhttps://api.airforce/v1/video/tasks/:task_id

Supprime l’enregistrement de la tâche de votre historique.

Idempotent — renvoie toujours { "deleted": true }. Cela supprime uniquement votre enregistrement d'historique ; cela ne purge pas séparément les médias stockés.


Coût & contraintes

Chaque modèle vidéo expose des métadonnées de capacité que vous pouvez lire /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 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 de bout en bout

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);
    }
  }
}