{"title":"Rate Limits & Kontingente","slug":"rate-limits","category":"api","summary":"Rate-Limit-Richtlinien für die Synapse-API — Bearer-Header (unbegrenzt), ?key= (60/min), öffentliche Endpunkte.","audience":["human","llm"],"tags":["api","rate-limits","quotas","throttling"],"difficulty":"beginner","updated":"2026-06-27","word_count":281,"read_minutes":1,"llm_context":"Mind Key (Authorization: Bearer header) → NO rate limit\nMind Key (?key= query param) → 60 req/min per IP\nJWT (Authorization: Bearer header) → NO rate limit\nPublic endpoints (/tools/*, /docs, /health, /endpoints) → NO rate limit\nRate limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After\nRecommendation: ALWAYS use Authorization header. Use ?key= only for URL-only tools.\n","lang":"de","translated":true,"requested_lang":"de","content_markdown":"\n# Rate Limits & Kontingente\n\nSynapse hat eine einfache, vorhersehbare Rate-Limit-Richtlinie, die Missbrauch\nverhindern soll, ohne legitime Nutzung auszubremsen.\n\n## Rate-Limit-Richtlinie\n\n| Auth-Methode | Limit | Scope |\n|---------------|-------|-------|\n| Mind Key (`Authorization: Bearer`) | **Keins** | Pro-Mind |\n| Mind Key (`?key=`) | 60 req/min | Pro-IP |\n| JWT (`Authorization: Bearer`) | **Keins** | Pro-Nutzer |\n| Öffentliche Endpunkte | **Keins** | Global |\n\n> [!TIP]\n> **Verwende immer den `Authorization: Bearer`-Header**, wenn möglich. Er hat\n> kein Rate Limit. Nutze `?key=` nur für Tools, die keine eigenen Header setzen\n> können.\n\n## Rate-Limit-Header\n\nWenn du `?key=`-Auth nutzt, enthalten Antworten Rate-Limit-Header:\n\n```\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840\n```\n\nWenn du das Limit überschreitest:\n\n```\nHTTP/1.1 429 Too Many Requests\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 0\nRetry-After: 42\nContent-Type: application/json\n\n{\n  \"statusCode\": 429,\n  \"error\": \"Too Many Requests\",\n  \"message\": \"Rate limit exceeded. Use Authorization header for unlimited access.\"\n}\n```\n\n## Wenn du ein Rate Limit triffst\n\nBei einer 429:\n\n1. **Wechsle zum Authorization-Header** (empfohlen):\n   ```bash\n   # Don't: ?key=YOUR_MIND_KEY (60/min limit)\n   curl \".../memory/recall?key=YOUR_MIND_KEY\"\n   \n   # Do: Authorization header (unlimited)\n   curl -H \"Authorization: Bearer YOUR_MIND_KEY\" .../memory/recall\n   ```\n\n2. **Oder warte `Retry-After` Sekunden** und versuche es erneut.\n\n## Warum das ?key=-Limit existiert\n\nDer `?key=`-Query-Parameter ist praktisch für reine URL-Tools (Browser,\n`open`-Befehle), hat aber Sicherheits- und Performance-Auswirkungen:\n\n- **Sicherheit:** Query-Parameter werden in Server-Access-Logs, Browser-Verlauf\n  und Referer-Headern protokolliert. Eine Begrenzung reduziert die Exposition.\n- **Performance:** Query-Parameter-Auth erfordert einen IP-basierten Rate-Limiter\n  (Redis-Lookup pro Anfrage), was Latenz erzeugt. Header-Auth umgeht das.\n- **Missbrauchsvermeidung:** Eine geleakte `?key=`-URL könnte geteilt und\n  abgefeuert werden. Das IP-Limit begrenzt den Schadensradius.\n\n## Empfohlene Patterns\n\n### LLM-Agenten\n\n```python\n# Always use header auth\nheaders = {\"Authorization\": f\"Bearer {MIND_KEY}\"}\nresponse = requests.get(f\"{URL}/memory/recall\", headers=headers)\n```\n\n### Browserbasierte Tools\n\nWenn dein Tool nur URLs öffnen kann:\n\n```bash\n# OK for occasional use (under 60/min)\nopen \"https://synapse.schaefer.zone/memory/recall?key=YOUR_MIND_KEY\"\n\n# For frequent use, switch to a tool that supports headers\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" .../memory/recall\n```\n\n### MCP-Server\n\nMCP-Server verwenden immer Header-Auth via `SYNAPSE_MIND_KEY`-Env-Var — kein\nRate Limit greift.\n\n### Bulk-Importe\n\nFür Bulk-Operationen (z. B. 1000 Memories importieren) verwende immer Header-Auth.\nBulk-Importe via `?key=` erreichen das Limit innerhalb einer Minute.\n\n## Kontingente (Mind-Ebene)\n\nAktuell gibt es keine Mind-spezifischen Kontingente für Speichergröße oder\nMemory-Anzahl. Alle Limits sind auf Auth/IP-Ebene, nicht auf Datenebene. Das\nkann sich in Zukunft für Multi-Tenant-Fairness ändern.\n\n## Eigene Nutzung beobachten\n\n```bash\n# Check your current rate limit status (with ?key= auth)\ncurl -i \"https://synapse.schaefer.zone/memory/stats?key=YOUR_MIND_KEY\" | grep -i ratelimit\n\n# Output:\n# X-RateLimit-Limit: 60\n# X-RateLimit-Remaining: 58\n# X-RateLimit-Reset: 1782567840\n```\n\n## Nächste Schritte\n\n- [Authentifizierung](/docs/getting-started/authentication)\n- [Errors & Fehlerbehandlung](/docs/api/errors)\n","content_html":"<h1>Rate Limits &amp; Kontingente</h1>\n<p>Synapse hat eine einfache, vorhersehbare Rate-Limit-Richtlinie, die Missbrauch\nverhindern soll, ohne legitime Nutzung auszubremsen.</p>\n<h2>Rate-Limit-Richtlinie</h2>\n<table>\n<thead>\n<tr>\n<th>Auth-Methode</th>\n<th>Limit</th>\n<th>Scope</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key (<code>Authorization: Bearer</code>)</td>\n<td><strong>Keins</strong></td>\n<td>Pro-Mind</td>\n</tr>\n<tr>\n<td>Mind Key (<code>?key=</code>)</td>\n<td>60 req/min</td>\n<td>Pro-IP</td>\n</tr>\n<tr>\n<td>JWT (<code>Authorization: Bearer</code>)</td>\n<td><strong>Keins</strong></td>\n<td>Pro-Nutzer</td>\n</tr>\n<tr>\n<td>Öffentliche Endpunkte</td>\n<td><strong>Keins</strong></td>\n<td>Global</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-ok\">**Verwende immer den `Authorization: Bearer`-Header**, wenn möglich. Er hat\nkein Rate Limit. Nutze `?key=` nur für Tools, die keine eigenen Header setzen\nkönnen.</div><h2>Rate-Limit-Header</h2>\n<p>Wenn du <code>?key=</code>-Auth nutzt, enthalten Antworten Rate-Limit-Header:</p>\n<pre><code class=\"hljs language-plaintext\">X-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840</code></pre><p>Wenn du das Limit überschreitest:</p>\n<pre><code class=\"hljs language-plaintext\">HTTP/1.1 429 Too Many Requests\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 0\nRetry-After: 42\nContent-Type: application/json\n\n{\n  &quot;statusCode&quot;: 429,\n  &quot;error&quot;: &quot;Too Many Requests&quot;,\n  &quot;message&quot;: &quot;Rate limit exceeded. Use Authorization header for unlimited access.&quot;\n}</code></pre><h2>Wenn du ein Rate Limit triffst</h2>\n<p>Bei einer 429:</p>\n<ol>\n<li><p><strong>Wechsle zum Authorization-Header</strong> (empfohlen):</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Don&#x27;t: ?key=YOUR_MIND_KEY (60/min limit)</span>\ncurl <span class=\"hljs-string\">&quot;.../memory/recall?key=YOUR_MIND_KEY&quot;</span>\n\n<span class=\"hljs-comment\"># Do: Authorization header (unlimited)</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> .../memory/recall</code></pre></li>\n<li><p><strong>Oder warte <code>Retry-After</code> Sekunden</strong> und versuche es erneut.</p>\n</li>\n</ol>\n<h2>Warum das ?key=-Limit existiert</h2>\n<p>Der <code>?key=</code>-Query-Parameter ist praktisch für reine URL-Tools (Browser,\n<code>open</code>-Befehle), hat aber Sicherheits- und Performance-Auswirkungen:</p>\n<ul>\n<li><strong>Sicherheit:</strong> Query-Parameter werden in Server-Access-Logs, Browser-Verlauf\nund Referer-Headern protokolliert. Eine Begrenzung reduziert die Exposition.</li>\n<li><strong>Performance:</strong> Query-Parameter-Auth erfordert einen IP-basierten Rate-Limiter\n(Redis-Lookup pro Anfrage), was Latenz erzeugt. Header-Auth umgeht das.</li>\n<li><strong>Missbrauchsvermeidung:</strong> Eine geleakte <code>?key=</code>-URL könnte geteilt und\nabgefeuert werden. Das IP-Limit begrenzt den Schadensradius.</li>\n</ul>\n<h2>Empfohlene Patterns</h2>\n<h3>LLM-Agenten</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Always use header auth</span>\nheaders = {<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{MIND_KEY}</span>&quot;</span>}\nresponse = requests.get(<span class=\"hljs-string\">f&quot;<span class=\"hljs-subst\">{URL}</span>/memory/recall&quot;</span>, headers=headers)</code></pre><h3>Browserbasierte Tools</h3>\n<p>Wenn dein Tool nur URLs öffnen kann:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># OK for occasional use (under 60/min)</span>\nopen <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/recall?key=YOUR_MIND_KEY&quot;</span>\n\n<span class=\"hljs-comment\"># For frequent use, switch to a tool that supports headers</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> .../memory/recall</code></pre><h3>MCP-Server</h3>\n<p>MCP-Server verwenden immer Header-Auth via <code>SYNAPSE_MIND_KEY</code>-Env-Var — kein\nRate Limit greift.</p>\n<h3>Bulk-Importe</h3>\n<p>Für Bulk-Operationen (z. B. 1000 Memories importieren) verwende immer Header-Auth.\nBulk-Importe via <code>?key=</code> erreichen das Limit innerhalb einer Minute.</p>\n<h2>Kontingente (Mind-Ebene)</h2>\n<p>Aktuell gibt es keine Mind-spezifischen Kontingente für Speichergröße oder\nMemory-Anzahl. Alle Limits sind auf Auth/IP-Ebene, nicht auf Datenebene. Das\nkann sich in Zukunft für Multi-Tenant-Fairness ändern.</p>\n<h2>Eigene Nutzung beobachten</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Check your current rate limit status (with ?key= auth)</span>\ncurl -i <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/stats?key=YOUR_MIND_KEY&quot;</span> | grep -i ratelimit\n\n<span class=\"hljs-comment\"># Output:</span>\n<span class=\"hljs-comment\"># X-RateLimit-Limit: 60</span>\n<span class=\"hljs-comment\"># X-RateLimit-Remaining: 58</span>\n<span class=\"hljs-comment\"># X-RateLimit-Reset: 1782567840</span></code></pre><h2>Nächste Schritte</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Authentifizierung</a></li>\n<li><a href=\"/docs/api/errors\">Errors &amp; Fehlerbehandlung</a></li>\n</ul>\n","urls":{"html":"/docs/api/rate-limits","text":"/docs/api/rate-limits?format=text","json":"/docs/api/rate-limits?format=json","llm":"/docs/api/rate-limits?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}