Skip to main content

Erros e tratamento de erros

Códigos de status HTTP, formato de resposta de erro e como se recuperar de erros comuns.


Erros e tratamento de erros

O Synapse usa códigos de status HTTP padrão com um formato consistente de resposta de erro. Esta página explica como interpretar e se recuperar de erros.

Formato de resposta de erro

Todos os erros retornam JSON com esta estrutura:

{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Mind Key fehlt oder ungültig.",
  "docs": "https://synapse.schaefer.zone/docs/getting-started/authentication"
}
Campo Descrição
statusCode Código de status HTTP
error Nome do status HTTP
message Descrição do erro legível para humanos
docs URL para a documentação relevante (quando aplicável)

Códigos de status HTTP

200 OK

Sucesso. A requisição foi processada corretamente.

201 Created

Sucesso. Um novo recurso foi criado (ex.: POST /memory).

204 No Content

Sucesso. Sem corpo retornado (ex.: DELETE /memory/:id).

400 Bad Request

A requisição estava malformada. Causas comuns:

  • Campos JSON obrigatórios ausentes
  • Sintaxe JSON inválida
  • Valor de enum inválido (ex.: categoria errada)
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "category must be one of: identity, preference, fact, project, skill, mistake, context, note, credentials"
}

Correção: Confira o corpo da requisição com a documentação da API. Garanta que todos os campos obrigatórios estão presentes e têm valores válidos.

401 Unauthorized

A autenticação falhou. Causas comuns:

  • Cabeçalho Authorization ausente
  • Mind Key ou JWT inválido
  • Uso de Mind Key onde JWT é necessário (ou vice-versa)
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Mind Key fehlt oder ungültig.",
  "docs": "https://synapse.schaefer.zone/docs/getting-started/authentication"
}

Correção: Verifique seu token. Consulte Autenticação.

403 Forbidden

Você está autenticado, mas não tem permissão para realizar esta ação. Causas comuns:

  • Tentativa de excluir o mind de outro usuário
  • Tentativa de verificar uma memória com Mind Key (requer JWT)
  • Mind desativado

Correção: Verifique se você está usando o tipo correto de token para este endpoint.

404 Not Found

O caminho ou recurso solicitado não existe.

**NÃO tente adivinhar caminhos de endpoint.** Apenas os caminhos listados em `GET /endpoints` existem. Se você recebeu um 404, usou um caminho errado.
{
  "statusCode": 404,
  "error": "Not Found",
  "message": "Route GET /memory/list not found",
  "docs": "https://synapse.schaefer.zone/docs/api/errors"
}

Correção: Chame GET /endpoints para ver a lista de endpoints válidos. Compare sua URL com a lista caractere por caractere.

409 Conflict

A requisição conflita com o estado existente. Causas comuns:

  • Tentativa de registrar com um email que já existe
  • URL de webhook duplicada

Correção: Use um valor diferente, ou use PUT para atualizar o recurso existente.

429 Too Many Requests

Você atingiu um limite de taxa. Aplica-se apenas à auth via parâmetro de consulta ?key= (60/min).

{
  "statusCode": 429,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Use Authorization header for unlimited access."
}

Cabeçalhos da resposta:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Retry-After: 42

Correção: Mude para o cabeçalho Authorization: Bearer (sem limite de taxa), ou aguarde Retry-After segundos.

500 Internal Server Error

Erro de servidor. Isso não deveria acontecer — se acontecer, é um bug.

Correção:

  1. Faça retry com backoff exponencial (1s, 2s, 4s, 8s)
  2. Verifique GET /health para ver se o servidor está no ar
  3. Se persistir, relate o erro

503 Service Unavailable

Servidor temporariamente indisponível (ex.: durante deploy, migração de banco).

Correção: Aguarde e tente novamente. Verifique GET /health.

Padrões de recuperação

Retry com backoff exponencial

import time
import requests

def call_with_retry(url, max_retries=3):
    for attempt in range(max_retries):
        try:
            r = requests.get(url, headers={"Authorization": f"Bearer {KEY}"})
            if r.status_code == 429:
                wait = int(r.headers.get("Retry-After", 60))
                time.sleep(wait)
                continue
            if r.status_code >= 500:
                time.sleep(2 ** attempt)
                continue
            return r
        except requests.RequestException:
            time.sleep(2 ** attempt)
    raise Exception(f"Failed after {max_retries} retries")

Tratamento de erro de auth

def safe_call(url, key):
    r = requests.get(url, headers={"Authorization": f"Bearer {key}"})
    if r.status_code == 401:
        # Mind Key invalid — alert user
        raise AuthError("Mind Key invalid or expired")
    return r

Cenários comuns de erro

"Mind Key fehlt oder ungültig"

  • Você esqueceu o cabeçalho Authorization
  • Você usou ?key= mas a chave está errada
  • Você está usando um JWT onde uma Mind Key é necessária

"Route not found"

  • Você tentou adivinhar um caminho que não existe
  • Você usou um verbo errado (ex.: GET /memory vs POST /memory)
  • Confira GET /endpoints para caminhos válidos

"Rate limit exceeded"

  • Você está usando ?key= e excedeu 60 req/min
  • Mude para o cabeçalho Authorization: Bearer

Próximos passos