Grenzen (Rate-Limits)
Die Minutengrenzen gelten in einem gleitenden Fenster: gezählt werden die Aufrufe der letzten 60 Sekunden, nicht die seit der vollen Minute.
| Grenze | Wert | Fenster |
|---|---|---|
| Lesende Aufrufe je Token | 120 | gleitend, 1 Minute |
| Schreibende Aufrufe je Token | 20 | gleitend, 1 Minute |
| Alle Aufrufe je Organisation | 600 | gleitend, 1 Minute |
| Alle Aufrufe je IP-Adresse | 300 | gleitend, 1 Minute |
| Fehlgeschlagene Anmeldungen je IP-Adresse | 20 | gleitend, 1 Minute |
| Neue Importe je Token (POST /v1/tenant-imports) | 20 | gleitend, 1 Stunde |
| Neue Importe je Konto (Ersteller des Tokens, alle seine Importe zusammen; fest) | 20 | gleitend, 10 Minuten |
| Offene Importe je Organisation (über die API angelegt) | 50 | kein Fenster: bis zur Übernahme oder Löschung |
| Importe insgesamt je Organisation (Datei und API, auch abgeschlossene; fest) | 500 | kein Fenster: abgeschlossene Importe werden nach 30, offene nach 90 Tagen gelöscht |
| Neue DATEV-Exporte je Organisation (POST /v1/datev/exports) | 30 | 1 Stunde |
| Neue Interessentenanfragen je Token (POST /v1/prospects) | 30 | 1 Stunde |
| Neue Interessentenanfragen je Token und E-Mail-Adresse | 5 | 24 Stunden |
| Webhooks je Organisation | 10 | — |
| Aktive Tokens je Organisation | 25 | — |
| Einträge je Listenseite | höchstens 200 | — |
Grenzen für Importe
Damit ein missbrauchtes Token den Import Ihrer Organisation nicht blockieren kann, gelten für POST /v1/tenant-imports eigene Grenzen:
| Grenze | Vorgabe | Antwort bei Überschreitung |
|---|---|---|
| Offene Importe je Organisation (über die API angelegt) | 50 | 422 import_limit_reached |
| Neue Importe je Token und Stunde | 20 | 429 import_rate_limited |
| Neue Importe je Konto (Ersteller des Tokens) in 10 Minuten; fest, nicht anhebbar | 20 | 429 rate_limited |
| Importe insgesamt je Organisation (Datei und API, auch abgeschlossene; fest) | 500 | 422 import_total_limit_reached |
| Datensätze je Import | 500 | 400 validation_error |
| Größe der Anfrage (Import · Übernahme) | 1 MB · 64 KB | 413 payload_too_large |
Offen ist ein Import, bis alle Datensätze in der Verwaltung übernommen oder gelöscht sind. Die für Ihre Organisation gültigen Werte und die Zahl offener Importe stehen unter Administration → API-Zugänge; bei einer Überschreitung nennt error.details Grenze und Stand (z. B. { "limit": 50, "open": 50 }). Brauchen Sie mehr, wenden Sie sich an den Support — die Grenzen lassen sich je Organisation anheben. Eine Wiederholung mit bereits verwendetem Idempotency-Key zählt nicht als neuer Import. Nicht mehr benötigte API-Importe geben Sie selbst frei: DELETE /v1/tenant-imports/{id} (siehe Import abbrechen).
Kopfzeilen zum Kontingent
Sobald das Token bekannt ist, tragen alle Antworten — auch Fehler wie 400, 403, 404 oder 409 — die Köpfe X-RateLimit-Limit (Grenze des Tokens je Minute: lesend oder schreibend), X-RateLimit-Remaining (noch freie Aufrufe) und X-RateLimit-Reset (Sekunden, bis alle bisher gezählten Aufrufe aus dem gleitenden Fenster gefallen sind; höchstens 60). Ohne bekanntes Token fehlen sie: bei 401, bei einer unbekannten Adresse (route_not_found) und bei 503 vor der Prüfung. Bei 429 rate_limited nennt der Kopf Retry-After die Wartezeit in Sekunden bis zum nächsten möglichen Aufruf (auch bei der Grenze je Organisation); X-RateLimit-Reset hat dann denselben Wert. Warten Sie mindestens so lange und verdoppeln Sie die Wartezeit bei wiederholten 429- oder 503-Antworten.
429 im Detail: Sonderfälle
Jedes 429 trägt Retry-After (ganze Sekunden, mindestens 1) — das ist die verbindliche Wartezeit. Die Zahl hängt von der ausgelösten Grenze ab; X-RateLimit-Remaining sagt bei den Sonderfällen unten nichts über den Grund, denn es zählt weiter die Minutengrenze des Tokens.
| Ausgelöste Grenze | Antwort | Retry-After | error.details |
|---|---|---|---|
| Minutengrenze je Token oder Organisation | 429 rate_limited | Sekunden bis zum nächsten möglichen Aufruf (höchstens 60) | — |
| Gesamtbremse oder Fehlversuche je IP-Adresse | 429 rate_limited | wie oben; ohne Kontingent-Köpfe (X-RateLimit-*), wenn das Token noch nicht geprüft war | — |
| Webhook-Replay: 1000 Zustellungen je Webhook und Stunde | 429 rate_limited | 1 bis 3600: bis wieder Platz in der Stundenquote ist | { "limit": 1000, "retry_after": 1800 } |
| Testereignisse: höchstens 3 wartend je Webhook | 429 rate_limited | 60 | { "limit": 3 } |
| Neue Importe je Token und Stunde | 429 import_rate_limited | 3600 | { "limit": 20, "used": 20 } |
| Importe: 20 in 10 Minuten je Konto | 429 rate_limited | 600 | — |
| Interessentenanfragen je Token (Stunde, Tag je E-Mail-Adresse) | 429 rate_limited | Wartezeit bis wieder Platz ist | { "limit": 30 } |
Minutengrenze (häufigster Fall)
HTTP/1.1 429 Too Many Requests
Retry-After: 23
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 23
X-Request-Id: req_8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f
{
"success": false,
"error": {
"code": "rate_limited",
"message": "Zu viele Anfragen. Bitte nach der in Retry-After genannten Zeit erneut versuchen."
},
"request_id": "req_8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f"
}Replay-Grenze eines Webhooks
HTTP/1.1 429 Too Many Requests
Retry-After: 1800
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 17
X-RateLimit-Reset: 1800
X-Request-Id: req_8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f
{
"success": false,
"error": {
"code": "rate_limited",
"message": "Für diesen Webhook wurden in der letzten Stunde schon 1000 Zustellungen erneut eingestellt (Höchstgrenze). Bitte nach der in Retry-After genannten Zeit erneut versuchen.",
"details": {
"limit": 1000,
"retry_after": 1800
}
},
"request_id": "req_8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f"
}Was X-RateLimit-Reset bedeutet: Bei normalen Antworten die Sekunden, bis alle bisher gezählten Aufrufe aus dem gleitenden Minutenfenster gefallen sind (höchstens 60). Bei einer 429 mit Retry-After trägt es denselben Wert wie Retry-After — bei den Stundengrenzen also bis zu 3600, nicht nur bis 60. Planen Sie die Wiederholung nach Retry-After; wiederholen Sie die Anfrage bei Replay und Importen unverändert, schreibende Aufrufe mit demselben Idempotency-Key. Ein Replay, der an der Stundengrenze scheitert, hat nichts eingestellt; lassen Sie nicht mehrere Prozesse gleichzeitig wiederherstellen.