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
Génération vidéo gemini-omni-1.1-flash-ext
- Modèle unifié de génération vidéo gemini-omni-1.1-flash-ext
- Prend en charge le Text-to-Video, l’Image-to-Video à image unique, la vidéo de référence et la fusion de 3 images de référence
- Prend en charge les résolutions 720p / 1080p / 4k et les durées de 4 / 6 / 8 / 10 secondes
- API de tâche asynchrone. Soumettez d’abord une tâche, puis interrogez le résultat via l’identifiant de tâche
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"
}
}
Authentification
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
string
requis
Nom du modèle de génération vidéo. Doit être
gemini-omni-1.1-flash-ext.boolean
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
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"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.string
défaut:"720p"
Résolution de la vidéo. Les valeurs sont insensibles à la casse.Valeurs prises en charge :
360p720p1080p4k
D’autres résolutions renvoient une erreur
invalid_resolution.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— paysage9:16— portrait
16:9string
Champ de compatibilité. Il a la même signification que
aspect_ratio. Si les deux sont fournis, maintenez-les cohérents.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_urlsne peut contenir qu’1 image, utilisée comme première image de la vidéo.reference- Mode référence.image_urlspeut 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.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_typeestreference)
generation_type :generation_typeestframe: seule 1 image peut être téléchargée.generation_typeestreference: 1 ou 3 images peuvent être téléchargées.
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.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.gemini-omni-1.1-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
integer
Code de statut de la réponse. Les requêtes réussies renvoient
200.array
Interroger le résultat de la tâche
La génération vidéo est asynchrone. Après la soumission, l’API renvoie untask_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>'
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": "gemini-omni-1.1-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": "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"]
}
Scénario 3 : fusion de 3 images de référence
{
"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"
]
}
Scénario 4 : courte vidéo 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"
}
Scénario 5 : génération avec vidéo de référence
{
"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"]
}
Codes d’erreur
| HTTP | Type d’erreur | Signification | Action recommandée |
|---|---|---|---|
| 400 | invalid_request_error | model n’est pas gemini-omni-1.1-flash-ext, prompt est vide ou le format JSON est invalide | Vérifiez le corps de la requête |
| 400 | invalid_duration | duration n’est pas 4, 6, 8 ou 10 | Utilisez une durée prise en charge |
| 400 | invalid_resolution | resolution n’est pas 720p, 1080p ou 4k | Utilisez une résolution prise en charge |
| 400 | unsupported_image_count | Nombre d’image_urls non pris en charge, généralement causé par la transmission de 2 images | Utilisez 0, 1 ou 3 images |
| 400 | unsupported_video_count | Nombre de video_urls non pris en charge, généralement causé par la transmission de 2 vidéos ou plus | Utilisez 0 ou 1 vidéo de référence |
| 401 | authentication_error | Jeton invalide | Vérifiez le Bearer Token |
| 402 | payment_required | Solde insuffisant | Rechargez et réessayez |
| 429 | rate_limit_error | Limite de débit dépassée | Réduisez la concurrence ou réessayez plus tard |
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.