{"title":"Rate Limits & Quotas","slug":"rate-limits","category":"api","summary":"นโยบาย rate limit สำหรับ Synapse API — Bearer header (ไม่จำกัด), ?key= (60/นาที), public endpoint","audience":["human","llm"],"tags":["api","rate-limits","quotas","throttling"],"difficulty":"beginner","updated":"2026-06-27","word_count":237,"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":"th","translated":true,"requested_lang":"th","content_markdown":"\n# Rate Limits & Quotas\n\nSynapse มีนโยบาย rate limit ที่เรียบง่ายและคาดเดาได้ ออกแบบเพื่อป้องกันการใช้งานในทางที่ผิดโดยไม่ขัดขวางการใช้งานที่ชอบด้วย\n\n## นโยบาย Rate Limit\n\n| วิธี Auth | Limit | Scope |\n|-------------|-------|-------|\n| Mind Key (`Authorization: Bearer`) | **None** | Per-mind |\n| Mind Key (`?key=`) | 60 req/min | Per-IP |\n| JWT (`Authorization: Bearer`) | **None** | Per-user |\n| Public endpoints | **None** | Global |\n\n> [!TIP]\n> **ใช้ `Authorization: Bearer` header เสมอเมื่อทำได้** ไม่มี rate limit ใช้ `?key=` เฉพาะเครื่องมือที่ตั้ง custom header ไม่ได้\n\n## Rate Limit Headers\n\nเมื่อคุณใช้ auth ผ่าน `?key=` response จะมี rate limit headers:\n\n```\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840\n```\n\nเมื่อคุณเกิน limit:\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## เมื่อคุณกระทบ Rate Limit\n\nหากคุณได้ 429:\n\n1. **เปลี่ยนไปใช้ Authorization header** (แนะนำ):\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. **หรือรอ `Retry-After` วินาที** แล้ว retry\n\n## ทำไมถึงมี Limit ของ ?key=\n\n`?key=` query parameter สะดวกสำหรับเครื่องมือ URL-only (browser, คำสั่ง `open`) แต่มีผลกระทบด้านความปลอดภัยและประสิทธิภาพ:\n\n- **ความปลอดภัย:** query parameter ถูกบันทึกใน server access log, browser history และ Referer header การจำกัดการใช้งานช่วยลดการสัมผัส\n- **ประสิทธิภาพ:** auth ผ่าน query parameter ต้องการ rate limiter ที่ใช้ IP (Redis lookup ต่อ request) ซึ่งเพิ่ม latency auth ผ่าน header ข้ามสิ่งนี้ไป\n- **การป้องกันการใช้งานในทางที่ผิด:** URL `?key=` ที่รั่วไหลอาจถูกแชร์และถูก hammer limit ต่อ IP จำกัดผลกระทบ\n\n## รูปแบบที่แนะนำ\n\n### LLM agent\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### เครื่องมือแบบ Browser\n\nหากเครื่องมือของคุณเปิด URL ได้อย่างเดียว:\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 ใช้ header auth เสมอผ่าน env var `SYNAPSE_MIND_KEY` — ไม่มี rate limit\n\n### การนำเข้าแบบ bulk\n\nสำหรับการดำเนินการแบบ bulk (เช่น นำเข้า memory 1000 รายการ) ให้ใช้ header auth เสมอ การนำเข้าแบบ bulk ผ่าน `?key=` จะกระทบ rate limit ภายใน 1 นาที\n\n## Quotas (ระดับ Mind)\n\nปัจจุบันไม่มี quota ต่อ mind สำหรับขนาด storage หรือจำนวน memory limit ทั้งหมดอยู่ในระดับ auth/IP ไม่ใช่ในระดับข้อมูล อาจเปลี่ยนแปลงในอนาคตเพื่อความเป็นธรรมใน multi-tenant\n\n## การตรวจสอบการใช้งานของคุณ\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\n- [Authentication](/docs/getting-started/authentication)\n- [Errors & Error Handling](/docs/api/errors)\n","content_html":"<h1>Rate Limits &amp; Quotas</h1>\n<p>Synapse มีนโยบาย rate limit ที่เรียบง่ายและคาดเดาได้ ออกแบบเพื่อป้องกันการใช้งานในทางที่ผิดโดยไม่ขัดขวางการใช้งานที่ชอบด้วย</p>\n<h2>นโยบาย Rate Limit</h2>\n<table>\n<thead>\n<tr>\n<th>วิธี Auth</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>None</strong></td>\n<td>Per-mind</td>\n</tr>\n<tr>\n<td>Mind Key (<code>?key=</code>)</td>\n<td>60 req/min</td>\n<td>Per-IP</td>\n</tr>\n<tr>\n<td>JWT (<code>Authorization: Bearer</code>)</td>\n<td><strong>None</strong></td>\n<td>Per-user</td>\n</tr>\n<tr>\n<td>Public endpoints</td>\n<td><strong>None</strong></td>\n<td>Global</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-ok\">**ใช้ `Authorization: Bearer` header เสมอเมื่อทำได้** ไม่มี rate limit ใช้ `?key=` เฉพาะเครื่องมือที่ตั้ง custom header ไม่ได้</div><h2>Rate Limit Headers</h2>\n<p>เมื่อคุณใช้ auth ผ่าน <code>?key=</code> response จะมี rate limit headers:</p>\n<pre><code class=\"hljs language-plaintext\">X-RateLimit-Limit: 60\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 1782567840</code></pre><p>เมื่อคุณเกิน limit:</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>เมื่อคุณกระทบ Rate Limit</h2>\n<p>หากคุณได้ 429:</p>\n<ol>\n<li><p><strong>เปลี่ยนไปใช้ Authorization header</strong> (แนะนำ):</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>หรือรอ <code>Retry-After</code> วินาที</strong> แล้ว retry</p>\n</li>\n</ol>\n<h2>ทำไมถึงมี Limit ของ ?key=</h2>\n<p><code>?key=</code> query parameter สะดวกสำหรับเครื่องมือ URL-only (browser, คำสั่ง <code>open</code>) แต่มีผลกระทบด้านความปลอดภัยและประสิทธิภาพ:</p>\n<ul>\n<li><strong>ความปลอดภัย:</strong> query parameter ถูกบันทึกใน server access log, browser history และ Referer header การจำกัดการใช้งานช่วยลดการสัมผัส</li>\n<li><strong>ประสิทธิภาพ:</strong> auth ผ่าน query parameter ต้องการ rate limiter ที่ใช้ IP (Redis lookup ต่อ request) ซึ่งเพิ่ม latency auth ผ่าน header ข้ามสิ่งนี้ไป</li>\n<li><strong>การป้องกันการใช้งานในทางที่ผิด:</strong> URL <code>?key=</code> ที่รั่วไหลอาจถูกแชร์และถูก hammer limit ต่อ IP จำกัดผลกระทบ</li>\n</ul>\n<h2>รูปแบบที่แนะนำ</h2>\n<h3>LLM agent</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>เครื่องมือแบบ Browser</h3>\n<p>หากเครื่องมือของคุณเปิด URL ได้อย่างเดียว:</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 ใช้ header auth เสมอผ่าน env var <code>SYNAPSE_MIND_KEY</code> — ไม่มี rate limit</p>\n<h3>การนำเข้าแบบ bulk</h3>\n<p>สำหรับการดำเนินการแบบ bulk (เช่น นำเข้า memory 1000 รายการ) ให้ใช้ header auth เสมอ การนำเข้าแบบ bulk ผ่าน <code>?key=</code> จะกระทบ rate limit ภายใน 1 นาที</p>\n<h2>Quotas (ระดับ Mind)</h2>\n<p>ปัจจุบันไม่มี quota ต่อ mind สำหรับขนาด storage หรือจำนวน memory limit ทั้งหมดอยู่ในระดับ auth/IP ไม่ใช่ในระดับข้อมูล อาจเปลี่ยนแปลงในอนาคตเพื่อความเป็นธรรมใน multi-tenant</p>\n<h2>การตรวจสอบการใช้งานของคุณ</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>ขั้นตอนถัดไป</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Authentication</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"]}