Api.Airforce
API REFERENCE

Video

Hasilkan klip video dengan model tugas asinkron — kirimkan perintah, jajak pendapat untuk status, ambil hasilnya.

Pembuatan video bersifat asynchronous: kirim prompt, terima task id, poll statusnya, lalu ambil clip yang sudah selesai. Text-to-video, image-to-video dan mode reference semuanya berbagi satu bentuk request.

Durasi, resolusi dan aspect ratio yang dapat Anda minta bergantung pada model yang dipilih — baca kembali dari endpoint models daripada mengasumsikan kumpulan yang tetap.

Pembuatan video berjalan di latar belakang — tidak ada rendering streaming. Alurnya selalu: buat tugas → status polling → unduh MP4. Tugas kedaluwarsa setelah 24 jam.

1. Buat tugas

Mengirim job dan mengembalikan task ID. Biaya diperkirakan dari durasi × harga per detik model dan diselesaikan saat job diproses.

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

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

Key lain apa pun (mis. seed, sound) diteruskan ke provider upstream apa adanya — key tersebut tidak divalidasi di sini dan dukungannya bergantung pada model.

Contoh

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

Gambar-ke-video (frame pertama)

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

Tanggapan

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. Jajak pendapat untuk status

Jajak pendapat setiap 5–15 detik. Tugas biasanya selesai dalam 30 detik – 4 menit tergantung durasi dan model. Titik akhir yang sama mengembalikan URL hasil ketika status berubah menjadi "selesai".

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. Kemajuan streaming (opsional)

Lewati loop polling dengan aliran Peristiwa Terkirim Server. Memancarkan satu peristiwa per perubahan kemajuan dan ditutup setelah tugas berada dalam status terminal. Bentuk muatan yang sama dengan titik akhir 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. Daftar dan hapus

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

Mengembalikan tugas terkini Anda (yang terbaru terlebih dahulu). Berguna bagi dasbor untuk menampilkan tampilan riwayat.

Mengembalikan hingga 100 task terbaru Anda, terbaru lebih dulu, sebagai { "data": [ ...tasks ] }. Tidak ada query parameter — lakukan filter dan paginasi di sisi client.

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

Menghapus catatan tugas dari riwayat Anda.

Idempoten — selalu mengembalikan { "deleted": true }. Ini hanya menghapus record history Anda; ia tidak secara terpisah membersihkan media yang tersimpan.


Biaya & kendala

Setiap model video memperlihatkan metadata kemampuan yang dapat Anda baca /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.

Skrip ujung ke ujung

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