Zum Hauptinhalt springen
Didit setzt mehrere Ebenen von Rate-Limits ein, um die API stabil zu halten und gleichzeitig normale Lastspitzen zu ermöglichen. Limits werden pro Kennung angewendet – Ihr x-api-key oder, falls kein API-Schlüssel gesendet wird, Ihre Client-IP. Jeder Gültigkeitsbereich verfügt über einen unabhängigen Zähler mit einem gleitenden 60-Sekunden-Fenster.

Kennung und Ausnahmen

Die Middleware wählt eine Kennung für das Rate-Limit in dieser Reihenfolge:
  1. x-api-key-Header → Zähler auf Schlüssel-Ebene.
  2. Erster Hop in X-Forwarded-For → Zähler auf IP-Ebene.
  3. REMOTE_ADDR → Zähler auf IP-Ebene.
Die folgenden Aufrufe umgehen das Rate-Limiting vollständig:
  • Der interne DIDIT_WEBAPP_API_KEY (ausschließlich von der Didit-Konsole verwendet).
  • Endpoints, die durch die Berechtigung IsValidSession geschützt sind (der Traffic von eingebetteten Sitzungen/SDK-Sitzungen).
  • GET /system/healthcheck (wird von HealthMiddleware vor diesem Stack verarbeitet).
  • Provider-Webhooks: Stripe, AML-Screening, Callbacks zur Gesichtsverifizierung, Änderungen von KYC-Listen.

Globale Limits

Jede authentifizierte Anfrage wird außerdem nach HTTP-Methode in einen generischen Gültigkeitsbereich eingestuft, sodass jede neue Route sinnvolle Standardwerte erbt: Das Erstellen von Transaktionen und die Event-Erfassung zählen zu ingest-write anstelle von generic-write: Eine Integration mit hohem Erfassungsvolumen erhält 600 Anfragen pro Minute pro API-Schlüssel, ohne das Budget ihrer anderen Schreibvorgänge aufzubrauchen. Endpoint-spezifische Limits (nächster Abschnitt) gelten zusätzlich zum globalen Limit. Der erste Gültigkeitsbereich, der seinen Zähler überschreitet, gibt den Status 429 zurück.

Endpoint-spezifische Limits

Die Middleware definiert strengere Gültigkeitsbereiche für die Routen mit den höchsten Auswirkungen:
GET /v3/session/<id>/decision/ wird von SessionV3RetrieveView bereitgestellt und befindet sich nicht im Gültigkeitsbereich session-decision. Er unterliegt ausschließlich der Obergrenze von 600/Min. von generic-get. Die Drosselung von 100/Min. für Entscheidungen gilt für die Entscheidungspfade von v1 und v2.
Die Codebasis definiert außerdem FREE_SESSION_RATE_LIMIT = 10 und PAID_SESSION_RATE_LIMIT = 600. Diese Konstanten werden derzeit nicht auf POST /v3/session/ angewendet – dieser Endpoint verwendet das einheitliche session-v2-create-Limit von 600/Min. für jede Anwendung. Planen Sie keine Kapazitäten basierend auf einer Drosselung für das kostenlose Kontingent pro Workflow, solange dies nicht als aktiv dokumentiert ist.

Format der 429-Antwort

Wenn Sie einen Gültigkeitsbereich überschreiten, erhalten Sie den HTTP-Status 429 mit folgendem Body und folgenden Headern:
X-RateLimit-*-Header werden nur bei der 429-Antwort ausgegeben – erfolgreiche Antworten enthalten sie derzeit nicht. Verwenden Sie den Wert von Retry-After (oder X-RateLimit-Reset - now) als Verzögerung vor dem nächsten Versuch.

Empfehlungen für Clients

  • Beachten Sie Retry-After als Mindestwert für Ihr Backoff. Nutzen Sie darauf aufbauend ein exponentielles Backoff mit Jitter (5s → 10s → 20s → 40s ± random), damit sich zwei Clients, die gleichzeitig auf einen 429 stoßen, nicht synchronisieren.
  • Brechen Sie Wiederholungsversuche nach einer geringen Obergrenze (z. B. 5 Versuchen) ab. Leiten Sie den Fehler an Ihren Aufrufer weiter und benachrichtigen Sie Ihr Team – anhaltende 429-Fehler weisen in der Regel auf eine Endlosschleife hin, nicht auf eine vorübergehende Spitze.
  • Verwenden Sie einen Bezeichner pro Workload. Wenn Sie einen x-api-key über mehrere Backends hinweg teilen, fallen diese in denselben Zähler, was dazu führen kann, dass ein störender Nachbar die übrigen ausbremst. Erstellen Sie eine separate Anwendung (und somit einen separaten api_key) pro Umgebung, Marke oder Kunde – siehe Programmatische Registrierung.
  • Cachen Sie Entscheidungsabfragen. Die /decision/-Endpoints sind nicht für enge Polling-Schleifen ausgelegt; wenn Sie Echtzeit-Updates benötigen, nutzen Sie Webhooks und rufen Sie GET /v3/session/<id>/decision/ nur für Backfills oder Audits auf.
  • Generieren Sie PDFs offline. Das Rendern von PDFs ist CPU-intensiv (Begrenzung auf 50/Min.). Lösen Sie dies über eine Warteschlange aus, nachdem die Sitzung einen finalen Status erreicht hat, und nicht bei jedem Seitenaufruf.

Beispiel für einen 429-kompatiblen Client

Benötigen Sie mehr Spielraum?

Wenn 600 Sitzungen pro Minute nicht ausreichen – beispielsweise bei einem Marketing-Launch oder einem Backfill –, senden Sie eine E-Mail an support@didit.me mit der UUID Ihrer application sowie den erwarteten Dauer- und Spitzenraten. Ausnahmen werden pro Anwendung konfiguriert.
Zuletzt geändert am 7. November 2026