Langsung ke konten utama
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": "Omni-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": "Omni-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: "Omni-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":        "Omni-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": "Omni-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": "Omni-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: "Omni-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":        "Omni-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

Authorization
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

model
string
wajib
Nama model pembuatan video. Harus Omni-Flash-Ext.
prompt
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"
duration
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.
resolution
string
default:"720p"
Resolusi video. Nilai tidak peka huruf besar/kecil.Nilai yang didukung:
  • 720p
  • 1080p
  • 4k
Other resolutions akan mengembalikan error invalid_resolution error.
aspect_ratio
string
default:"16:9"
Rasio aspek video. Gunakan untuk mengontrol output lanskap atau potret.Nilai umum:
  • 16:9 - landscape
  • 9:16 - potret
Default: 16:9
size
string
Field kompatibilitas. Artinya sama dengan aspect_ratio. Jika keduanya disediakan, pastikan nilainya konsisten.
generation_type
string
Tipe generasi, digunakan untuk menentukan cara gambar digunakan.Pilihan:
  • frame - Mode frame pertama. image_urls hanya dapat berisi 1 gambar, digunakan sebagai frame pertama video.
  • reference - Mode referensi. image_urls dapat 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.
image_urls
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_type adalah reference)
Hubungan dengan generation_type:
  • generation_type adalah frame: hanya 1 gambar yang dapat diunggah.
  • generation_type adalah reference: 1 atau 3 gambar dapat diunggah.
Hanya URL gambar yang dapat diakses publik yang didukung.
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.
video_urls
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.
Omni-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

code
integer
Respons status code. Successful requests mengembalikan 200.
data
array
Array tugas yang dikembalikan.

Kueri Hasil Tugas

Pembuatan video bersifat asinkron. Setelah pengiriman, API mengembalikan task_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>'
Kami menyarankan menunggu 5-10 detik setelah pengiriman sebelum kueri pertama, lalu melakukan polling setiap 5-10 detik. Satu tugas biasanya selesai dalam sekitar 3-5 menit.

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": "Omni-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": "Omni-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": "Omni-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": "Omni-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": "Omni-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

HTTPTipe errorArtiTindakan yang disarankan
400invalid_request_errormodel bukan Omni-Flash-Ext, prompt kosong, atau format JSON tidak validPeriksa body permintaan
400invalid_durationduration bukan 4, 6, 8, atau 10Gunakan durasi yang didukung
400invalid_resolutionresolution bukan 720p, 1080p, atau 4kGunakan resolusi yang didukung
400unsupported_image_countJumlah image_urls tidak didukung, biasanya karena mengirim 2 gambarGunakan 0, 1, atau 3 gambar
400unsupported_video_countJumlah video_urls tidak didukung, biasanya karena mengirim 2 video atau lebihGunakan 0 atau 1 video referensi
401authentication_errorToken tidak validPeriksa Bearer Token
402payment_requiredSaldo tidak mencukupiIsi ulang dan coba lagi
429rate_limit_errorBatas laju terlampauiKurangi konkurensi atau coba lagi nanti
Saat tugas gagal, API status tugas mengembalikan alasan kegagalan di data.error. Penyebab umum meliputi kuota upstream yang sementara habis, kegagalan moderasi konten, atau timeout upstream.