---
title: "Bild oder Video mit KI erstellen"
description: "Ein Bild oder kurzes Video in den Medien der Website generieren. Die Abrechnung erfolgt zu einem Festpreis in Credits."
canonical: "https://atelier201.com/docs/de/api/media/generate"
updated: "2026-11-06"
---

# Bild oder Video mit KI erstellen

Erfordert `media:generate`, eine eigene Berechtigung: Zugangsdaten mit Bearbeitungsrechten für Websites können keine Credits ausgeben, solange sie diese Berechtigung nicht ebenfalls erhalten haben. Die Credits des Workspace werden belastet.

1. Rufen Sie den Endpunkt mit `estimate_only: true` auf. Das ist kostenlos und liefert `estimated_credits` (den exakten Preis) sowie `balance`.
2. Rufen Sie ihn erneut auf und setzen Sie `max_credits` auf diesen Preis. Ohne `max_credits` wird der Aufruf abgelehnt. Ein höherer Preis wird ebenfalls abgelehnt und es wird nichts berechnet: `invalid_parameter` bei `max_credits`, mit `details.reason` `price_above_max_credits`, `details.estimated_credits` und `details.max_credits`.

Die Credits werden beim Start der Generierung abgebucht. Schlägt sie fehl, werden sie zurückerstattet. Ein Bild ist normalerweise innerhalb von `wait_seconds` fertig (standardmäßig 50) und wird mit `status: succeeded` und den zugehörigen `media` zurückgegeben. Ein Video dauert ein bis fünf Minuten: Die Antwort enthält `status: running` und eine `id`; rufen Sie [die Generierung ab](/docs/api/media/generation), bis sie abgeschlossen ist.

Die Datei wird wie ein Upload in den Medien der Website abgelegt, wobei `credit` auf das verwendete Modell gesetzt ist. Stellen Sie ein generiertes Bild niemals als Foto des Unternehmens, seiner Produkte, seiner Mitarbeiter oder seiner Geschäftsräume dar.

Pro Workspace sind höchstens 10 Generierungen pro Minute möglich (darüber hinaus `429 rate_limited` mit `details.retry_after_seconds`). Bei unzureichendem Guthaben wird `402 insufficient_credits` mit `details.needed` und `details.balance` zurückgegeben. Ist ein Modell ausgelastet, schlägt die Generierung fehl und die Credits werden zurückerstattet. Versuchen Sie es in einer Minute erneut.

```http
POST https://api.atelier201.com/v1/sites/{site_id}/media/generations
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Path parameters

- `site_id` (`string`, required): ID der Website oder ihr Slug (die Adresse vor .atelier201.page).

## Body

`application/json`, required

- `model` (`enum<string>`, required, one of: `gpt-image, nano-banana, flux, p-image, wan, minimax, seedance, p-video`): GET /v1/media/models listet alle Modelle, ihre Stärken und ihre Preise in Credits auf.
- `prompt` (`string`, required, length: `1–4000 chars`): Was angezeigt werden soll: Motiv, Umgebung, Licht, Bildausschnitt, Stil.
- `aspect_ratio` (`enum<string>`, one of: `16:9, 1:1, 9:16, 4:3, 3:4, 3:2, 2:3`): Breite zu Höhe. Jedes Modell akzeptiert die von list_media_models ausgegebenen Seitenverhältnisse. Standardmäßig wird das erste verwendet (bei den meisten Modellen 16:9).
- `quality` (`enum<string>`, one of: `draft, standard, high`): Bilder: draft, standard (Standard) oder high.
- `duration` (`integer`, range: `1–10`): Videos: Dauer in Sekunden.
- `resolution` (`enum<string>`, one of: `480p, 720p, 768p, 1080p, 2k`): Videos: Standard ist die Auflösung des Modells (720p oder bei minimax und p-video 768p).
- `audio` (`boolean`): Videos: mit Ton (nur seedance).
- `filename` (`string`, length: `1–100 chars`): Ein Name ohne Erweiterung.
- `alt` (`string`, length: `≤ 300 chars`)
- `estimate_only` (`boolean`): true: der genaue Preis in Credits und das Guthaben. Kostenlos, es wird nichts ausgeführt.
- `max_credits` (`integer`, range: `≤ 9007199254740991`): Zum Ausführen erforderlich: der Höchstbetrag, den du ausgeben möchtest. Wird abgelehnt und nichts berechnet, wenn der Preis höher ist. Übernimm den Wert aus einem estimate_only-Aufruf.
- `wait_seconds` (`integer`, range: `0–55`): Wie lange auf das Ergebnis gewartet werden soll. Standardmäßig 50 bei einem Bild und 0 bei einem Video.

## Response

**202**: Ein Bild oder Video mit KI erstellen

- `data` (`Record<string, object>`, required)
- `data.id` (`string`): Die ID der Generierung. Rufe sie per GET ab, bis der Status succeeded oder failed lautet.
- `data.status` (`enum<string>`, one of: `running, succeeded, failed`)
- `data.media` (`object | null`)
- `data.media.path` (`string`, required)
- `data.media.url_path` (`string`, required)
- `data.media.mime` (`string`, required)
- `data.media.size` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.media.alt` (`string,null`, required)
- `data.media.credit` (`string,null`, required): Wer es erstellt hat, sofern eine Lizenzangabe erforderlich ist: "Photo by Jane Doe on Pixabay", "Generated with Seedream 5 Lite (ByteDance)". Bei Uploads null.
- `data.media.keep_original` (`boolean`, required): Wird exakt so gespeichert, wie hochgeladen, und beim Build nie neu kodiert. Andernfalls wird ein Bild über 200 KB beim Eingang komprimiert (maximal 2000 px, Zielgröße etwa 150 KB, Qualität mindestens 75, Metadaten entfernt).
- `data.error` (`string,null`)
- `data.credits` (`integer | null`): Die Kosten.
- `data.credits_refunded` (`integer | null`): Bei einem Fehler zurückerstattet.
- `data.estimated_credits` (`integer`, range: `-9007199254740991–9007199254740991`): estimate_only: der genaue Preis der Generierung.
- `data.balance` (`number`): estimate_only: das aktuelle Credit-Guthaben des Arbeitsbereichs.
- `data.next_action` (`string,null`, required)
- `request_id` (`string`, required)

```json
{
  "data": {
    "id": "<string>",
    "status": "running",
    "media": {
      "path": "<string>",
      "url_path": "<string>",
      "mime": "<string>",
      "size": 123,
      "alt": null,
      "credit": null,
      "keep_original": true
    },
    "error": null,
    "credits": 123,
    "credits_refunded": 123,
    "estimated_credits": 123,
    "balance": 123.45,
    "next_action": null
  },
  "request_id": "<string>"
}
```

**400**: Mögliche Codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**401**: Mögliche Codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**402**: Mögliche Codes: insufficient_credits

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**403**: Mögliche Codes: insufficient_scope, feature_not_available, admin_required

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**404**: Mögliche Codes: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**409**: Mögliche Codes: conflict, result_not_ready, idempotency_key_reused

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**410**: Mögliche Codes: result_expired

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**413**: Mögliche Codes: request_too_large

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**422**: Mögliche Codes: request_too_large_for_plan

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**429**: Mögliche Codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**500**: Mögliche Codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**503**: Mögliche Codes: service_unavailable

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request POST \
  --url 'https://api.atelier201.com/v1/sites/<site_id>/media/generations' \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "gpt-image",
  "prompt": "<string>"
}'
```
