ligbox-ops-platform/specs/001-webhook-vm112-integration/contracts/webhook-onboard.md
Ligbox Spec Hub 3a2c64834b Initial import: ligbox-ops-platform + specs + LAPTOP + obsidian merge (CT130)
Source: VM122 /opt + obsidian-infra + LAPTOP
Hub: CT130 spec-hub 10.10.10.130
2026-06-19 17:26:41 +00:00

1.9 KiB

API Contract: POST /api/v1/webhooks/onboard

Service: Ligbox Ops Platform API (VM122)
Base URL (LAN): http://10.10.10.122:8080
Auth: Header X-Webhook-Secret

Request

POST /api/v1/webhooks/onboard HTTP/1.1
Host: 10.10.10.122:8080
Content-Type: application/json
X-Webhook-Secret: <shared-secret>

{
  "event": "account.created",
  "domain": "cliente.exemplo.com",
  "session_id": "sess-abc123",
  "data": {
    "email": "admin@cliente.exemplo.com",
    "account_verified": true,
    "needs_review": false,
    "dns_mode": "cloudflare",
    "mail_aliases": ["suporte.cliente.exemplo.com"]
  }
}

Response 200

{
  "accepted": true,
  "event": "account.created"
}

Response 401

{
  "detail": "invalid webhook secret"
}

Event Types

Event Emissor (fase) Cria ticket?
account.created Phase B (MVP) Sim
domain.validated Phase D Não (só audit log)
dns.applied Phase D Não
onboarding.completed Phase D Nota/update
onboarding.failed Phase D Sim (prioridade)

Idempotency

Repetir o mesmo request (mesmo event + session_id + domain) retorna 200 accepted sem criar ticket duplicado.

cURL example

curl -sf -X POST "http://10.10.10.122:8080/api/v1/webhooks/onboard" \
  -H "Content-Type: application/json" \
  -H "X-Webhook-Secret: ligbox-ops-dev-secret" \
  -d '{
    "event": "account.created",
    "domain": "teste.ops.ligbox",
    "session_id": "demo-e2e-001",
    "data": {
      "email": "admin@teste.ops.ligbox",
      "account_verified": true,
      "needs_review": false
    }
  }'
Method Path Descrição
GET /health Health check API
GET /api/v1/tenants Lista tenants
GET /api/v1/desk/tickets Lista tickets (verificar criação)
GET /api/v1/infra/vm112/status Poll health portal