# Limits und Rate Limits

## Rate Limit

Jeder Key darf **120 Anfragen pro Minute** senden. Gezählt wird in festen Fenstern von 60 Sekunden. Jede Antwort trägt den aktuellen Stand in Headern nach dem IETF-Entwurf für RateLimit-Header:

```
RateLimit-Policy: "default";q=120;w=60
RateLimit: "default";r=87;t=34
```

| Wert | Bedeutung |
|---|---|
| `q` | Anfragen pro Fenster |
| `w` | Fenstergröße in Sekunden |
| `r` | verbleibende Anfragen im aktuellen Fenster |
| `t` | Sekunden bis zum nächsten Fenster |

Ist das Limit erreicht, antwortet die API mit `429` [`rate_limited`](https://docs.kalender-sync.de/api/errors/rate_limited/) und dem Header `Retry-After` (Sekunden). Warte so lange und wiederhole dann.

Zusätzlich gibt es eine großzügige Obergrenze **pro IP-Adresse** (600 Anfragen pro Minute), damit mehrere Websites auf einem gemeinsamen Webhosting sich nicht gegenseitig ausbremsen.

**Tipps:**

- Für viele Termine nimm [Batch](https://docs.kalender-sync.de/api/batch/): 100 Operationen zählen als eine Anfrage.
- Schick Änderungen, wenn sie passieren, statt regelmäßig alles. Für den vollständigen Abgleich gibt es den [Full Sync](https://docs.kalender-sync.de/api/full-sync/).
- Unveränderte Termine erkennt die API selbst (`changed: false`); du musst dir dafür nichts merken.

## Grenzen nach Tarif

| | Sandbox (jeder Tarif) | Basic | Professional |
|---|---|---|---|
| Kalender | 3 Testkalender | 1 Live-Kalender | 10 Live-Kalender |
| Termine je Kalender | 500 | 5.000 | 5.000 |
| Aktive Abonnenten (Konto) | | 500 | 5.000 |

Eine Serie zählt als ein Termin. Mehr auf Anfrage. Was beim Erreichen passiert: [Tarife und Limits](https://docs.kalender-sync.de/abo-kalender/tarife/#was-passiert-wenn-du-ein-limit-erreichst).

## Technische Grenzen

| | Grenze |
|---|---|
| Aktive Keys je Konto | 10 |
| JSON-Body | 1 MB |
| Batch | 100 Operationen |
| Logo / Banner | 512 KB / 2 MB |
| Kalendername | 100 Zeichen |
| Kalenderbeschreibung | 1.000 Zeichen |
| `external_id` | 1 bis 128 Zeichen: `A-Z a-z 0-9 . _ : -` |
| Termintitel | 255 Zeichen |
| Terminbeschreibung | 65.536 Zeichen Eingabe, gespeichert bis 8.000 Zeichen Text |
| Ort | 500 Zeichen |
| URLs | 2.000 Zeichen, nur `https://` |
| `categories` | 10 Einträge à 50 Zeichen |
| `metadata` | 2 KB JSON |
| `recurrence.rules` | 5 Regeln à 500 Zeichen |
| `recurrence.except_dates` | 1.000 |
| `recurrence.overrides` | 500 |
| `COUNT`, `INTERVAL` | 1 bis 1.000 |
| `default_duration` | bis `PT24H` |
| Seitengröße beim Auflisten | 100 |
| Gültigkeit eines Full Sync | 1 Stunde |
| `Idempotency-Key` | 255 Zeichen, 24 Stunden gespeichert |