Skip to content

Erros (RFC 7807)

Todos os erros seguem RFC 7807 (Problem Details). Content-Type: application/problem+json.

Estrutura padrao

{
"type": "about:blank",
"title": "Chip nao encontrado",
"status": 404,
"code": "chip-not-found",
"detail": "Chip 01HZTQ... nao existe.",
"extra": {
"chip_id": "01HZTQ..."
}
}
CampoNotas
typeURI do tipo do erro. Hoje sempre about:blank (campo mantido pra compat futura)
titleresumo legivel em PT-BR
statusHTTP status code
codeidentificador unico estavel (use isso pra logica do consumer)
detailmensagem mais especifica
extraobjeto com campos contextuais (chip_id, app_id, etc)

Use code pra branching no seu codigo, nao title ou detail — sao mensagens humanas e podem mudar.

Codigos por dominio

Chips

CodeHTTPQuando
chip-not-found404ID nao existe
chip-not-connected409tentou enviar mensagem por chip nao-connected
chip-qr-unavailable409tentou pegar QR de chip nao-pairing (ou ainda nao gerou)

Apps

CodeHTTPQuando
app-not-found404ID nao existe
app-chip-access-forbidden403app nao tem can_send/can_receive no chip
unauthorized401api_key invalida/expirada

Mensagens

CodeHTTPQuando
message-not-found404ID nao existe ou app nao tem acesso
idempotency-conflict409idempotency_key reutilizada com payload diferente
unsupported-message-type422type nao reconhecido
daily-limit-exceeded429chip atingiu daily_message_limit

Midia

CodeHTTPQuando
media-not-found404id nao existe OU app sem acesso

Transcricao

CodeHTTPQuando
transcription-disabled422TRANSCRIPTION_PROVIDER=disabled no hub

Push devices

CodeHTTPQuando
push-device-not-found404ID nao existe

Contatos

CodeHTTPQuando
contact-not-found404JID nao existe pra esse chip
chip-offline503foto requisitada mas chip nao esta connected

Webhook deliveries

CodeHTTPQuando
webhook-delivery-not-found404ID nao existe

Validacao

CodeHTTPQuando
validation400body/query falhou validacao Zod. extra.issues traz array de problemas

Exemplo:

{
"code": "validation",
"status": 400,
"title": "Validacao falhou",
"detail": "campos invalidos no body",
"extra": {
"issues": [
{ "path": ["to"], "message": "Required" },
{ "path": ["content", "text"], "message": "String must contain at least 1 character(s)" }
]
}
}

Erros do servidor (5xx)

Hub raramente retorna 5xx — quando retorna, indica bug ou infra fora. Recomendado retry com backoff do seu lado.

CodeHTTPTipo
internal-error500erro nao tratado
service-unavailable503dependencia (Postgres/Redis/MinIO) caiu

/health/ready falha junto. Monitore.

Padrao de tratamento

async function callHub(method, path, body) {
const res = await fetch(`${HUB}${path}`, {
method,
headers: { 'Authorization': `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: body ? JSON.stringify(body) : undefined,
})
if (!res.ok) {
const problem = await res.json().catch(() => ({}))
const err = new Error(problem.detail || problem.title || `HTTP ${res.status}`)
err.status = res.status
err.code = problem.code
err.extra = problem.extra
throw err
}
if (res.status === 204) return null
return res.json()
}
// Uso:
try {
const msg = await callHub('POST', '/v1/messages', { ... })
} catch (e) {
if (e.code === 'idempotency-conflict') {
// mesma key foi usada antes — pega a mensagem original
const original = await callHub('GET', `/v1/messages/${e.extra.existing_message_id}`)
} else if (e.code === 'chip-not-connected') {
// re-tenta apos reconnect ou avisa o operador
} else {
throw e
}
}