curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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: "flux-3-video",
prompt: "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
duration: 5,
resolution: "hd",
aspect_ratio: "16:9",
};
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": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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_01J9HA7JPQ9A0Z6JZ3V8M9W6PZ"
}
]
}
{
"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 top up and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 422,
"message": "Parameter conflict or invalid value",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 429,
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}
FLUX 3 Video
Pembuatan Video FLUX 3
- Mode pemrosesan asinkron, mengembalikan ID tugas untuk kueri berikutnya
- Entri terpadu: text-to-video / image-to-video / video continuation / draft dua langkah
- Output H.264 + AAC dengan audio tersinkron, durasi 5~20 detik
- Resolusi hd / fhd, tujuh rasio aspek
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": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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: "flux-3-video",
prompt: "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
duration: 5,
resolution: "hd",
aspect_ratio: "16:9",
};
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": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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_01J9HA7JPQ9A0Z6JZ3V8M9W6PZ"
}
]
}
{
"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 top up and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 422,
"message": "Parameter conflict or invalid value",
"type": "invalid_request_error"
}
}
{
"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": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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: "flux-3-video",
prompt: "An orange cat jumps onto a sunlit wooden table, its tail brushes a glass that wobbles but does not fall. Cinematic, shallow depth of field.",
duration: 5,
resolution: "hd",
aspect_ratio: "16:9",
};
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": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table",
"duration": 5,
"resolution": "hd",
"aspect_ratio": "16:9",
}
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_01J9HA7JPQ9A0Z6JZ3V8M9W6PZ"
}
]
}
{
"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 top up and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 422,
"message": "Parameter conflict or invalid value",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 429,
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}
Authorization
string
wajib
Semua endpoint memerlukan autentikasi Bearer TokenDapatkan API Key Anda dari Halaman Manajemen API Key:
Authorization: Bearer YOUR_API_KEY
Mode Pembuatan
flux-3-video adalah entri terpadu: mode disimpulkan dari field, atau diatur secara eksplisit dengan mode.
| Mode | Pemicu | Catatan |
|---|---|---|
| Text-to-video (t2v) | hanya prompt | Teks murni |
| Image-to-video (i2v) | image_urls | Keyframe; lihat di bawah |
| Video continuation (v2v) | video_url / video_urls | Harga unit lebih tinggi; jika gambar dan video keduanya diatur, continuation menang |
| Draft → final | draft:true atau draft_from_task_id | Pratinjau murah, lalu final harga penuh |
mode: t2v / i2v / v2v / draft_enhance, atau ejaan resmi text-to-video / image-continuation / video-continuation. mode eksplisit memiliki prioritas tertinggi.
Semantik keyframe image-to-video
Urutan diimage_urls bersifat semantik — jangan mengurutkan atau menghapus duplikat:
| Jumlah | Arti |
|---|---|
| 1 | Frame awal |
| 2 | Pertama = awal, kedua = frame akhir |
| 3~10 | Pertama = awal, terakhir = akhir, frame tengah berjarak merata (atur duration secara eksplisit) |
Parameter Permintaan
string
wajib
Nilai tetap:
flux-3-videoboolean
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
Prompt. Tidak boleh dikirim saat menggunakan
draft_from_task_id (ditolak jika ada).integer
default:"5"
Durasi dalam detik, bilangan bulat 5~20, default
5duration: "auto" tidak didukung (penagihan memerlukan jumlah detik tetap). Dihilangkan, "auto", atau non-integer → diperlakukan sebagai 5 detik tanpa error dan tanpa panjang adaptif.Untuk video continuation, durasi yang dikirim mungkin lebih pendek dari yang diminta (mis. minta 5s, dapat 4s). Detik yang diminta dibebankan di muka dan selisihnya dikembalikan setelah selesai; jumlah akhir adalah
cost kueri. Text/image-to-video tidak menunjukkan selisih ini.string
default:"hd"
Resolusi
hd(default; juga menerima720p)fhd(juga menerima1080p)
hd ~1280×704 pada 16:9; fhd ~1920×1088.Mode draft (
draft:true) hanya mengizinkan hd.string
default:"auto"
Rasio aspekOpsi:
21:9, 2:1, 16:9, 4:3, 1:1, 3:4, 9:16, atau auto (default; dipilih otomatis dari prompt dan aset)string[]
Keyframe image-to-video, 1~10, URL http(s) publik atau base64
string
Video input untuk continuation (mp4, URL publik atau base64)
string[]
Sama dengan
video_url; menggunakan item pertama (kompatibilitas)boolean
default:"true"
Hasilkan audio tersinkron, default
true. false menghasilkan video bisu (tanpa diskon)boolean
default:"false"
Mode draft: pratinjau kualitas rendah ~1/3 harga; hanya dengan
resolution: hdstring
Draft → final: ID tugas draft Anda yang berhasil
- Hanya
resolutionyang boleh berubah; prompt, durasi, gambar, video tidak boleh - Ditagih dengan harga final penuh; biaya draft tidak dikreditkan
- Saling eksklusif dengan
draft:true
integer
default:"2"
Toleransi moderasi 0~4, default
2 (lebih tinggi = lebih permisif)Jangan bingungkan dengan gambar FLUX.2 (05) atau Kontext (06).
string
Mode eksplisit (opsional); lihat Mode Pembuatan
Mode Draft
Alur kerja dua langkah ketika iterasi mahal:Step 1 draft:true → ~1/3 price low-quality preview
Step 2 draft_from_task_id → full-price final matching the draft look
Buat draft
{
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table",
"duration": 5,
"draft": true
}
Draft ke final
{
"model": "flux-3-video",
"draft_from_task_id": "task_01K_DRAFT...",
"resolution": "fhd"
}
Contoh Permintaan
Text-to-video (potret)
{
"model": "flux-3-video",
"prompt": "Rainy Tokyo street at night, neon in puddles, a person walks with an umbrella.",
"duration": 8,
"resolution": "fhd",
"aspect_ratio": "9:16"
}
Image-to-video (awal + akhir)
{
"model": "flux-3-video",
"prompt": "Slow push-in as a flower opens from bud to bloom",
"image_urls": [
"https://example.com/bud.jpg",
"https://example.com/bloom.jpg"
],
"duration": 5
}
Video continuation
{
"model": "flux-3-video",
"prompt": "Camera keeps following as the lead turns toward a distant lighthouse",
"video_url": "https://example.com/clip.mp4",
"duration": 5
}
Video bisu
{
"model": "flux-3-video",
"prompt": "...",
"audio": false
}
Batasan
| Batas | Nilai |
|---|---|
| Durasi | Bilangan bulat 5~20 (auto tidak didukung; 21 ditolak) |
| Keyframe | 1~10 |
| Resolusi | hanya hd / fhd; draft hanya hd |
| Rasio aspek | Tujuh opsi atau auto |
safety_tolerance | 0~4 |
Error kirim umum (biasanya tidak ditagih)
| Kasus | Catatan |
|---|---|
prompt hilang | Wajib kecuali draft enhance |
resolution / aspect_ratio / duration tidak valid | Di luar rentang |
| Keyframe > 10 | Batas terlampaui |
i2v eksplisit tanpa gambar / v2v tanpa video | Ketidakcocokan mode/aset |
draft:true + fhd | Draft hanya hd |
draft_from_task_id tidak valid / non-draft / belum selesai | Prasyarat finalisasi |
| Mengubah prompt / durasi saat finalisasi | Hanya resolution diizinkan |
Keduanya draft dan draft_from_task_id | Saling eksklusif |
failed dengan pengembalian dana penuh.
Cakupan Kapabilitas
| Kapabilitas | Status |
|---|---|
| t2v / i2v / v2v | ✅ Otomatis atau mode eksplisit |
| Draft / draft enhance | ✅ draft / draft_from_task_id |
| Audio tersinkron | ✅ Aktif secara default; audio:false nonaktif (tanpa diskon) |
Keyframe berwaktu [seconds, image] | ❌ Hanya array keyframe berjarak merata |
duration: "auto" | ❌ Tidak didukung |
Response
integer
Kode status; 200 saat berhasil
array
Kueri hasilPembuatan video bersifat asinkron. Poll Dapatkan Status Tugas.Interval yang disarankan 5~10 detik; timeout klien 15 menit (20s fhd lebih lambat). Diukur ~60s untuk
t2v + hd + 5s.Saat berhasil gunakan result.videos[0].url; aset di-mirror ke CDN platform. cost adalah tagihan final. Kegagalan diganti penuh.