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.
| Endpoint | Tier | Limit | Hinweis |
|---|---|---|---|
| Idea-Genome REST | Free | 60/min | Reicht für interaktive Recherche. |
| Idea-Genome REST | Paid | 600/min | Für Batch-Jobs und Agents — erfordert Vertrag. |
| Idea-Genome MCP | Free | 60/min | Pro API-Key, gesamte Tool-Calls zählen. |
| Schreibtisch REST | Pilot | 30/min | Pilot-spezifisch — wird beim Onboarding angepasst. |
| Mundart Webhook | — | outbound only | Wir pushen, kein Limit für inbound. Du musst aber mit Spitzen umgehen. |
Response-Header
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.