---
title: "Einen Website-Plan anwenden"
description: "Schreibt Geschäftsdaten, Theme, Navigation, Einträge und Bilder einer Website mit einem Aufruf und als einen Verlaufseintrag."
canonical: "https://atelier201.com/docs/de/api/sites/apply-plan"
updated: "2026-11-06"
---

# Einen Website-Plan anwenden

Erfordert `sites:write`. Kostet keine Credits: Stockbilder sind kostenlos. Der Pfad endet mit `/plan:apply`. Änderungen betreffen nur den Entwurf. Besucher sehen nichts, bis Sie die Website [veröffentlichen](/docs/api/publishing/publish).

Der schnellste Weg, eine erste Version einer Website zu erstellen oder eine bestehende zu überarbeiten: alles, was eine erste Version braucht, in einer Anfrage. Lesen Sie zuerst das [Inhaltsmodell](/docs/api/content/model), um sich über die Felder zu informieren.

- **`name`**: der Name der Website in Atelier201.
- **`singletons`**: `business`, `theme`, `navigation`... Jedes Element wird auf oberster Ebene Schlüssel für Schlüssel mit dem Inhalt des Entwurfs zusammengeführt. Eine übergebene verschachtelte Gruppe wie `hero` oder `colors` ersetzt die vorhandene Gruppe.
- **`entries`**: bis zu 200 Einträge, die erstellt, aktualisiert oder gelöscht werden, wie bei [Mehrere Einträge speichern](/docs/api/content/save-entries).
- **`images`**: bis zu 12 Bilder, wie bei [Ein Bild in ein Bildfeld einfügen](/docs/api/media/place): `target`, `alt` und eines der Felder `query`, `stock_id` oder `media_path`. Kann ein Bild nicht gefunden werden, wird eine `warning` zurückgegeben und der restliche Plan trotzdem angewendet.
- **`keep_samples`**: Die Beispiel-Einträge des Starters (`service-one`, `service-two`) werden gelöscht, sofern der Plan sie nicht enthält oder dieser Wert nicht auf `true` gesetzt ist.

Alles wird geprüft, bevor etwas gespeichert wird. Wird ein Teil abgelehnt, wird nichts gespeichert und die `400`-Antwort listet alle zu korrigierenden Punkte auf, damit Sie sie in einem Durchgang beheben können. Bei Erfolg wird ein einzelner Verlaufseintrag angelegt und der Build gestartet: Die Antwort enthält `build`. [Prüfen Sie anschließend die Veröffentlichung](/docs/api/publishing/review): Sie wird abgelehnt, solange noch Beispieltexte des Starters vorhanden sind.

```http
POST https://api.atelier201.com/v1/sites/{site_id}/plan:apply
```

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

- `name` (`string`, length: `1–80 chars`): Der Name der Website in Atelier201 (der Geschäftsname).
- `singletons` (`Record<string, Record<string, object>>`): business, theme, navigation ...: jeweils mit den Werten im Entwurf zusammengeführt (Top-Level-Schlüssel; eine hier angegebene verschachtelte Gruppe ersetzt diese Gruppe). Felder gemäß get_content_model.
- `entries` (`object[]`, items: `1–200 items`): Einträge zum Erstellen, Aktualisieren oder Löschen (delete: true), im Format von save_entries, bis zu 200.
- `entries.collection` (`string`, required)
- `entries.slug` (`string`, required): Kleinbuchstaben, Ziffern und Bindestriche.
- `entries.data` (`Record<string, object>`): Felder gemäß dem Schema der Collection (nicht bei delete).
- `entries.body` (`string`, length: `≤ 500000 chars`): Markdown-Text für Content-Collections.
- `entries.delete` (`boolean`): true, um diesen Eintrag zu löschen.
- `images` (`object[]`, items: `≤ 12 items`): Bilder für Bildfelder, wie place_image sie erwartet (target, alt und eines von query, stock_id oder media_path). Ein Bild, das nicht gefunden wird, führt zu einer Warnung. Die übrigen Änderungen werden trotzdem angewendet.
- `images.target` (`string`, required, length: `3–200 chars`): Das Bildfeld: business:/hero/image für Unternehmensdetails oder <collection>/<slug>:/image für einen Eintrag (services/sourdough:/image). get_content_model zeigt die Bildfelder an.
- `images.alt` (`string`, required, length: `1–300 chars`): Beschreibt in der Sprache der Website, was auf dem Bild zu sehen ist, für Menschen, die es nicht sehen können. Wird neben dem Bild im Feld alt gespeichert, sofern dieses vorhanden ist.
- `images.query` (`string`, length: `≤ 100 chars`): Eine Suchbeschreibung für die kostenlose Stock-Bibliothek. Auf Englisch und mit konkreten Begriffen, etwa „minimalist concrete house at dusk“: Das erste Ergebnis wird importiert.
- `images.stock_id` (`string`, length: `≤ 20 chars`): Eine Ergebnis-ID von search_stock_media, wenn du das Bild selbst ausgewählt hast.
- `images.media_path` (`string`, length: `≤ 200 chars`): Eine Datei, die sich bereits in den Medien der Website befindet (/media/storefront.jpg), zum Beispiel ein eigenes Foto des Inhabers.
- `images.orientation` (`enum<string>`, one of: `landscape, portrait, square`): Mit query: das gesuchte Format. Landscape eignet sich für ein Hero-Bild.
- `keep_samples` (`boolean`): Die Beispiel-Einträge des Starters beibehalten (service-one, service-two). Standardmäßig werden sie gelöscht, sofern der Plan sie nicht erstellt.
- `summary` (`string`, length: `≤ 200 chars`): Ein Satz für den Änderungsverlauf.

## Response

**200**: Website-Plan anwenden

- `data` (`Record<string, object>`, required)
- `data.renamed` (`string,null`, required)
- `data.singletons` (`string[]`, required): Die geschriebenen Singletons.
- `data.saved` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.deleted` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.images` (`object[]`, required)
- `data.images.target` (`string`, required)
- `data.images.image` (`string,null`, required)
- `data.images.credit` (`string,null`, required)
- `data.images.warning` (`string,null`, required)
- `data.revision` (`string | null`, required)
- `data.changed` (`boolean`, required)
- `data.build` (`object | null`, required): Der Build, den diese Änderung gestartet oder übernommen hat: Die Vorschau folgt diesem Build. Kein Aufruf von build_site erforderlich.
- `data.build.id` (`string`, required)
- `data.build.state` (`string`, required)
- `data.build.next_action` (`string`, required)
- `data.next_action` (`string`, required)
- `request_id` (`string`, required)

```json
{
  "data": {
    "renamed": null,
    "singletons": [
      "<string>"
    ],
    "saved": 123,
    "deleted": 123,
    "images": [
      {
        "target": "<string>",
        "image": null,
        "credit": null,
        "warning": null
      }
    ],
    "revision": "<string>",
    "changed": true,
    "build": {
      "id": "<string>",
      "state": "<string>",
      "next_action": "<string>"
    },
    "next_action": "<string>"
  },
  "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>/plan:apply' \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "<string>",
  "singletons": {},
  "entries": [
    {
      "collection": "<string>",
      "slug": "<string>"
    }
  ],
  "images": [
    {
      "target": "<string>",
      "alt": "<string>"
    }
  ],
  "keep_samples": true,
  "summary": "<string>"
}'
```
