{"title":"Помилки та обробка помилок","slug":"errors","category":"api","summary":"Коди стану HTTP, формат відповідей з помилками та способи відновлення після поширених помилок.","audience":["human","llm"],"tags":["api","errors","troubleshooting","http"],"difficulty":"beginner","updated":"2026-06-27","word_count":475,"read_minutes":2,"llm_context":"Error format: { statusCode, error, message, docs? }\nCommon errors: 401 (auth), 404 (wrong path), 429 (rate limit), 500 (server)\n401 → check Mind Key/JWT, see /docs/getting-started/authentication\n404 → wrong path, GET /endpoints for valid list, do NOT guess paths\n429 → rate limited (?key= is 60/min), use Bearer header instead\n500 → server error, retry with backoff, check /health\ndocs field in error response links to relevant documentation.\n","lang":"uk","translated":true,"requested_lang":"uk","content_markdown":"\n# Помилки та обробка помилок\n\nSynapse використовує стандартні коди стану HTTP із послідовним форматом\nвідповідей з помилками. Ця сторінка пояснює, як інтерпретувати та відновлюватися\nпісля помилок.\n\n## Формат відповіді з помилкою\n\nУсі помилки повертають JSON такої структури:\n\n```json\n{\n  \"statusCode\": 401,\n  \"error\": \"Unauthorized\",\n  \"message\": \"Mind Key fehlt oder ungültig.\",\n  \"docs\": \"https://synapse.schaefer.zone/docs/getting-started/authentication\"\n}\n```\n\n| Поле | Опис |\n|-------|-------------|\n| `statusCode` | Код стану HTTP |\n| `error` | Назва статусу HTTP |\n| `message` | Зрозумілий для людини опис помилки |\n| `docs` | URL-адреса відповідної документації (за наявності) |\n\n## Коди стану HTTP\n\n### 200 OK\n\nУспіх. Запит оброблено коректно.\n\n### 201 Created\n\nУспіх. Створено новий ресурс (напр. `POST /memory`).\n\n### 204 No Content\n\nУспіх. Тіло відповіді не повертається (напр. `DELETE /memory/:id`).\n\n### 400 Bad Request\n\nЗапит є malformed. Поширені причини:\n\n- Відсутні обов'язкові JSON-поля\n- Некоректний синтаксис JSON\n- Недійсне значення enum (напр. неправильна категорія)\n\n```json\n{\n  \"statusCode\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": \"category must be one of: identity, preference, fact, project, skill, mistake, context, note, credentials\"\n}\n```\n\n**Виправлення:** Перевірте тіло запиту за документацією API. Переконайтеся, що\nусі обов'язкові поля присутні та мають коректні значення.\n\n### 401 Unauthorized\n\nПомилка автентифікації. Поширені причини:\n\n- Відсутній заголовок `Authorization`\n- Недійсний Mind Key або JWT\n- Використання Mind Key там, де потрібен JWT (або навпаки)\n\n```json\n{\n  \"statusCode\": 401,\n  \"error\": \"Unauthorized\",\n  \"message\": \"Mind Key fehlt oder ungültig.\",\n  \"docs\": \"https://synapse.schaefer.zone/docs/getting-started/authentication\"\n}\n```\n\n**Виправлення:** Перевірте ваш токен. Дивіться [Автентифікацію](/docs/getting-started/authentication).\n\n### 403 Forbidden\n\nВи автентифіковані, але не маєте права виконувати цю дію. Поширені причини:\n\n- Спроба видалити чужий mind\n- Спроба верифікувати спогад за допомогою Mind Key (потрібен JWT)\n- Mind вимкнено\n\n**Виправлення:** Перевірте, чи використовуєте правильний тип токена для цієї кінцевої точки.\n\n### 404 Not Found\n\nЗапитаний шлях або ресурс не існує.\n\n> [!CRITICAL]\n> **НЕ вгадуйте шляхи кінцевих точок.** Існують лише шляхи зі списку `GET /endpoints`.\n> Якщо отримали 404 — ви використали неправильний шлях.\n\n```json\n{\n  \"statusCode\": 404,\n  \"error\": \"Not Found\",\n  \"message\": \"Route GET /memory/list not found\",\n  \"docs\": \"https://synapse.schaefer.zone/docs/api/errors\"\n}\n```\n\n**Виправлення:** Викличте `GET /endpoints`, щоб побачити список дійсних кінцевих\nточок. Порівняйте ваш URL зі списком символ за символом.\n\n### 409 Conflict\n\nЗапит конфліктує з наявним станом. Поширені причини:\n\n- Спроба зареєструватися з email, що вже існує\n- Дублікат URL webhook\n\n**Виправлення:** Використайте інше значення або скористайтеся `PUT` для оновлення наявного ресурсу.\n\n### 429 Too Many Requests\n\nВи досягли ліміту частоти. Стосується лише автентифікації через параметр запиту\n`?key=` (60/хв).\n\n```json\n{\n  \"statusCode\": 429,\n  \"error\": \"Too Many Requests\",\n  \"message\": \"Rate limit exceeded. Use Authorization header for unlimited access.\"\n}\n```\n\nЗаголовки відповіді:\n\n```\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 0\nRetry-After: 42\n```\n\n**Виправлення:** Перейдіть на заголовок `Authorization: Bearer` (без обмеження\nчастоти) або зачекайте `Retry-After` секунд.\n\n### 500 Internal Server Error\n\nПомилка сервера. Це не повинно траплятися — якщо трапилося, це баг.\n\n**Виправлення:**\n\n1. Повторіть із експоненційною затримкою (1с, 2с, 4с, 8с)\n2. Перевірте `GET /health`, щоб переконатися, що сервер працює\n3. Якщо помилка стійка, повідомте про неї\n\n### 503 Service Unavailable\n\nСервер тимчасово недоступний (напр. під час розгортання, міграції БД).\n\n**Виправлення:** Зачекайте та повторіть спробу. Перевірте `GET /health`.\n\n## Шаблони відновлення\n\n### Повтор із експоненційною затримкою\n\n```python\nimport time\nimport requests\n\ndef call_with_retry(url, max_retries=3):\n    for attempt in range(max_retries):\n        try:\n            r = requests.get(url, headers={\"Authorization\": f\"Bearer {KEY}\"})\n            if r.status_code == 429:\n                wait = int(r.headers.get(\"Retry-After\", 60))\n                time.sleep(wait)\n                continue\n            if r.status_code >= 500:\n                time.sleep(2 ** attempt)\n                continue\n            return r\n        except requests.RequestException:\n            time.sleep(2 ** attempt)\n    raise Exception(f\"Failed after {max_retries} retries\")\n```\n\n### Обробка помилок автентифікації\n\n```python\ndef safe_call(url, key):\n    r = requests.get(url, headers={\"Authorization\": f\"Bearer {key}\"})\n    if r.status_code == 401:\n        # Mind Key недійсний — попередити користувача\n        raise AuthError(\"Mind Key invalid or expired\")\n    return r\n```\n\n## Поширені сценарії помилок\n\n### \"Mind Key fehlt oder ungültig\"\n\n- Ви забули заголовок `Authorization`\n- Ви використали `?key=`, але ключ неправильний\n- Ви використовуєте JWT там, де потрібен Mind Key\n\n### \"Route not found\"\n\n- Ви вгадали шлях, якого не існує\n- Ви неправильно використали метод (напр. `GET /memory` замість `POST /memory`)\n- Перевірте `GET /endpoints` для дійсних шляхів\n\n### \"Rate limit exceeded\"\n\n- Ви використовуєте `?key=` та перевищили 60 запитів/хв\n- Перейдіть на заголовок `Authorization: Bearer`\n\n## Наступні кроки\n\n- [Автентифікація](/docs/getting-started/authentication)\n- [Огляд API](/docs/api/overview)\n- [Обмеження частоти](/docs/api/rate-limits)\n","content_html":"<h1>Помилки та обробка помилок</h1>\n<p>Synapse використовує стандартні коди стану HTTP із послідовним форматом\nвідповідей з помилками. Ця сторінка пояснює, як інтерпретувати та відновлюватися\nпісля помилок.</p>\n<h2>Формат відповіді з помилкою</h2>\n<p>Усі помилки повертають JSON такої структури:</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;statusCode&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">401</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;error&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Unauthorized&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;message&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Mind Key fehlt oder ungültig.&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;docs&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/docs/getting-started/authentication&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><table>\n<thead>\n<tr>\n<th>Поле</th>\n<th>Опис</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>statusCode</code></td>\n<td>Код стану HTTP</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>Назва статусу HTTP</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>Зрозумілий для людини опис помилки</td>\n</tr>\n<tr>\n<td><code>docs</code></td>\n<td>URL-адреса відповідної документації (за наявності)</td>\n</tr>\n</tbody></table>\n<h2>Коди стану HTTP</h2>\n<h3>200 OK</h3>\n<p>Успіх. Запит оброблено коректно.</p>\n<h3>201 Created</h3>\n<p>Успіх. Створено новий ресурс (напр. <code>POST /memory</code>).</p>\n<h3>204 No Content</h3>\n<p>Успіх. Тіло відповіді не повертається (напр. <code>DELETE /memory/:id</code>).</p>\n<h3>400 Bad Request</h3>\n<p>Запит є malformed. Поширені причини:</p>\n<ul>\n<li>Відсутні обов&#39;язкові JSON-поля</li>\n<li>Некоректний синтаксис JSON</li>\n<li>Недійсне значення enum (напр. неправильна категорія)</li>\n</ul>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;statusCode&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">400</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;error&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Bad Request&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;message&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;category must be one of: identity, preference, fact, project, skill, mistake, context, note, credentials&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><p><strong>Виправлення:</strong> Перевірте тіло запиту за документацією API. Переконайтеся, що\nусі обов&#39;язкові поля присутні та мають коректні значення.</p>\n<h3>401 Unauthorized</h3>\n<p>Помилка автентифікації. Поширені причини:</p>\n<ul>\n<li>Відсутній заголовок <code>Authorization</code></li>\n<li>Недійсний Mind Key або JWT</li>\n<li>Використання Mind Key там, де потрібен JWT (або навпаки)</li>\n</ul>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;statusCode&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">401</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;error&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Unauthorized&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;message&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Mind Key fehlt oder ungültig.&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;docs&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/docs/getting-started/authentication&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><p><strong>Виправлення:</strong> Перевірте ваш токен. Дивіться <a href=\"/docs/getting-started/authentication\">Автентифікацію</a>.</p>\n<h3>403 Forbidden</h3>\n<p>Ви автентифіковані, але не маєте права виконувати цю дію. Поширені причини:</p>\n<ul>\n<li>Спроба видалити чужий mind</li>\n<li>Спроба верифікувати спогад за допомогою Mind Key (потрібен JWT)</li>\n<li>Mind вимкнено</li>\n</ul>\n<p><strong>Виправлення:</strong> Перевірте, чи використовуєте правильний тип токена для цієї кінцевої точки.</p>\n<h3>404 Not Found</h3>\n<p>Запитаний шлях або ресурс не існує.</p>\n<div class=\"callout callout-critical\">**НЕ вгадуйте шляхи кінцевих точок.** Існують лише шляхи зі списку `GET /endpoints`.\nЯкщо отримали 404 — ви використали неправильний шлях.</div><pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;statusCode&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">404</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;error&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Not Found&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;message&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Route GET /memory/list not found&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;docs&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/docs/api/errors&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><p><strong>Виправлення:</strong> Викличте <code>GET /endpoints</code>, щоб побачити список дійсних кінцевих\nточок. Порівняйте ваш URL зі списком символ за символом.</p>\n<h3>409 Conflict</h3>\n<p>Запит конфліктує з наявним станом. Поширені причини:</p>\n<ul>\n<li>Спроба зареєструватися з email, що вже існує</li>\n<li>Дублікат URL webhook</li>\n</ul>\n<p><strong>Виправлення:</strong> Використайте інше значення або скористайтеся <code>PUT</code> для оновлення наявного ресурсу.</p>\n<h3>429 Too Many Requests</h3>\n<p>Ви досягли ліміту частоти. Стосується лише автентифікації через параметр запиту\n<code>?key=</code> (60/хв).</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;statusCode&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">429</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;error&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Too Many Requests&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;message&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Rate limit exceeded. Use Authorization header for unlimited access.&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><p>Заголовки відповіді:</p>\n<pre><code class=\"hljs language-plaintext\">X-RateLimit-Limit: 60\nX-RateLimit-Remaining: 0\nRetry-After: 42</code></pre><p><strong>Виправлення:</strong> Перейдіть на заголовок <code>Authorization: Bearer</code> (без обмеження\nчастоти) або зачекайте <code>Retry-After</code> секунд.</p>\n<h3>500 Internal Server Error</h3>\n<p>Помилка сервера. Це не повинно траплятися — якщо трапилося, це баг.</p>\n<p><strong>Виправлення:</strong></p>\n<ol>\n<li>Повторіть із експоненційною затримкою (1с, 2с, 4с, 8с)</li>\n<li>Перевірте <code>GET /health</code>, щоб переконатися, що сервер працює</li>\n<li>Якщо помилка стійка, повідомте про неї</li>\n</ol>\n<h3>503 Service Unavailable</h3>\n<p>Сервер тимчасово недоступний (напр. під час розгортання, міграції БД).</p>\n<p><strong>Виправлення:</strong> Зачекайте та повторіть спробу. Перевірте <code>GET /health</code>.</p>\n<h2>Шаблони відновлення</h2>\n<h3>Повтор із експоненційною затримкою</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import</span> time\n<span class=\"hljs-keyword\">import</span> requests\n\n<span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">call_with_retry</span>(<span class=\"hljs-params\">url, max_retries=<span class=\"hljs-number\">3</span></span>):\n    <span class=\"hljs-keyword\">for</span> attempt <span class=\"hljs-keyword\">in</span> <span class=\"hljs-built_in\">range</span>(max_retries):\n        <span class=\"hljs-keyword\">try</span>:\n            r = requests.get(url, headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{KEY}</span>&quot;</span>})\n            <span class=\"hljs-keyword\">if</span> r.status_code == <span class=\"hljs-number\">429</span>:\n                wait = <span class=\"hljs-built_in\">int</span>(r.headers.get(<span class=\"hljs-string\">&quot;Retry-After&quot;</span>, <span class=\"hljs-number\">60</span>))\n                time.sleep(wait)\n                <span class=\"hljs-keyword\">continue</span>\n            <span class=\"hljs-keyword\">if</span> r.status_code &gt;= <span class=\"hljs-number\">500</span>:\n                time.sleep(<span class=\"hljs-number\">2</span> ** attempt)\n                <span class=\"hljs-keyword\">continue</span>\n            <span class=\"hljs-keyword\">return</span> r\n        <span class=\"hljs-keyword\">except</span> requests.RequestException:\n            time.sleep(<span class=\"hljs-number\">2</span> ** attempt)\n    <span class=\"hljs-keyword\">raise</span> Exception(<span class=\"hljs-string\">f&quot;Failed after <span class=\"hljs-subst\">{max_retries}</span> retries&quot;</span>)</code></pre><h3>Обробка помилок автентифікації</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">safe_call</span>(<span class=\"hljs-params\">url, key</span>):\n    r = requests.get(url, headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{key}</span>&quot;</span>})\n    <span class=\"hljs-keyword\">if</span> r.status_code == <span class=\"hljs-number\">401</span>:\n        <span class=\"hljs-comment\"># Mind Key недійсний — попередити користувача</span>\n        <span class=\"hljs-keyword\">raise</span> AuthError(<span class=\"hljs-string\">&quot;Mind Key invalid or expired&quot;</span>)\n    <span class=\"hljs-keyword\">return</span> r</code></pre><h2>Поширені сценарії помилок</h2>\n<h3>&quot;Mind Key fehlt oder ungültig&quot;</h3>\n<ul>\n<li>Ви забули заголовок <code>Authorization</code></li>\n<li>Ви використали <code>?key=</code>, але ключ неправильний</li>\n<li>Ви використовуєте JWT там, де потрібен Mind Key</li>\n</ul>\n<h3>&quot;Route not found&quot;</h3>\n<ul>\n<li>Ви вгадали шлях, якого не існує</li>\n<li>Ви неправильно використали метод (напр. <code>GET /memory</code> замість <code>POST /memory</code>)</li>\n<li>Перевірте <code>GET /endpoints</code> для дійсних шляхів</li>\n</ul>\n<h3>&quot;Rate limit exceeded&quot;</h3>\n<ul>\n<li>Ви використовуєте <code>?key=</code> та перевищили 60 запитів/хв</li>\n<li>Перейдіть на заголовок <code>Authorization: Bearer</code></li>\n</ul>\n<h2>Наступні кроки</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Автентифікація</a></li>\n<li><a href=\"/docs/api/overview\">Огляд API</a></li>\n<li><a href=\"/docs/api/rate-limits\">Обмеження частоти</a></li>\n</ul>\n","urls":{"html":"/docs/api/errors","text":"/docs/api/errors?format=text","json":"/docs/api/errors?format=json","llm":"/docs/api/errors?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}