# Batch

Für Importe und Massenänderungen schickst du bis zu **100 Operationen** in einem Aufruf.

```
POST /v1/publisher/calendars/{calendar_id}/events/batch
```

```bash
curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/batch \
  -H "Authorization: Bearer $KS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operations": [
      { "method": "PUT", "external_id": "wp-1482", "event": { "title": "Sunset Yoga", "start": "2026-11-12T18:00:00" } },
      { "method": "PUT", "external_id": "wp-1490", "event": { "title": "", "start": "2026-11-13T18:00:00" } },
      { "method": "DELETE", "external_id": "wp-1311" }
    ]
  }'
```

| Feld | Regeln |
|---|---|
| `operations` | 1 bis 100 Einträge |
| `operations[].method` | `PUT` (anlegen oder ändern) oder `DELETE` |
| `operations[].external_id` | wie beim [Einzel-PUT](https://docs.kalender-sync.de/api/events/) |
| `operations[].event` | bei `PUT`: der Termin mit denselben Feldern wie beim Einzel-PUT |
| `sync_id` | optional: ordnet die Operationen einem [Full Sync](https://docs.kalender-sync.de/api/full-sync/) zu |

Der Request-Body darf bis zu 1 MB groß sein.

## Antwort

Immer `200 OK`, sofern der Aufruf selbst gültig ist. Das Ergebnis jeder Operation steht in `results`, in derselben Reihenfolge:

```json
{
  "results": [
    { "external_id": "wp-1482", "status": 201, "changed": true, "sequence": 0 },
    {
      "external_id": "wp-1490",
      "status": 400,
      "error": {
        "code": "invalid_request",
        "errors": [{ "field": "title", "code": "too_small", "message": "String must contain at least 1 character(s)" }]
      }
    },
    { "external_id": "wp-1311", "status": 204 }
  ]
}
```

| `status` | Bedeutung |
|---|---|
| `201` | Termin angelegt |
| `200` | Termin geändert oder unverändert (`changed: false`) |
| `204` | Termin gelöscht (oder war schon weg) |
| `4xx` | Fehler bei dieser Operation, Details in `error.code`, `error.message`, `error.errors` |

Mögliche Fehlercodes je Operation: [`invalid_request`](https://docs.kalender-sync.de/api/errors/invalid_request/), [`invalid_external_id`](https://docs.kalender-sync.de/api/errors/invalid_external_id/), [`event_limit_reached`](https://docs.kalender-sync.de/api/errors/event_limit_reached/).

## Verhalten

- Die Operationen laufen **der Reihe nach**. Eine fehlerhafte Operation hält die anderen nicht auf; prüfe also jedes Ergebnis.
- Ein Batch ist **keine Transaktion**. Bricht die Verbindung ab, sind manche Operationen eventuell schon durch. Schick den Batch einfach noch einmal: `PUT` und `DELETE` sind idempotent.
- Der Feed wird nach dem Batch einmal aktualisiert, nicht pro Operation.
- Jeder Batch zählt als **eine** Anfrage für das [Rate Limit](https://docs.kalender-sync.de/api/limits/). Für Importe ist Batch deshalb der richtige Weg.

Fehler, die den ganzen Aufruf betreffen (Key, Kalender, mehr als 100 Operationen, Body zu groß, Sync abgelaufen), kommen wie gewohnt als Problem-Antwort mit HTTP-Status. → [Fehler](https://docs.kalender-sync.de/api/errors/)