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

# Pembuatan Video Gemini Omni 1.1 Flash

>  - Model resmi Google Gemini Omni 1.1 Flash untuk pembuatan video multimodal serbaguna
- Mendukung teks-ke-video, gambar-ke-video, referensi multi-subjek, interpolasi frame awal dan akhir, pengeditan, serta perpanjangan video
- Mendukung 360p / 720p / 1080p / 4K, 24 fps, dan keluaran 3–10 detik dengan audio yang dihasilkan
- API tugas asinkron; lihat hasil berdasarkan ID tugas setelah pengiriman 

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://api.apimart.ai/v1/videos/generations \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
      "model": "gemini-omni-1.1-flash",
      "prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
      "aspect_ratio": "16:9",
      "resolution": "1080p"
    }'
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.apimart.ai/v1/videos/generations"

  payload = {
      "model": "gemini-omni-1.1-flash",
      "prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
      "aspect_ratio": "16:9",
      "resolution": "1080p"
  }

  headers = {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)

  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const url = "https://api.apimart.ai/v1/videos/generations";

  const payload = {
    model: "gemini-omni-1.1-flash",
    prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
    aspect_ratio: "16:9",
    resolution: "1080p"
  };

  const headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  };

  fetch(url, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(payload)
  })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error("Error:", error));
  ```

  ```go Go theme={null}
  package main

  import (
      "bytes"
      "encoding/json"
      "fmt"
      "io/ioutil"
      "net/http"
  )

  func main() {
      url := "https://api.apimart.ai/v1/videos/generations"

      payload := map[string]interface{}{
          "model":        "gemini-omni-1.1-flash",
          "prompt":       "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
          "aspect_ratio": "16:9",
          "resolution":   "1080p",
      }

      jsonData, _ := json.Marshal(payload)

      req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
      req.Header.Set("Authorization", "Bearer <token>")
      req.Header.Set("Content-Type", "application/json")

      client := &http.Client{}
      resp, err := client.Do(req)
      if err != nil {
          panic(err)
      }
      defer resp.Body.Close()

      body, _ := ioutil.ReadAll(resp.Body)
      fmt.Println(string(body))
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "code": 200,
    "data": [
      {
        "status": "submitted",
        "task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
      }
    ]
  }
  ```

  ```json 400 theme={null}
  {
    "error": {
      "code": 400,
      "message": "Parameter permintaan tidak valid",
      "type": "invalid_request_error"
    }
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": 401,
      "message": "Autentikasi gagal. Periksa kunci API Anda",
      "type": "authentication_error"
    }
  }
  ```

  ```json 402 theme={null}
  {
    "error": {
      "code": 402,
      "message": "Saldo akun tidak cukup. Isi saldo dan coba lagi",
      "type": "payment_required"
    }
  }
  ```

  ```json 429 theme={null}
  {
    "error": {
      "code": 429,
      "message": "Terlalu banyak permintaan. Coba lagi nanti",
      "type": "rate_limit_error"
    }
  }
  ```
</ResponseExample>

## Autentikasi

<ParamField header="Authorization" type="string" required>
  Semua API memerlukan autentikasi Bearer Token.

  Dapatkan kunci API:

  Kunjungi [halaman pengelolaan kunci API](https://apimart.ai/keys) untuk mendapatkan kunci API Anda.

  Tambahkan ke header permintaan saat digunakan:

  ```
  Authorization: Bearer YOUR_API_KEY
  ```
</ParamField>

## Parameter permintaan

<ParamField body="model" type="string" required>
  Nama model pembuatan video. Harus `gemini-omni-1.1-flash`.
</ParamField>

<ParamField body="prompt" type="string">
  Instruksi teks. Untuk teks-ke-video, jelaskan adegan. Untuk gambar-ke-video, pengeditan, atau perpanjangan video, jelaskan gerakan, gaya, atau perubahan yang diinginkan.

  <Note>
    Berikan setidaknya `prompt` atau media (`image_urls`, gambar frame awal/akhir, atau `video_urls`).
  </Note>
</ParamField>

<ParamField body="resolution" type="string" default="720p">
  Resolusi video keluaran. Huruf besar dan kecil tidak dibedakan.

  Nilai yang tersedia:

  * `360p`
  * `720p` (default)
  * `1080p`
  * `4k`

  `2160p` diperlakukan sebagai `4k`. Resolusi menentukan tingkat deposit yang ditahan dan biaya utama keluaran video.

  <Warning>
    Resolusi yang tidak didukung akan mengembalikan error `invalid_resolution`.
  </Warning>
</ParamField>

<ParamField body="aspect_ratio" type="string" default="16:9">
  Rasio aspek video untuk memilih keluaran lanskap atau potret.

  Didukung:

  * `16:9` - Lanskap (default)
  * `9:16` - Potret

  Nilai lain diperlakukan sebagai `16:9`.

  <Warning>
    Saat `video_urls` diberikan, keluaran biasanya mengikuti rasio aspek video masukan sehingga `aspect_ratio` mungkin tidak diterapkan.
  </Warning>
</ParamField>

<ParamField body="image_urls" type="array<string>">
  Array gambar referensi. Hanya URL HTTP/HTTPS yang dapat diakses publik yang didukung.

  * Berikan 1 gambar: digunakan sebagai frame awal video secara default
  * Berikan beberapa gambar: digunakan sebagai referensi subjek atau gaya; jelaskan tujuan dan hubungan setiap gambar dalam `prompt`

  <Warning>
    `image_urls` dan gambar frame awal/akhir dibatasi maksimal 10 gambar secara total.
  </Warning>
</ParamField>

<ParamField body="first_frame_image" type="string">
  Gambar frame awal. Hanya URL HTTP/HTTPS yang dapat diakses publik yang didukung.

  * Diberikan sendiri: menggunakan gambar sebagai frame awal video
  * Diberikan bersama `last_frame_image`: membuat transisi video yang mulus dari frame awal ke frame akhir
</ParamField>

<ParamField body="last_frame_image" type="string">
  Gambar frame akhir. Hanya URL HTTP/HTTPS yang dapat diakses publik yang didukung dan harus diberikan bersama `first_frame_image`.

  <Warning>
    Memberikan hanya `last_frame_image` akan mengembalikan `invalid_frame_images`. Gunakan rasio yang sama untuk kedua gambar dan samakan dengan `aspect_ratio`.
  </Warning>
</ParamField>

<Note>
  Untuk frame awal atau pasangan frame awal/akhir, kedua metode berikut memberikan hasil yang sama. **Pilih salah satu dan jangan berikan keduanya**:

  * Gunakan `first_frame_image` / `last_frame_image`
  * Gunakan `image_with_roles` dengan `role` diatur ke `first_frame` / `last_frame`
</Note>

<ParamField body="image_with_roles" type="array<object>">
  Array gambar dengan peran. Ini adalah alternatif yang setara dengan `first_frame_image` / `last_frame_image` dan juga dapat mendeklarasikan gambar referensi.

  <Expandable title="Elemen image_with_roles">
    <ParamField body="url" type="string" required>
      URL HTTP/HTTPS gambar yang dapat diakses publik.
    </ParamField>

    <ParamField body="role" type="string" required>
      Peran gambar:

      * `first_frame`: frame awal
      * `last_frame`: frame akhir; frame awal juga harus tersedia
      * `reference`: gambar referensi; peran lain selain frame awal dan akhir juga diperlakukan sebagai referensi
    </ParamField>
  </Expandable>

  Contoh:

  ```json theme={null}
  [
    {"url": "https://example.com/start.jpg", "role": "first_frame"},
    {"url": "https://example.com/end.jpg", "role": "last_frame"}
  ]
  ```

  <Note>
    Jika `image_urls` juga diberikan, parameter tersebut diprioritaskan untuk referensi dan tidak digabungkan dengan referensi dalam `image_with_roles`. Semua gambar yang benar-benar digunakan, termasuk frame awal dan akhir, dibatasi maksimal 10 secara total.
  </Note>
</ParamField>

<ParamField body="video_urls" type="array<string>">
  Array video yang akan diedit atau diperpanjang. Saat ini maksimal satu video dapat diberikan dan durasinya tidak boleh lebih dari 10 detik.

  Hanya URL langsung video HTTP/HTTPS yang dapat diakses publik yang didukung. Tautan YouTube tidak didukung.

  <Warning>
    `video_urls` dan `extend_from_task_id` saling eksklusif. Berikan hanya salah satu.
  </Warning>
</ParamField>

<ParamField body="metadata" type="object">
  Objek parameter tambahan untuk menentukan tujuan pembuatan secara eksplisit.

  <Expandable title="Field metadata">
    <ParamField body="task" type="string">
      Jenis tugas yang tersedia:

      * `text_to_video`: teks-ke-video
      * `image_to_video`: gambar-ke-video
      * `reference_to_video`: referensi-ke-video
      * `edit`: pengeditan video
      * `extend`: perpanjangan video

      Jika dihilangkan, sistem menyimpulkan tugas dari masukan dan prompt.
    </ParamField>
  </Expandable>

  <Note>
    Untuk interpolasi frame awal dan akhir, model menyimpulkan jenis tugas secara otomatis dan platform tidak meneruskan `metadata.task`.
  </Note>
</ParamField>

<ParamField body="extend_from_task_id" type="string">
  `task_id` lokal dari tugas pembuatan sebelumnya. Gunakan untuk pengeditan percakapan atau perpanjangan lanjutan tanpa mengunggah ulang video sebelumnya.

  Tugas yang dirujuk harus milik pengguna saat ini, berstatus berhasil, dan merupakan tugas model Gemini Omni.

  <Warning>
    `extend_from_task_id` dan `video_urls` saling eksklusif. Berikan hanya salah satu.
  </Warning>
</ParamField>

<Warning>
  Model ini tidak memiliki parameter `duration`. Durasi setiap keluaran ditentukan secara otomatis berdasarkan konten, biasanya 3–10 detik. Untuk mengatur tempo, jelaskan dalam `prompt` menggunakan bahasa alami atau rentang waktu.
</Warning>

## Respons

<ResponseField name="code" type="integer">
  Kode status respons. `200` menunjukkan berhasil.
</ResponseField>

<ResponseField name="data" type="array">
  Array tugas yang dikembalikan.

  <Expandable title="Elemen array">
    <ResponseField name="status" type="string">
      Status awal tugas. Pengiriman yang berhasil mengembalikan `submitted`.
    </ResponseField>

    <ResponseField name="task_id" type="string">
      Pengidentifikasi unik untuk melihat status dan hasil tugas.
    </ResponseField>
  </Expandable>
</ResponseField>

## Melihat hasil tugas

Pembuatan video berjalan asinkron. Setelah menerima `task_id`, gunakan API [Dapatkan status tugas](/id/api-reference/tasks/status) untuk melihat progres dan hasil.

```bash cURL theme={null}
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
```

Lakukan polling setiap 5–10 detik dan berhenti saat status menjadi `completed` atau `failed`. Batas waktu keseluruhan klien yang disarankan adalah 10 menit.

### Contoh hasil berhasil

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "cost": 1.52,
    "credits_cost": 15.2,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/gemini_omni_xxx.mp4"],
          "expires_at": 1788518400
        }
      ]
    }
  }
}
```

## Kasus penggunaan

### Kasus 1: teks-ke-video (4K)

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "a blue butterfly landing on a flower, macro, soft light, no dialogue",
  "aspect_ratio": "9:16",
  "resolution": "4k"
}
```

### Kasus 2: interpolasi frame awal dan akhir

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "smooth transition, camera slowly pushes in",
  "first_frame_image": "https://example.com/start.jpg",
  "last_frame_image": "https://example.com/end.jpg",
  "resolution": "720p"
}
```

### Kasus 3: referensi multi-subjek

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "the cat playfully bats at the ball of yarn",
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ],
  "resolution": "720p"
}
```

### Kasus 4: mendeklarasikan frame awal dan akhir dengan peran gambar

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "a smooth cinematic transition from sunrise to a starry night",
  "image_with_roles": [
    {"url": "https://example.com/sunrise.jpg", "role": "first_frame"},
    {"url": "https://example.com/night.jpg", "role": "last_frame"}
  ],
  "resolution": "1080p"
}
```

### Kasus 5: pengeditan video

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "Make the violin invisible. Keep everything else the same.",
  "video_urls": ["https://example.com/clip.mp4"]
}
```

Gunakan prompt singkat dan spesifik untuk pengeditan video. Untuk mengubah hanya satu bagian, tambahkan `Keep everything else the same` agar bagian lainnya tetap konsisten.

### Kasus 6: perpanjangan percakapan

```json theme={null}
{
  "model": "gemini-omni-1.1-flash",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01AAA"
}
```
