# Contrato API — Operational Feed (Spec 041)

**Base URL:** `https://desk.ligbox.com.br/api/v1/ops-inbox`  
**Auth:** `Authorization: Bearer {jwt}`  
**Permissão (fase A):** `can_manage_users`  
**Implementação:** `OF-API-002` · `api/app/ops_inbox_routes.py`  
**Store:** `OF-API-001` · `api/app/ops_inbox_store.py`

---

## OF-EP-001 — GET /stats

KPIs e contadores por canal.

**Response 200:**

```json
{
  "events_today": 6,
  "pending": 6,
  "critical": 1,
  "awaiting_you": 5,
  "sla_avg_pct": 96,
  "channels": [
    { "id": "all", "label": "Todos os canais", "count": 6 },
    { "id": "whatsapp", "label": "WhatsApp API", "count": 1 },
    { "id": "email", "label": "Email", "count": 1 }
  ]
}
```

---

## OF-EP-002 — GET /events

**Query parameters:**

| Param | Tipo | Default | Descrição |
|-------|------|---------|-----------|
| channel | string | `all` | Filtrar canal |
| priority | string | — | `normal`, `high`, `critical` |
| status | string | — | `open`, `pending`, `resolved` |
| q | string | — | Busca title/preview/contact |
| limit | int | 128 | Max 500 |

**Response 200:**

```json
{
  "events": [
    {
      "id": "evt-wa-001",
      "channel": "whatsapp",
      "event_type": "message",
      "priority": "high",
      "title": "Cliente: Empresa Alpha — …",
      "preview": "Bom dia, após o login…",
      "tags": ["Cliente", "Acesso"],
      "assignee": "Editor",
      "status": "open",
      "contact_name": "Empresa Alpha",
      "contact_company": "Empresa Alpha Ltda",
      "contact_cnpj": "12.345.678/0001-90",
      "contact_client_id": "CLI-8842",
      "sla_minutes": 15,
      "sla_remaining_sec": 750,
      "created_at": "2026-06-29T…"
    }
  ],
  "total": 1
}
```

---

## OF-EP-003 — GET /events/{event_id}

**Response 200:**

```json
{
  "event": {
    "id": "evt-wa-001",
    "channel": "whatsapp",
    "messages": [
      {
        "id": 1,
        "author_type": "user",
        "author_label": "Empresa Alpha",
        "body": "Bom dia, não consigo acessar…",
        "created_at": "…"
      }
    ]
  }
}
```

**404:** event not found

---

## OF-EP-004 — POST /events/{event_id}/messages

**Request:**

```json
{
  "body": "Texto da resposta ou nota",
  "note_type": "reply"
}
```

`note_type`: `reply` | `internal_note`

**Response 200:**

```json
{
  "message": {
    "id": 4,
    "event_id": "evt-wa-001",
    "author_type": "operator",
    "author_label": "Roger",
    "body": "…",
    "created_at": "…"
  }
}
```

---

## OF-EP-005 — PATCH /events/{event_id}

**Request (campos opcionais):**

```json
{
  "status": "resolved",
  "assignee": "NOC",
  "priority": "high"
}
```

**Response 200:** `{ "event": { … } }`

---

## Códigos de erro

| HTTP | Condição |
|------|----------|
| 401 | Token inválido |
| 403 | Sem permissão |
| 404 | Evento não encontrado |

---

## Webhooks (fase B — não implementados)

| Código planeado | Método | Path |
|-----------------|--------|------|
| OF-EP-101 | POST | `/api/v1/ops-inbox/webhooks/email` |
| OF-EP-102 | POST | `/api/v1/ops-inbox/webhooks/whatsapp` |
| OF-EP-103 | POST | `/api/v1/ops-inbox/webhooks/telegram` |
