/relatorios/caixasDesempenho por caixa (canal)
Uma linha por caixa (WhatsApp, Instagram etc.) com conversas novas e resolvidas e mensagens no período todo.
GET /relatorios/caixas
curl "https://chat.forsi.com.br/api/v1/relatorios/caixas?de=2026-09-01&ate=2026-09-30" \
-H "Authorization: Bearer $FORSI_CHAVE"const resposta = await fetch('https://chat.forsi.com.br/api/v1/relatorios/caixas?de=2026-09-01&ate=2026-09-30', {
headers: {
Authorization: `Bearer ${process.env.FORSI_CHAVE}`,
},
});
const json = await resposta.json();
if (!resposta.ok) throw new Error(`${resposta.status} ${json.erro.codigo}: ${json.erro.mensagem}`);
console.log(json.dados);import os
import requests
resposta = requests.get(
"https://chat.forsi.com.br/api/v1/relatorios/caixas",
headers={
"Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
},
params={
"de": "2026-09-01",
"ate": "2026-09-30",
},
timeout=30,
)
corpo = resposta.json()
if not resposta.ok:
raise RuntimeError(f"{resposta.status_code} {corpo['erro']['codigo']}: {corpo['erro']['mensagem']}")
print(corpo["dados"]){
"dados": {
"periodo": {
"de": "2026-10-12",
"ate": "2026-10-12",
"dias": 30,
"fuso": "America/Sao_Paulo",
"granularidade": "dia",
"caixa_id": "7a9d53e9-9d1b-4122-923b-fac67958f445"
},
"resumo": {"caixas":12},
"linhas": [
{
"id": "64ba31d1-11f4-41f2-9d68-33eef70d3495",
"nome": "Maria Souza",
"canal": "whatsapp",
"telefone": "+5531988887777",
"conversas_novas": 12,
"conversas_resolvidas": 12,
"conversas_com_mensagens": 12,
"mensagens_recebidas": 12,
"mensagens_enviadas": 12
}
]
}
}Parâmetros de consulta#
dedata AAAA-MM-DDopcionalPrimeiro dia (AAAA-MM-DD, no fuso da organização). Padrão: 29 dias antes de
ate.atedata AAAA-MM-DDopcionalÚltimo dia, inclusive. Padrão: hoje. O período vai até 366 dias.
caixa_iduuidopcionalSó os números desta caixa (WhatsApp, Instagram...). Veja as caixas em GET /me.
formato"json" | "csv"opcionaljson(padrão) oucsv(UTF-8 com BOM, separado por vírgula, pronto para planilha).
Resposta#
200 com {"dados": ...}: RelatorioCaixas. Com formato=csv, um arquivo CSV.
periodoobjectopcionalO período que valeu na consulta (com os padrões aplicados).
periodo.dedata AAAA-MM-DDopcional—periodo.atedata AAAA-MM-DDopcional—periodo.diasintegeropcional—periodo.fusostringopcional- ex.: America/Sao_Paulo
periodo.granularidade"dia" | "semana" | "mes"opcionalSó nos relatórios em série.
periodo.caixa_iduuidopcional—resumoobjectopcional—resumo.caixasintegeropcional—linhaslista de objectopcionalUma linha por caixa.
linhas[].iduuidopcional—linhas[].nomestringopcional—linhas[].canalstringopcional—linhas[].telefonestring ou nullopcional—linhas[].conversas_novasintegeropcional—linhas[].conversas_resolvidasintegeropcional—linhas[].conversas_com_mensagensintegeropcional—linhas[].mensagens_recebidasintegeropcional—linhas[].mensagens_enviadasintegeropcional—
Erros#
Todo erro vem como {"erro": {"codigo", "mensagem"}}. Trate pelo codigo: ele não muda.
| Status | Quando |
|---|---|
| 401 | Chave ausente ou inválida (resposta igual para qualquer motivo). |
| 403 | Plano sem API, escopo insuficiente ou https/origem recusados. |
| 422 | Dados inválidos ou regra de negócio (ex.: janela_fechada; conta_restrita = a Meta restringiu a conta por spam: erro traz os campos de RestricaoMeta, como ate, escopo, motivo e retry_after_s). |
| 429 | Limite de requisições. Veja Retry-After. |
Códigos de erro que esta área pode devolver6
periodo_longoEscolha um período de até 366 dias.periodo_invalidoPeríodo inválido: `de` precisa ser antes de `ate` (AAAA-MM-DD).granularidade_invalidagranularidade deve ser dia, semana ou mes.caixa_invalidaCaixa não encontrada nesta organização (veja GET /me).limite_relatoriosRelatórios têm limite próprio, mais baixo. Espere o tempo de Retry-After.relatorio_demorouO relatório demorou demais. Escolha um período menor ou uma granularidade maior (semana ou mes).
Os erros que valem para qualquer rota (chave, limite, JSON) estão em Erros.