Skip to content

Audit & Events

WPP Hub e construido com auditoria como pilar de produto (ADR 007). Toda mutacao admin grava entry append-only em audit_events. Tabela tem trigger Postgres bloqueando UPDATE/DELETE — nem o hub consegue alterar historico.

audit_events — trilha admin

GET /v1/audit-events

Lista paginada com filtros.

Query params

ParamNotas
actor_typeadmin | bootstrap | app | system
actionchip.create, app.update, webhook.replay, etc
resource_typechip | app | webhook_delivery | …
resource_idULID do recurso
since, untilISO datetime
beforecursor — created_at do ultimo item
limitint 1-200, default 50

Response

{
"data": [
{
"id": "01HZTQ...",
"actor_type": "admin",
"actor_id": "01HZTQADMIN...",
"actor_label": "gustavo (key: ops-machine)",
"action": "app.update",
"resource_type": "app",
"resource_id": "01HZTQAPP...",
"before": { "webhook_url": "https://old.com" },
"after": { "webhook_url": "https://new.com" },
"metadata": { "ip": "..." },
"created_at": "..."
}
],
"next_before": "..."
}

GET /v1/audit-events.csv

Export do mesmo filtro acima como CSV. Util pra compliance/auditoria externa.

Retencao

audit_events nunca sao podadas (D13). Append-only por design — cresce indefinido. Em volume real (>100M events), considerar particionamento por mes.

chip_events — historico do chip

Diferente de audit_events (trilha admin), chip_events registra mudancas de estado do chip (open/close/qr/banned/qr_loop/etc).

GET /v1/chip-events/:chipId

{
"data": [
{
"id": "01HZTQ...",
"chip_id": "...",
"event_type": "connection.close",
"metadata": {
"reason": "badSession",
"will_reconnect": true,
"is_terminal": false,
"status_code": 500,
"consecutive_bad_session": 1
},
"occurred_at": "..."
}
],
"next_before": "..."
}

Tipos de evento (ChipEventType)

event_typeQuando
connection.openchip conectou (apos pareamento OU reconnect)
connection.closechip desconectou (transient ou terminal — ver metadata.is_terminal)
chip.qrQR code gerado (cada refresh)
chip.logged_outchip ficou terminal por loggedOut/badSession streak
chip.banneddetector marcou como banned
chip.qr_loopdetector identificou pairing >5min
chip.bad_session_streakpreventivo — consecutiveBadSession==2

Retencao

chip_events sao podadas apos CHIP_EVENTS_RETENTION_DAYS (default 90 dias). Configuravel.

Endpoints administrativos extras

EndpointDescricao
GET /v1/admin/meidentidade da admin key atual
GET /v1/admin/dashboardsumario JSON (chips por status, contadores, ultimos eventos)
GET /v1/admin/messagesbusca paginada de mensagens cross-app + filtros
GET /v1/admin/messages/:iddetalhe de 1 mensagem
POST /v1/admin/messages/:id/transcribetranscricao manual (admin override)
POST /v1/admin/messages/:id/favoritemarca como favorito (UI dashboard)
GET /v1/admin/users + CRUDgerenciar admin users (Fase 7.5d)
POST /v1/admin/users/:id/keyscriar admin key nomeada
DELETE /v1/admin/keys/:idrevogar admin key
GET /v1/admin/media/:idacesso admin a midia (sem auth de app)