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

# gemini-omni-1.2-flash-ext Videogenerierung

>  - gemini-omni-1.2-flash-ext, ein einheitliches Modell zur Videogenerierung
- Unterstützt Text-zu-Video, Video ab Startbild, Video aus Start- und Endbild, Mehrbild-Referenz sowie Videobearbeitung und -verlängerung
- Unterstützt die Auflösungen 360p/720p/1080p/4k und eine Dauer von 3–15 Sekunden, Abrechnung pro Sekunde
- Asynchrone Task-API: Aufgabe zuerst einreichen, dann das Ergebnis über die Task-ID abfragen 

```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": "Ungültige Anfrageparameter",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Unzureichendes Kontoguthaben. Bitte laden Sie Ihr Guthaben auf und versuchen Sie es erneut",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Zu viele Anfragen. Bitte versuchen Sie es später erneut",
    "type": "rate_limit_error"
  }
}
```

## Authentifizierung

**Authorization** `string` *required*

Alle Anfragen erfordern eine Authentifizierung per Bearer Token.

API-Schlüssel abrufen:

Besuchen Sie die [Seite zur API-Schlüsselverwaltung](https://apimart.ai/keys), um Ihren API-Schlüssel zu erhalten.

Fügen Sie beim Senden von Anfragen den folgenden Header hinzu:

```
Authorization: Bearer YOUR_API_KEY
```

## Anfrageparameter

**model** `string` *required*

Name des Videogenerierungsmodells. Fest auf `gemini-omni-1.2-flash-ext` gesetzt.

**prompt** `string` *required*

Videobeschreibung oder Bearbeitungsanweisung. Darf nach dem Entfernen führender und nachgestellter Leerzeichen nicht leer sein. Beschreiben Sie bei Text-zu-Video Szene, Figuren, Handlung, Kamera und Ton; mit Bildern oder Videos beschreiben Sie Bewegung, Stil oder die gewünschten Änderungen.

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

> [!WARNING]
>
> `prompt` ist in allen Modi erforderlich, auch bei Startbild, Mehrbild-Referenz, Bearbeitung und Verlängerung. Fehlt der Parameter, wird ein 400-Fehler zurückgegeben.

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

Videodauer in Sekunden. Muss eine ganze Zahl sein.

* Text-zu-Video / Startbild / Mehrbild-Referenz: Ausgabedauer, `3`–`15`
* Start- und Endbild: Ausgabedauer, `3`–`10`
* Verlängerung (`extend`): Dauer des **neu hinzugefügten Abschnitts**, `3`–`10`
* Bearbeitung (`edit`): darf nicht übergeben werden; die Ausgabedauer entspricht dem Quellvideo

Der Alias `seconds` wird ebenfalls akzeptiert. Werden beide übergeben, müssen die Werte übereinstimmen.

> [!WARNING]
>
> Wird `duration` im Bearbeitungsmodus übergeben, wird der Fehler `video edit does not accept duration` zurückgegeben.

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

Videoauflösung, ohne Beachtung der Groß-/Kleinschreibung. Sie bestimmt den Preis pro Sekunde.

Zulässige Werte:

* `360p`
* `720p`
* `1080p`
* `4k` (`2160p` wird ebenfalls akzeptiert)

> [!WARNING]
>
> Jede andere Auflösung führt zu einem 400-Fehler.

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

Nur `16:9` (Querformat, Standard) und `9:16` (Hochformat) werden unterstützt; andere Werte führen zu einem 400-Fehler.

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

Aufgabentyp, der festlegt, wie das Eingabematerial verwendet wird.

Zulässige Werte:

* `edit` - Video bearbeiten; zusammen mit `video_urls` oder `extend_from_task_id` verwenden
* `extend` - Video verlängern, indem am Ende neuer Inhalt angefügt wird; zusammen mit `video_urls` oder `extend_from_task_id` verwenden
* `reference` - Mehrbild-Referenz; zusammen mit `image_urls` verwenden
* `text_to_video` / `image_to_video` / `reference_to_video` - Text-zu-Video / Startbild / Referenzbilder
* `auto` - wird anhand der Eingabe erkannt; mit Video wird es als `edit` behandelt

Ohne Video optional; der Modus wird anhand der Eingabe erkannt.

> [!WARNING]
>
> Bei Übergabe von `video_urls` oder `extend_from_task_id` ist ein Aufgabentyp erforderlich (`omni_reference_task_type` oder das kompatible Feld `generation_type`); fehlt er, wird ein 400-Fehler zurückgegeben. Empfohlen wird die explizite Angabe von `edit` oder `extend`; `auto` wird als `edit` behandelt.

**generation\_type** `string`

Kompatibilitätsfeld, gleichwertig mit `omni_reference_task_type`. Zulässige Werte: `frame` (entspricht `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` und `omni_reference_task_type` dürfen nicht gleichzeitig übergeben werden.

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

Array mit Referenzbildern für die Mehrbild-Referenz (Figuren, Produkte, Stile usw.). Unterstützt 1–10 Bilder.

Es werden nur öffentlich erreichbare HTTP/HTTPS-Bild-URLs unterstützt. Laden Sie lokale Bilder zuerst hoch, um eine öffentliche URL zu erhalten, und übergeben Sie diese; Base64-Data-URLs werden derzeit nicht unterstützt und führen zu einem 400-Fehler.

Wird nur 1 Bild übergeben, hängt die Verwendung vom Aufgabentyp ab:

* `omni_reference_task_type` nicht angegeben: wird als Referenzbild verwendet
* `omni_reference_task_type` ist `auto` oder `image_to_video`: wird als Startbild verwendet

Für die Generierung ab Startbild empfiehlt es sich, direkt `first_frame_image` zu verwenden, statt sich auf die Anzahl der Bilder zu verlassen.

> [!WARNING]
>
> `image_urls` darf nicht zusammen mit `first_frame_image` oder `last_frame_image` übergeben werden, und Bilder in `image_urls` werden nie als Startbild behandelt; beim Bearbeiten und Verlängern dürfen keine Bilder übergeben werden.

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

Startbild: Das erste Bild des generierten Videos ist dieses Bild. Es werden nur öffentlich erreichbare HTTP/HTTPS-Bild-URLs unterstützt, keine Base64-Data-URLs.

Zusammen mit `last_frame_image` übergeben, wird ein Video aus Start- und Endbild generiert.

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

Endbild für die Generierung aus Start- und Endbild; das Video geht vom Startbild in dieses Bild über. Es werden nur öffentlich erreichbare HTTP/HTTPS-Bild-URLs unterstützt, keine Base64-Data-URLs.

Im Start-/Endbild-Modus:

* `duration` unterstützt `3`–`10`; 10 Sekunden, wenn nicht angegeben
* `system_prompt` und `negative_prompt` dürfen nicht übergeben werden

> [!WARNING]
>
> `last_frame_image` muss zusammen mit `first_frame_image` übergeben werden; wird nur das Endbild übergeben, folgt der Fehler `last_frame_image requires first_frame_image`. Eine Kombination mit `image_urls` ist nicht möglich.

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

Bild-Array mit Rollen, eine gleichwertige Schreibweise für `first_frame_image` / `last_frame_image` / `image_urls`.

**Array-Element**

**url** `string` *required*

Öffentlich erreichbare HTTP/HTTPS-Bild-URL. Base64-Data-URLs werden nicht unterstützt.

**role** `string`

`first_frame` ist das Startbild, `last_frame` das Endbild (jeweils nur 1 Bild); jeder andere oder leere Wert wird als Referenzbild behandelt.

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

Array mit dem zu bearbeitenden oder zu verlängernden Video; es wird nur 1 Video unterstützt. Alternativ kann das Einzelwertfeld `video_url` verwendet werden – übergeben Sie nur eines von beiden.

Es werden nur öffentlich erreichbare HTTP/HTTPS-Video-URLs unterstützt. Format MP4 / MOV / WebM, höchstens 15 Sekunden und 64 MB.

> [!WARNING]
>
> Bei Übergabe von `video_urls` ist ein Aufgabentyp erforderlich; empfohlen wird `omni_reference_task_type` mit `edit` oder `extend` (`auto` wird als `edit` behandelt). Fehlt er, wird ein 400-Fehler zurückgegeben. Werden 2 oder mehr Videos übergeben, wird ein 400-Fehler zurückgegeben.

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

Eine Task-ID dieser Plattform (`task_01…`). Damit können Sie eine Ihrer zuvor abgeschlossenen `gemini-omni-1.2-flash-ext`-Aufgaben weiter bearbeiten oder verlängern, ohne das Video erneut hochzuladen.

Voraussetzungen:

* Die Aufgabe gehört zum aktuellen Konto
* Das Modell der Aufgabe ist `gemini-omni-1.2-flash-ext`
* Der Status der Aufgabe ist `completed`
* Der Kanal, über den die ursprüngliche Aufgabe erstellt wurde, ist weiterhin verfügbar; andernfalls wird 503 `source_channel_unavailable` zurückgegeben
* Das ursprüngliche Ergebnis ist höchstens 15 Sekunden lang (gilt für Bearbeitung und Verlängerung); im Bearbeitungsmodus muss zudem seine Dauer ermittelbar sein

Ist der Kanal nicht verfügbar oder lässt sich die Dauer des ursprünglichen Ergebnisses nicht ermitteln, laden Sie es herunter und laden Sie es stattdessen über `video_urls` hoch. Ist das ursprüngliche Ergebnis länger als 15 Sekunden, kürzen Sie es vor dem Hochladen auf höchstens 15 Sekunden.

> [!WARNING]
>
> `extend_from_task_id` darf nicht zusammen mit `video_urls` übergeben werden, und ein Aufgabentyp ist erforderlich; empfohlen wird `omni_reference_task_type` mit `edit` oder `extend` (`auto` wird als `edit` behandelt).

**negative\_prompt** `string`

Inhalte, die nicht im Video erscheinen sollen.

Beispiel: `"people, cars, color"`

> [!WARNING]
>
> Im Start-/Endbild-Modus darf `negative_prompt` nicht übergeben werden.

**system\_prompt** `string`

Systemanweisung, etwa um einen visuellen Stil festzulegen oder eingeblendeten Text zu verbieten. Muss ein String sein.

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

> [!WARNING]
>
> Im Start-/Endbild-Modus darf `system_prompt` nicht übergeben werden.

## Antwort

**code** `integer`

Statuscode der Antwort. Erfolgreiche Anfragen geben `200` zurück.

**data** `array`

Zurückgegebenes Task-Array.

**Array-Element**

**status** `string`

Anfangsstatus der Aufgabe. Nach erfolgreicher Einreichung ist er `submitted`.

**task\_id** `string`

Eindeutige Task-ID zur Abfrage von Status und Ergebnis.

## Aufgabenergebnis abfragen

Die Videogenerierung läuft asynchron. Nach dem Einreichen wird eine `task_id` zurückgegeben. Fragen Sie Fortschritt und Ergebnis über die API [Aufgabenstatus abrufen](https://docs.apimart.ai/de/api-reference/tasks/status.md) ab.

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

Fragen Sie alle 5-10 Sekunden ab und setzen Sie das Client-Timeout auf mindestens 10 Minuten. Richtwerte für die Generierungsdauer (inklusive Warteschlange): etwa 46 Sekunden für ein 15-Sekunden-Video in 360p, etwa 99 Sekunden für 15 Sekunden in 1080p und etwa 4-5 Minuten für 15 Sekunden in 4k. Der Fortschritt kann bis zum Abschluss lange bei 10 % stehen bleiben.

### Beispiel für ein erfolgreiches Ergebnis

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

Die Video-URL ist `data.result.videos[0].url[0]`. `data.actual_time` ist die Bearbeitungszeit der Aufgabe in Sekunden, nicht die Videolänge. Die Ausgabe ist MP4 (H.264, 24fps) mit AAC-Tonspur und unsichtbarem SynthID-Wasserzeichen; bei 4k fehlt gelegentlich die Tonspur.

### Beispiel für ein fehlgeschlagenes Ergebnis

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

Fehlgeschlagene Aufgaben werden vollständig erstattet.

## Abrechnung

Abrechnung pro Sekunde: Kosten = Sekundenpreis der gewählten Auflösung × abgerechnete Sekunden. Alle Modi werden in der angeforderten Auflösungsstufe abgerechnet. Die tatsächlichen Preise finden Sie auf der [Preisseite](https://apimart.ai/pricing).

| Modus | Abgerechnete Sekunden |
| - | - |
| Text-zu-Video / Startbild / Mehrbild-Referenz | `duration`; 10 Sekunden, wenn nicht angegeben |
| Start- und Endbild | `duration` (maximal 10 Sekunden); 10 Sekunden, wenn nicht angegeben |
| Bearbeitung | Dauer des Quellvideos (abzüglich 0,15 Sekunden Container-Toleranz, dann aufgerundet, mindestens 1 Sekunde; z. B. 8,019 Sekunden → 8 Sekunden, 8,3 Sekunden → 9 Sekunden) |
| Verlängerung | Hinzugefügte Sekunden `duration`; 10 Sekunden, wenn nicht angegeben. Das Originalvideo wird nicht berechnet |

## Anwendungsfälle

### Szenario 1: Text-zu-Video

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

### Szenario 2: Video ab Startbild

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

### Szenario 3: Video aus Start- und Endbild

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

Im Start-/Endbild-Modus unterstützt `duration` 3–10 Sekunden (10 Sekunden, wenn nicht angegeben); `system_prompt` / `negative_prompt` dürfen nicht übergeben werden.

### Szenario 4: Mehrbild-Referenz

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

### Szenario 5: Videobearbeitung

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

Übergeben Sie beim Bearbeiten kein `duration`; die Ausgabedauer entspricht dem Quellvideo.

### Szenario 6: Videoverlängerung

```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
}
```

### Szenario 7: Bestehende Aufgabe verlängern

```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
}
```

### Szenario 8: Systemanweisung und Negativ-Prompt

```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.