{"title":"Rate Limits & Quotas","slug":"rate-limits","category":"api","summary":"Kebijakan rate limit untuk API Synapse — Bearer header (tidak terbatas), ?key= (60/menit), endpoint publik.","audience":["human","llm"],"tags":["api","rate-limits","quotas","throttling"],"difficulty":"beginner","updated":"2026-06-27","word_count":326,"read_minutes":2,"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":"id","translated":true,"requested_lang":"id","content_markdown":"\n# Rate Limits & Quotas\n\nSynapse memiliki kebijakan rate limit yang sederhana dan dapat diprediksi,\ndirancang untuk mencegah penyalahgunaan tanpa menghambat penggunaan yang sah.\n\n## Kebijakan Rate Limit\n\n| Metode Auth | Batas | Cakupan |\n|-------------|-------|-------|\n| Mind Key (`Authorization: Bearer`) | **Tidak ada** | Per-mind |\n| Mind Key (`?key=`) | 60 req/menit | Per-IP |\n| JWT (`Authorization: Bearer`) | **Tidak ada** | Per-user |\n| Endpoint publik | **Tidak ada** | Global |\n\n> [!TIP]\n> **Selalu gunakan header `Authorization: Bearer`** bila memungkinkan. Header ini\n> tidak memiliki rate limit. Gunakan `?key=` hanya untuk alat yang tidak dapat\n> mengatur header khusus.\n\n## Header Rate Limit\n\nSaat Anda menggunakan autentikasi `?key=`, respons menyertakan header rate limit:\n\n```\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840\n```\n\nSaat Anda melebihi batas:\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## Saat Anda Mengenai Rate Limit\n\nJika Anda mendapat 429:\n\n1. **Beralih ke header Authorization** (disarankan):\n   ```bash\n   # Jangan: ?key=YOUR_MIND_KEY (batas 60/menit)\n   curl \".../memory/recall?key=YOUR_MIND_KEY\"\n   \n   # Lakukan: header Authorization (tidak terbatas)\n   curl -H \"Authorization: Bearer YOUR_MIND_KEY\" .../memory/recall\n   ```\n\n2. **Atau tunggu `Retry-After` detik** lalu coba lagi.\n\n## Mengapa Batas ?key= Ada\n\nParameter query `?key=` nyaman untuk alat yang hanya menggunakan URL (browser,\nperintah `open`), tetapi memiliki implikasi keamanan dan performa:\n\n- **Keamanan:** Parameter query dicatat dalam log akses server, riwayat\n  browser, dan header Referer. Membatasi penggunaan mengurangi paparan.\n- **Performa:** Autentikasi parameter query memerlukan rate limiter berbasis IP\n  (pencarian Redis per permintaan), yang menambah latensi. Autentikasi header\n  melewati ini.\n- **Pencegahan penyalahgunaan:** URL `?key=` yang bocor dapat dibagikan dan\n  dibombardir. Batas IP membatasi dampak.\n\n## Pola yang Disarankan\n\n### Agen LLM\n\n```python\n# Selalu gunakan autentikasi header\nheaders = {\"Authorization\": f\"Bearer {MIND_KEY}\"}\nresponse = requests.get(f\"{URL}/memory/recall\", headers=headers)\n```\n\n### Alat berbasis browser\n\nJika alat Anda hanya dapat membuka URL:\n\n```bash\n# OK untuk penggunaan sesekali (di bawah 60/menit)\nopen \"https://synapse.schaefer.zone/memory/recall?key=YOUR_MIND_KEY\"\n\n# Untuk penggunaan sering, beralih ke alat yang mendukung header\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" .../memory/recall\n```\n\n### MCP server\n\nMCP server selalu menggunakan autentikasi header melalui env var\n`SYNAPSE_MIND_KEY` — tidak ada rate limit yang berlaku.\n\n### Impor massal\n\nUntuk operasi massal (mis. mengimpor 1000 memori), selalu gunakan autentikasi\nheader. Impor massal melalui `?key=` akan mengenai rate limit dalam 1 menit.\n\n## Quota (Level Mind)\n\nSaat ini tidak ada kuota per-mind untuk ukuran penyimpanan atau jumlah memori.\nSemua batas ada di level auth/IP, bukan level data. Ini mungkin berubah di\nmasa depan untuk keadilan multi-tenant.\n\n## Memantau Penggunaan Anda\n\n```bash\n# Periksa status rate limit Anda saat ini (dengan autentikasi ?key=)\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## Langkah Berikutnya\n\n- [Autentikasi](/docs/getting-started/authentication)\n- [Errors & Error Handling](/docs/api/errors)\n","content_html":"<h1>Rate Limits &amp; Quotas</h1>\n<p>Synapse memiliki kebijakan rate limit yang sederhana dan dapat diprediksi,\ndirancang untuk mencegah penyalahgunaan tanpa menghambat penggunaan yang sah.</p>\n<h2>Kebijakan Rate Limit</h2>\n<table>\n<thead>\n<tr>\n<th>Metode Auth</th>\n<th>Batas</th>\n<th>Cakupan</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key (<code>Authorization: Bearer</code>)</td>\n<td><strong>Tidak ada</strong></td>\n<td>Per-mind</td>\n</tr>\n<tr>\n<td>Mind Key (<code>?key=</code>)</td>\n<td>60 req/menit</td>\n<td>Per-IP</td>\n</tr>\n<tr>\n<td>JWT (<code>Authorization: Bearer</code>)</td>\n<td><strong>Tidak ada</strong></td>\n<td>Per-user</td>\n</tr>\n<tr>\n<td>Endpoint publik</td>\n<td><strong>Tidak ada</strong></td>\n<td>Global</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-ok\">**Selalu gunakan header `Authorization: Bearer`** bila memungkinkan. Header ini\ntidak memiliki rate limit. Gunakan `?key=` hanya untuk alat yang tidak dapat\nmengatur header khusus.</div><h2>Header Rate Limit</h2>\n<p>Saat Anda menggunakan autentikasi <code>?key=</code>, respons menyertakan header rate limit:</p>\n<pre><code class=\"hljs language-plaintext\">X-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840</code></pre><p>Saat Anda melebihi batas:</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>Saat Anda Mengenai Rate Limit</h2>\n<p>Jika Anda mendapat 429:</p>\n<ol>\n<li><p><strong>Beralih ke header Authorization</strong> (disarankan):</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Jangan: ?key=YOUR_MIND_KEY (batas 60/menit)</span>\ncurl <span class=\"hljs-string\">&quot;.../memory/recall?key=YOUR_MIND_KEY&quot;</span>\n\n<span class=\"hljs-comment\"># Lakukan: header Authorization (tidak terbatas)</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> .../memory/recall</code></pre></li>\n<li><p><strong>Atau tunggu <code>Retry-After</code> detik</strong> lalu coba lagi.</p>\n</li>\n</ol>\n<h2>Mengapa Batas ?key= Ada</h2>\n<p>Parameter query <code>?key=</code> nyaman untuk alat yang hanya menggunakan URL (browser,\nperintah <code>open</code>), tetapi memiliki implikasi keamanan dan performa:</p>\n<ul>\n<li><strong>Keamanan:</strong> Parameter query dicatat dalam log akses server, riwayat\nbrowser, dan header Referer. Membatasi penggunaan mengurangi paparan.</li>\n<li><strong>Performa:</strong> Autentikasi parameter query memerlukan rate limiter berbasis IP\n(pencarian Redis per permintaan), yang menambah latensi. Autentikasi header\nmelewati ini.</li>\n<li><strong>Pencegahan penyalahgunaan:</strong> URL <code>?key=</code> yang bocor dapat dibagikan dan\ndibombardir. Batas IP membatasi dampak.</li>\n</ul>\n<h2>Pola yang Disarankan</h2>\n<h3>Agen LLM</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Selalu gunakan autentikasi header</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>Alat berbasis browser</h3>\n<p>Jika alat Anda hanya dapat membuka URL:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># OK untuk penggunaan sesekali (di bawah 60/menit)</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\"># Untuk penggunaan sering, beralih ke alat yang mendukung header</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 selalu menggunakan autentikasi header melalui env var\n<code>SYNAPSE_MIND_KEY</code> — tidak ada rate limit yang berlaku.</p>\n<h3>Impor massal</h3>\n<p>Untuk operasi massal (mis. mengimpor 1000 memori), selalu gunakan autentikasi\nheader. Impor massal melalui <code>?key=</code> akan mengenai rate limit dalam 1 menit.</p>\n<h2>Quota (Level Mind)</h2>\n<p>Saat ini tidak ada kuota per-mind untuk ukuran penyimpanan atau jumlah memori.\nSemua batas ada di level auth/IP, bukan level data. Ini mungkin berubah di\nmasa depan untuk keadilan multi-tenant.</p>\n<h2>Memantau Penggunaan Anda</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Periksa status rate limit Anda saat ini (dengan autentikasi ?key=)</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>Langkah Berikutnya</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autentikasi</a></li>\n<li><a href=\"/docs/api/errors\">Errors &amp; Error Handling</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"]}