> ## 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.2-flash-ext

>  - gemini-omni-1.2-flash-ext, model pembuatan video terpadu
- Mendukung teks-ke-video, video dari frame pertama, video dari frame pertama dan terakhir, referensi multi-gambar, serta pengeditan dan perpanjangan video
- Mendukung resolusi 360p/720p/1080p/4k dan durasi 3–15 detik, ditagih per detik
- API tugas asinkron: kirim tugas terlebih dahulu, lalu kueri hasilnya dengan ID tugas 

```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.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'
```

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

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

payload = {
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
}

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.2-flash-ext",
  prompt: "Aerial shot over a misty mountain lake at sunrise.",
  duration: 10,
  resolution: "1080p",
  aspect_ratio: "9:16"
};

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.2-flash-ext",
        "prompt":       "Aerial shot over a misty mountain lake at sunrise.",
        "duration":     10,
        "resolution":   "1080p",
        "aspect_ratio": "9:16",
    }

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

```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 API key Anda",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Saldo akun tidak mencukupi. Silakan isi ulang lalu coba lagi",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Terlalu banyak permintaan. Silakan coba lagi nanti",
    "type": "rate_limit_error"
  }
}
```

## Autentikasi

**Authorization** `string` *required*

Semua permintaan memerlukan autentikasi Bearer Token.

Dapatkan API Key:

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

Tambahkan header berikut saat membuat permintaan:

```
Authorization: Bearer YOUR_API_KEY
```

## Parameter Permintaan

**model** `string` *required*

Nama model pembuatan video. Selalu `gemini-omni-1.2-flash-ext`.

**prompt** `string` *required*

Deskripsi video atau instruksi pengeditan. Tidak boleh kosong setelah spasi di awal dan akhir dihapus. Untuk teks-ke-video, jelaskan adegan, karakter, aksi, kamera, dan suara; jika menyertakan gambar atau video, jelaskan gerakan, gaya, atau perubahan yang diinginkan.

Contoh: `"Aerial shot over a misty mountain lake at sunrise."`

> [!WARNING]
>
> `prompt` wajib diisi di semua mode, termasuk frame pertama, referensi multi-gambar, pengeditan, dan perpanjangan. Jika tidak ada, error 400 dikembalikan.

**duration** `integer` (default: 10)

Durasi video dalam detik. Harus berupa bilangan bulat.

* Teks-ke-video / frame pertama / referensi multi-gambar: durasi output, `3`–`15`
* Frame pertama dan terakhir: durasi output, `3`–`10`
* Perpanjangan (`extend`): durasi **segmen tambahan**, `3`–`10`
* Pengeditan (`edit`): tidak boleh dikirim; durasi output mengikuti video sumber

Alias `seconds` juga diterima. Jika keduanya dikirim, nilainya harus sama.

> [!WARNING]
>
> Mengirim `duration` dalam mode pengeditan mengembalikan error `video edit does not accept duration`.

**resolution** `string` (default: 720p)

Resolusi video, tidak peka huruf besar/kecil. Menentukan harga per detik.

Nilai yang didukung:

* `360p`
* `720p`
* `1080p`
* `4k` (`2160p` juga diterima)

> [!WARNING]
>
> Resolusi lain mengembalikan error 400.

**aspect\_ratio** `string` (default: 16:9)

Hanya mendukung `16:9` (lanskap, default) dan `9:16` (potret); nilai lain mengembalikan error 400.

**omni\_reference\_task\_type** `string`

Jenis tugas, yang menentukan cara materi input digunakan.

Nilai yang didukung:

* `edit` - Mengedit video; gunakan bersama `video_urls` atau `extend_from_task_id`
* `extend` - Memperpanjang video dengan menambahkan konten baru di akhir; gunakan bersama `video_urls` atau `extend_from_task_id`
* `reference` - Referensi multi-gambar; gunakan bersama `image_urls`
* `text_to_video` / `image_to_video` / `reference_to_video` - Teks-ke-video / frame pertama / gambar referensi
* `auto` - Ditentukan otomatis berdasarkan input; diperlakukan sebagai `edit` jika ada video

Opsional jika tidak ada video; mode ditentukan otomatis berdasarkan input.

> [!WARNING]
>
> Saat mengirim `video_urls` atau `extend_from_task_id`, jenis tugas wajib diisi (`omni_reference_task_type`, atau field kompatibel `generation_type`); jika tidak dikirim, error 400 dikembalikan. Disarankan mengirim `edit` atau `extend` secara eksplisit; `auto` diperlakukan sebagai `edit`.

**generation\_type** `string`

Field kompatibilitas, setara dengan `omni_reference_task_type`. Nilai yang didukung: `frame` (sama dengan `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` dan `omni_reference_task_type` tidak boleh dikirim bersamaan.

**image\_urls** `array\<url\>`

Array gambar referensi untuk referensi multi-gambar (karakter, produk, gaya, dll.). Mendukung 1–10 gambar.

Hanya mendukung URL gambar HTTP/HTTPS yang dapat diakses publik. Unggah gambar lokal terlebih dahulu untuk mendapatkan URL publik, lalu kirim URL tersebut; Base64 Data URL saat ini tidak didukung dan mengembalikan error 400.

Jika hanya 1 gambar yang dikirim, cara penggunaannya bergantung pada jenis tugas:

* `omni_reference_task_type` tidak dikirim: digunakan sebagai gambar referensi
* `omni_reference_task_type` bernilai `auto` atau `image_to_video`: digunakan sebagai frame pertama

Untuk pembuatan dari frame pertama, sebaiknya gunakan `first_frame_image` secara langsung, bukan mengandalkan jumlah gambar.

> [!WARNING]
>
> `image_urls` tidak boleh dikirim bersama `first_frame_image` atau `last_frame_image`, dan gambar di `image_urls` tidak pernah diperlakukan sebagai frame pertama; gambar juga tidak boleh dikirim saat mengedit atau memperpanjang video.

**first\_frame\_image** `string`

Gambar frame pertama: frame pertama video yang dihasilkan adalah gambar ini. Hanya mendukung URL gambar HTTP/HTTPS yang dapat diakses publik; Base64 Data URL tidak didukung.

Jika dikirim bersama `last_frame_image`, akan menghasilkan video dari frame pertama dan terakhir.

**last\_frame\_image** `string`

Gambar frame terakhir untuk pembuatan video dari frame pertama dan terakhir; video bertransisi dari frame pertama ke gambar ini. Hanya mendukung URL gambar HTTP/HTTPS yang dapat diakses publik; Base64 Data URL tidak didukung.

Dalam mode frame pertama dan terakhir:

* `duration` mendukung `3`–`10`; 10 detik jika tidak dikirim
* `system_prompt` dan `negative_prompt` tidak boleh dikirim

> [!WARNING]
>
> `last_frame_image` wajib dikirim bersama `first_frame_image`; mengirim frame terakhir saja mengembalikan error `last_frame_image requires first_frame_image`. Tidak boleh dikirim bersama `image_urls`.

**image\_with\_roles** `array\<object\>`

Array gambar dengan peran, cara penulisan yang setara dengan `first_frame_image` / `last_frame_image` / `image_urls`.

**Item array**

**url** `string` *required*

URL gambar HTTP/HTTPS yang dapat diakses publik. Base64 Data URL tidak didukung.

**role** `string`

`first_frame` adalah frame pertama dan `last_frame` adalah frame terakhir (masing-masing hanya 1 gambar); nilai lain atau peran kosong diperlakukan sebagai gambar referensi.

**video\_urls** `array\<url\>`

Array video yang akan diedit atau diperpanjang; hanya 1 video yang didukung. Anda juga dapat menggunakan field nilai tunggal `video_url`; kirim salah satunya saja.

Hanya mendukung URL video HTTP/HTTPS yang dapat diakses publik. Format MP4 / MOV / WebM, maksimal 15 detik dan 64 MB.

> [!WARNING]
>
> Saat mengirim `video_urls`, jenis tugas wajib diisi; disarankan mengatur `omni_reference_task_type` ke `edit` atau `extend` (`auto` diperlakukan sebagai `edit`). Jika tidak dikirim, error 400 dikembalikan. Mengirim 2 video atau lebih mengembalikan error 400.

**extend\_from\_task\_id** `string`

ID tugas di platform ini (`task_01…`). Gunakan untuk melanjutkan pengeditan atau perpanjangan salah satu tugas `gemini-omni-1.2-flash-ext` Anda yang sudah selesai, tanpa mengunggah ulang video.

Persyaratan:

* Tugas milik akun saat ini
* Model tugas adalah `gemini-omni-1.2-flash-ext`
* Status tugas adalah `completed`
* Kanal yang menghasilkan tugas asli masih tersedia; jika tidak, 503 `source_channel_unavailable` dikembalikan
* Video asli maksimal 15 detik (berlaku untuk pengeditan dan perpanjangan); dalam mode pengeditan, durasinya juga harus dapat dikenali

Jika kanal tidak tersedia atau durasi video asli tidak dapat dikenali, unduh video asli lalu unggah melalui `video_urls`. Jika video asli lebih dari 15 detik, potong menjadi maksimal 15 detik sebelum diunggah.

> [!WARNING]
>
> `extend_from_task_id` tidak boleh dikirim bersama `video_urls`, dan jenis tugas wajib diisi; disarankan mengatur `omni_reference_task_type` ke `edit` atau `extend` (`auto` diperlakukan sebagai `edit`).

**negative\_prompt** `string`

Konten yang tidak ingin muncul dalam video.

Contoh: `"people, cars, color"`

> [!WARNING]
>
> `negative_prompt` tidak boleh dikirim dalam mode frame pertama dan terakhir.

**system\_prompt** `string`

Instruksi sistem, misalnya untuk menetapkan gaya visual atau melarang teks di layar. Harus berupa string.

Contoh: `"Render as a black-and-white silent film."`

> [!WARNING]
>
> `system_prompt` tidak boleh dikirim dalam mode frame pertama dan terakhir.

## Respons

**code** `integer`

Kode status respons. Permintaan yang berhasil mengembalikan `200`.

**data** `array`

Array tugas yang dikembalikan.

**Item array**

**status** `string`

Status awal tugas. Nilainya `submitted` setelah pengiriman berhasil.

**task\_id** `string`

ID tugas unik untuk mengueri status dan hasil tugas.

## Kueri Hasil Tugas

Pembuatan video bersifat asinkron. Setelah dikirim, `task_id` dikembalikan. Gunakan API [Dapatkan Status Tugas](https://docs.apimart.ai/id/api-reference/tasks/status.md) untuk mengueri progres dan hasil pembuatan.

```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 atur timeout klien minimal 10 menit. Perkiraan waktu pembuatan (termasuk antrean): sekitar 46 detik untuk video 15 detik 360p, sekitar 99 detik untuk 15 detik 1080p, dan sekitar 4-5 menit untuk 15 detik 4k. Selama pembuatan, progres dapat tertahan di 10% cukup lama hingga selesai.

### Contoh Hasil Berhasil

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "actual_time": 99,
    "cost": 0.695,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/videos/abc.mp4"]
        }
      ]
    }
  }
}
```

URL video adalah `data.result.videos[0].url[0]`. `data.actual_time` adalah waktu pemrosesan tugas dalam detik, bukan durasi video. Output berupa MP4 (H.264, 24fps) dengan trek audio AAC dan watermark SynthID yang tidak terlihat; pada 4k terkadang tidak ada trek audio.

### Contoh Hasil Gagal

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "failed",
    "progress": 100,
    "cost": 0,
    "error": {
      "code": "task_failed",
      "message": "content_rejected",
      "type": "task_failed"
    }
  }
}
```

Tugas yang gagal akan dikembalikan dananya secara penuh.

## Penagihan

Ditagih per detik: biaya = harga per detik untuk resolusi yang dipilih × jumlah detik yang ditagih. Semua mode ditagih berdasarkan tingkat resolusi yang diminta. Lihat [halaman harga](https://apimart.ai/pricing) untuk harga aktual.

| Mode | Detik yang ditagih |
| - | - |
| Teks-ke-video / frame pertama / referensi multi-gambar | `duration`; 10 detik jika tidak dikirim |
| Frame pertama dan terakhir | `duration` (maksimal 10 detik); 10 detik jika tidak dikirim |
| Pengeditan | Durasi video sumber (dikurangi toleransi kontainer 0,15 detik lalu dibulatkan ke atas, minimal 1 detik; misalnya 8,019 detik ditagih 8 detik, 8,3 detik ditagih 9 detik) |
| Perpanjangan | Detik tambahan `duration`; 10 detik jika tidak dikirim. Video asli tidak ditagih |

## Kasus Penggunaan

### Skenario 1: Teks-ke-Video

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Aerial shot over a misty mountain lake at sunrise.",
  "duration": 15,
  "resolution": "1080p",
  "aspect_ratio": "9:16"
}
```

### Skenario 2: Video dari Frame Pertama

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The camera slowly pushes in.",
  "duration": 6,
  "aspect_ratio": "9:16",
  "first_frame_image": "https://example.com/start.jpg"
}
```

### Skenario 3: Video dari Frame Pertama dan Terakhir

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The flower bud slowly opens into full bloom.",
  "duration": 8,
  "aspect_ratio": "16:9",
  "first_frame_image": "https://example.com/bud.jpg",
  "last_frame_image": "https://example.com/bloom.jpg"
}
```

Dalam mode frame pertama dan terakhir, `duration` mendukung 3–10 detik (10 detik jika tidak dikirim), dan `system_prompt` / `negative_prompt` tidak boleh dikirim.

### Skenario 4: Referensi Multi-Gambar

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The cat bats at the ball of yarn.",
  "duration": 8,
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ]
}
```

### Skenario 5: Pengeditan Video

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

Jangan kirim `duration` saat mengedit; durasi output mengikuti video sumber.

### Skenario 6: Perpanjangan Video

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Continue the scene: the dancer bows.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "extend",
  "duration": 4
}
```

### Skenario 7: Memperpanjang Tugas yang Sudah Ada

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
  "omni_reference_task_type": "extend",
  "duration": 6
}
```

### Skenario 8: Instruksi Sistem dan Prompt Negatif

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "A busy city street at noon.",
  "system_prompt": "Render as a black-and-white silent film.",
  "negative_prompt": "people, cars, color",
  "duration": 6
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.