Códigos de erro

A API usa códigos HTTP padrão combinados com um envelope de erro estruturado. Todos os erros seguem o mesmo formato.

Formato do erro

{
  "error": {
    "code": "NOT_FOUND",
    "message": "Estudante não encontrado.",
    "details": {
      "id": "550e8400-e29b-41d4-a716-446655440000"
    }
  }
}
CampoTipoDescrição
error.codestringCódigo de erro padronizado (ver tabela abaixo)
error.messagestringMensagem legível para humanos em português
error.detailsobject (opcional)Detalhes adicionais (ex: campos de validação, IDs)

Códigos de erro

Autenticação e autorização (401/403)

CodeHTTPQuando ocorre
MISSING_API_KEY401Nenhuma API key enviada
INVALID_API_KEY401API key inexistente, inativa, ou formato inválido
EXPIRED_API_KEY401API key expirada (expiresAt no passado)
REVOKED_API_KEY401API key revogada pelo administrador
INSUFFICIENT_SCOPE403A key não tem o scope necessário para o endpoint
BRANCH_SCOPE_MISMATCH403Key BRANCH tentou acessar outra branch via x-branch-id

Branch e contexto (400/404)

CodeHTTPQuando ocorre
BRANCH_REQUIRED400Key BUSINESS sem header x-branch-id em endpoint branch-scoped
INVALID_BRANCH404/400Branch não existe, não pertence ao Business, ou está inativa

Validação e requisição (400/404/405/409)

CodeHTTPQuando ocorre
VALIDATION_ERROR400Dados enviados não passaram na validação (campos obrigatórios faltando, valores inválidos, etc.)
BAD_REQUEST400JSON inválido ou requisição malformada
NOT_FOUND404Recurso solicitado não existe
METHOD_NOT_ALLOWED405Método HTTP não suportado pela rota
CONFLICT409Conflito de estado (ex: webhook já existe para esta branch)

Rate limiting (429)

CodeHTTPQuando ocorre
RATE_LIMITED429Limite de requisições por minuto excedido

Veja Rate Limits para detalhes.

Idempotência (409)

CodeHTTPQuando ocorre
IDEMPOTENCY_CONFLICT409Idempotency-Key reutilizada com payload diferente

Veja Idempotência para detalhes.

Erro interno (500)

CodeHTTPQuando ocorre
INTERNAL_ERROR500Erro inesperado no servidor

Erros de validação (VALIDATION_ERROR)

Quando a validação falha, details contém a lista de issues:

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Erro de validação nos dados enviados.",
    "details": [
      {
        "code": "too_small",
        "path": ["name"],
        "message": "String deve conter pelo menos 1 caractere(s)"
      }
    ]
  }
}

Códigos HTTP

HTTPSignificado
200Sucesso (GET, PUT)
201Criado (POST)
204Sem conteúdo (DELETE)
400Erro de validação ou requisição inválida
401Não autenticado
403Autenticado mas sem permissão
404Recurso não encontrado
405Método não permitido
409Conflito
429Rate limit excedido
500Erro interno

Tratamento de erros recomendado

async function callGdreduApi (url, options) {
  const res = await fetch(url, options)
  const body = await res.json().catch(() => null)

  if (!res.ok) {
    const err = body?.error
    if (err?.code === 'RATE_LIMITED') {
      // Implementar backoff e retry
      const retryAfter = parseInt(res.headers.get('Retry-After') || '60', 10)
      await sleep(retryAfter * 1000)
      return callGdreduApi(url, options)
    }
    if (err?.code === 'INVALID_API_KEY' || err?.code === 'EXPIRED_API_KEY') {
      // Notificar que a key precisa ser renovada
      throw new Error(`Problema de autenticação: ${err.message}`)
    }
    throw new Error(`${err?.code || 'UNKNOWN'}: ${err?.message || res.statusText}`)
  }

  return body
}


Did this page help you?