Passer au contenu principal
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"
  }
}

Authentification

Authorization
string
requis
Toutes les requêtes nécessitent une authentification par Bearer Token.Obtenir une clé API :Rendez-vous sur la page de gestion des clés API pour obtenir votre clé API.Ajoutez l’en-tête suivant lors de l’envoi des requêtes :
Authorization: Bearer YOUR_API_KEY

Paramètres de la requête

model
string
requis
Nom du modèle de génération vidéo. Doit être Omni-Flash-Ext.
prompt
string
requis
Description du contenu de la vidéo. Nous recommandons de décrire en détail la scène, le sujet, l’action, l’environnement, les mouvements de caméra, le style visuel et les indices sonores.Exemple : "a girl is dancing happily in a sunny garden"
duration
integer
défaut:"6"
Durée de la vidéo en secondes.Valeurs prises en charge : 4, 6, 8, 10.
D’autres valeurs telles que 5 ou 7 renvoient une erreur invalid_duration.
Ne transmettez pas duration lorsque vous importez une vidéo de référence. duration et video_urls ne peuvent pas être transmis en même temps.
resolution
string
défaut:"720p"
Résolution de la vidéo. Les valeurs sont insensibles à la casse.Valeurs prises en charge :
  • 720p
  • 1080p
  • 4k
D’autres résolutions renvoient une erreur invalid_resolution.
aspect_ratio
string
défaut:"16:9"
Format d’image de la vidéo. Utilisez-le pour contrôler la sortie en paysage ou en portrait.Valeurs courantes :
  • 16:9 — paysage
  • 9:16 — portrait
Par défaut : 16:9
size
string
Champ de compatibilité. Il a la même signification que aspect_ratio. Si les deux sont fournis, maintenez-les cohérents.
generation_type
string
Type de génération, utilisé pour spécifier la manière dont les images sont utilisées.Options :
  • frame - Mode première image. image_urls ne peut contenir qu’1 image, utilisée comme première image de la vidéo.
  • reference - Mode référence. image_urls peut contenir 1 ou 3 images, utilisées comme images de référence.
Lorsque generation_type est frame, image_urls ne prend en charge qu’1 image ; transmettre toute autre quantité renvoie une erreur unsupported_image_count.
image_urls
array<url>
Tableau d’URL d’images de référence. Vous pouvez l’omettre, fournir 1 image ou 3 images, selon generation_type :
  • Omis ou tableau vide : Text-to-Video
  • 1 image : Image-to-Video à image unique
  • 3 images : fusion d’images de référence (pris en charge uniquement lorsque generation_type est reference)
Relation avec generation_type :
  • generation_type est frame : seule 1 image peut être téléchargée.
  • generation_type est reference : 1 ou 3 images peuvent être téléchargées.
Seules les URL d’images publiquement accessibles sont prises en charge.
Le mode « première image + dernière image » avec 2 images n’est pas pris en charge. La transmission de 2 images renvoie une erreur unsupported_image_count. 4 images ou plus n’ont pas été entièrement vérifiées et ne sont pas recommandées.
video_urls
array<url>
Tableau d’URL de vidéos de référence. Vous pouvez l’omettre ou fournir 1 vidéo de référence.Seules les URL vidéo HTTP/HTTPS publiquement accessibles sont prises en charge. Vous pouvez le transmettre avec image_urls : les images servent de références d’identité ou de composition, tandis que la vidéo sert de référence de mouvement.
Omni-Flash-Ext ne prend en charge que 0 ou 1 vidéo de référence. La transmission de 2 vidéos ou plus renvoie une erreur unsupported_video_count.
Ne transmettez pas duration lorsque vous transmettez video_urls. video_urls et duration ne peuvent pas être transmis en même temps.

Réponse

code
integer
Code de statut de la réponse. Les requêtes réussies renvoient 200.
data
array
Tableau de tâches renvoyé.

Interroger le résultat de la tâche

La génération vidéo est asynchrone. Après la soumission, l’API renvoie un task_id. Utilisez le point de terminaison Obtenir le statut de la tâche pour interroger la progression et les résultats.
cURL
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
Nous recommandons d’attendre 5 à 10 secondes après la soumission avant la première interrogation, puis d’interroger toutes les 5 à 10 secondes. Une tâche unique s’achève généralement en environ 3 à 5 minutes.

Exemple de résultat réussi

{
  "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
        }
      ]
    }
  }
}

Exemple de résultat échoué

{
  "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"
    }
  }
}

Cas d’usage

Scénario 1 : Texte vers vidéo

{
  "model": "Omni-Flash-Ext",
  "prompt": "a beautiful sunset over the ocean with seagulls flying",
  "duration": 6,
  "resolution": "720p",
  "aspect_ratio": "16:9"
}

Scénario 2 : vidéo à image unique

{
  "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"]
}

Scénario 3 : fusion de 3 images de référence

{
  "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"
  ]
}

Scénario 4 : courte vidéo 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"
}

Scénario 5 : génération avec vidéo de référence

{
  "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"]
}

Codes d’erreur

HTTPType d’erreurSignificationAction recommandée
400invalid_request_errormodel n’est pas Omni-Flash-Ext, prompt est vide ou le format JSON est invalideVérifiez le corps de la requête
400invalid_durationduration n’est pas 4, 6, 8 ou 10Utilisez une durée prise en charge
400invalid_resolutionresolution n’est pas 720p, 1080p ou 4kUtilisez une résolution prise en charge
400unsupported_image_countNombre d’image_urls non pris en charge, généralement causé par la transmission de 2 imagesUtilisez 0, 1 ou 3 images
400unsupported_video_countNombre de video_urls non pris en charge, généralement causé par la transmission de 2 vidéos ou plusUtilisez 0 ou 1 vidéo de référence
401authentication_errorJeton invalideVérifiez le Bearer Token
402payment_requiredSolde insuffisantRechargez et réessayez
429rate_limit_errorLimite de débit dépasséeRéduisez la concurrence ou réessayez plus tard
Lorsqu’une tâche échoue, l’API de statut de tâche renvoie la raison de l’échec dans data.error. Les causes courantes incluent l’épuisement temporaire du quota en amont, l’échec de la modération du contenu ou un délai d’attente en amont.