Erros & Limites

Códigos de erro HTTP, formato das respostas de erro, e limites de rate.

Actualizado em Abril 2026

Formato das respostas de erro

Quando um pedido falha, a API devolve um JSON com a seguinte estrutura:

Estrutura de erro
{
  "statusCode": 401,
  "message": "API Key inválida ou revogada.",
  "error": "Unauthorized"
}

Códigos HTTP

Códigos de resposta

NomeTipoObrig.Descrição
200HTTPnãoPedido bem-sucedido.
201HTTPnãoRecurso criado com sucesso.
400HTTPnãoPedido inválido — verifica os campos obrigatórios e os tipos de dados.
401HTTPnãoNão autorizado — API Key em falta, inválida ou revogada.
403HTTPnãoProibido — a chave não tem o scope necessário para esta operação.
404HTTPnãoRecurso não encontrado — verifica o ID e o Company ID.
409HTTPnãoConflito — o recurso já existe (ex: NIF duplicado).
422HTTPnãoEntidade não processável — dados válidos mas com erro de negócio.
429HTTPnãoDemasiados pedidos — rate limit atingido.
500HTTPnãoErro interno do servidor — reporta em suporte@uwata.app.

Mensagens de erro comuns

Erros frequentes

NomeTipoObrig.Descrição
API Key inválida ou revogada401nãoO token não existe ou foi revogado. Gera uma nova chave no Dashboard.
Scope insuficiente403nãoA chave não tem o scope necessário. Ex: precisas de clients:write para criar clientes.
X-Company-Id em falta400nãoO cabeçalho X-Company-Id é obrigatório em todos os pedidos.
Empresa não encontrada404nãoO Company ID não corresponde à empresa associada à API Key.
Limite de API Keys atingido422nãoMáximo de 10 chaves activas por empresa. Revoga chaves não utilizadas.

Rate Limiting

A API aplica limites de pedidos por chave para garantir a disponibilidade do serviço. Quando o limite é atingido, recebes um 429 Too Many Requests.

Limites actuais

NomeTipoObrig.Descrição
Pedidos por minutolimitnão60 pedidos por minuto por API Key.
Pedidos por horalimitnão1.000 pedidos por hora por API Key.
Pedidos por dialimitnão10.000 pedidos por dia por empresa.
Os cabeçalhos X-RateLimit-Remaining e X-RateLimit-Reset serão adicionados nas próximas versões da API.

Tratamento de erros no código

Tratar erros
const res = await fetch('https://api.uwata.app/api/v1/v1/invoices', {
  headers: { Authorization: `Bearer ${API_KEY}`, 'X-Company-Id': COMPANY_ID },
})

if (!res.ok) {
  const error = await res.json()
  console.error(`Erro ${error.statusCode}: ${error.message}`)
  // Tratar conforme o statusCode
  if (res.status === 429) {
    // Rate limit — aguardar e tentar novamente
    await new Promise(r => setTimeout(r, 1000))
  }
}

Retry com backoff exponencial

Para erros 429 ou 5xx, implementa retry com backoff exponencial: aguarda 1s, depois 2s, depois 4s, até um máximo de 3 tentativas.

Retry com backoff
async function fetchWithRetry(url, options, retries = 3) {
  for (let i = 0; i < retries; i++) {
    const res = await fetch(url, options)
    if (res.ok) return res.json()
    if (res.status === 429 || res.status >= 500) {
      await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000))
      continue
    }
    throw await res.json()
  }
  throw new Error('Máximo de tentativas atingido')
}