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

# Omni-Flash-Ext Videogenerierung

>  - Einheitliches Videogenerierungsmodell Omni-Flash-Ext
- Unterstützt Text-to-Video, Image-to-Video mit einem Bild, Referenzvideo und Fusion von 3 Referenzbildern
- Unterstützt 720p / 1080p / 4k Auflösung sowie Dauern von 4 / 6 / 8 / 10 Sekunden
- Asynchrone Task-API. Zuerst wird eine Aufgabe eingereicht, anschließend wird das Ergebnis über die Task-ID abgefragt 

<RequestExample>
  ```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": "Omni-Flash-Ext",
      "prompt": "a girl is dancing happily in a sunny garden",
      "duration": 10,
      "resolution": "1080p",
      "aspect_ratio": "9:16"
    }'
  ```

  ```python Python theme={null}
  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())
  ```

  ```javascript JavaScript theme={null}
  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));
  ```

  ```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":        "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))
  }
  ```
</RequestExample>

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

  ```json 400 theme={null}
  {
    "error": {
      "code": 400,
      "message": "Invalid request parameters",
      "type": "invalid_request_error"
    }
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": 401,
      "message": "Authentication failed. Please check your API key",
      "type": "authentication_error"
    }
  }
  ```

  ```json 402 theme={null}
  {
    "error": {
      "code": 402,
      "message": "Insufficient account balance. Please recharge and try again",
      "type": "payment_required"
    }
  }
  ```

  ```json 429 theme={null}
  {
    "error": {
      "code": 429,
      "message": "Too many requests. Please try again later",
      "type": "rate_limit_error"
    }
  }
  ```
</ResponseExample>

## Authentifizierung

<ParamField header="Authorization" type="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
  ```
</ParamField>

## Anfrageparameter

<ParamField body="model" type="string" required>
  Name des Videogenerierungsmodells. Muss `Omni-Flash-Ext` sein.
</ParamField>

<ParamField body="prompt" type="string" required>
  Beschreibung des Videoinhalts. Wir empfehlen, Szene, Subjekt, Aktion, Umgebung, Kameraführung, visuellen Stil und Audiohinweise detailliert zu beschreiben.

  Beispiel: `"a girl is dancing happily in a sunny garden"`
</ParamField>

<ParamField body="duration" type="integer" default="6">
  Videodauer in Sekunden.

  Unterstützte Werte: `4`, `6`, `8`, `10`.

  <Warning>
    Andere Werte wie `5` oder `7` geben einen `invalid_duration`-Fehler zurück.
  </Warning>

  <Warning>
    Übergeben Sie `duration` nicht, wenn Sie ein Referenzvideo hochladen. `duration` und `video_urls` können nicht gleichzeitig übergeben werden.
  </Warning>
</ParamField>

<ParamField body="resolution" type="string" default="720p">
  Auflösung des Videos. Werte sind unabhängig von der Groß-/Kleinschreibung.

  Unterstützte Werte:

  * `720p`
  * `1080p`
  * `4k`

  <Warning>
    Andere Auflösungen geben einen `invalid_resolution`-Fehler zurück.
  </Warning>
</ParamField>

<ParamField body="aspect_ratio" type="string" default="16:9">
  Seitenverhältnis des Videos. Damit steuern Sie die Ausgabe in Quer- oder Hochformat.

  Übliche Werte:

  * `16:9` — Querformat
  * `9:16` — Hochformat

  Standard: `16:9`
</ParamField>

<ParamField body="size" type="string">
  Kompatibilitätsfeld. Hat die gleiche Bedeutung wie `aspect_ratio`. Wenn beide angegeben sind, halten Sie sie konsistent.
</ParamField>

<ParamField body="generation_type" type="string">
  Generierungstyp, der angibt, wie die Bilder verwendet werden.

  Optionen:

  * `frame` - Erstes-Bild-Modus. `image_urls` darf nur 1 Bild enthalten, das als erstes Bild des Videos verwendet wird.
  * `reference` - Referenzmodus. `image_urls` kann 1 oder 3 Bilder enthalten, die als Referenzbilder verwendet werden.

  <Warning>
    Wenn `generation_type` `frame` ist, unterstützt `image_urls` nur 1 Bild; die Übergabe einer anderen Anzahl gibt einen `unsupported_image_count`-Fehler zurück.
  </Warning>
</ParamField>

<ParamField body="image_urls" type="array<url>">
  Array mit URLs der Referenzbilder. Sie können es weglassen, 1 Bild oder 3 Bilder bereitstellen, abhängig von `generation_type`:

  * Weggelassen oder leeres Array: Text-to-Video
  * 1 Bild: Image-to-Video mit einem Bild
  * 3 Bilder: Fusion von Referenzbildern (nur unterstützt, wenn `generation_type` `reference` ist)

  Beziehung zu `generation_type`:

  * `generation_type` ist `frame`: Es darf nur 1 Bild hochgeladen werden.
  * `generation_type` ist `reference`: Es können 1 oder 3 Bilder hochgeladen werden.

  Es werden nur öffentlich zugängliche Bild-URLs unterstützt.

  <Warning>
    Der Modus „Erstes Bild + letztes Bild" mit 2 Bildern wird nicht unterstützt. Die Übergabe von 2 Bildern gibt einen `unsupported_image_count`-Fehler zurück. 4 oder mehr Bilder sind nicht vollständig verifiziert und werden nicht empfohlen.
  </Warning>
</ParamField>

<ParamField body="video_urls" type="array<url>">
  Array mit URLs der Referenzvideos. Sie können es weglassen oder 1 Referenzvideo bereitstellen.

  Es werden nur öffentlich zugängliche HTTP/HTTPS-Video-URLs unterstützt. Es kann zusammen mit `image_urls` übergeben werden: Bilder dienen als Identitäts- oder Kompositionsreferenz, das Video als Bewegungsreferenz.

  <Warning>
    `Omni-Flash-Ext` unterstützt nur 0 oder 1 Referenzvideo. Die Übergabe von 2 oder mehr Videos gibt einen `unsupported_video_count`-Fehler zurück.
  </Warning>

  <Warning>
    Übergeben Sie `duration` nicht, wenn Sie `video_urls` übergeben. `video_urls` und `duration` können nicht gleichzeitig übergeben werden.
  </Warning>
</ParamField>

## Antwort

<ResponseField name="code" type="integer">
  Statuscode der Antwort. Erfolgreiche Anfragen geben `200` zurück.
</ResponseField>

<ResponseField name="data" type="array">
  Zurückgegebenes Task-Array.

  <Expandable title="Array-Element">
    <ResponseField name="status" type="string">
      Anfangsstatus der Aufgabe. Nach erfolgreicher Einreichung ist er `submitted`.
    </ResponseField>

    <ResponseField name="task_id" type="string">
      Eindeutige Task-ID zur Abfrage von Status und Ergebnis.
    </ResponseField>
  </Expandable>
</ResponseField>

## Aufgabenergebnis abfragen

Die Videogenerierung erfolgt asynchron. Nach der Einreichung gibt die API eine `task_id` zurück. Verwenden Sie den Endpunkt [Aufgabenstatus abrufen](/de/api-reference/tasks/status), um Fortschritt und Ergebnisse abzufragen.

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

Wir empfehlen, nach der Einreichung 5–10 Sekunden bis zur ersten Abfrage zu warten und dann alle 5–10 Sekunden zu pollen. Eine einzelne Aufgabe wird in der Regel in etwa 3–5 Minuten abgeschlossen.

### Beispiel für ein erfolgreiches Ergebnis

```json theme={null}
{
  "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
        }
      ]
    }
  }
}
```

### Beispiel für ein fehlgeschlagenes Ergebnis

```json theme={null}
{
  "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"
    }
  }
}
```

## Anwendungsfälle

### Szenario 1: Text-zu-Video

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

### Szenario 2: Video mit einem Bild

```json theme={null}
{
  "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"]
}
```

### Szenario 3: Fusion von 3 Referenzbildern

```json theme={null}
{
  "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"
  ]
}
```

### Szenario 4: Kurzes 4K-Video

```json theme={null}
{
  "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"
}
```

### Szenario 5: Generierung mit Referenzvideo

```json theme={null}
{
  "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"]
}
```

## Fehlercodes

| HTTP | Fehlertyp                 | Bedeutung                                                                                             | Empfohlene Aktion                                       |
| ---- | ------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| 400  | `invalid_request_error`   | `model` ist nicht `Omni-Flash-Ext`, `prompt` ist leer oder das JSON-Format ist ungültig               | Überprüfen Sie den Request-Body                         |
| 400  | `invalid_duration`        | `duration` ist nicht `4`, `6`, `8` oder `10`                                                          | Verwenden Sie eine unterstützte Dauer                   |
| 400  | `invalid_resolution`      | `resolution` ist nicht `720p`, `1080p` oder `4k`                                                      | Verwenden Sie eine unterstützte Auflösung               |
| 400  | `unsupported_image_count` | Anzahl von `image_urls` nicht unterstützt, meist durch die Übergabe von 2 Bildern verursacht          | Verwenden Sie 0, 1 oder 3 Bilder                        |
| 400  | `unsupported_video_count` | Anzahl von `video_urls` nicht unterstützt, meist durch die Übergabe von 2 oder mehr Videos verursacht | Verwenden Sie 0 oder 1 Referenzvideo                    |
| 401  | `authentication_error`    | Ungültiges Token                                                                                      | Überprüfen Sie den Bearer Token                         |
| 402  | `payment_required`        | Unzureichendes Guthaben                                                                               | Aufladen und erneut versuchen                           |
| 429  | `rate_limit_error`        | Ratenlimit überschritten                                                                              | Parallelität reduzieren oder es später erneut versuchen |

Wenn eine Aufgabe fehlschlägt, gibt die Status-API der Aufgabe den Fehlergrund in `data.error` zurück. Häufige Ursachen sind vorübergehende Kontingenterschöpfungen beim Upstream, fehlgeschlagene Inhaltsmoderation oder Timeout beim Upstream.
