> ## Documentation Index
> Fetch the complete documentation index at: https://docs.neosantara.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Generasi Video

> Buat video generatif berbasis AI secara asinkron melalui endpoint /v1/videos.

Gateway Neosantara mendukung pembuatan video generatif melalui protokol OpenAI Sora (`/v1/videos`). Anda dapat menggunakan SDK resmi OpenAI (`openai` di Python atau Node.js) secara langsung dengan mengarahkan `base_url` ke gateway Neosantara.

<CodeGroup>
  ```python Python (OpenAI SDK) icon="python" theme={"theme":{"light":"ayu-dark","dark":"catppuccin-latte"}}
  from openai import OpenAI
  import time
  import os

  client = OpenAI(
      base_url="https://api.neosantara.xyz/v1",
      api_key=os.environ["NEOSANTARA_API_KEY"]
  )

  # 1. Kirim tugas pembuatan video (OpenAI Sora Compatible)
  video = client.videos.create(
      model="luma-ray2-720p",
      prompt="Drone meluncur di atas ombak pantai Uluwatu saat senja, gerak lambat sinematik.",
      seconds=5,
      size="1280x720"
  )

  print(f"Tugas video dibuat: {video.id}")

  # 2. Polling status hingga selesai
  while True:
      job = client.videos.retrieve(video.id)
      progress = getattr(job, "progress", 0)
      print(f"Status: {job.status} ({progress}%)")
      
      if job.status == "completed":
          print(f"Video siap! URL Unduhan: https://api.neosantara.xyz/v1/videos/{video.id}/content")
          break
      elif job.status == "failed":
          print("Gagal:", getattr(job, "error", "Unknown error"))
          break
      time.sleep(10)
  ```

  ```javascript Node.js (OpenAI SDK) icon="js" theme={"theme":{"light":"ayu-dark","dark":"catppuccin-latte"}}
  import OpenAI from "openai";

  const client = new OpenAI({
    baseURL: "https://api.neosantara.xyz/v1",
    apiKey: process.env.NEOSANTARA_API_KEY,
  });

  // 1. Buat tugas video
  const video = await client.videos.create({
    model: "luma-ray2-720p",
    prompt: "Drone meluncur di atas ombak pantai Uluwatu saat senja, gerak lambat.",
    seconds: 5,
    size: "1280x720",
  });

  console.log("Job Dibuat:", video.id);

  // 2. Poll status penyelesaian
  let status = video.status;
  while (status !== "completed" && status !== "failed") {
    await new Promise((resolve) => setTimeout(resolve, 10000));
    const job = await client.videos.retrieve(video.id);
    status = job.status;
    console.log(`Status: ${status}`);
  }

  if (status === "completed") {
    console.log(`Video URL: https://api.neosantara.xyz/v1/videos/${video.id}/content`);
  }
  ```

  ```bash cURL icon="terminal" theme={"theme":{"light":"ayu-dark","dark":"catppuccin-latte"}}
  # 1. Membuat tugas video
  curl -X POST https://api.neosantara.xyz/v1/videos \
    -H "Authorization: Bearer $NEOSANTARA_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "luma-ray2-720p",
      "prompt": "Drone meluncur di atas ombak pantai Uluwatu saat senja.",
      "seconds": 5,
      "size": "1280x720"
    }'

  # 2. Mengecek status tugas
  curl https://api.neosantara.xyz/v1/videos/vid_123456 \
    -H "Authorization: Bearer $NEOSANTARA_API_KEY"

  # 3. Mengunduh konten video final
  curl -L https://api.neosantara.xyz/v1/videos/vid_123456/content \
    -H "Authorization: Bearer $NEOSANTARA_API_KEY" \
    -o hasil_video.mp4
  ```
</CodeGroup>

## Parameter Permintaan

| Parameter | Tipe      | Wajib    | Keterangan                                                |
| :-------- | :-------- | :------- | :-------------------------------------------------------- |
| `prompt`  | `string`  | Ya       | Deskripsi adegan, gerakan kamera, dan pencahayaan video.  |
| `model`   | `string`  | Ya       | `luma-ray2-720p` atau `luma-ray2-540p`.                   |
| `seconds` | `integer` | Opsional | Durasi video dalam detik (contoh: 5 atau 9). Default `5`. |
| `size`    | `string`  | Opsional | Resolusi keluaran: `"1280x720"` atau `"960x540"`.         |

## Status Siklus Tugas Video

| Status        | Deskripsi                                                                             |
| :------------ | :------------------------------------------------------------------------------------ |
| `queued`      | Permintaan masuk antrean generator video upstream.                                    |
| `in_progress` | Rendering video sedang berlangsung dengan progres `0-99%`.                            |
| `completed`   | Rendering selesai. URL video berdurasi tertentu tersedia untuk diunduh.               |
| `failed`      | Pembuatan video gagal. Saldo tidak terpotong atau otomatis dikembalikan ke akun Anda. |


## Related topics

- [Generasi Gambar](/id/gateway/capabilities/image-generation.md)
- [Tugas Latar Belakang & Webhook](/id/gateway/responses-api/background-jobs.md)
- [FAQ & Tanya Jawab](/id/guides/faq.md)
