2. Health & Sistema#
GET/health#
Verifica se o serviço e suas dependencias (MySQL, Redis) estão funcionando.
Auth: Nenhuma
Resposta 200:
{
"status": "ok",
"service": "catcher-api",
"checks": {
"mysql": "ok",
"redis": "ok"
}
}
Resposta 503 (degradado):
{
"status": "degraded",
"service": "catcher-api",
"checks": {
"mysql": "ok",
"redis": "error: connection refused"
}
}
GET/ready#
Verifica se todas as dependencias (MySQL, Redis, S3) estão funcionando.
Auth: Nenhuma
Resposta 200:
{
"status": "ready",
"checks": {
"mysql": "ok",
"redis": "ok",
"s3": "ok",
"email": "configured",
"proxy_audit": "ok"
}
}
Os campos s3 e proxy_audit so aparecem quando S3 / pool de proxy estão configurados. email e sempre presente (configured ou disabled) e e informativo. proxy_audit em estado degraded ou stale faz o /ready responder 503.
Resposta 503 (degradado):
{
"status": "degraded",
"checks": {
"mysql": "ok",
"redis": "error"
}
}
GET/metrics#
Metricas Prometheus.
Auth: Desabilitado por padrão quando METRICS_BEARER_TOKEN estiver vazio. Para expor:
- defina
METRICS_BEARER_TOKENe envieAuthorization: Bearer <METRICS_BEARER_TOKEN> - ou habilite explicitamente
ALLOW_PUBLIC_METRICS=true
Se ALLOW_PUBLIC_METRICS=false e METRICS_BEARER_TOKEN estiver vazio, a API responde 401.
Resposta: Texto no formato Prometheus exposition.
Exemplos de series expostas (não exaustivo): biazap_active_instances, biazap_connection_states, biazap_messages_total, biazap_send_latency_seconds_*, biazap_webhook_failures_total, biazap_send_failures_total, biazap_throttle_pauses_total, biazap_realtime_events_dropped_total (eventos descartados quando o cliente SSE/WS não acompanha o hub), biazap_queue_depth, biazap_redis_latency_seconds_*, biazap_s3_latency_seconds_*.
Stealth / fingerprint hardening (scaffolding inicial):
biazap_send_interval_msbiazap_connection_opens_totalbiazap_connection_closes_totalbiazap_warmup_phasebiazap_warmup_daily_sentbiazap_warmup_daily_capbiazap_fingerprint_platform_totalbiazap_fingerprint_utls_spec_totalbiazap_fingerprint_utls_pool_active_sizebiazap_fingerprint_utls_assignments_totalbiazap_fingerprint_utls_probe_totalbiazap_fingerprint_utls_burn_totalbiazap_fingerprint_city_totalbiazap_hygiene_applied_totalbiazap_send_blocked_totalbiazap_humanize_typing_emitted_totalbiazap_stealth_debug_mode_activebiazap_ban_events_totalbiazap_audit_emit_failed_totalbiazap_audit_emit_dropped_totalbiazap_appversion_fetch_failed_total
As series do Stealth Mode aparecem no /metrics desde o bootstrap, mesmo antes dos produtores definitivos, para que dashboards e canaries possam ser preparados sem esperar as tasks posteriores.
Em biazap_send_blocked_total, o label reason agora inclui inbound_first quando a instância opt-in recusa um outbound para chat sem inbound previo na janela configurada.
GET/v1/monitoring/errors/{id}#
Retorna o JSON completo de um incidente capturado (toda resposta 4xx — exceto 401/403/404/429 — e toda 5xx geram um arquivo INC-YYYY-MM-DD-XXXX). Endpoint público, sem JWT/cookie: a autenticação e feita pelo header X-Incident-Key.
Auth: Header X-Incident-Key: <INCIDENT_KEY> (segredo de ambiente). Sem JWT.
Path param:
| Param | Formato | Descricao |
|---|---|---|
id |
INC-AAAA-MM-DD-XXXX |
ID do incidente (4 caracteres finais são [A-Z0-9]) |
Resposta 200: O JSON do incidente — incident_id, service, timestamp, trace_id, request{method,url,path,remote_addr,user_agent,headers,body}, response{status,headers,body,duration_ms}, error{code,message,stack}, context{}.
Erros (este endpoint usa um envelope aninhado {"error":{"code","message"}}, distinto do envelope unificado da seção 19):
| Status | code | Quando |
|---|---|---|
400 |
INCIDENT_ID_INVALID |
id não casa com INC-AAAA-MM-DD-XXXX |
401 |
INCIDENT_KEY_INVALID |
Header X-Incident-Key ausente ou inválido |
404 |
INCIDENT_NOT_FOUND |
Incidente expirou (>7 dias) ou nunca existiu |
500 |
INCIDENT_READ_FAILED |
Falha ao ler o arquivo do incidente |