CRM Oficina Martech
ReferênciaRelatórios

Relatório de disparos e canais

GET /analytics/reports/dispatch — campanhas iniciadas na janela, entrega das mensagens enviadas e custo em dólar por dia e por categoria.

GET/analytics/reports/dispatchBeta

Escopo necessário: analytics:read

Responde como foram os envios: quantas campanhas começaram a enviar, quanto das mensagens enviadas foi entregue e lido, por dia e por canal, e quanto custaram as mensagens cobradas. O relatório é agregado: não traz destinatários nem conteúdo.

Endpoint

GET https://crm.oficinamartech.com/api/v1/analytics/reports/dispatch

Parâmetros de query

ParâmetroTipoDescrição
daysint (1-90)Janela em dias. Default: 30. Termina no fim de hoje, no fuso da organização.

Um parâmetro fora desta lista é recusado com 400.

window.start é o primeiro dia da janela e window.end é o dia seguinte ao último. Os dias seguem o fuso da organização (window.timezone). A resposta usa Cache-Control: private, no-store.

Exemplo

curl -s "https://crm.oficinamartech.com/api/v1/analytics/reports/dispatch?days=30" \
  -H "Authorization: Bearer crm_live_SEU_PREFIXO_SEU_SEGREDO"

Resposta 200

{
  "captured_at": "2026-11-13T15:20:41.318Z",
  "window": {
    "days": 30,
    "timezone": "America/Sao_Paulo",
    "start": "2026-10-15",
    "end": "2026-11-14"
  },
  "campaigns": {
    "started": 6,
    "sending": 1,
    "paused": 0,
    "completed": 4,
    "failed": 0,
    "cancelled": 1,
    "total_contacts": 5200,
    "total_sent": 4810,
    "total_delivered": 4520,
    "total_read": 2630,
    "total_failed": 64,
    "total_skipped": 40,
    "total_blocked": 210
  },
  "delivery_by_day": [
    {
      "date": "2026-11-12",
      "total": 960,
      "pending": 4,
      "sent": 31,
      "delivered": 402,
      "read": 505,
      "failed": 18,
      "delivery_rate": 0.9669
    }
  ],
  "delivery_by_channel": [
    {
      "channel_id": "ab12ab12-58cc-4372-a567-0e02b2c3d479",
      "channel_name": "Comercial",
      "total": 7400,
      "pending": 12,
      "sent": 210,
      "delivered": 3150,
      "read": 3900,
      "failed": 128,
      "delivery_rate": 0.9711
    }
  ],
  "cost": {
    "messages": 4120,
    "cost_usd": 186.4
  },
  "cost_by_day": [
    {
      "date": "2026-11-12",
      "messages": 880,
      "cost_usd": 39.6
    }
  ],
  "cost_by_category": [
    {
      "category": "marketing",
      "messages": 3900,
      "cost_usd": 181.2
    },
    {
      "category": "utility",
      "messages": 220,
      "cost_usd": 5.2
    }
  ]
}

Campos

CampoDefinição
captured_at, windowInstante do cálculo (UTC) e janela: days, timezone, start e end (dia seguinte ao último).
campaigns.startedCampanhas que começaram a enviar na janela.
campaigns.sending, paused, completed, failed, cancelledDessas campanhas, quantas estão hoje em cada situação.
campaigns.total_*Contadores acumulados dessas campanhas, inclusive o que foi enviado fora da janela: contatos, enviadas, entregues, lidas, com falha, ignoradas e barradas pelas regras de envio.
delivery_by_day, delivery_by_channelMensagens enviadas pela organização, por dia e por canal.
totalMensagens enviadas no grupo.
pending, sent, delivered, read, failedCada mensagem conta uma vez, na situação atual. Uma mensagem lida aparece só em read, não em delivered.
delivery_rate(delivered + read) / (sent + delivered + read), de 0 a 1. null quando nada saiu de pending ou failed.
cost.messages, cost.cost_usdMensagens cobradas e custo total em dólar na janela. cost vem null quando falta tarifa.
cost_by_day, cost_by_categoryO mesmo custo por dia e por categoria de cobrança (category).

cost_usd considera só as mensagens cobradas, enviadas pelo canal oficial. As demais não entram em cost, mas entram em delivery_*, que conta toda mensagem enviada pela organização (equipe, automação, IA e campanha, inclusive em grupos), e por isso não coincide com o volume do relatório de atendimento. Quando alguma mensagem cobrada da janela não tem tarifa cadastrada, cost vem null e as duas listas de custo vêm vazias; o restante do relatório não muda. A lista de delivery_by_channel inclui todos os canais com envio na janela.

Erros

StatusCódigoQuando
400invalid_querydays fora de 1–90 ou parâmetro desconhecido.
401missing_api_key / invalid_api_keyAPI key ausente, inválida, expirada ou revogada.
403missing_scopeA chave não tem o escopo analytics:read.
413report_too_largeO relatório passou do limite de tamanho. Reduza days.
429rate_limitedAcima de 120 req/min por chave ou por organização.
500—Erro interno.

Um nome de relatório desconhecido no caminho responde 404 not_found.

On this page