> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apimart.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Génération vidéo gemini-omni-1.2-flash-ext

>  - gemini-omni-1.2-flash-ext, modèle unifié de génération vidéo
- Prend en charge le texte vers vidéo, la vidéo à partir d'une première image, la vidéo à partir de la première et de la dernière image, la référence multi-images ainsi que l'édition et la prolongation de vidéos
- Résolutions 360p/720p/1080p/4k, durée de 3 à 15 secondes, facturation à la seconde
- API de tâches asynchrone : soumettez d'abord une tâche, puis récupérez le résultat avec l'ID de tâche 

```bash cURL theme={null}
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.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'
```

```python Python theme={null}
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "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())
```

```javascript JavaScript theme={null}
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "gemini-omni-1.2-flash-ext",
  prompt: "Aerial shot over a misty mountain lake at sunrise.",
  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));
```

```go Go theme={null}
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.2-flash-ext",
        "prompt":       "Aerial shot over a misty mountain lake at sunrise.",
        "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))
}
```

```json 200 theme={null}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
    }
  ]
}
```

```json 400 theme={null}
{
  "error": {
    "code": 400,
    "message": "Paramètres de requête invalides",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "Échec de l'authentification. Veuillez vérifier votre clé API",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Solde du compte insuffisant. Veuillez recharger votre compte et réessayer",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Trop de requêtes. Veuillez réessayer plus tard",
    "type": "rate_limit_error"
  }
}
```

## Authentification

**Authorization** `string` *required*

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](https://apimart.ai/keys) 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` *required*

Nom du modèle de génération vidéo. Toujours `gemini-omni-1.2-flash-ext`.

**prompt** `string` *required*

Description de la vidéo ou instruction d'édition. Ne doit pas être vide une fois les espaces de début et de fin supprimés. En texte vers vidéo, décrivez la scène, les personnages, les actions, la caméra et le son ; avec des images ou une vidéo, décrivez le mouvement, le style ou les modifications souhaitées.

Exemple : `"Aerial shot over a misty mountain lake at sunrise."`

> [!WARNING]
>
> `prompt` est obligatoire dans tous les modes, y compris première image, référence multi-images, édition et prolongation. En son absence, une erreur 400 est renvoyée.

**duration** `integer` (default: 10)

Durée de la vidéo en secondes. Doit être un entier.

* Texte vers vidéo / première image / référence multi-images : durée de sortie, `3`–`15`
* Première et dernière image : durée de sortie, `3`–`10`
* Prolongation (`extend`) : durée du **segment ajouté**, `3`–`10`
* Édition (`edit`) : ne doit pas être transmis ; la durée de sortie suit la vidéo source

L'alias `seconds` est également accepté. Si les deux sont transmis, leurs valeurs doivent être identiques.

> [!WARNING]
>
> Transmettre `duration` en mode édition renvoie l'erreur `video edit does not accept duration`.

**resolution** `string` (default: 720p)

Résolution de la vidéo, insensible à la casse. Elle détermine le prix à la seconde.

Valeurs autorisées :

* `360p`
* `720p`
* `1080p`
* `4k` (`2160p` est également accepté)

> [!WARNING]
>
> Toute autre résolution renvoie une erreur 400.

**aspect\_ratio** `string` (default: 16:9)

Seuls `16:9` (paysage, par défaut) et `9:16` (portrait) sont pris en charge ; les autres valeurs renvoient une erreur 400.

**omni\_reference\_task\_type** `string`

Type de tâche, qui indique comment les éléments fournis sont utilisés.

Valeurs autorisées :

* `edit` - Éditer une vidéo ; à utiliser avec `video_urls` ou `extend_from_task_id`
* `extend` - Prolonger une vidéo en ajoutant du contenu à la fin ; à utiliser avec `video_urls` ou `extend_from_task_id`
* `reference` - Référence multi-images ; à utiliser avec `image_urls`
* `text_to_video` / `image_to_video` / `reference_to_video` - Texte vers vidéo / première image / images de référence
* `auto` - Déterminé automatiquement selon les entrées ; traité comme `edit` en présence d'une vidéo

Facultatif sans vidéo ; le mode est déterminé automatiquement selon les entrées.

> [!WARNING]
>
> Lorsque `video_urls` ou `extend_from_task_id` est transmis, un type de tâche est obligatoire (`omni_reference_task_type`, ou le champ compatible `generation_type`) ; s'il est omis, une erreur 400 est renvoyée. Il est recommandé de transmettre explicitement `edit` ou `extend` ; `auto` est traité comme `edit`.

**generation\_type** `string`

Champ de compatibilité, équivalent à `omni_reference_task_type`. Valeurs autorisées : `frame` (identique à `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` et `omni_reference_task_type` ne peuvent pas être transmis ensemble.

**image\_urls** `array\<url\>`

Tableau d'images de référence pour la référence multi-images (personnages, produits, styles, etc.). De 1 à 10 images.

Seules les URL d'image HTTP/HTTPS accessibles publiquement sont prises en charge. Téléversez d'abord les images locales pour obtenir une URL publique, puis transmettez cette URL ; les Data URL Base64 ne sont pas prises en charge actuellement et renvoient une erreur 400.

Lorsqu'une seule image est transmise, son utilisation dépend du type de tâche :

* `omni_reference_task_type` omis : utilisée comme image de référence
* `omni_reference_task_type` vaut `auto` ou `image_to_video` : utilisée comme première image

Pour générer à partir d'une première image, utilisez directement `first_frame_image` plutôt que de vous fier au nombre d'images.

> [!WARNING]
>
> `image_urls` ne peut pas être transmis avec `first_frame_image` ou `last_frame_image`, et les images de `image_urls` ne sont jamais traitées comme première image ; aucune image ne peut non plus être transmise lors d'une édition ou d'une prolongation.

**first\_frame\_image** `string`

Première image : la première image de la vidéo générée sera cette image. Seules les URL d'image HTTP/HTTPS accessibles publiquement sont prises en charge ; les Data URL Base64 ne le sont pas.

Transmis avec `last_frame_image`, il génère une vidéo à partir de la première et de la dernière image.

**last\_frame\_image** `string`

Dernière image, pour la génération à partir de la première et de la dernière image : la vidéo passe de la première image à celle-ci. Seules les URL d'image HTTP/HTTPS accessibles publiquement sont prises en charge ; les Data URL Base64 ne le sont pas.

En mode première et dernière image :

* `duration` accepte `3`–`10` ; 10 secondes si omis
* `system_prompt` et `negative_prompt` ne peuvent pas être transmis

> [!WARNING]
>
> `last_frame_image` doit être transmis avec `first_frame_image` ; transmettre uniquement la dernière image renvoie l'erreur `last_frame_image requires first_frame_image`. Il ne peut pas être transmis avec `image_urls`.

**image\_with\_roles** `array\<object\>`

Tableau d'images avec rôles, forme équivalente de `first_frame_image` / `last_frame_image` / `image_urls`.

**Élément du tableau**

**url** `string` *required*

URL d'image HTTP/HTTPS accessible publiquement. Les Data URL Base64 ne sont pas prises en charge.

**role** `string`

`first_frame` désigne la première image et `last_frame` la dernière image (1 seule image chacune) ; toute autre valeur ou un rôle vide est traité comme image de référence.

**video\_urls** `array\<url\>`

Tableau contenant la vidéo à éditer ou à prolonger ; une seule vidéo est prise en charge. Vous pouvez aussi utiliser le champ à valeur unique `video_url` ; transmettez l'un ou l'autre.

Seules les URL vidéo HTTP/HTTPS accessibles publiquement sont prises en charge. Format MP4 / MOV / WebM, 15 secondes et 64 MB maximum.

> [!WARNING]
>
> Lorsque `video_urls` est transmis, un type de tâche est obligatoire ; il est recommandé de définir `omni_reference_task_type` sur `edit` ou `extend` (`auto` est traité comme `edit`). S'il est omis, une erreur 400 est renvoyée. Transmettre 2 vidéos ou plus renvoie une erreur 400.

**extend\_from\_task\_id** `string`

ID de tâche de cette plateforme (`task_01…`). Permet de poursuivre l'édition ou la prolongation de l'une de vos tâches `gemini-omni-1.2-flash-ext` déjà terminées, sans renvoyer la vidéo.

Conditions d'utilisation :

* La tâche appartient au compte actuel
* Le modèle de la tâche est `gemini-omni-1.2-flash-ext`
* Le statut de la tâche est `completed`
* Le canal ayant généré la tâche d'origine est toujours disponible ; sinon, 503 `source_channel_unavailable` est renvoyé
* La vidéo d'origine ne dépasse pas 15 secondes (s'applique à l'édition comme à la prolongation) ; en mode édition, sa durée doit aussi pouvoir être déterminée

Si le canal n'est pas disponible ou si la durée de la vidéo d'origine ne peut pas être déterminée, téléchargez la vidéo d'origine puis envoyez-la via `video_urls`. Si la vidéo d'origine dépasse 15 secondes, coupez-la à 15 secondes maximum avant de l'envoyer.

> [!WARNING]
>
> `extend_from_task_id` ne peut pas être transmis avec `video_urls`, et un type de tâche est obligatoire ; il est recommandé de définir `omni_reference_task_type` sur `edit` ou `extend` (`auto` est traité comme `edit`).

**negative\_prompt** `string`

Contenu à ne pas faire apparaître dans la vidéo.

Exemple : `"people, cars, color"`

> [!WARNING]
>
> `negative_prompt` ne peut pas être transmis en mode première et dernière image.

**system\_prompt** `string`

Instruction système, par exemple pour imposer un style visuel ou interdire le texte à l'écran. Doit être une chaîne de caractères.

Exemple : `"Render as a black-and-white silent film."`

> [!WARNING]
>
> `system_prompt` ne peut pas être transmis en mode première et dernière image.

## 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é.

**Élément du tableau**

**status** `string`

Statut initial de la tâche. Après une soumission réussie, il est `submitted`.

**task\_id** `string`

Identifiant unique de la tâche pour interroger son statut et son résultat.

## Interroger le résultat de la tâche

La génération vidéo est asynchrone. Après la soumission, un `task_id` est renvoyé. Utilisez l'API [Obtenir le statut d'une tâche](https://docs.apimart.ai/fr/api-reference/tasks/status.md) pour suivre la progression et obtenir le résultat.

```bash cURL theme={null}
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
```

Interrogez toutes les 5-10 secondes et définissez un délai d'attente client d'au moins 10 minutes. Durées de génération indicatives (file d'attente comprise) : environ 46 secondes pour une vidéo de 15 secondes en 360p, environ 99 secondes pour 15 secondes en 1080p et environ 4-5 minutes pour 15 secondes en 4k. La progression peut rester longtemps à 10 % jusqu'à la fin.

### Exemple de résultat réussi

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "actual_time": 99,
    "cost": 0.695,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/videos/abc.mp4"]
        }
      ]
    }
  }
}
```

L'URL de la vidéo est `data.result.videos[0].url[0]`. `data.actual_time` correspond au temps de traitement de la tâche en secondes, et non à la durée de la vidéo. La sortie est au format MP4 (H.264, 24fps) avec une piste audio AAC et un filigrane invisible SynthID ; en 4k, la piste audio est parfois absente.

### Exemple de résultat échoué

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "failed",
    "progress": 100,
    "cost": 0,
    "error": {
      "code": "task_failed",
      "message": "content_rejected",
      "type": "task_failed"
    }
  }
}
```

Les tâches échouées sont intégralement remboursées.

## Facturation

Facturation à la seconde : coût = prix à la seconde de la résolution choisie × secondes facturées. Tous les modes sont facturés selon le palier de résolution demandé. Consultez la [page des tarifs](https://apimart.ai/pricing) pour les prix réels.

| Mode | Secondes facturées |
| - | - |
| Texte vers vidéo / première image / référence multi-images | `duration` ; 10 secondes si omis |
| Première et dernière image | `duration` (10 secondes maximum) ; 10 secondes si omis |
| Édition | Durée de la vidéo source (moins une tolérance de conteneur de 0,15 seconde, arrondie à l'entier supérieur, 1 seconde minimum ; par ex. 8,019 secondes → 8 secondes, 8,3 secondes → 9 secondes) |
| Prolongation | Secondes ajoutées `duration` ; 10 secondes si omis. La vidéo d'origine n'est pas facturée |

## Cas d'usage

### Scénario 1 : Texte vers vidéo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Aerial shot over a misty mountain lake at sunrise.",
  "duration": 15,
  "resolution": "1080p",
  "aspect_ratio": "9:16"
}
```

### Scénario 2 : vidéo à partir d'une première image

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The camera slowly pushes in.",
  "duration": 6,
  "aspect_ratio": "9:16",
  "first_frame_image": "https://example.com/start.jpg"
}
```

### Scénario 3 : vidéo à partir de la première et de la dernière image

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The flower bud slowly opens into full bloom.",
  "duration": 8,
  "aspect_ratio": "16:9",
  "first_frame_image": "https://example.com/bud.jpg",
  "last_frame_image": "https://example.com/bloom.jpg"
}
```

En mode première et dernière image, `duration` accepte 3 à 10 secondes (10 secondes si omis), et `system_prompt` / `negative_prompt` ne peuvent pas être transmis.

### Scénario 4 : référence multi-images

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The cat bats at the ball of yarn.",
  "duration": 8,
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ]
}
```

### Scénario 5 : édition vidéo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Make the violin invisible. Keep everything else the same.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "edit"
}
```

Ne transmettez pas `duration` lors d'une édition ; la durée de sortie suit la vidéo source.

### Scénario 6 : prolongation vidéo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Continue the scene: the dancer bows.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "extend",
  "duration": 4
}
```

### Scénario 7 : prolonger une tâche existante

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
  "omni_reference_task_type": "extend",
  "duration": 6
}
```

### Scénario 8 : instruction système et prompt négatif

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "A busy city street at noon.",
  "system_prompt": "Render as a black-and-white silent film.",
  "negative_prompt": "people, cars, color",
  "duration": 6
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.