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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
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));
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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
gemini-omni-1.1-flash-ext
Pembuatan Video gemini-omni-1.1-flash-ext
- Model pembuatan video terpadu gemini-omni-1.1-flash-ext
- Mendukung Teks-ke-Video, Gambar-ke-Video satu gambar, video referensi, dan fusi 3 gambar referensi
- Mendukung resolusi 720p/1080p/4k dan durasi 4/6/8/10 detik
- API tugas asinkron. Kirim tugas terlebih dahulu, lalu kueri hasilnya berdasarkan ID tugas
POST
/
v1
/
videos
/
generations
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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
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));
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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
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));
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-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"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))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
Autentikasi
string
wajib
Semua permintaan memerlukan autentikasi Bearer Token.Dapatkan API Key:Kunjungi halaman manajemen API Key untuk mendapatkan API Key Anda.Tambahkan header berikut saat membuat permintaan:
Authorization: Bearer YOUR_API_KEY
Parameter Permintaan
string
wajib
Nama model pembuatan video. Harus
gemini-omni-1.1-flash-ext.boolean
default:"false"
Menentukan apakah moderasi konten dijalankan sebelum tugas video dikirim.
true: periksa prompt dan gambar input denganomni-moderation-latestfalseatau dihilangkan: tidak mengirim permintaan moderasi, tanpa biaya atau latensi moderasi tambahan (default)
string
wajib
Deskripsi konten video. Kami menyarankan untuk menjelaskan adegan, subjek, aksi, lingkungan, gerakan kamera, gaya visual, dan petunjuk audio secara detail.Contoh:
"a girl is dancing happily in a sunny garden"integer
default:"6"
Durasi video dalam detik.Nilai yang didukung:
4, 6, 8, 10.Nilai lain seperti
5 atau 7 akan mengembalikan error invalid_duration error.Jangan kirim
duration saat mengunggah video referensi. duration dan video_urls tidak dapat dikirim bersamaan.string
default:"720p"
Resolusi video. Nilai tidak peka huruf besar/kecil.Nilai yang didukung:
360p720p1080p4k
Other resolutions akan mengembalikan error
invalid_resolution error.string
default:"16:9"
Rasio aspek video. Gunakan untuk mengontrol output lanskap atau potret.Nilai umum:
16:9- landscape9:16- potret
16:9string
Field kompatibilitas. Artinya sama dengan
aspect_ratio. Jika keduanya disediakan, pastikan nilainya konsisten.string
Tipe generasi, digunakan untuk menentukan cara gambar digunakan.Pilihan:
frame- Mode frame pertama.image_urlshanya dapat berisi 1 gambar, digunakan sebagai frame pertama video.reference- Mode referensi.image_urlsdapat berisi 1 atau 3 gambar, digunakan sebagai gambar referensi.
Ketika
generation_type adalah frame, image_urls hanya mendukung 1 gambar; mengirim jumlah lain akan mengembalikan error unsupported_image_count.array<url>
Array URL gambar referensi. Anda dapat menghilangkannya, menyediakan 1 gambar, atau menyediakan 3 gambar, tergantung pada
generation_type:- Dihilangkan atau array kosong: Teks-ke-Video
- 1 gambar: Gambar-ke-Video satu gambar
- 3 gambar: fusi gambar referensi (hanya didukung ketika
generation_typeadalahreference)
generation_type:generation_typeadalahframe: hanya 1 gambar yang dapat diunggah.generation_typeadalahreference: 1 atau 3 gambar dapat diunggah.
Mode frame pertama plus frame terakhir dengan 2 gambar tidak didukung. Mengirim 2 gambar mengembalikan error
unsupported_image_count error. 4 gambar atau lebih belum sepenuhnya diverifikasi dan tidak direkomendasikan.array<url>
Array URL video referensi. Anda dapat menghilangkannya atau menyediakan 1 video referensi.Hanya URL video HTTP/HTTPS yang dapat diakses publik yang didukung. Anda dapat mengirimkannya bersama
image_urls: gambar digunakan sebagai referensi identitas atau komposisi, sedangkan video digunakan sebagai referensi gerakan.gemini-omni-1.1-flash-ext hanya mendukung 0 atau 1 video referensi. Mengirim 2 video atau lebih akan mengembalikan error unsupported_video_count.Jangan kirim
duration saat mengirim video_urls. video_urls dan duration tidak dapat dikirim bersamaan.Respons
integer
Respons status code. Successful requests mengembalikan
200.array
Kueri Hasil Tugas
Pembuatan video bersifat asinkron. Setelah pengiriman, API mengembalikantask_id. Gunakan endpoint Dapatkan status tugas untuk mengueri progres dan hasil.
cURL
curl --request GET \
--url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
--header 'Authorization: Bearer <token>'
Contoh Hasil Berhasil
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "completed",
"progress": 100,
"created": 1779246294,
"completed": 1779246534,
"actual_time": 240,
"estimated_time": 600,
"cost": 0.4,
"credits_cost": 4,
"result": {
"videos": [
{
"url": ["https://cdn.example.com/videos/abc.mp4"],
"expires_at": 1779332760
}
]
}
}
}
Gagal Hasil Example
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "failed",
"progress": 100,
"created": 1779246294,
"completed": 1779246534,
"actual_time": 240,
"estimated_time": 600,
"cost": 0,
"credits_cost": 0,
"error": {
"message": "invalid duration 7, must be one of 4/6/8/10",
"code": "task_failed"
}
}
}
Kasus Penggunaan
Skenario 1: Teks-ke-Video
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a beautiful sunset over the ocean with seagulls flying",
"duration": 6,
"resolution": "720p",
"aspect_ratio": "16:9"
}
Skenario 2: Video Satu Gambar
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "make the character smile and slowly turn around, cinematic camera motion",
"duration": 6,
"resolution": "1080p",
"aspect_ratio": "9:16",
"image_urls": ["https://example.com/character.jpg"]
}
Skenario 3: Fusi 3 Gambar Referensi
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a creative scene combining these elements with smooth camera motion",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16",
"image_urls": [
"https://example.com/scene.jpg",
"https://example.com/character.jpg",
"https://example.com/product.jpg"
]
}
Skenario 4: Video Pendek 4K
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "close-up of a hummingbird hovering in front of a red flower",
"duration": 4,
"resolution": "4k",
"aspect_ratio": "16:9"
}
Skenario 5: Pembuatan dengan Video Referensi
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "the same scene but at night with neon lights",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_urls": ["https://example.com/reference.mp4"]
}
Kode Error
| HTTP | Tipe error | Arti | Tindakan yang disarankan |
|---|---|---|---|
| 400 | invalid_request_error | model bukan gemini-omni-1.1-flash-ext, prompt kosong, atau format JSON tidak valid | Periksa body permintaan |
| 400 | invalid_duration | duration bukan 4, 6, 8, atau 10 | Gunakan durasi yang didukung |
| 400 | invalid_resolution | resolution bukan 720p, 1080p, atau 4k | Gunakan resolusi yang didukung |
| 400 | unsupported_image_count | Jumlah image_urls tidak didukung, biasanya karena mengirim 2 gambar | Gunakan 0, 1, atau 3 gambar |
| 400 | unsupported_video_count | Jumlah video_urls tidak didukung, biasanya karena mengirim 2 video atau lebih | Gunakan 0 atau 1 video referensi |
| 401 | authentication_error | Token tidak valid | Periksa Bearer Token |
| 402 | payment_required | Saldo tidak mencukupi | Isi ulang dan coba lagi |
| 429 | rate_limit_error | Batas laju terlampaui | Kurangi konkurensi atau coba lagi nanti |
data.error. Penyebab umum meliputi kuota upstream yang sementara habis, kegagalan moderasi konten, atau timeout upstream.