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.
/analytics/reports/dispatchBetaEscopo 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/dispatchParâmetros de query
| Parâmetro | Tipo | Descrição |
|---|---|---|
days | int (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
| Campo | Definição |
|---|---|
captured_at, window | Instante do cálculo (UTC) e janela: days, timezone, start e end (dia seguinte ao último). |
campaigns.started | Campanhas que começaram a enviar na janela. |
campaigns.sending, paused, completed, failed, cancelled | Dessas 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_channel | Mensagens enviadas pela organização, por dia e por canal. |
total | Mensagens enviadas no grupo. |
pending, sent, delivered, read, failed | Cada 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_usd | Mensagens cobradas e custo total em dólar na janela. cost vem null quando falta tarifa. |
cost_by_day, cost_by_category | O 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
| Status | Código | Quando |
|---|---|---|
400 | invalid_query | days fora de 1–90 ou parâmetro desconhecido. |
401 | missing_api_key / invalid_api_key | API key ausente, inválida, expirada ou revogada. |
403 | missing_scope | A chave não tem o escopo analytics:read. |
413 | report_too_large | O relatório passou do limite de tamanho. Reduza days. |
429 | rate_limited | Acima 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.
Relatório de atendimento
GET /analytics/reports/service — SLA atual, volume de mensagens por dia e por canal, e CSAT/NPS respondidos na janela.
Relatório de agenda, tarefas, formulários e automações
GET /analytics/reports/operations — agendamentos por situação e profissional, tarefas por responsável, respostas por formulário e execuções por automação.