{"title":"Autenticación y Mind Keys","slug":"authentication","category":"getting-started","summary":"Cómo funciona la autenticación de Synapse: Mind Keys para agentes, JWTs para humanos, ?key= para herramientas que solo usan URL.","audience":["human","llm"],"tags":["auth","mind-key","jwt","security"],"difficulty":"beginner","updated":"2026-06-27","word_count":544,"read_minutes":3,"llm_context":"Two auth methods: Mind Key (token-scoped, never expires) and JWT (user-scoped, 7-day expiry).\nMind Key: Authorization: Bearer mk_xxx OR ?key=mk_xxx (60 req/min limit on query)\nJWT: Authorization: Bearer eyJ... (no rate limit, used for /register, /login, /minds, /sharing)\nMind Key is shown only once at creation. Store it permanently.\nEach mind has exactly one Mind Key. Multiple minds = multiple keys.\n","lang":"es","translated":true,"requested_lang":"es","content_markdown":"\n# Autenticación y Mind Keys\n\nSynapse usa dos métodos de autenticación, cada uno optimizado para un caso de\nuso diferente. Comprender la diferencia es esencial para construir integraciones\nfiables.\n\n## Dos métodos de autenticación\n\n| Método | Caso de uso | Límite de frecuencia | Expiración |\n|--------|----------|------------|--------|\n| **Mind Key** | Agentes LLM, herramientas automatizadas | Ninguno (cabecera) / 60 min (query) | Nunca |\n| **JWT** | Interfaz humana, operaciones de cuenta | Ninguno | 7 días |\n\n## Mind Key (para agentes)\n\nUn Mind Key es un token de API con ámbito de tenant. Autentica los datos de un\nsolo mind (memorias, tareas, chat, scripts, etc.). Úselo para:\n\n- Agentes LLM que llaman a la API\n- Scripts de automatización en segundo plano\n- Configuración del servidor MCP\n- Cualquier integración de larga duración\n\n### Autenticación por cabecera (recomendada)\n\n```bash\ncurl -H \"Authorization: Bearer mk_yourMindKeyHere\" \\\n     https://synapse.schaefer.zone/memory/recall\n```\n\n### Parámetro de consulta (para herramientas que solo usan URL)\n\n```bash\ncurl https://synapse.schaefer.zone/memory/recall?key=mk_yourMindKeyHere\n```\n\n> [!WARNING]\n> El parámetro de consulta `?key=` está limitado a **60 peticiones por minuto**.\n> La cabecera Bearer no tiene límite de frecuencia. Use la cabecera siempre que\n> su cliente admita cabeceras personalizadas.\n\n### Crear un Mind Key\n\n```bash\ncurl -X POST https://synapse.schaefer.zone/minds \\\n  -H \"Authorization: Bearer YOUR_JWT\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"Work Mind\", \"description\": \"Project memories\"}'\n```\n\nLa respuesta incluye `mind_key` — **guárdelo de inmediato**, solo se muestra una\nvez.\n\n### Listar sus minds\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n```\n\n### Eliminar un mind (¡irreversible!)\n\n```bash\ncurl -X DELETE -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds/m_xyz789\n```\n\n## JWT (para humanos)\n\nLos JWT autentican la **cuenta de usuario**, no un mind específico. Úselos para:\n\n- Registro y login de cuenta\n- Crear / listar / eliminar minds\n- Compartir minds con otros usuarios\n- Gestión de suscripciones Web Push\n\n### Registro\n\n```bash\ncurl -X POST https://synapse.schaefer.zone/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\": \"you@example.com\", \"password\": \"secret\"}'\n```\n\nDevuelve: `{ \"jwt\": \"eyJ...\", \"user\": {...} }`\n\n### Login\n\n```bash\ncurl -X POST https://synapse.schaefer.zone/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\": \"you@example.com\", \"password\": \"secret\"}'\n```\n\nDevuelve: `{ \"jwt\": \"eyJ...\", \"user\": {...} }`\n\n### Expiración del JWT\n\nLos JWT expiran después de **7 días**. Cuando un JWT expira, simplemente llame\na `/login` de nuevo para obtener uno nuevo. El Mind Key nunca expira, de modo\nque las integraciones de agente existentes siguen funcionando.\n\n## Mejores prácticas de seguridad\n\n> [!CRITICAL]\n> - **Nunca confíe Mind Keys a git.** Use variables de entorno.\n> - **Nunca registre Mind Keys en logs.** Enmascárelos (`mk_***...***xyz`).\n> - **Rote las claves** si sospecha de una fuga (elimine el mind, cree uno nuevo).\n> - **Use un mind por proyecto** para limitar el radio de impacto si se filtra una clave.\n\n### Patrón con variables de entorno\n\n```bash\n# .env (NEVER commit this file)\nSYNAPSE_MIND_KEY=mk_yourMindKeyHere\nSYNAPSE_URL=https://synapse.schaefer.zone\n```\n\n```typescript\n// Node.js\nconst mindKey = process.env.SYNAPSE_MIND_KEY;\nconst url = process.env.SYNAPSE_URL;\nawait fetch(`${url}/memory/recall`, {\n  headers: { Authorization: `Bearer ${mindKey}` },\n});\n```\n\n### Configuración del servidor MCP\n\n```json\n{\n  \"mcpServers\": {\n    \"synapse\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"synapse-mcp-api@latest\"],\n      \"env\": {\n        \"SYNAPSE_MIND_KEY\": \"mk_yourMindKeyHere\",\n        \"SYNAPSE_URL\": \"https://synapse.schaefer.zone\"\n      }\n    }\n  }\n}\n```\n\n## Patrón multi-mind\n\nCada usuario puede tener múltiples minds. Patrones comunes:\n\n| Nombre del mind | Propósito |\n|-----------|---------|\n| `work` | Memorias de trabajo |\n| `personal` | Preferencias personales, familia |\n| `project-synapse` | Contexto de un proyecto específico |\n| `learning-german` | Progreso de aprendizaje |\n| `assistant-default` | Fallback de propósito general |\n\nUse diferentes Mind Keys para diferentes sesiones LLM a fin de mantener los\ncontextos aislados.\n\n## Límites de frecuencia\n\n| Método de auth | Límite | Ámbito |\n|-------------|-------|-------|\n| Mind Key (cabecera) | Ninguno | Por mind |\n| Mind Key (?key=) | 60/min | Por IP |\n| JWT (cabecera) | Ninguno | Por usuario |\n| Endpoints públicos | Ninguno | Global |\n\nLas cabeceras de límite de frecuencia (`X-RateLimit-Limit`,\n`X-RateLimit-Remaining`, `Retry-After`) se incluyen en las respuestas cuando\naplica.\n\n## Próximos pasos\n\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt) — cuándo usar cada uno\n- [API de Memory](/docs/api/memory) — qué puede hacer con un Mind Key\n- [API de User](/docs/api/user) — gestión de cuenta con JWTs\n","content_html":"<h1>Autenticación y Mind Keys</h1>\n<p>Synapse usa dos métodos de autenticación, cada uno optimizado para un caso de\nuso diferente. Comprender la diferencia es esencial para construir integraciones\nfiables.</p>\n<h2>Dos métodos de autenticación</h2>\n<table>\n<thead>\n<tr>\n<th>Método</th>\n<th>Caso de uso</th>\n<th>Límite de frecuencia</th>\n<th>Expiración</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Mind Key</strong></td>\n<td>Agentes LLM, herramientas automatizadas</td>\n<td>Ninguno (cabecera) / 60 min (query)</td>\n<td>Nunca</td>\n</tr>\n<tr>\n<td><strong>JWT</strong></td>\n<td>Interfaz humana, operaciones de cuenta</td>\n<td>Ninguno</td>\n<td>7 días</td>\n</tr>\n</tbody></table>\n<h2>Mind Key (para agentes)</h2>\n<p>Un Mind Key es un token de API con ámbito de tenant. Autentica los datos de un\nsolo mind (memorias, tareas, chat, scripts, etc.). Úselo para:</p>\n<ul>\n<li>Agentes LLM que llaman a la API</li>\n<li>Scripts de automatización en segundo plano</li>\n<li>Configuración del servidor MCP</li>\n<li>Cualquier integración de larga duración</li>\n</ul>\n<h3>Autenticación por cabecera (recomendada)</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_yourMindKeyHere&quot;</span> \\\n     https://synapse.schaefer.zone/memory/recall</code></pre><h3>Parámetro de consulta (para herramientas que solo usan URL)</h3>\n<pre><code class=\"hljs language-bash\">curl https://synapse.schaefer.zone/memory/recall?key=mk_yourMindKeyHere</code></pre><div class=\"callout callout-warn\">El parámetro de consulta `?key=` está limitado a **60 peticiones por minuto**.\nLa cabecera Bearer no tiene límite de frecuencia. Use la cabecera siempre que\nsu cliente admita cabeceras personalizadas.</div><h3>Crear un Mind Key</h3>\n<pre><code class=\"hljs language-bash\">curl -X POST https://synapse.schaefer.zone/minds \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;name&quot;: &quot;Work Mind&quot;, &quot;description&quot;: &quot;Project memories&quot;}&#x27;</span></code></pre><p>La respuesta incluye <code>mind_key</code> — <strong>guárdelo de inmediato</strong>, solo se muestra una\nvez.</p>\n<h3>Listar sus minds</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/minds</code></pre><h3>Eliminar un mind (¡irreversible!)</h3>\n<pre><code class=\"hljs language-bash\">curl -X DELETE -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/minds/m_xyz789</code></pre><h2>JWT (para humanos)</h2>\n<p>Los JWT autentican la <strong>cuenta de usuario</strong>, no un mind específico. Úselos para:</p>\n<ul>\n<li>Registro y login de cuenta</li>\n<li>Crear / listar / eliminar minds</li>\n<li>Compartir minds con otros usuarios</li>\n<li>Gestión de suscripciones Web Push</li>\n</ul>\n<h3>Registro</h3>\n<pre><code class=\"hljs language-bash\">curl -X POST https://synapse.schaefer.zone/register \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;email&quot;: &quot;you@example.com&quot;, &quot;password&quot;: &quot;secret&quot;}&#x27;</span></code></pre><p>Devuelve: <code>{ &quot;jwt&quot;: &quot;eyJ...&quot;, &quot;user&quot;: {...} }</code></p>\n<h3>Login</h3>\n<pre><code class=\"hljs language-bash\">curl -X POST https://synapse.schaefer.zone/login \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;email&quot;: &quot;you@example.com&quot;, &quot;password&quot;: &quot;secret&quot;}&#x27;</span></code></pre><p>Devuelve: <code>{ &quot;jwt&quot;: &quot;eyJ...&quot;, &quot;user&quot;: {...} }</code></p>\n<h3>Expiración del JWT</h3>\n<p>Los JWT expiran después de <strong>7 días</strong>. Cuando un JWT expira, simplemente llame\na <code>/login</code> de nuevo para obtener uno nuevo. El Mind Key nunca expira, de modo\nque las integraciones de agente existentes siguen funcionando.</p>\n<h2>Mejores prácticas de seguridad</h2>\n<div class=\"callout callout-critical\"></div><h3>Patrón con variables de entorno</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># .env (NEVER commit this file)</span>\nSYNAPSE_MIND_KEY=mk_yourMindKeyHere\nSYNAPSE_URL=https://synapse.schaefer.zone</code></pre><pre><code class=\"hljs language-typescript\"><span class=\"hljs-comment\">// Node.js</span>\n<span class=\"hljs-keyword\">const</span> mindKey = process.<span class=\"hljs-property\">env</span>.<span class=\"hljs-property\">SYNAPSE_MIND_KEY</span>;\n<span class=\"hljs-keyword\">const</span> url = process.<span class=\"hljs-property\">env</span>.<span class=\"hljs-property\">SYNAPSE_URL</span>;\n<span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">fetch</span>(<span class=\"hljs-string\">`<span class=\"hljs-subst\">${url}</span>/memory/recall`</span>, {\n  <span class=\"hljs-attr\">headers</span>: { <span class=\"hljs-title class_\">Authorization</span>: <span class=\"hljs-string\">`Bearer <span class=\"hljs-subst\">${mindKey}</span>`</span> },\n});</code></pre><h3>Configuración del servidor MCP</h3>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;mcpServers&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n    <span class=\"hljs-attr\">&quot;synapse&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n      <span class=\"hljs-attr\">&quot;command&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;npx&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;args&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;-y&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;synapse-mcp-api@latest&quot;</span><span class=\"hljs-punctuation\">]</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;env&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n        <span class=\"hljs-attr\">&quot;SYNAPSE_MIND_KEY&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;mk_yourMindKeyHere&quot;</span><span class=\"hljs-punctuation\">,</span>\n        <span class=\"hljs-attr\">&quot;SYNAPSE_URL&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone&quot;</span>\n      <span class=\"hljs-punctuation\">}</span>\n    <span class=\"hljs-punctuation\">}</span>\n  <span class=\"hljs-punctuation\">}</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><h2>Patrón multi-mind</h2>\n<p>Cada usuario puede tener múltiples minds. Patrones comunes:</p>\n<table>\n<thead>\n<tr>\n<th>Nombre del mind</th>\n<th>Propósito</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>work</code></td>\n<td>Memorias de trabajo</td>\n</tr>\n<tr>\n<td><code>personal</code></td>\n<td>Preferencias personales, familia</td>\n</tr>\n<tr>\n<td><code>project-synapse</code></td>\n<td>Contexto de un proyecto específico</td>\n</tr>\n<tr>\n<td><code>learning-german</code></td>\n<td>Progreso de aprendizaje</td>\n</tr>\n<tr>\n<td><code>assistant-default</code></td>\n<td>Fallback de propósito general</td>\n</tr>\n</tbody></table>\n<p>Use diferentes Mind Keys para diferentes sesiones LLM a fin de mantener los\ncontextos aislados.</p>\n<h2>Límites de frecuencia</h2>\n<table>\n<thead>\n<tr>\n<th>Método de auth</th>\n<th>Límite</th>\n<th>Ámbito</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key (cabecera)</td>\n<td>Ninguno</td>\n<td>Por mind</td>\n</tr>\n<tr>\n<td>Mind Key (?key=)</td>\n<td>60/min</td>\n<td>Por IP</td>\n</tr>\n<tr>\n<td>JWT (cabecera)</td>\n<td>Ninguno</td>\n<td>Por usuario</td>\n</tr>\n<tr>\n<td>Endpoints públicos</td>\n<td>Ninguno</td>\n<td>Global</td>\n</tr>\n</tbody></table>\n<p>Las cabeceras de límite de frecuencia (<code>X-RateLimit-Limit</code>,\n<code>X-RateLimit-Remaining</code>, <code>Retry-After</code>) se incluyen en las respuestas cuando\naplica.</p>\n<h2>Próximos pasos</h2>\n<ul>\n<li><a href=\"/docs/getting-started/mind-key-vs-jwt\">Mind Key vs JWT</a> — cuándo usar cada uno</li>\n<li><a href=\"/docs/api/memory\">API de Memory</a> — qué puede hacer con un Mind Key</li>\n<li><a href=\"/docs/api/user\">API de User</a> — gestión de cuenta con JWTs</li>\n</ul>\n","urls":{"html":"/docs/getting-started/authentication","text":"/docs/getting-started/authentication?format=text","json":"/docs/getting-started/authentication?format=json","llm":"/docs/getting-started/authentication?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}