Mensagens

Consulte o histórico de mensagens da empresa — a lista geral com filtros ou o histórico de um contato específico. Ambos exigem plano Enterprise e são paginados. Mensagem com `status: "failed"` traz a falha normalizada em `delivery_error` (`code` estável + `description` em português); `error_type` e `error_message` preservam os dados brutos por compatibilidade. Valores de `error_type` já observados: `network`, `connection_offline`, `config`, `unknown`. Cada mensagem também traz `meta_template_category` (a categoria Meta do template que a originou, ou `null` quando não veio de template) e `prosa`, o débito que a cobriu. ATENÇÃO AO SOMAR CUSTO: deduplique por `prosa.consumption_id` ANTES de somar `prosa.cost_brl`. A cobrança da IA é por TURNO, não por mensagem — um turno que a IA divide em 3 balões gera UM débito e TRÊS mensagens, e as três devolvem o mesmo `consumption_id` com `scope: "turn"`; somar mensagem a mensagem contaria esse débito três vezes. Com `scope: "message"` o débito cobre só aquela mensagem. Para o total do período use GET /api/v1/prosas/consumption, que é o ledger em grão de linha e dispensa deduplicação.

escopo: messages:readEnterprise

Lista mensagens da empresa. Filtros: ?contact_id=&connection_id=&direction=inbound&type=text&status=delivered&from=&to=&page=1&limit=50

  • Deduplique por `prosa.consumption_id` antes de somar `prosa.cost_brl`: com `scope: "turn"` o mesmo débito cobre outros balões da mesma resposta, e somar mensagem a mensagem o conta mais de uma vez. Com `scope: "message"` o débito cobre só aquela mensagem.
  • `prosa: null` significa que não há débito atribuído à mensagem — nunca que ela custou zero. Cai nesse estado a mensagem recebida (inbound não custa), o envio manual do operador, a mensagem anterior à entrada deste campo em produção e o envio de campanha, que debita antes de a mensagem existir e aparece em GET /api/v1/prosas/consumption e no relatório da campanha.
  • `prosa.prosas` e `prosa.cost_brl` são os valores do débito INTEIRO, não uma fração por balão, e refletem a cobrança atribuída à mensagem. Estornos aparecem apenas no ledger (GET /api/v1/prosas/consumption), como linha de valor negativo.
  • `meta_template_category` é `null` em toda mensagem que não saiu de um template aprovado — texto livre da IA, envio manual e mensagem recebida.
  • Quando houver falha, `delivery_error` traz `{ code, description }`: use `code` para automação e `description` para exibir o significado em português. `error_message`/`failure_reason` continuam com o retorno bruto do provedor apenas por compatibilidade.

Resposta (200)

Corpo da resposta
{
  "success": true,
  "data": [
    {
      "id": "<uuid>",
      "contact_id": "<uuid>",
      "direction": "inbound",
      "type": "text",
      "content": "Olá, tudo bem?",
      "media_url": null,
      "media_mimetype": null,
      "media_filename": null,
      "media_caption": null,
      "status": "delivered",
      "error_type": null,
      "error_message": null,
      "delivery_error": null,
      "sender_type": "contact",
      "wamid": "<id-da-meta-ou-provider>",
      "external_id": null,
      "quoted_message_id": null,
      "quoted_content": null,
      "quoted_type": null,
      "connection_id": "<uuid>",
      "is_edited": false,
      "edited_at": null,
      "created_at": "2026-07-15T09:20:00.000Z",
      "timestamp": "2026-07-15T09:20:00.000Z",
      "meta_template_category": null,
      "prosa": null,
      "contacts": {
        "id": "<uuid>",
        "phone": "5548999990000",
        "name": "João Silva",
        "display_name": "João Silva",
        "source_platform": "whatsapp"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 240,
    "total_pages": 5
  }
}

Exemplo

curl
curl -s -H "Authorization: Bearer <sua-key>" https://www.prosalab.com/api/v1/messages
escopo: messages:readEnterprise

Histórico de mensagens de um contato. Filtros: ?from=&to=&direction=&page=1&limit=50

  • Deduplique por `prosa.consumption_id` antes de somar `prosa.cost_brl`: com `scope: "turn"` o mesmo débito cobre outros balões da mesma resposta, e somar mensagem a mensagem o conta mais de uma vez. Com `scope: "message"` o débito cobre só aquela mensagem.
  • `prosa: null` significa que não há débito atribuído à mensagem — nunca que ela custou zero. Cai nesse estado a mensagem recebida (inbound não custa), o envio manual do operador, a mensagem anterior à entrada deste campo em produção e o envio de campanha, que debita antes de a mensagem existir e aparece em GET /api/v1/prosas/consumption e no relatório da campanha.
  • `prosa.prosas` e `prosa.cost_brl` são os valores do débito INTEIRO, não uma fração por balão, e refletem a cobrança atribuída à mensagem. Estornos aparecem apenas no ledger (GET /api/v1/prosas/consumption), como linha de valor negativo.
  • `meta_template_category` é `null` em toda mensagem que não saiu de um template aprovado — texto livre da IA, envio manual e mensagem recebida.
  • Quando houver falha, `delivery_error` traz `{ code, description }`: use `code` para automação e `description` para exibir o significado em português. `error_message`/`failure_reason` continuam com o retorno bruto do provedor apenas por compatibilidade.

Resposta (200)

Corpo da resposta
{
  "success": true,
  "data": [
    {
      "id": "<uuid>",
      "direction": "outbound",
      "type": "text",
      "content": "Seu pedido foi confirmado.",
      "media_url": null,
      "media_mimetype": null,
      "media_filename": null,
      "media_caption": null,
      "status": "failed",
      "error_type": "provider",
      "error_message": "[131026] Message undeliverable - Message Undeliverable.",
      "delivery_error": {
        "code": "131026",
        "description": "Número não tem WhatsApp ativo"
      },
      "sender_type": "system",
      "wamid": "<id-da-meta-ou-provider>",
      "quoted_message_id": null,
      "quoted_content": null,
      "quoted_type": null,
      "connection_id": "<uuid>",
      "is_edited": false,
      "edited_at": null,
      "created_at": "2026-07-15T09:22:00.000Z",
      "timestamp": "2026-07-15T09:22:00.000Z",
      "meta_template_category": null,
      "prosa": {
        "consumption_id": "<uuid>",
        "prosas": 1,
        "cost_brl": 0.01,
        "scope": "turn"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 12,
    "total_pages": 1
  }
}

Erros

StatusCódigoQuando ocorre
404NOT_FOUNDContato não existe ou pertence a outra empresa

Exemplo

curl
curl -s -H "Authorization: Bearer <sua-key>" https://www.prosalab.com/api/v1/contacts/{id}/messages
Mensagens — Prosalab Developers