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

# apimart-zoe Videogenerierung

> Videos aus Text, Frames sowie Bild-, Video- und Audioreferenzen erzeugen und bearbeiten: 480p–4k, letztes Frame als Bild, MOV und Entwurf-zu-Finalvideo.

> [!NOTE]
>
> Diese API arbeitet asynchron. Lesen Sie nach dem Absenden `data[0].task_id` aus und rufen Sie den [Aufgabenstatus](https://docs.apimart.ai/de/api-reference/tasks/status.md) ab. Die Generierung dauert meist 1–3 Minuten; fragen Sie alle 5–10 Sekunden ab. Die tatsächliche Dauer hängt von der Aufgabe ab.

```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": "apimart-zoe",
    "prompt": "Ein orangefarbenes Kätzchen auf der Fensterbank blickt zur Kamera, seitliches Sonnenlicht, die Kamera fährt langsam näher",
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "duration": 8,
    "audio": true,
    "nsfw_check": true,
    "return_last_frame": true
  }'
```

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

response = requests.post(
    "https://api.apimart.ai/v1/videos/generations",
    headers={"Authorization": "Bearer <token>"},
    json={
        "model": "apimart-zoe",
        "prompt": "Ein orangefarbenes Kätzchen auf der Fensterbank blickt zur Kamera, seitliches Sonnenlicht, die Kamera fährt langsam näher",
        "resolution": "1080p",
        "aspect_ratio": "16:9",
        "duration": 8,
        "audio": True,
        "nsfw_check": True,
        "return_last_frame": True
    }
)
response.raise_for_status()
print(response.json())
```

```javascript JavaScript theme={null}
const response = await fetch("https://api.apimart.ai/v1/videos/generations", {
  method: "POST",
  headers: {
    Authorization: "Bearer <token>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "model": "apimart-zoe",
    "prompt": "Ein orangefarbenes Kätzchen auf der Fensterbank blickt zur Kamera, seitliches Sonnenlicht, die Kamera fährt langsam näher",
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "duration": 8,
    "audio": true,
    "nsfw_check": true,
    "return_last_frame": true
  })
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

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

## Modus wählen

| Modus | Parameter |
| - | - |
| Text zu Video | `prompt` ohne Medien übergeben. |
| Start-/Endbild zu Video | Die Rollen `first_frame` und optional `last_frame` in `image_with_roles` oder `first_frame_image` / `last_frame_image` verwenden. |
| Referenzen zu Video | Referenzbilder oder -videos, optional mit Audioreferenzen. Audio allein ist nicht möglich. |
| Entwurf | `draft: true` für eine Ausgabe in `480p`. |
| Finales Video | `draft_task_id` eines erfolgreichen Entwurfs für `1080p` verwenden. |
| Videobearbeitung | `omni_reference_task_type: "edit"` mit mindestens einem Quellvideo. Dauer und Seitenverhältnis folgen der Quelle. |

## Header

**Authorization** `string` *required*

Bearer-Authentifizierung: `Bearer <token>`, wobei `<token>` Ihr APIMart-API-Schlüssel ist. Senden Sie den Body mit `Content-Type: application/json`.

## Anfrageparameter

**model** `string` *required*

Immer `apimart-zoe`.

**prompt** `string`

Bis zu 204.800 Zeichen. Für Text-zu-Video erforderlich; bei reinen Medienanfragen optional. Bei `draft_task_id` nicht zulässig: Der Prompt wird vom Entwurf übernommen.

**resolution** `string`

`480p`, `720p`, `1080p`, `2k`, `4k`; Groß-/Kleinschreibung ist unerheblich. Standard bei normaler Generierung: `720p`. Mit `draft: true` ist nur `480p` zulässig, auch bei Auslassung. Mit `draft_task_id` ist nur `1080p` zulässig, auch bei Auslassung.

**aspect\_ratio** `string`

`21:9`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `adaptive`. Standard: `adaptive`, vom Modell oder den Medien bestimmt. Für finale Videos weglassen; das Format wird vom Entwurf übernommen.

Bei Videobearbeitung (`edit`) nur weglassen oder `adaptive` angeben; das Seitenverhältnis folgt der Quelle.

**size** `string`

Alternativer Name für `aspect_ratio` mit denselben Werten. Verwenden Sie möglichst nur eines der Felder. Für finale Videos weglassen.

**duration** `integer`

Normale Generierung: Ganze Sekunden von `4` bis `30`, Standard `5`. Explizite oder voreingestellte Dauer wird wie angefragt berechnet und nicht an die fertige Videolänge angepasst. Bei `-1` entscheidet das Modell: 30 Sekunden werden reserviert, danach wird die tatsächliche Dauer auf ganze Sekunden kaufmännisch gerundet und abgerechnet. Für finale Videos weglassen; die Dauer wird vom Entwurf übernommen.

Bei Videobearbeitung (`edit`) nur weglassen oder `-1` angeben. Ohne Angabe gilt `-1`; die Ausgabedauer folgt dem Quellvideo.

**seconds** `integer`

Alias für `duration`, mit denselben Regeln. Verwenden Sie nur eines der Felder. Für finale Videos weglassen.

**audio** `boolean`

Boolescher Wert für die gleichzeitige Audioausgabe. Alias: `generate_audio`. Ohne Angabe entscheidet das Modell. Für finale Videos verboten. Steuert die Ausgabe, nicht die Eingabereferenzen in `audio_urls`.

Werden `audio` und `generate_audio` gemeinsam gesendet, müssen die Werte übereinstimmen, sonst HTTP 400. Ohne Angabe entscheidet das Modell und erzeugt meist Ton.

**generate\_audio** `boolean`

Alias für `audio` mit denselben Regeln. Nur eines der Felder verwenden; für finale Videos weglassen.

Werden `audio` und `generate_audio` gemeinsam gesendet, müssen die Werte übereinstimmen, sonst HTTP 400. Ohne Angabe entscheidet das Modell und erzeugt meist Ton.

**seed** `integer`

Zufallsstartwert als Ganzzahl. Für finale Videos verboten.

**nsfw\_check** `boolean`

Standardmäßig keine Inhaltsprüfung. Mit `true` aktivieren.

Optionaler boolescher Wert. `true` aktiviert die Inhaltsprüfung für `prompt`, `image_urls`, `image_with_roles`, Start-/Endbilder und `asset://`-Bildmedien. Referenzvideos und Audio werden nicht geprüft.

Finale Anfragen enthalten weder Prompt noch Medien. Beim Ablauf Entwurf → finales Video erfolgt die Prüfung bei der Erstellung des Entwurfs.

Ein Treffer führt zu HTTP 400 (`nsfw_content_detected`); Kategorien stehen in `error.message`. Zeigen Sie dies als Ablehnung durch die Inhaltsprüfung an, nicht als allgemeinen Parameterfehler. Bei Fehlern oder Ausfall des Prüfdienstes wird die Generierung fortgesetzt; der Parameter garantiert daher keine abgeschlossene Prüfung jeder Anfrage.

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

Unterstützt `auto` (Standard, entspricht Weglassen; das Modell entscheidet), `reference` und `edit`. `reference` / `edit` erfordern Referenzmedien; reine Text- oder Start-/Endbildanfragen führen damit zu HTTP 400. `edit` benötigt mindestens ein `video_urls`-Element und darf nicht mit `draft: true` kombiniert werden. `extend` wird nicht unterstützt und führt zu HTTP 400. Bei Finalgenerierung weglassen.

**return\_last\_frame** `boolean`

Mit `true` wird das letzte Frame zusätzlich als PNG unter `data.result.last_frame_url` zurückgegeben. Standardmäßig deaktiviert. Bei Finalgenerierung weglassen.

**output\_format** `string`

`mp4` (Standard) oder `mov` (QuickTime-Container); andere Werte ergeben HTTP 400. Alias: `response_format`. Bei beiden Feldern hat `output_format` Vorrang. Bei Finalgenerierung weglassen.

**response\_format** `string`

Alias für `output_format`, unterstützt `mp4` / `mov`. Bei beiden Feldern hat `output_format` Vorrang. Bei Finalgenerierung weglassen.

**enhance\_prompt** `boolean`

Mit `true` wird der Prompt vor der Generierung automatisch optimiert. Standardmäßig wird der ursprüngliche Prompt verwendet. Bei Finalgenerierung weglassen.

**image\_with\_roles** `object[]`

Jeder Eintrag enthält `url` und `role`. Rollen: `first_frame` (Startbild), `last_frame` (Endbild), `reference_image` (Referenzbild). Je höchstens ein Start- und Endbild; ein Endbild benötigt ein Startbild. Start-/Endbilder dürfen nicht mit Referenzmedien kombiniert werden.

`image_urls` und `image_with_roles` dürfen nicht gemeinsam gesendet werden. Andernfalls wird beim Absenden HTTP 400 (`invalid_request_error`) ohne Berechnung zurückgegeben. Die Aliasse `image`, `images` und `image_url` zählen als `image_urls` und umgehen diese Einschränkung nicht.

**image\_urls** `string[]`

Höchstens 30 Referenzbilder. Formate, Abmessungen und Dateigrößen stehen in den Medienanforderungen unten.

`image_urls` und `image_with_roles` dürfen nicht gemeinsam gesendet werden. Andernfalls wird beim Absenden HTTP 400 (`invalid_request_error`) ohne Berechnung zurückgegeben. Die Aliasse `image`, `images` und `image_url` zählen als `image_urls` und umgehen diese Einschränkung nicht.

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

Adresse des Startbilds; entspricht der Rolle `first_frame` in `image_with_roles`.

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

Adresse des Endbilds; entspricht `last_frame` in `image_with_roles`. Ein Startbild ist ebenfalls erforderlich.

**video\_urls** `string[]`

Höchstens 10 Referenzvideos. Öffentliche `http(s)`-URLs oder `asset://<Medien-ID>`, kein `data:` Base64. Abmessungen, genaue Dauer und Bildrate werden beim Absenden nach den folgenden Regeln geprüft.

Für die Abrechnung werden die Dauern addiert und erst dann auf ganze Sekunden abgerundet, ohne spätere Anpassung. Diese Rundung gilt nicht für die Zulässigkeit einzelner Videos. Bei fehlendem Zugriff oder gescheiterter Dauerermittlung: HTTP 400 (`input_video_probe_failed`) ohne Berechnung.

`auto` / `reference`: 2–15 Sekunden, zulässig `1.8 ≤ t ≤ 15.2`. Quellvideos für `edit`: 4–30 Sekunden, zulässig `3.8 ≤ t < 30.2`. Exakte Dauer ohne vorheriges Runden prüfen.

**audio\_urls** `string[]`

Maximal 10; WAV / MP3; jeweils 2–15 Sekunden und `≤ 15 MB`, insgesamt maximal 30 Sekunden. Toleranz ±0.2 Sekunden: je Clip `1.8 ≤ t ≤ 15.2`, insgesamt `≤ 30.2`. Referenzbild oder -video erforderlich.

Öffentliche `http(s)`-URLs oder `asset://<Medien-ID>`, kein `data:` Base64. Die Audiodauer wird beim Absenden geprüft; ungültige Werte ergeben synchron HTTP 400 ohne Berechnung.

**draft** `boolean`

`true` erzeugt einen Entwurf in `480p`. Andere Parameter folgen den normalen Generierungsregeln. Bei der finalen Generierung nicht übergeben.

Videobearbeitung (`edit`) unterstützt keine Entwürfe.

**draft\_task\_id** `string`

`task_id` eines erfolgreichen Entwurfs zur Generierung eines finalen Videos in `1080p`. Innerhalb von 24 Stunden nach Erstellung des Entwurfs verwenden. Prompt, Medien, Dauer und Seitenverhältnis werden übernommen und dürfen nicht erneut übergeben werden. Für finale Videos sind auch `seed`, `audio` und dessen Alias `generate_audio` verboten.

## Medienadressen und Kombinationsregeln

Bilder, Videos und Audio akzeptieren öffentliche `http(s)`-URLs oder APIMart-Medien über `asset://<Medien-ID>`. Kein Medientyp akzeptiert `data:` Base64; zuerst hochladen. Die Registrierung erfolgt automatisch ohne separaten API-Aufruf. Bei Registrierungsfehlern scheitert die Aufgabe mit Erstattung.

| Medien | Anforderungen |
| - | - |
| Referenzbilder | Bis zu 30; JPEG / PNG / WebP / BMP / TIFF / GIF / HEIC / HEIF; Seitenverhältnis 0.4–2.5; Breite und Höhe jeweils 300–6000 Pixel; jeweils `< 30 MB`. |
| Referenzvideos | Bis zu 10; MP4 / MOV (H.264 / H.265; Audiospur: AAC / MP3); jeweils `≤ 200 MB`. Regeln zu Abmessungen, Dauer und Bildrate siehe unten. |
| Audioreferenzen | Maximal 10; WAV / MP3; jeweils 2–15 Sekunden und `≤ 15 MB`, insgesamt maximal 30 Sekunden. Toleranz ±0.2 Sekunden: je Clip `1.8 ≤ t ≤ 15.2`, insgesamt `≤ 30.2`. Referenzbild oder -video erforderlich. |

### Prüfung der Referenzvideos

| Eigenschaft | Anforderung |
| - | - |
| Breite und Höhe | Breite und Höhe jeweils 300–6000 Pixel. |
| Pixelfläche (Breite × Höhe) | 409.600–8.295.044 Pixel. |
| Seitenverhältnis (Breite / Höhe) | 0.4–2.5. |
| Dauer je Video | `auto` / `reference`: 2–15 Sekunden, zulässig `1.8 ≤ t ≤ 15.2`. Quellvideos für `edit`: 4–30 Sekunden, zulässig `3.8 ≤ t < 30.2`. Exakte Dauer ohne vorheriges Runden prüfen. |
| Bildrate | Zuerst kaufmännisch auf eine Ganzzahl runden, dann auf 24–60fps prüfen. 23.976 und 59.94 sind zulässig. |

Videoabmessungen, Pixelfläche, Seitenverhältnis, exakte Dauer und Bildrate sowie Referenzaudiodauer werden beim Absenden geprüft. Verstöße ergeben synchron HTTP 400 ohne Berechnung. Videofehler verwenden `invalid_request_error` mit Messwerten. Maßgeblich ist die Pixelfläche, nicht kurze Seite mindestens 480 und lange Seite höchstens 4096.

Nur hinsichtlich der Abmessungen ist 420×1000 (420.000 Pixel) zulässig. 720×480 (345.600 Pixel), 848×480 (407.040 Pixel) und 4096×2160 (8.847.360 Pixel) liegen außerhalb der Flächengrenzen. Dauer, Bildrate und weitere Medienanforderungen müssen ebenfalls erfüllt sein.

Bildabmessungen, Dateigröße und Kodierung werden während der Generierung geprüft. Ungültige Medien führen zum Fehlschlag mit automatischer Erstattung. Prüfen Sie diese Eigenschaften möglichst vor dem Aufruf.

### Regeln für Medienkombinationen

* `image_urls` und `image_with_roles` dürfen nicht gemeinsam gesendet werden. Andernfalls wird beim Absenden HTTP 400 (`invalid_request_error`) ohne Berechnung zurückgegeben. Die Aliasse `image`, `images` und `image_url` zählen als `image_urls` und umgehen diese Einschränkung nicht.
* Start-/Endbilder dürfen nicht in derselben Anfrage wie Referenzbilder, -videos oder -audio vorkommen.
* Je höchstens ein Start- und Endbild. Ein Endbild benötigt ein Startbild.
* Höchstens 30 Referenzbilder, 10 Referenzvideos und 10 Audioreferenzen, insgesamt höchstens 50 Medien.
* Verstöße gegen diese Kombinationen oder Anzahlen führen beim Absenden synchron zu HTTP 400 ohne Berechnung.
* `omni_reference_task_type: "edit"` erfordert mindestens ein Quellvideo (`3.8 ≤ t < 30.2` Sekunden). `duration` / `seconds` nur weglassen oder `-1`; `aspect_ratio` / `size` nur weglassen oder `adaptive`. Nicht mit `draft: true` kombinieren. Auto/reference behalten die Grenze von 2–15 Sekunden samt Toleranz.

> [!WARNING]
>
> Diese Felder führen allein durch ihre Anwesenheit zu HTTP 400, auch bei `""`, `[]`, `false` oder `null`; vollständig entfernen: `negative_prompt`, `camera_fixed`, `camerafixed`, `extend_from_task_id`, `mask_url`, `video_list`, `element_list`, `multi_shot`, `tools`. `n` weglassen oder auf `1` setzen.

## Anfragebeispiele

Die folgenden Medien-URLs sind Platzhalter. Ersetzen Sie sie durch erreichbare Medienadressen.

### Start- und Endbilder

```json theme={null}
{
  "model": "apimart-zoe",
  "prompt": "Ein natürlicher Übergang vom Startbild zum Endbild bei gleichbleibender Beleuchtung",
  "image_with_roles": [
    {
      "url": "https://example.com/start.jpg",
      "role": "first_frame"
    },
    {
      "url": "https://example.com/end.jpg",
      "role": "last_frame"
    }
  ],
  "duration": 6
}
```

Alternativ sind `first_frame_image` und `last_frame_image` möglich. Fügen Sie derselben Anfrage keine Referenzbilder, -videos oder -audio hinzu.

### Bild-, Video- und Audioreferenzen

```json theme={null}
{
  "model": "apimart-zoe",
  "prompt": "Die Figur aus dem Referenzbild bewegt sich natürlich in der Szene des Referenzvideos, begleitet von Musik im Rhythmus der Bilder",
  "image_urls": [
    "https://example.com/character.jpg"
  ],
  "video_urls": [
    "https://example.com/scene.mp4"
  ],
  "audio_urls": [
    "https://example.com/bgm.mp3"
  ],
  "duration": -1
}
```

Bilder in `image_urls` werden als Referenzbilder behandelt. Bei `duration: -1` bestimmt das Modell die Ausgabedauer.

### Videobearbeitung

`omni_reference_task_type: "edit"` erfordert mindestens ein Quellvideo (`3.8 ≤ t < 30.2` Sekunden). `duration` / `seconds` nur weglassen oder `-1`; `aspect_ratio` / `size` nur weglassen oder `adaptive`. Nicht mit `draft: true` kombinieren. Auto/reference behalten die Grenze von 2–15 Sekunden samt Toleranz.

```json theme={null}
{
  "model": "apimart-zoe",
  "prompt": "Das gesamte Bild in einen klassischen Schwarzweißfilm verwandeln und Kamerabewegung sowie Komposition beibehalten",
  "video_urls": [
    "https://example.com/source_20s.mp4"
  ],
  "omni_reference_task_type": "edit"
}
```

Bearbeitung nutzt den Tarif mit Referenzvideo. Zunächst werden 30 Ausgabesekunden reserviert, dann wird mit der tatsächlichen Ausgabedauer, auf ganze Sekunden gerundet, abgerechnet. Referenzvideodauer und Differenzausgleich folgen der untenstehenden Formel.

### Letztes Frame, MOV-Ausgabe und Prompt-Optimierung

```json theme={null}
{
  "model": "apimart-zoe",
  "prompt": "Ein orangefarbenes Kätzchen auf der Fensterbank blickt zur Kamera, seitliches Sonnenlicht, die Kamera fährt langsam näher",
  "duration": 5,
  "return_last_frame": true,
  "output_format": "mov",
  "enhance_prompt": true
}
```

## Entwurf → finales Video

1. Entwurf mit `draft: true` absenden. Ohne `resolution` wird `480p` verwendet; bei expliziter Angabe ist ebenfalls nur `480p` zulässig.

```json theme={null}
{
  "model": "apimart-zoe",
  "prompt": "Ein orangefarbenes Kätzchen auf der Fensterbank blickt zur Kamera, seitliches Sonnenlicht, die Kamera fährt langsam näher",
  "draft": true
}
```

2. Warten Sie auf den erfolgreichen Entwurf und übergeben Sie dessen `task_id` für das finale Video. `model` und `draft_task_id` genügen. Wenn Sie `resolution` angeben, muss es `1080p` sein.

```json theme={null}
{
  "model": "apimart-zoe",
  "draft_task_id": "task_01KZOEEXAMPLE"
}
```

> [!WARNING]
>
> Das Finalvideo übernimmt Prompt, Medien, Dauer, Seitenverhältnis, Seed und Audioeinstellungen des Entwurfs. Senden Sie `model`, `draft_task_id`, optional `resolution: "1080p"` sowie allgemeine Felder wie `nsfw_check` / `webhook`. Folgende Generierungsfelder müssen fehlen; auch leere Strings/Arrays, `false` oder `null` ergeben HTTP 400: `prompt`, `image_urls`, `image_with_roles`, `image`, `images`, `image_url`, `first_frame_image`, `last_frame_image`, `video_urls`, `audio_urls`, `duration`, `seconds`, `aspect_ratio`, `size`, `seed`, `audio`, `generate_audio`, `draft`, `omni_reference_task_type`, `return_last_frame`, `output_format`, `response_format`, `enhance_prompt`. Den Entwurf innerhalb von 24 Stunden nach Erstellung verwenden; beide Generierungen werden separat berechnet.

## Aufgaben und Ergebnisse abrufen

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

Bei der Einreichung ist `data` ein Array, bei der Statusabfrage ein Aufgabenobjekt. `data.status`: `pending` = Warteschlange, `processing` = Generierung, `completed` = Erfolg, `failed` = Fehler. Lesen Sie bei Erfolg die Video-Adresse aus `data.result.videos[].url`, etwa `data.result.videos[0].url[0]`. Videos werden in den APIMart-Speicher kopiert. Das folgende Beispiel zeigt nur die wichtigsten Felder einer erfolgreichen Abfrage.

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KZOEEXAMPLE",
    "status": "completed",
    "result": {
      "videos": [
        {
          "url": [
            "https://example.com/generated-video.mp4"
          ],
          "expires_at": 1794475442
        }
      ],
      "last_frame_url": "https://example.com/generated-last-frame.png"
    },
    "progress": 100,
    "completed": 1794389042
  }
}
```

Lesen Sie bei Fehlern die Ursache aus `data.error.message`. Bereits abgebuchte Beträge werden automatisch erstattet.

| Feld | Beschreibung |
| - | - |
| `data.progress` | Aufgabenfortschritt, 0–100. |
| `data.result.videos[].url` | Array der Videoadressen im APIMart-Speicher. |
| `data.result.videos[].expires_at` | Die Adresse läuft 24 Stunden nach Abschluss ab. Video zeitnah herunterladen. |
| `data.result.last_frame_url` | PNG-URL des letzten Frames im APIMart-Speicher; nur bei erfolgreicher Aufgabe mit `return_last_frame: true` in der Anfrage. |
| `data.error.message` | Fehlerursache, nur bei `failed` vorhanden. |
| `data.error.code` | Bei Fehlern die Zeichenfolge `task_failed`. |
| `data.cost` | Aufgabenkosten; bei fehlgeschlagenen Aufgaben nach Rückerstattung 0. |

## Abrechnung

Sekundenbasierte Abrechnung nach Ausgabeauflösung und Referenzvideos. Tarife und Kontorabatte stehen auf der [Preisseite](https://apimart.ai/pricing). `D` bezeichnet die für die Abrechnung verwendete Ausgabedauer in Sekunden.

| Fall | Abrechenbare Ausgabedauer D |
| - | - |
| Normale Generierung: `duration: 4–30` oder ausgelassen (Standard 5) | Die angefragten Sekunden werden berechnet, ohne Anpassung an die fertige Videolänge. |
| `duration: -1` / Videobearbeitung `edit` | 30 Sekunden reservieren; nach Abschluss die tatsächliche Dauer kaufmännisch auf ganze Sekunden runden und die Differenz ausgleichen. |
| Finales Video | Dauer des Entwurfs übernehmen. Bei einem Entwurf mit `duration: -1` gilt dessen tatsächliche fertige Dauer als Grundlage; keine erneute Anpassung an das finale Video. |

* Gesamtdauer der Referenzvideos `R`: beim Absenden jede Dauer ermitteln, addieren und die Summe auf ganze Sekunden abrunden. Keine spätere Anpassung.
* Ohne Referenzvideos: abrechenbare Sekunden = `D`. Mit Referenzvideos: `D + max(R, ceil(D × 2/3))`. `ceil` rundet auf ganze Sekunden auf. Es gilt der Tarif mit Referenzvideos.
* Beispiel: Angefragte 8 Sekunden bleiben `D = 8`, selbst bei 8.2 Sekunden Ergebnis. Automatische 8.5 Sekunden ergeben `D = 9`. Referenzen mit 2.8 und 3.8 Sekunden werden zuerst zu 6.6 addiert und dann abgerundet: `R = 6`.
* Entwurf (`480p`) und finales Video (`1080p`) werden separat berechnet. Referenzvideos des Entwurfs zählen mit ihrer ursprünglichen Dauer auch beim finalen Video; kein erneuter Upload nötig.
* Fehlgeschlagene Einreichungen werden nicht berechnet. Fehlgeschlagene Aufgaben werden automatisch erstattet.

## Häufige Fehler

Fehlgeschlagene Einreichungen liefern ein `error`-Objekt: `error.message` enthält Details, `error.code` einen String-Code, getrennt vom HTTP-Status. Es fallen keine Kosten an.

| HTTP | `error.code` | Ursache und Lösung |
| - | - | - |
| 400 | `invalid_request_error` | Dauer, Auflösung, Format, Medienanzahl/-kombination, nicht unterstützte Parameter und Entwurfsregeln prüfen. Gilt auch bei unbekannter `draft_task_id`, Nicht-Entwurf, unvollständigem oder mehr als 24 Stunden altem Entwurf. Gilt auch für unzulässige Videoabmessungen, genaue Dauer oder Bildrate sowie die Kombination von `image_urls` (einschließlich Aliassen) mit `image_with_roles`. Videofehler enthalten Messwerte. Auch Referenzaudiodauer, Aufgabentyp/Bearbeitungsregeln, `output_format`, übereinstimmende Audio-Aliasse und vorhandene verbotene Felder prüfen. |
| 400 | `nsfw_content_detected` | Ablehnung durch die Inhaltsprüfung. Kategorien stehen in `error.message`. Als solche anzeigen und Inhalte vor erneutem Absenden anpassen. Keine Berechnung. |
| 400 | `input_video_probe_failed` | Referenzvideo nicht erreichbar oder Dauer nicht ermittelbar. Adresse und Inhalt prüfen. |
| 402 | `payment_required` | Unzureichendes Guthaben; automatische Dauer reserviert 30 Sekunden. |
| 503 | `draft_channel_unavailable` / `draft_task_unavailable` | Entwurfskanal nicht verfügbar oder Abfrage vorübergehend fehlgeschlagen. Später wiederholen oder neuen Entwurf erstellen. |


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