Zum Inhalt springen
Mithgard
Rate Limits

Limits, die fair sind.

Pro-Minute-Bucket, Header-basiertes Feedback, Retry-After bei 429. Keine versteckten Burst-Limits.

Profile

Limits gelten pro API-Key, nicht pro IP — d.h. ein Multi-Tenant-Service mit einem Master-Key teilt sich das Budget.

EndpointTierLimitHinweis
Idea-Genome RESTFree60/minReicht für interaktive Recherche.
Idea-Genome RESTPaid600/minFür Batch-Jobs und Agents — erfordert Vertrag.
Idea-Genome MCPFree60/minPro API-Key, gesamte Tool-Calls zählen.
Schreibtisch RESTPilot30/minPilot-spezifisch — wird beim Onboarding angepasst.
Mundart Webhookoutbound onlyWir pushen, kein Limit für inbound. Du musst aber mit Spitzen umgehen.

Jede Response (auch 200) trägt drei Header: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (Unix-Timestamp). Bei 429 zusätzlich Retry-After in Sekunden.

curl -sS -i https://genome.mithgard.ai/api/search \
  -H "Authorization: Bearer mg_live_xxx" \
  -d '{"q":"x"}'

# HTTP/1.1 200 OK
# X-RateLimit-Limit:     60
# X-RateLimit-Remaining: 57
# X-RateLimit-Reset:     1714060860   # Unix-Timestamp
# Retry-After:           42           # nur bei 429

Backoff-Strategie

Bei 429: Retry-After respektieren, sonst exponentielles Backoff (500ms, 1s, 2s, 4s). Maximal 4 Retries — danach Fehler an den User propagieren.

// Exponentielles Backoff bei 429.
// Retry-After respektieren wenn Header gesetzt ist.

async function callWithBackoff(url: string, init: RequestInit, max = 4) {
  for (let attempt = 0; attempt < max; attempt++) {
    const res = await fetch(url, init);
    if (res.status !== 429) return res;

    const retryAfter = Number(res.headers.get("retry-after")) || 0;
    const wait = retryAfter > 0 ? retryAfter * 1000 : (2 ** attempt) * 500;
    await new Promise((r) => setTimeout(r, wait));
  }
  throw new Error("Rate-limit exhausted");
}

Upgrade

Du brauchst mehr Volumen?

Schreib uns mit Use-Case und erwartetem Volumen an nico@mithgard.ai. Wir definieren Custom-Limits ab 10k Requests/Tag.