# Full Sync

War dein Plugin eine Zeit lang aus oder ist eine Anfrage verloren gegangen, bringt ein **Full Sync** den Kalender wieder auf den Stand deines Systems. Empfehlung: beim ersten Verbinden und danach einmal täglich, zum Beispiel per WP-Cron.

## Ablauf

**1. Sync starten**

```bash
curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs \
  -H "Authorization: Bearer $KS_KEY"
```

```json
{ "sync_id": "sync_XXXXXXXXXXXXXXXX", "expires_at": "2026-11-03T15:02:11.000Z" }
```

Ein Sync ist **eine Stunde** gültig.

**2. Alle aktuellen Termine schicken**

Schick jeden Termin, den es in deinem System gibt, per [Batch](https://docs.kalender-sync.de/api/batch/) mit der `sync_id`:

```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 '{
    "sync_id": "sync_XXXXXXXXXXXXXXXX",
    "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": "Yin Yoga", "start": "2026-11-13T18:30:00" } }
    ]
  }'
```

Unveränderte Termine kosten dabei nichts: Sie werden nur als bestätigt markiert, nicht neu geschrieben. Die `sync_id` gibt es nur im Batch, nicht beim Einzel-PUT.

**3. Sync abschließen**

```bash
curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs/sync_XXXXXXXXXXXXXXXX/complete \
  -H "Authorization: Bearer $KS_KEY"
```

```json
{ "sync_id": "sync_XXXXXXXXXXXXXXXX", "deleted": 3, "remaining": 42 }
```

Dabei werden alle Termine gelöscht, die während des Syncs **nicht** geschickt wurden. Termine, die du während des Syncs außerhalb davon geschrieben hast (zum Beispiel ein normales Speichern auf der Website), bleiben erhalten.

## Schutz vor versehentlichem Leeren

Würde das Abschließen **mehr als die Hälfte** der Termine löschen, lehnt die API mit `409` [`large_delete`](https://docs.kalender-sync.de/api/errors/large_delete/) ab. Ein halb fertiger Export soll nie einen Kalender mit tausenden Abonnenten leeren.

Ist das Löschen gewollt, bestätige es:

```bash
curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs/sync_XXXXXXXXXXXXXXXX/complete \
  -H "Authorization: Bearer $KS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "confirm_large_delete": true }'
```

## Fehler

| Code | Wann |
|---|---|
| [`sync_not_found`](https://docs.kalender-sync.de/api/errors/sync_not_found/) | Die `sync_id` gehört nicht zu diesem Kalender. |
| [`sync_expired`](https://docs.kalender-sync.de/api/errors/sync_expired/) | Die Stunde ist um. Starte einen neuen Sync. |
| [`sync_completed`](https://docs.kalender-sync.de/api/errors/sync_completed/) | Der Sync wurde schon abgeschlossen. |
| [`large_delete`](https://docs.kalender-sync.de/api/errors/large_delete/) | Mehr als die Hälfte würde gelöscht. |