Zum Inhalt springen

Rate-Limits

Damit eine Integration nicht alle anderen ausbremst, begrenzt DebtFlow die Anfragen pro Minute. Jede Antwort zeigt, wie viel Spielraum bleibt.
AufruferGrenzegezählt je
API-Schlüssel120 Anfragen pro MinuteSchlüssel
OAuth-App120 Anfragen pro MinuteVerbindung (App und Nutzer)
Ohne Anmeldung (z. B. Token-Endpunkt)je Endpunkt festgelegtIP-Adresse
Alle Pfade unter /api/v1 zusammen1.000 Anfragen pro MinuteIP-Adresse

Die Grenze je IP-Adresse gilt zusätzlich und fängt nur Lastspitzen ab: Laufen mehrere Schlüssel vom selben Server, teilen sie sich diese 1.000 Anfragen. Einzelne aufwendige Endpunkte können eine eigene, niedrigere Grenze haben; maßgeblich sind die Header der jeweiligen Antwort. Auch die IP-Grenze antwortet mit 429, error: "rate_limited" und Retry-After.

Header

HeaderBedeutung
X-RateLimit-LimitAnfragen im aktuellen Zeitfenster
X-RateLimit-Remainingdavon noch übrig
Retry-Afternur bei 429: Sekunden bis zum nächsten Versuch
Antwort 429
HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0

{ "error": "rate_limited", "message": "Zu viele Anfragen. Bitte kurz warten.", "details": { "retryAfter": 17 } }

Richtig reagieren

Warten Sie bei 429 mindestens so lange wie Retry-After angibt und wiederholen Sie dann. Für POST-Anfragen denselben Idempotency-Key verwenden.

async function debtflow(path, init = {}, attempt = 0) {
  const res = await fetch('https://www.debt-flow.io/api/v1' + path, {
    ...init,
    headers: { ...init.headers, Authorization: `Bearer ${process.env.DEBTFLOW_API_KEY}` },
  });
  if (res.status === 429 && attempt < 5) {
    const wait = Number(res.headers.get('Retry-After') ?? 1) * 1000;
    await new Promise((r) => setTimeout(r, wait));
    return debtflow(path, init, attempt + 1);
  }
  return res;
}
Weniger Anfragen statt mehr Tempo
Statt regelmäßig Listen abzufragen, lassen Sie sich per Webhook benachrichtigen. Für Massenimporte die Seitengröße limit=100 nutzen und Anfragen nacheinander statt parallel senden.