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
Génération vidéo FLUX 3
- Mode de traitement asynchrone, retourne un identifiant de tâche pour les requêtes ultérieures
- Entrée unifiée : texte-vers-vidéo / image-vers-vidéo / continuation vidéo / brouillon en deux étapes
- Sortie H.264 + AAC avec audio synchronisé, durée 5~20 secondes
- Résolution hd / fhd, sept rapports d’aspect
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
requis
Tous les points de terminaison nécessitent une authentification Bearer TokenObtenez votre clé API depuis la page de gestion des clés API :
Authorization: Bearer YOUR_API_KEY
Modes de génération
flux-3-video est une entrée unifiée : le mode est déduit des champs, ou défini explicitement avec mode.
| Mode | Déclencheur | Notes |
|---|---|---|
| Texte-vers-vidéo (t2v) | prompt uniquement | Texte pur |
| Image-vers-vidéo (i2v) | image_urls | Images clés ; voir ci-dessous |
| Continuation vidéo (v2v) | video_url / video_urls | Prix unitaire plus élevé ; si image et vidéo sont définis, la continuation l’emporte |
| Brouillon → final | draft:true ou draft_from_task_id | Aperçu peu coûteux, puis final au prix plein |
mode : t2v / i2v / v2v / draft_enhance, ou orthographes officielles text-to-video / image-continuation / video-continuation. mode explicite a la priorité la plus élevée.
Sémantique des images clés image-vers-vidéo
L’ordre dansimage_urls est sémantique — ne pas trier ni dédupliquer :
| Nombre | Signification |
|---|---|
| 1 | Image de début |
| 2 | Première = début, seconde = image de fin |
| 3~10 | Première = début, dernière = fin, images du milieu espacées uniformément (définir duration explicitement) |
Paramètres de la requête
string
requis
Valeur fixe :
flux-3-videoboolean
défaut:"false"
Indique s’il faut modérer le contenu avant d’envoyer la tâche vidéo.
true: vérifier les prompts et les images d’entrée avecomni-moderation-latestfalseou omis : ne pas envoyer de requête de modération, sans coût ni latence de modération supplémentaires (par défaut)
string
requis
Prompt. Ne doit pas être envoyé lors de l’utilisation de
draft_from_task_id (rejeté s’il est présent).integer
défaut:"5"
Durée en secondes, entier 5~20, par défaut
5duration: "auto" n’est pas pris en charge (la facturation nécessite un nombre de secondes fixe). Omise, "auto", ou non-entiers → traités comme 5 secondes sans erreur et sans longueur adaptative.Pour la continuation vidéo, la durée livrée peut être inférieure à celle demandée (ex. demander 5s, obtenir 4s). Les secondes demandées sont préfacturées et la différence est remboursée après achèvement ; le montant final est le
cost de la requête. Texte/image-vers-vidéo ne présentent pas cet écart.string
défaut:"hd"
Résolution
hd(par défaut ; accepte aussi720p)fhd(accepte aussi1080p)
hd ~1280×704 en 16:9 ; fhd ~1920×1088.Le mode brouillon (
draft:true) n’autorise que hd.string
défaut:"auto"
Rapport d’aspectOptions :
21:9, 2:1, 16:9, 4:3, 1:1, 3:4, 9:16, ou auto (par défaut ; choisi automatiquement d’après le prompt et les assets)string[]
Images clés image-vers-vidéo, 1~10, URL http(s) publique ou base64
string
Vidéo d’entrée pour la continuation (mp4, URL publique ou base64)
string[]
Identique à
video_url ; utilise le premier élément (compat)boolean
défaut:"true"
Générer l’audio synchronisé, par défaut
true. false produit une vidéo muette (pas de remise)boolean
défaut:"false"
Mode brouillon : aperçu basse qualité à ~1/3 du prix ; uniquement avec
resolution: hdstring
Brouillon → final : ID de votre tâche brouillon réussie
- Seule
resolutionpeut changer ; prompt, durée, images, vidéo ne le peuvent pas - Facturé au prix final plein ; les frais de brouillon ne sont pas crédités
- Mutuellement exclusif avec
draft:true
integer
défaut:"2"
Tolérance de modération 0~4, par défaut
2 (plus élevé = plus permissif)Ne pas confondre avec les images FLUX.2 (05) ou Kontext (06).
string
Mode explicite (optionnel) ; voir Modes de génération
Mode brouillon
Flux en deux étapes lorsque l’itération est coûteuse :Step 1 draft:true → ~1/3 price low-quality preview
Step 2 draft_from_task_id → full-price final matching the draft look
Créer un brouillon
{
"model": "flux-3-video",
"prompt": "An orange cat jumps onto a sunlit wooden table",
"duration": 5,
"draft": true
}
Brouillon vers final
{
"model": "flux-3-video",
"draft_from_task_id": "task_01K_DRAFT...",
"resolution": "fhd"
}
Exemples de requêtes
Texte-vers-vidéo (portrait)
{
"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-vers-vidéo (début + fin)
{
"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
}
Continuation vidéo
{
"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
}
Vidéo muette
{
"model": "flux-3-video",
"prompt": "...",
"audio": false
}
Contraintes
| Limite | Valeur |
|---|---|
| Durée | Entier 5~20 (auto non pris en charge ; 21 est rejeté) |
| Images clés | 1~10 |
| Résolution | hd / fhd uniquement ; brouillon uniquement hd |
| Rapport d’aspect | Sept options ou auto |
safety_tolerance | 0~4 |
Erreurs de soumission courantes (généralement non facturées)
| Cas | Notes |
|---|---|
prompt manquant | Requis sauf draft enhance |
resolution / aspect_ratio / duration invalides | Hors plage |
| Images clés > 10 | Plafond dépassé |
i2v explicite sans images / v2v sans vidéo | Incohérence mode/asset |
draft:true + fhd | Le brouillon est hd uniquement |
draft_from_task_id invalide / non-brouillon / inachevé | Préconditions de finalisation |
| Modification de prompt / durée à la finalisation | Seule resolution autorisée |
draft et draft_from_task_id ensemble | Mutuellement exclusifs |
failed avec remboursement intégral.
Couverture des capacités
| Capacité | Statut |
|---|---|
| t2v / i2v / v2v | ✅ Auto ou mode explicite |
| Brouillon / draft enhance | ✅ draft / draft_from_task_id |
| Audio synchronisé | ✅ Activé par défaut ; audio:false désactive (pas de remise) |
Images clés temporisées [seconds, image] | ❌ Tableau d’images clés espacées uniformément uniquement |
duration: "auto" | ❌ Non pris en charge |
Response
integer
Code de statut ; 200 en cas de succès
array
Consulter les résultatsLa génération vidéo est asynchrone. Interrogez Obtenir le statut d’une tâche.Intervalle recommandé 5~10 secondes ; timeout client 15 minutes (20s fhd est plus lent). Mesuré ~60s pour
t2v + hd + 5s.En cas de succès, utilisez result.videos[0].url ; les assets sont mis en miroir sur le CDN de la plateforme. cost est le montant final facturé. Les échecs sont entièrement remboursés.