@lionchat/mcp-server 1.29.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -188,7 +188,7 @@ Muitos campos objeto/lista são **trocados inteiros** no update: o que não vier
188
188
 
189
189
  | TROCA inteira (leia e reenvie tudo) | SOMA (só as chaves enviadas mudam) |
190
190
  |---|---|
191
- | `custom_attributes` da CONVERSA (`conversations_create_3` — só `captain_*` sobrevive; apaga utm/gclid/ctwa/origin) | `custom_attributes` do CONTATO (`contacts_update`) |
191
+ | `custom_attributes` da CONVERSA (`conversations_create_3` — troca os atributos DO CLIENTE; desde 06/10/2026 o dado do sistema fica FORA dessa troca: não é apagado e também não é gravado por aqui — ctwa/origin/UTM oficiais/cliques do Google/waha/captain e qualquer atributo marcado como do sistema. Atributo próprio do cliente segue normal, mesmo com nome parecido, ex.: `utm_loja_fisica`) | `custom_attributes` do CONTATO (`contacts_update`) |
192
192
  | card: cada chave de `item_details` (a lista `custom_attributes` do card, `offers`, `notes`), `assigned_agents`, coluna `custom_attributes` | `item_details` do card no 1º nível (chave não enviada fica) |
193
193
  | `funnel.settings`, `funnel.stages` (etapa ausente = removida), `kanban_config.global_custom_attributes` | `channel.additional_attributes` da caixa WhatsApp/Instagram/Facebook/TikTok |
194
194
  | `flow_data` do fluxo, `actions` de macro/automação, `query` de filtro salvo, `audience` de campanha | `roles_layout` do modelo de contrato |
@@ -292,7 +292,7 @@ POST /api/v1/accounts/{account_id}/kanban_items
292
292
  2. lionchat_reports_list (por agente — passa since/until em Unix EM SEGUNDOS)
293
293
  3. Comparar avg_first_response_time entre agentes
294
294
  ```
295
- **`since`/`until` dos relatórios só aceitam número Unix em SEGUNDOS** (`1782864000` = 01/07/2026 00:00
295
+ **`since`/`until` dos relatórios: prefira número Unix em SEGUNDOS** (desde 05/10/2026 também aceitam `aaaa-mm-dd` = dia inteiro no fuso da conta, ISO 8601 com fuso e milissegundos) (`1782864000` = 01/07/2026 00:00
296
296
  UTC), nunca ISO 8601 nem data por extenso — o formato ISO do resto da plataforma (seção 3) NÃO vale
297
297
  aqui. Desde 29/07/2026 a API recusa com HTTP 400 (`invalid_date_params`); antes disso o relatório
298
298
  voltava ZERADO com HTTP 200 (a conta 19 tinha 4.396 conversas no período e a resposta vinha zero).
@@ -627,6 +627,14 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
627
627
  | `eclinica_ultima_cobranca_vencimento` | date | Vencimento da última cobrança |
628
628
  | `eclinica_ultima_cobranca_descricao` | text | Descrição da última cobrança |
629
629
 
630
+ **O cadastro do paciente pode mudar de contato (07/10/2026).** Todos os atributos `eclinica_*` desta
631
+ tabela (e `endereco_unidade` / `unidade_de_atendimento`) acompanham o paciente: quando a clínica troca o
632
+ celular para um número que já é de OUTRO contato da conta, eles saem do contato antigo e passam para o
633
+ contato do número novo, junto com os lembretes pendentes. O contato antigo fica com
634
+ `additional_attributes.eclinica_vinculo_cedido` (para onde foi) e o novo pode ter
635
+ `additional_attributes.eclinica_vinculo_recebido` (de onde veio) — chaves do sistema, só leitura. Ver o
636
+ `troubleshooting` ("A clínica trocou o celular do paciente...").
637
+
630
638
  **Regras de atualização que enganam na leitura (2026-08-20/21):**
631
639
 
632
640
  - `eclinica_situacao` e `eclinica_cor` são **esparsas**: evento de agenda que vem SEM o campo
@@ -807,6 +815,15 @@ ContactDocument (aba Documentos do contato, 2026-06-11)
807
815
  └── ações: preview, download, renomear, favoritar, excluir (conversas são só-leitura)
808
816
  ```
809
817
 
818
+ **Paginação opcional da aba Documentos (2026-10-06):** `lionchat_contacts_documents_list` e
819
+ `lionchat_companies_documents_list` aceitam `page` (50 por página, `per_page` até 100) e, junto com ele, os filtros
820
+ `source` (contact/kanban/conversation/agenda/lead_form/esignature), `type` (images/pdf/sheets/docs/other), `favorite`
821
+ e `q` (nome); a empresa aceita também `owner_id` (dono do arquivo). Com `page` a resposta é `{payload, meta: {total,
822
+ page, per_page, total_pages, contacts, truncated}}`, o `total` já vem filtrado e uma página que não existe mais vira
823
+ a última. **Sem `page` nada mudou: a lista inteira, como sempre.** Para quem tem muitos arquivos prefira paginar —
824
+ só os itens da página trazem os links assinados (`open_url`/`download_url`/`preview_url`), então a resposta é bem
825
+ menor (medido: 255 arquivos, 304 KB -> 59 KB por página).
826
+
810
827
  **Histórico de preenchimentos por CONTATO (2026-08-21 — entra com o próximo deploy do app depois
811
828
  de 21/08/2026):** `GET /contacts/{id}/form_entries` (aba "Preenchimentos" da ficha; tools
812
829
  `lionchat_contacts_form_entries_list` / `_show`) junta, em ordem de data, o que a pessoa preencheu
@@ -245,10 +245,11 @@ payload=[
245
245
  **R3 — Ganhos do mês por agente/time:**
246
246
  `kanban_items_list_3 funnel_id=37 from=2026-07-01 to=2026-07-31 user_ids=[6,12]` (ou `team_id=3`)
247
247
 
248
- > ⚠️ **`from`/`to` deste relatório: mande SEMPRE timestamp UNIX.** Data por extenso (`2026-07-01`)
249
- > só é aceita a partir da atualização de 26/07/2026; antes dela o relatório volta **inteiro zerado,
250
- > sem erro nenhum** (vira 1970 por dentro). Timestamp funciona em qualquer versão — use ele e você
251
- > nunca cai na armadilha. Se vier tudo zero e o funil tem cards, era isso.
248
+ > ⚠️ **`from`/`to` deste relatório:** timestamp UNIX funciona em QUALQUER versão e é o mais seguro.
249
+ > Data por extenso (`2026-07-01`) só é aceita a partir da atualização de 26/07/2026; antes dela o
250
+ > relatório volta **inteiro zerado, sem erro nenhum** (vira 1970 por dentro). Desde 05/10/2026 a data
251
+ > pura cobre o **dia inteiro no fuso da CONTA** (00:00:00 até 23:59:59) e ISO 8601 também é aceito
252
+ > (sem offset vale a hora da conta). Se vier tudo zero e o funil tem cards, repita com timestamp.
252
253
 
253
254
  **R4 — Conversas de uma campanha que FALHARAM/entregaram:** filtre por
254
255
  `campaign_id equal_to <id>`; o status da MENSAGEM de template (sent/delivered/read/failed) está
@@ -307,11 +308,12 @@ custom_dashboards_preview_widget
307
308
  columns=[
308
309
  {"metric":"leads"}, {"metric":"atendidos"},
309
310
  {"metric":"primeira_resposta"}, {"metric":"tempo_resposta"},
310
- {"metric":"ligacoes_feitas"}, {"metric":"taxa_ligacao"}
311
+ {"metric":"ligacoes_feitas"}, {"metric":"ligacoes_recebidas"},
312
+ {"metric":"tempo_falado"}, {"metric":"taxa_ligacao"}
311
313
  ]
312
314
  ```
313
315
  > ⚠️ `primeira_resposta`/`tempo_resposta` vêm em **segundos**, contados só no horário comercial da conta.
314
- > `taxa_ligacao` = ligações feitas ÷ leads (ou `"denominator":"atendidos"`). Essas 4 colunas só valem com
316
+ > `taxa_ligacao` = ligações feitas ÷ leads (ou `"denominator":"atendidos"`). Essas colunas só valem com
315
317
  > `dimension: agent` — em tabela por equipe/caixa o salvamento volta 422 com o motivo.
316
318
 
317
319
  **R9 — Salvar isso como relatório na tela do cliente:** teste com o R8, mostre o número, confirme
@@ -99,6 +99,21 @@ Todo node tem essa estrutura base:
99
99
  Regras: `attr_key` é **obrigatório**. `trigger_uuid` é preenchido pelo backend no save (NÃO envie; se enviar é preservado). 29/02 em ano não-bissexto colapsa p/ 28/02. Disparo vencido tem tolerância de 24h. Se `inbox_mode` for `fixed` e a caixa for desvinculada do flow depois, os envios daquele gatilho são **pulados** (visíveis em `flows_executions_list`). Caixa oficial WhatsApp exige template na 1ª mensagem se a conversa for criada nova (senão pula). Ativar o flow agenda automaticamente os contatos que já têm a data preenchida.
100
100
  - **`attr_source: 'conversation'` (novo 2026-07-18):** a data vem de um atributo de DATA da CONVERSA (não do contato). Dispara NAQUELA conversa (reabre se resolvida). `attr_key` = chave de atributo de conversa tipo Data; o horário-por-atributo lê da conversa. NÃO tem seletor de caixa (a conversa já é conhecida) — não envie `inbox_mode`/`inbox_id`. NÃO use `repeat_yearly` (conversa é evento pontual — vetado com keep_both). SEM agendamento retroativo: só agenda o que for escrito/alterado APÓS ativar (100% forward). Ausente = `'contact'` (comportamento legado).
101
101
  - **`overwrite_mode` (novo 2026-07-18):** `'replace'` (default) = trocar a data cancela o agendamento anterior (correção de data errada não dispara em dobro). `'keep_both'` = acumula (cada data seu próprio disparo) — **SÓ com `attr_source: 'conversation'`** (vetado no contato) e **incompatível com `repeat_yearly`**. Os disparos futuros pendentes ficam visíveis/canceláveis na aba "Agendados" do editor.
102
+ - **QUANDO a mensagem sai de verdade (mudou em 2026-10-02):** o horário configurado passou a ser
103
+ **respeitado exatamente**. Até 02/10 o motor somava `id do contato % 180` **MINUTOS** ao horário
104
+ escolhido (espalhamento anti-banimento): quem configurava 18:00 podia receber às 20:50, e isso
105
+ nunca esteve documentado aqui. Caso real: Villa Eyá, 18:00 configurado, 19:50 entregue.
106
+ O que espaça agora é a **fila por caixa**, no momento do envio, e só quando há fila de verdade:
107
+ - **1 pessoa na data** → sai no horário configurado, nos dois canais.
108
+ - **Caixa QR Code (WAHA)**, várias pessoas na mesma data → **20 a 40 segundos entre cada**
109
+ (sorteado — intervalo exato é padrão de robô). 50 aniversariantes ≈ 25 min; 500 ≈ 4 h.
110
+ **Ao montar aniversário em massa no QR Code, avise o cliente disso** — não é atraso, é a
111
+ proteção que impede o número de ser bloqueado. A mesma fila atende os lembretes da e-Clínica:
112
+ se as duas coisas saem pela MESMA caixa, elas dividem a vaga.
113
+ - **Caixa oficial (Cloud)** → **10 mensagens por segundo** por número da Meta, com recuo
114
+ automático se a Meta reclamar (o mesmo freio da campanha). 5.000 aniversariantes ≈ 8 min.
115
+ - **Atraso maior que 24 h não sai**: aviso parado por queda do sistema é marcado `vencida_expirada`
116
+ no histórico em vez de ser entregue atrasado. O aniversário do ano seguinte continua agendado.
102
117
  - **Ver/cancelar os agendamentos (novo 2026-07-20):** `flows_scheduled_firings_list` (flow_id) lista os disparos FUTUROS pendentes do Gatilho de Data (quando vai disparar, atributo/valor que gerou, fonte contato/conversa, contato/conversa alvo). `flows_scheduled_firings_cancel` (flow_id, id) cancela um — se já disparou responde 409 `ja_disparado` e nada muda. Só flows com Gatilho de Data; ADMIN + flowbuilder_manage.
103
118
 
104
119
  **Trigger `campaign_trigger` — Gatilho "Campanha" (novo 2026-07-28):** LIBERA o flow para ser disparado
@@ -549,6 +549,23 @@
549
549
 
550
550
  **Lembretes:** `attr_key` é obrigatório; `_date_of_birth` é o Aniversário nativo. `trigger_uuid` é preenchido pelo backend (não envie). Ativar o flow já agenda os contatos que têm a data. Pulos (contato sem telefone, caixa desvinculada, etc.) aparecem em `flows_executions_list`.
551
551
 
552
+ **Quanto tempo leva, com muita gente na mesma data (mudou em 2026-10-02):** o horário configurado é
553
+ respeitado — a primeira mensagem sai às 09:00 em ponto. As demais saem no ritmo da caixa, que existe
554
+ para o número não ser bloqueado:
555
+
556
+ | Caixa | Ritmo | 50 pessoas | 500 pessoas |
557
+ |---|---|---|---|
558
+ | QR Code (WAHA) | 20-40 s entre cada | ~25 min | ~4 h |
559
+ | Oficial (Cloud) | 10 por segundo | 5 s | ~50 s |
560
+
561
+ **Ao montar aniversário para uma base grande em QR Code, diga isso ao cliente antes** — ele vai ver as
562
+ mensagens pingando e achar que travou. Não é atraso: é a trava anti-banimento. Se precisar sair rápido
563
+ em volume, o caminho é caixa oficial ou Campanha de Fluxo (que tem agendamento por dias).
564
+
565
+ Até 02/10/2026 o motor somava `id do contato % 180` MINUTOS ao horário escolhido — 18:00 podia virar
566
+ 20:50, sem nada na tela explicando. Isso acabou; se encontrar documentação antiga dizendo que o
567
+ Gatilho de Data "espalha em até 3 horas", está desatualizada.
568
+
552
569
  ---
553
570
 
554
571
  ## 17. Gestão de Grupos WhatsApp por fluxo (`update_group`)
@@ -40,7 +40,7 @@ Quando o usuário disser "o relatório está errado / não bate", quase sempre
40
40
  Os dois cards podem divergir legitimamente em conta que reatribui.
41
41
  5. **timezone_offset NÃO altera totais** de summary — só o agrupamento dos pontos da série temporal.
42
42
  Diferenças de ~1% entre relatório e lista filtrada são borda de janela/fuso, não defeito.
43
- 6. **since/until são unix SEGUNDOS** na família `reports_*`, no CSAT e no SLA. Data por extenso
43
+ 6. **since/until: prefira unix SEGUNDOS** (desde 05/10/2026 a API também aceita `aaaa-mm-dd` = dia inteiro no fuso da conta, ISO 8601 com fuso e milissegundos; formato ilegível dá 400) na família `reports_*`, no CSAT e no SLA. Data por extenso
44
44
  (`"2026-07-01"`) é lida como epoch: o `"2026"` vira 01/01/1970 e a janela some. Na conta 19 havia
45
45
  4.396 conversas no período e a resposta veio ZERO, com HTTP 200.
46
46
  **Desde 29/07/2026 a maioria dos relatórios RECUSA o formato errado** com HTTP **400** e a mensagem
@@ -280,7 +280,7 @@ Retorna SOMENTE estes dois campos (não existe taxa pronta):
280
280
  ### `lionchat_reports_list_13` — Conversation Traffic (tráfego)
281
281
  **Use quando:** "horário de pico", "quando tem mais demanda"
282
282
 
283
- Heatmap de volume por hora. Aceita SÓ `timezone_offset` (sem ele o pico sai em UTC). ATENÇÃO: janela FIXA a partir de hoje — NÃO aceita `since`/`until`.
283
+ Heatmap de volume por hora. Aceita SÓ `timezone_offset` (desde 05/10/2026, sem ele o pico sai no FUSO DA CONTA; antes saía em UTC). ATENÇÃO: janela FIXA a partir de hoje — NÃO aceita `since`/`until`.
284
284
 
285
285
  > ⚠️ **Instalação anterior a 29/07/2026: o pico sai em UTC MESMO mandando `timezone_offset`.** O fuso
286
286
  > era resolvido por nome (`"-3"` não é nome de zona), caía em UTC e o horário vinha **3 horas adiantado**
@@ -508,13 +508,22 @@ ONDE vieram os leads, cruzando os campos `origin_*` das conversas com os leads
508
508
  viraram conversa). É um relatório de LEITURA puro — não cria nem altera nada.
509
509
 
510
510
  **Filtros (query, todos opcionais):** `since` / `until` (ISO 8601; default = 30 dias atrás → agora),
511
- `funnel_id`, `platform`, `kind`, `campaign`, `adset`, `group_by`.
511
+ `funnel_id`, `platform`, `kind`, `campaign`, `adset`, `inbox_id`, `assignee_id`, `group_by`.
512
+ `campaign`/`adset` aceitam `__none__` para filtrar so os leads SEM aquele nome (campanha/conjunto vazio).
513
+
514
+ **`inbox_id` e `assignee_id` (06/10/2026)** — recortam por caixa de entrada e por responsável da conversa.
515
+ **Em conta com mais de uma loja/unidade, SEM `inbox_id` o relatório soma TODAS as caixas** — foi o que fez a
516
+ mesma conta misturar duas lojas e não bater com o relatório da Meta. Com qualquer um dos dois ligado, os
517
+ **leads órfãos saem da contagem** (contato sem conversa nenhuma não pertence a caixa nem a responsável), então
518
+ `orphan_leads` vai a zero e `unique_leads` cai — é esperado, não é perda de dado.
512
519
 
513
520
  **Retorno:**
514
521
  - `period` — janela efetiva considerada.
515
522
  - `totals` — `conversations`, `classified` (com origem identificada), `unclassified` (sem origem),
516
523
  `orphan_leads` (leads sem conversa ainda), `unique_leads` (deduplicados por TELEFONE),
517
524
  `won_leads` (leads em cards de estágio de Ganho) e `conversion_rate`.
525
+ - `unclassified` — `{conversations, won, conversion_rate}` das conversas SEM origem (entram em `totals` mas nao em `by_platform`;
526
+ a venda de uma conversa iniciada pela propria empresa mora aqui).
518
527
  - Arrays de quebra: `by_platform`, `by_kind`, `by_campaign`, `by_adset`, `by_creative`. Cada linha
519
528
  tem `{value, conversations, won, conversion_rate}`.
520
529
 
@@ -576,6 +585,10 @@ quebra. Aconteceu em produção com quem seguiu a versão anterior da tela.
576
585
  como público de campanha (antes apareciam no painel e eram invisíveis para tudo isso): `google_keyword`
577
586
  (Palavra-chave), `google_match_type`, `google_device`, `google_network`, `google_placement`,
578
587
  `google_ad_position`, `google_campaign_id`, `google_adgroup_id`, `google_creative_id`.
588
+ Desde 06/10/2026 são 12: entraram `google_feed_item_id` (a extensão do anúncio que foi clicada),
589
+ `google_loc_physical` (o lugar onde a pessoa estava ao clicar) e `google_loc_interest` (o lugar que ela
590
+ pesquisou). **Os três são CÓDIGOS numéricos do Google, não nomes** (ex.: `1001773`) — servem para filtrar por
591
+ igualdade ou por "preenchido", não para ler o nome da cidade.
579
592
 
580
593
  **A palavra-chave só existe em campanha de BUSCA.** Medido na produção em 29/09: 39% dos cliques são
581
594
  Performance Max, onde o Google não informa palavra-chave, conjunto nem anúncio — nesses a linha vem vazia,
@@ -721,7 +734,7 @@ funil sem nome chegam indistinguíveis pra quem lê depois.
721
734
  `label_count` (exige `label_id`) e `conversao` (exige `denominator` e `numerator`, que é **lista de
722
735
  IDs de etiqueta**, nunca nome de métrica).
723
736
 
724
- **Quatro colunas por PESSOA (novas, 02/10/2026 — só com `dimension: agent`; em tabela por equipe ou
737
+ **Seis colunas por PESSOA (novas, 02/10 e 03/10/2026 — só com `dimension: agent`; em tabela por equipe ou
725
738
  caixa o salvamento é RECUSADO com o motivo):**
726
739
 
727
740
  | `metric` | O que mostra | Cuidado |
@@ -729,12 +742,15 @@ caixa o salvamento é RECUSADO com o motivo):**
729
742
  | `primeira_resposta` | Tempo **médio** da 1ª resposta do atendente | Conta **só o horário comercial da conta** (o do SLA). Sem horário ligado na conta, cai no relógio corrido. O início é quando a IA passou a conversa (ou a reabertura/criação), não o instante da atribuição — pode divergir do SLA por alguns minutos. Vem em segundos; quem não respondeu nada no período vem vazio (travessão), nunca "0s" |
730
743
  | `tempo_resposta` | Tempo médio entre respostas, depois da 1ª | Mesma regra de horário. Registro de `reply_time` |
731
744
  | `ligacoes_feitas` | Ligações que a pessoa **fez** (`outbound`), atendidas ou não | Recebidas não entram. Acompanha o recorte por caixa; VTCall e Zenvia quase não gravam caixa |
745
+ | `ligacoes_recebidas` | Ligações **recebidas** ligadas à pessoa (`inbound`) | No VTCall o atendente só é gravado quando atende: na prática são as que ela **atendeu**. A que ninguém atendeu não tem dono — fica na linha "Sem responsável" do `calls_report` |
746
+ | `tempo_falado` | Tempo total em ligação da pessoa (feitas + recebidas), em segundos | Mesma definição do "Tempo falado" do `calls_report`. Sem ligação = 0 (a tela e o aviso mostram travessão) |
732
747
  | `taxa_ligacao` | Ligações feitas ÷ leads, em % | `denominator` opcional: `leads` (padrão, a definição do Wesley — "100 leads, 10 ligações = 10%") ou `atendidos`; outro valor é recusado. Pessoa sem lead dá 0,0%, nunca erro |
733
748
 
734
749
  O `as` dessas colunas é honrado (diferente das métricas núcleo). Exemplo de bloco do Instituto Homem:
735
750
  `{"widget_type":"agent_report","chart_type":"table","dimension":"agent","scope_type":"team","scope_id":142,
736
751
  "columns":[{"metric":"leads"},{"metric":"atendidos"},{"metric":"primeira_resposta"},
737
- {"metric":"tempo_resposta"},{"metric":"ligacoes_feitas"},{"metric":"taxa_ligacao"}]}`.
752
+ {"metric":"tempo_resposta"},{"metric":"ligacoes_feitas"},{"metric":"ligacoes_recebidas"},
753
+ {"metric":"tempo_falado"},{"metric":"taxa_ligacao"}]}`.
738
754
 
739
755
  ### Como ler a resposta (campo `shape`)
740
756
 
@@ -795,6 +795,33 @@ criptografia de grupo, aviso de protocolo, cabeçalho de álbum). Não são mens
795
795
  cabeçalho de álbum some porque as fotos chegam logo em seguida como mensagens próprias — se o
796
796
  cliente reclamar que "faltou uma mensagem antes das fotos", era isso.
797
797
 
798
+ ## "O aniversário saiu fora do horário que eu configurei" (Gatilho de Data) — 02/10/2026
799
+
800
+ **Antes de 02/10/2026 isso era um defeito real:** o motor somava `id do contato % 180` **MINUTOS** ao
801
+ horário escolhido (espalhamento anti-banimento). Quem configurava 18:00 podia receber às 20:50 — caso
802
+ relatado: Villa Eyá, 18:00 configurado, 19:50 entregue. **Consertado.** O horário agora é respeitado.
803
+
804
+ **Depois de 02/10, se a mensagem sair depois do horário, é a FILA — e é normal.** O que espaça agora é
805
+ a fila por caixa, e só quando há mais de uma pessoa na mesma data:
806
+
807
+ | Caixa | Ritmo | Efeito com 50 pessoas |
808
+ |---|---|---|
809
+ | QR Code (WAHA) | 20-40 s entre cada (sorteado) | a última sai ~25 min depois |
810
+ | Oficial (Cloud) | 10 por segundo | a última sai ~5 s depois |
811
+
812
+ A primeira sempre sai no horário configurado. **Uma pessoa sozinha nunca atrasa.**
813
+
814
+ Ao consultar `lionchat_flows_scheduled_firings_list`:
815
+ - `fire_at` **diferente do horário configurado** = a fila já reservou a vaga real daquele envio.
816
+ É o horário em que vai sair mesmo. **Normal — não é o defeito antigo, não reporte como erro.**
817
+ - `skip_reason = vencida_expirada` = o aviso ficou mais de 24 h atrasado (queda do sistema) e foi
818
+ **descartado de propósito**, para não entregar "feliz aniversário" dias depois. O do ano seguinte
819
+ continua agendado. Não reprocessar.
820
+
821
+ **Quando o cliente reclamar que "está demorando" numa base grande em QR Code:** não é lentidão, é a
822
+ trava que impede o número de ser bloqueado — a mesma que a campanha usa. Se precisa de volume rápido,
823
+ o caminho é caixa oficial ou Campanha de Fluxo (que tem agendamento por dias).
824
+
798
825
  ## "O paciente tem duas consultas no dia e recebeu um lembrete só" (e-Clínica) — 17/09/2026
799
826
 
800
827
  **Como é desde 17/09:** um lembrete por CONSULTA. Duas consultas no mesmo dia, ou duas pessoas no mesmo
@@ -827,6 +854,41 @@ antes de 17/09 podem não ter `{{cliente_id}}`: use a ficha só como reserva
827
854
 
828
855
  ---
829
856
 
857
+ ## "A clínica trocou o celular do paciente e os dados da e-Clínica mudaram de contato" — 07/10/2026
858
+
859
+ **Não é defeito.** Quando o celular novo informado pela e-Clínica **já é de outro contato** da conta (o
860
+ paciente já conversava pelo número novo, por exemplo), os avisos da e-Clínica passam para o contato do
861
+ número novo: os atributos `eclinica_*` (mais `endereco_unidade` e `unidade_de_atendimento`) saem do
862
+ contato antigo e os lembretes pendentes do paciente trocam de contato. **Nenhum telefone é trocado e
863
+ nenhuma ficha é juntada** — juntar continua sendo decisão da equipe (`lionchat_contact_merge_preview`
864
+ antes de qualquer junção).
865
+
866
+ **Como reconhecer:**
867
+ - as duas conversas têm um aviso em cinza ("Os avisos da e-Clínica passam a sair por lá" / "Este contato
868
+ passou a receber os avisos da e-Clínica do paciente ...");
869
+ - o contato antigo tem `additional_attributes.eclinica_vinculo_cedido` — um mapa
870
+ `"<unidade>:<paciente>" => { para, em, prova }` dizendo para qual contato o cadastro foi;
871
+ - o contato novo pode ter `additional_attributes.eclinica_vinculo_recebido` (`{ de, em }`), só quando a
872
+ passagem foi sem prova de que é a mesma pessoa.
873
+
874
+ **Não escreva nem apague essas duas chaves** (são do sistema) e **não regrave `eclinica_cliente_id` /
875
+ `eclinica_unit_id` no contato antigo**: a busca do paciente prefere o contato que NÃO cedeu o cadastro, e
876
+ o par regravado à mão só gera confusão.
877
+
878
+ **Quando os avisos NÃO passam** (a conversa diz "Nada foi alterado. Confira o celular no cadastro da
879
+ clínica."): o contato dono do número novo já é de OUTRO paciente da clínica, ou os dois contatos têm CPFs
880
+ diferentes.
881
+
882
+ **Número digitado errado na recepção:** se o número errado for de outro contato, os avisos vão para lá
883
+ até a clínica corrigir; na correção eles voltam sozinhos para o contato do paciente (as duas conversas
884
+ ganham novo aviso). Para mover à mão é com o suporte — não existe ferramenta do MCP para isso.
885
+
886
+ **Lembrete "pendente" que aparece em nome de outro contato** em `lionchat_eclinica_reminder_history_list`:
887
+ é o mesmo paciente, depois da passagem. Na hora de sair, o lembrete confere de novo qual contato tem o
888
+ cadastro e sai por ele.
889
+
890
+ ---
891
+
830
892
  ## "Marquei Faltou (ou Compareceu) e a tarefa continua pendente" — 17/09/2026
831
893
 
832
894
  **Não é defeito.** Presença (`attendance`) e situação (`status`) são campos separados de propósito: marcar
package/dist/tools.js CHANGED
@@ -188,9 +188,17 @@ function buildZodSchema(params, toolId, confirmRequired = false) {
188
188
  }
189
189
  return z.object(shape);
190
190
  }
191
- // AIDEV-NOTE: Check if endpoint has any file-type params (unsupported in MCP v1)
191
+ // AIDEV-NOTE: Check if endpoint REQUIRES a file-type param (unsupported in MCP v1).
192
+ // AIDEV-NOTE: [arquivo-opcional 03/10] A pergunta e "EXIGE arquivo?", nunca "tem campo de arquivo?".
193
+ // O executor ja acertava (so recusa quando um VALOR de arquivo e enviado); quem errava era este
194
+ // aviso, que e a PRIMEIRA linha que o modelo le na descricao. Com `.some(type === 'file')` quatro
195
+ // ferramentas que funcionam hoje se anunciavam quebradas e a IA desistia antes de tentar:
196
+ // contacts_update (a foto e opcional), account_update (o logotipo), upload_create (aceita
197
+ // external_url) e captain_documents_create (a base de conhecimento da IA, aceita external_link —
198
+ // e a nossa propria best-practices.md ensina a usar o link enquanto esta linha dizia que nao da).
199
+ // Achado nas auditorias de 03/10. NUNCA voltar a ignorar `required`.
192
200
  function hasFileParam(params) {
193
- return params.some((p) => p.type === 'file');
201
+ return params.some((p) => p.type === 'file' && p.required);
194
202
  }
195
203
  // AIDEV-NOTE: Register a single API endpoint as an MCP tool
196
204
  function registerSingleTool(server, config, client, endpoint) {
@@ -207,22 +215,27 @@ function registerSingleTool(server, config, client, endpoint) {
207
215
  server.tool(endpoint.id, description, schema.shape, annotations, async (params) => {
208
216
  try {
209
217
  // AIDEV-NOTE: Block execution if file param was actually provided
210
- if (hasFile) {
211
- const fileParams = endpoint.params.filter((p) => p.type === 'file');
212
- for (const fp of fileParams) {
213
- // AIDEV-NOTE: B10 (2026-06-02) — trata "" como "não fornecido" (igual ao remoto
214
- // runner.ts), pra os dois conectores terem o mesmo guard de file vazio.
215
- if (params[fp.name] !== undefined && params[fp.name] !== null && params[fp.name] !== '') {
216
- return {
217
- content: [
218
- {
219
- type: 'text',
220
- text: 'File upload is not supported via MCP. Use the LionChat web interface or direct API calls.',
221
- },
222
- ],
223
- isError: true,
224
- };
225
- }
218
+ // AIDEV-NOTE: [arquivo-opcional 03/10] A recusa roda SEMPRE, nunca mais dentro de
219
+ // `if (hasFile)`. Desde que `hasFileParam` passou a exigir `required`, o antigo `if`
220
+ // deixava as 4 ferramentas de arquivo OPCIONAL (contacts_update, account_update,
221
+ // upload_create, captain_documents_create) sem defesa nenhuma — e o conector REMOTO
222
+ // sempre recusou incondicionalmente (`runner.ts`), entao os dois tinham passado a
223
+ // divergir. Hoje o param `type: file` nem entra no schema (`continue` acima), logo isto
224
+ // e defesa em profundidade; e e exatamente por ser defesa que nao pode depender do aviso.
225
+ const fileParams = endpoint.params.filter((p) => p.type === 'file');
226
+ for (const fp of fileParams) {
227
+ // AIDEV-NOTE: B10 (2026-06-02) — trata "" como "não fornecido" (igual ao remoto
228
+ // runner.ts), pra os dois conectores terem o mesmo guard de file vazio.
229
+ if (params[fp.name] !== undefined && params[fp.name] !== null && params[fp.name] !== '') {
230
+ return {
231
+ content: [
232
+ {
233
+ type: 'text',
234
+ text: 'File upload is not supported via MCP. Use the LionChat web interface or direct API calls.',
235
+ },
236
+ ],
237
+ isError: true,
238
+ };
226
239
  }
227
240
  }
228
241
  // AIDEV-NOTE: [auditoria adversus A3] trava de confirmacao, ANTES de qualquer trabalho —
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mFAAmF;AAEnF,OAAO,EAAE,CAAC,EAAc,MAAM,KAAK,CAAC;AAIpC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAsCtD,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,MAAc;IACxC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E,KAAK,MAAM;YACT,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAChF,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC9E;YACE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,iBAAiB,GAA2B;IAChD,OAAO,EAAE,SAAS;IAClB,mBAAmB,EAAE,kBAAkB;IACvC,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,eAAe;IAC5B,mBAAmB,EAAE,SAAS;IAC9B,WAAW,EAAE,UAAU;IACvB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,wBAAwB,EAAE,gBAAgB;IAC1C,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,QAAQ;IACjB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,mBAAmB;IACzC,qBAAqB,EAAE,oBAAoB;IAC3C,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,aAAa;IACnC,kBAAkB,EAAE,eAAe;IACnC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,cAAc;IACvB,oBAAoB,EAAE,iBAAiB;IACvC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,iBAAiB;IACxC,eAAe,EAAE,aAAa;IAC9B,SAAS,EAAE,eAAe;IAC1B,iBAAiB,EAAE,qBAAqB;IACxC,SAAS,EAAE,gBAAgB;IAC3B,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,oBAAoB;IACnC,sBAAsB,EAAE,mBAAmB;IAC3C,qBAAqB,EAAE,kBAAkB;IACzC,sBAAsB,EAAE,cAAc;IACtC,yBAAyB,EAAE,mBAAmB;IAC9C,KAAK,EAAE,KAAK;IACZ,mBAAmB,EAAE,gBAAgB;IACrC,gBAAgB,EAAE,gBAAgB;IAClC,iBAAiB,EAAE,aAAa;IAChC,oBAAoB,EAAE,oBAAoB;IAC1C,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,iBAAiB;IACtC,iBAAiB,EAAE,iBAAiB;IACpC,yBAAyB,EAAE,qBAAqB;IAChD,UAAU,EAAE,UAAU;IACtB,wBAAwB,EAAE,oBAAoB;IAC9C,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,eAAe;IAChC,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,SAAS;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,iBAAiB;IACnC,kBAAkB,EAAE,eAAe;IACnC,iBAAiB,EAAE,oBAAoB;IACvC,MAAM,EAAE,MAAM;IACd,0BAA0B,EAAE,mBAAmB;IAC/C,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,UAAU,GAAG,IAAI;SACpB,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,IAAI,EAAE,CAAC;IACV,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,kEAAkE;AAClE,SAAS,cAAc,CAAC,KAAoB;IAC1C,IAAI,MAAkB,CAAC;IAEvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,GAAG,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CACP,wDAAwD,CACzD,CAAC;YACJ,MAAM;QACR,KAAK,QAAQ,CAAC;QACd;YACE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM;IACV,CAAC;IAED,gFAAgF;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,wFAAwF;AACxF,kFAAkF;AAClF,0FAA0F;AAC1F,yFAAyF;AACzF,mCAAmC;AACnC,SAAS,cAAc,CACrB,MAAuB,EACvB,MAAe,EACf,eAAe,GAAG,KAAK;IAEvB,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,kBAAkB,GAAG,IAAI,CAAC;YAC1B,oFAAoF;YACpF,yEAAyE;YACzE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;YACJ,SAAS;QACX,CAAC;QACD,uFAAuF;QACvF,uFAAuF;QACvF,yFAAyF;QACzF,sFAAsF;QACtF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,8FAA8F;IAC9F,6EAA6E;IAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;aACpB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2HAA2H,CAC5H,CAAC;IACN,CAAC;IAED,kFAAkF;IAClF,IAAI,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC;aAC3B,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,+FAA+F;IAC/F,iGAAiG;IACjG,sFAAsF;IACtF,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,MAAuB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,4DAA4D;AAC5D,SAAS,kBAAkB,CACzB,MAAiB,EACjB,MAAc,EACd,MAAsB,EACtB,QAAqB;IAErB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9C,yFAAyF;IACzF,IAAI,WAAW,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/E,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW;YACT,+EAA+E;gBAC/E,WAAW,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,EAAE,EACX,WAAW,EACX,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,KAAK,EAAE,MAA+B,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,kEAAkE;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACpE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;oBAC5B,gFAAgF;oBAChF,wEAAwE;oBACxE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACxF,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,2FAA2F;iCAClG;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,yFAAyF;YACzF,0FAA0F;YAC1F,yFAAyF;YACzF,iDAAiD;YACjD,IAAI,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EACF,IAAI,QAAQ,CAAC,EAAE,wCAAwC,QAAQ,CAAC,KAAK,KAAK;gCAC1E,4FAA4F;yBAC/F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,+FAA+F;YAC/F,oFAAoF;YACpF,wDAAwD;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1C,MAAM,kBAAkB,GACtB,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC;gBACpF,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;gBACtB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACvB,MAAM,oBAAoB,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;YACpE,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAE1C,uFAAuF;YACvF,gFAAgF;YAChF,8EAA8E;YAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;YAC1D,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;YAEjD,wFAAwF;YACxF,wEAAwE;YACxE,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,cAAc,CAC5D,oBAAoB,EACpB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,YAAY,CACtB,CAAC;YAEF,MAAM,IAAI,GAAG,cAAc,CACzB,QAAQ,CAAC,IAAI,EACb,kBAAkB,EAClB,UAAU,CACX,CAAC;YACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAExD,gFAAgF;YAChF,4FAA4F;YAC5F,8DAA8D;YAC9D,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,QAAQ,CAAC,EAAE,EACX,UAAU,EACV,UAAU,CAAC,IAAI,CAAC,EAChB,GAAG,EAAE,CACH,MAAM,CAAC,OAAO,CAAC;gBACb,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,oBAAoB,kBAAkB,mBAAmB;aAChE,CAAC,CACL,CAAC;YACF,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;oBACzD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE;4BAC3B,IAAI,EAAE,CAAC,YAAY;4BACnB,MAAM,EAAE,QAAQ,CAAC,EAAE;yBACpB,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gFAAgF;YAChF,uEAAuE;YACvE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,gBAAgB,CACvB,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yFAAyF,EACzF,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,0BAA0B,CACjC,MAAiB,EACjB,YAA2B;IAE3B,6EAA6E;IAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAClC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,QAAQ,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,sIAAsI,EACtI,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,wEAAwE;AACxE,gDAAgD;AAChD,SAAS,gCAAgC,CAAC,MAAiB;IACzD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAq0BlB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,2PAA2P,EAC3P,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EACpE,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SACtD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,MAAc,EACd,MAAsB;IAEtB,yFAAyF;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACjE,IAAI,SAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sCAAsC,aAAa,IAAI;YACvD,oDAAoD;YACpD,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,SAAS,CAAC;IAEzB,iFAAiF;IACjF,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,6DAA6D;IAC7D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,wEAAwE;IACxE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,uDAAuD;AACrF,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/endpoints.json CHANGED
@@ -1608,7 +1608,7 @@
1608
1608
  "method": "POST",
1609
1609
  "path": "/api/v1/accounts/{account_id}/conversations/{id}/custom_attributes",
1610
1610
  "title": "Custom Attributes",
1611
- "description": "Atualiza atributos customizados da conversa. Obrigatorios: id, custom_attributes. O custom_attributes enviado SUBSTITUI o conjunto da conversa (menos captain_*): leia antes com lionchat_conversations_show e reenvie tudo — mandar so a chave nova apaga clique do anuncio, gclid e origem.",
1611
+ "description": "Atualiza atributos customizados da conversa. Obrigatorios: id, custom_attributes. O custom_attributes enviado SUBSTITUI os atributos DO CLIENTE (o que nao vier no envio e apagado): leia antes com lionchat_conversations_show e reenvie os atributos do cliente com o alterado. O dado do SISTEMA fica FORA dessa troca — nao e apagado e tambem NAO e gravado por aqui: dados do anuncio (ctwa_*), origem (origin_*), UTM oficiais (utm_source, utm_medium, utm_campaign, utm_term, utm_content), cliques e dados do Google que o rastreio grava (gclid, gbraid, wbraid, google_keyword e demais), identificadores do WhatsApp (waha_*, whatsapp_*), campos da IA (captain_*) e todo atributo marcado como do sistema. Para marcar a origem a mao use lionchat_conversations_set_origin.",
1612
1612
  "category": "Conversas",
1613
1613
  "params": [
1614
1614
  {
@@ -1623,7 +1623,7 @@
1623
1623
  "type": "object",
1624
1624
  "location": "body",
1625
1625
  "required": true,
1626
- "description": "Objeto {chave: valor} dos atributos da CONVERSA. ATENCAO: SUBSTITUI o conjunto inteiro — so os campos internos da IA (captain_*) sobrevivem; tudo que nao vier no envio e APAGADO, inclusive a origem do lead (utm_*, gclid, ctwa_*, origin_*). Leia antes com lionchat_conversations_show e reenvie TODOS os campos com o alterado. Ex.: {\"utm_source\": \"google\", \"motivo_contato\": \"orcamento\"}. Por tipo: data 'AAAA-MM-DD', numero como numero, lista = uma das opcoes cadastradas, sim/nao true/false."
1626
+ "description": "Objeto {chave: valor} com os atributos DO CLIENTE na conversa. SUBSTITUI o conjunto dos atributos do cliente: o que nao vier no envio e APAGADO — leia antes com lionchat_conversations_show e reenvie todos com o alterado. Chave do sistema (ctwa_*, origin_*, UTM oficiais como utm_source, gclid/gbraid/wbraid, os google_* do rastreio, waha_*, whatsapp_*, captain_* e atributo marcado como do sistema) e IGNORADA: nao apaga e nao grava. Atributo proprio com nome parecido (ex.: utm_loja_fisica) funciona normal. Ex.: {\"motivo_contato\": \"orcamento\", \"cidade\": \"Campinas\"}. Por tipo: data 'AAAA-MM-DD', numero como numero, lista = uma das opcoes cadastradas, sim/nao true/false."
1627
1627
  }
1628
1628
  ],
1629
1629
  "returns": "conversa atualizada",
@@ -4064,14 +4064,14 @@
4064
4064
  "type": "string",
4065
4065
  "location": "query",
4066
4066
  "required": false,
4067
- "description": "Inicio do periodo — mande SEMPRE timestamp UNIX (segundos ou milissegundos): funciona em QUALQUER versao. Data por extenso ('2026-07-01') so e aceita a partir da atualizacao de 26/07/2026; antes dela NAO da erro, devolve o relatorio INTEIRO ZERADO (vira 1970 por dentro). Se vier tudo zero e o funil tem cards, era isso — repita com timestamp."
4067
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Mande unix se quiser o instante exato; data SEM hora cobre o dia inteiro no fuso da conta."
4068
4068
  },
4069
4069
  {
4070
4070
  "name": "to",
4071
4071
  "type": "string",
4072
4072
  "location": "query",
4073
4073
  "required": false,
4074
- "description": "Fim do periodo — mesma regra do 'from': timestamp UNIX e sempre seguro. A partir da atualizacao de 26/07/2026 aceita tambem data por extenso, e data SEM hora passa a cobrir o dia inteiro (ate 23:59:59)."
4074
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Data SEM hora cobre o dia inteiro (ate 23:59:59 no fuso da conta)."
4075
4075
  },
4076
4076
  {
4077
4077
  "name": "user_ids",
@@ -5320,14 +5320,14 @@
5320
5320
  "type": "string",
5321
5321
  "location": "query",
5322
5322
  "required": false,
5323
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5323
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5324
5324
  },
5325
5325
  {
5326
5326
  "name": "until",
5327
5327
  "type": "string",
5328
5328
  "location": "query",
5329
5329
  "required": false,
5330
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5330
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5331
5331
  },
5332
5332
  {
5333
5333
  "name": "business_hours",
@@ -5369,14 +5369,14 @@
5369
5369
  "type": "string",
5370
5370
  "location": "query",
5371
5371
  "required": false,
5372
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5372
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5373
5373
  },
5374
5374
  {
5375
5375
  "name": "until",
5376
5376
  "type": "string",
5377
5377
  "location": "query",
5378
5378
  "required": false,
5379
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5379
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5380
5380
  },
5381
5381
  {
5382
5382
  "name": "business_hours",
@@ -5411,14 +5411,14 @@
5411
5411
  "type": "string",
5412
5412
  "location": "query",
5413
5413
  "required": false,
5414
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5414
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5415
5415
  },
5416
5416
  {
5417
5417
  "name": "until",
5418
5418
  "type": "string",
5419
5419
  "location": "query",
5420
5420
  "required": false,
5421
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5421
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5422
5422
  },
5423
5423
  {
5424
5424
  "name": "business_hours",
@@ -5453,14 +5453,14 @@
5453
5453
  "type": "string",
5454
5454
  "location": "query",
5455
5455
  "required": false,
5456
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5456
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5457
5457
  },
5458
5458
  {
5459
5459
  "name": "until",
5460
5460
  "type": "string",
5461
5461
  "location": "query",
5462
5462
  "required": false,
5463
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5463
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5464
5464
  },
5465
5465
  {
5466
5466
  "name": "business_hours",
@@ -5495,14 +5495,14 @@
5495
5495
  "type": "string",
5496
5496
  "location": "query",
5497
5497
  "required": false,
5498
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5498
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5499
5499
  },
5500
5500
  {
5501
5501
  "name": "until",
5502
5502
  "type": "string",
5503
5503
  "location": "query",
5504
5504
  "required": false,
5505
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5505
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5506
5506
  },
5507
5507
  {
5508
5508
  "name": "business_hours",
@@ -5551,14 +5551,14 @@
5551
5551
  "type": "string",
5552
5552
  "location": "query",
5553
5553
  "required": false,
5554
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5554
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5555
5555
  },
5556
5556
  {
5557
5557
  "name": "until",
5558
5558
  "type": "string",
5559
5559
  "location": "query",
5560
5560
  "required": false,
5561
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5561
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5562
5562
  },
5563
5563
  {
5564
5564
  "name": "id",
@@ -5586,7 +5586,7 @@
5586
5586
  "type": "string",
5587
5587
  "location": "query",
5588
5588
  "required": false,
5589
- "description": "Deslocamento de fuso em horas (ex: -3 pra Brasilia) — afeta SO o agrupamento dos pontos do grafico (fronteira do dia/hora), NAO altera totais de summary."
5589
+ "description": "Deslocamento de fuso em horas (ex: -3 pra Brasilia) — afeta SO o agrupamento dos pontos do grafico (fronteira do dia/hora), NAO altera totais de summary. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3)."
5590
5590
  }
5591
5591
  ],
5592
5592
  "returns": "array de { value, timestamp[, count] } (sem meta)",
@@ -5664,7 +5664,7 @@
5664
5664
  "type": "string",
5665
5665
  "location": "query",
5666
5666
  "required": false,
5667
- "description": "Fuso em horas (ex: -3 pra Brasília). O MESMO da série — define a fronteira do dia/hora do ponto."
5667
+ "description": "Fuso em horas (ex: -3 pra Brasília). O MESMO da série — define a fronteira do dia/hora do ponto. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3)."
5668
5668
  },
5669
5669
  {
5670
5670
  "name": "business_hours",
@@ -5706,14 +5706,14 @@
5706
5706
  "type": "string",
5707
5707
  "location": "query",
5708
5708
  "required": false,
5709
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5709
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5710
5710
  },
5711
5711
  {
5712
5712
  "name": "until",
5713
5713
  "type": "string",
5714
5714
  "location": "query",
5715
5715
  "required": false,
5716
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
5716
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
5717
5717
  },
5718
5718
  {
5719
5719
  "name": "type",
@@ -5741,7 +5741,7 @@
5741
5741
  "type": "string",
5742
5742
  "location": "query",
5743
5743
  "required": false,
5744
- "description": "Deslocamento de fuso em horas (ex: -3). NAO altera os totais do summary — so afeta agrupamento em endpoints de serie temporal."
5744
+ "description": "Deslocamento de fuso em horas (ex: -3). NAO altera os totais do summary — so afeta agrupamento em endpoints de serie temporal. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3)."
5745
5745
  }
5746
5746
  ],
5747
5747
  "returns": "{ conversations_count, incoming_messages_count, outgoing_messages_count, resolutions_count, avg_first_response_time (seg), avg_resolution_time (seg), median_first_response_time (seg), median_resolution_time (seg), reply_time (seg — tempo medio de resposta), previous: {...mesma estrutura...} }",
@@ -5800,7 +5800,7 @@
5800
5800
  "type": "string",
5801
5801
  "location": "query",
5802
5802
  "required": false,
5803
- "description": "Offset de timezone em horas"
5803
+ "description": "Offset de timezone em horas. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3)."
5804
5804
  }
5805
5805
  ],
5806
5806
  "returns": "{ bot_resolutions_count, bot_handoffs_count, previous: {...} }",
@@ -5985,7 +5985,7 @@
5985
5985
  "type": "string",
5986
5986
  "location": "query",
5987
5987
  "required": false,
5988
- "description": "Offset de timezone em horas"
5988
+ "description": "Offset de timezone em horas. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3)."
5989
5989
  }
5990
5990
  ],
5991
5991
  "returns": "arquivo CSV (conversation_traffic_reports.csv)",
@@ -8188,14 +8188,14 @@
8188
8188
  "type": "string",
8189
8189
  "location": "query",
8190
8190
  "required": false,
8191
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8191
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8192
8192
  },
8193
8193
  {
8194
8194
  "name": "until",
8195
8195
  "type": "string",
8196
8196
  "location": "query",
8197
8197
  "required": false,
8198
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8198
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8199
8199
  },
8200
8200
  {
8201
8201
  "name": "page",
@@ -8224,6 +8224,13 @@
8224
8224
  "location": "query",
8225
8225
  "required": false,
8226
8226
  "description": "Filtros estruturados aplicados aos resultados de CARDS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8227
+ },
8228
+ {
8229
+ "name": "date_basis",
8230
+ "type": "string",
8231
+ "location": "query",
8232
+ "required": false,
8233
+ "description": "OPCIONAL. Qual data o periodo (since/until) usa: `activity` (padrao e qualquer outro valor: conversas e contatos pela ULTIMA ATIVIDADE, artigos pela ultima atualizacao) ou `created` (pela data de CRIACAO). Mensagens ja sao por criacao e cards do Kanban nao tem periodo. Valor invalido nunca da erro."
8227
8234
  }
8228
8235
  ],
8229
8236
  "returns": "{ payload: { conversations, contacts, messages, articles, kanban_items } } — sem meta. [29/07] Cada conversa vem com `status` e `labels` (etiquetas da conversa) e cada contato vem com `labels` (etiquetas do contato), entao NAO e preciso uma chamada extra por resultado so pra saber a etiqueta. Cada mensagem inclui previous_message/next_message (contexto vizinho) e NAO traz labels.",
@@ -8268,14 +8275,14 @@
8268
8275
  "type": "string",
8269
8276
  "location": "query",
8270
8277
  "required": false,
8271
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8278
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8272
8279
  },
8273
8280
  {
8274
8281
  "name": "until",
8275
8282
  "type": "string",
8276
8283
  "location": "query",
8277
8284
  "required": false,
8278
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8285
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8279
8286
  },
8280
8287
  {
8281
8288
  "name": "page",
@@ -8290,6 +8297,13 @@
8290
8297
  "location": "query",
8291
8298
  "required": false,
8292
8299
  "description": "Filtros estruturados (mesmo formato de conversations_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8300
+ },
8301
+ {
8302
+ "name": "date_basis",
8303
+ "type": "string",
8304
+ "location": "query",
8305
+ "required": false,
8306
+ "description": "OPCIONAL. Qual data o periodo (since/until) usa: `activity` (padrao e qualquer outro valor: conversas e contatos pela ULTIMA ATIVIDADE, artigos pela ultima atualizacao) ou `created` (pela data de CRIACAO). Mensagens ja sao por criacao e cards do Kanban nao tem periodo. Valor invalido nunca da erro."
8293
8307
  }
8294
8308
  ],
8295
8309
  "returns": "{ payload: { conversations: [...] } } — sem meta. [29/07] Cada conversa traz `labels` (etiquetas da conversa) e `status`, alem de contato, caixa, responsavel e ultima mensagem — nao e preciso outra chamada so pra saber a etiqueta.",
@@ -8323,14 +8337,14 @@
8323
8337
  "type": "string",
8324
8338
  "location": "query",
8325
8339
  "required": false,
8326
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8340
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8327
8341
  },
8328
8342
  {
8329
8343
  "name": "until",
8330
8344
  "type": "string",
8331
8345
  "location": "query",
8332
8346
  "required": false,
8333
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8347
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8334
8348
  },
8335
8349
  {
8336
8350
  "name": "page",
@@ -8345,6 +8359,13 @@
8345
8359
  "location": "query",
8346
8360
  "required": false,
8347
8361
  "description": "Filtros estruturados (mesmo formato de contacts_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8362
+ },
8363
+ {
8364
+ "name": "date_basis",
8365
+ "type": "string",
8366
+ "location": "query",
8367
+ "required": false,
8368
+ "description": "OPCIONAL. Qual data o periodo (since/until) usa: `activity` (padrao e qualquer outro valor: conversas e contatos pela ULTIMA ATIVIDADE, artigos pela ultima atualizacao) ou `created` (pela data de CRIACAO). Mensagens ja sao por criacao e cards do Kanban nao tem periodo. Valor invalido nunca da erro."
8348
8369
  }
8349
8370
  ],
8350
8371
  "returns": "{ payload: { contacts: [...] } } — sem meta e sem total; 15 contatos por pagina, use `page` para as proximas, ordenados por atividade mais recente (last_activity_at desc). [29/07] Cada contato traz id, name, email, phone_number, identifier, `labels` (nomes das etiquetas do contato), `thumbnail` (foto), `last_activity_at` (unix) e `additional_attributes` — e dentro dele que ficam os dados cadastrais (`cadastral`: CPF/CNPJ/RG/endereco) e os atributos personalizados.",
@@ -8392,14 +8413,14 @@
8392
8413
  "type": "string",
8393
8414
  "location": "query",
8394
8415
  "required": false,
8395
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8416
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8396
8417
  },
8397
8418
  {
8398
8419
  "name": "until",
8399
8420
  "type": "string",
8400
8421
  "location": "query",
8401
8422
  "required": false,
8402
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8423
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8403
8424
  },
8404
8425
  {
8405
8426
  "name": "page",
@@ -13480,14 +13501,14 @@
13480
13501
  "type": "string",
13481
13502
  "location": "query",
13482
13503
  "required": false,
13483
- "description": "Data inicio (YYYY-MM-DD)"
13504
+ "description": "Data inicio (YYYY-MM-DD, dia inteiro no fuso da conta)"
13484
13505
  },
13485
13506
  {
13486
13507
  "name": "date_to",
13487
13508
  "type": "string",
13488
13509
  "location": "query",
13489
13510
  "required": false,
13490
- "description": "Data fim (YYYY-MM-DD)"
13511
+ "description": "Data fim (YYYY-MM-DD, dia inteiro no fuso da conta)"
13491
13512
  },
13492
13513
  {
13493
13514
  "name": "favorited",
@@ -15085,14 +15106,14 @@
15085
15106
  "type": "string",
15086
15107
  "location": "query",
15087
15108
  "required": false,
15088
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
15109
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
15089
15110
  },
15090
15111
  {
15091
15112
  "name": "until",
15092
15113
  "type": "string",
15093
15114
  "location": "query",
15094
15115
  "required": false,
15095
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
15116
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
15096
15117
  },
15097
15118
  {
15098
15119
  "name": "inbox_id",
@@ -22288,14 +22309,14 @@
22288
22309
  "type": "string",
22289
22310
  "location": "query",
22290
22311
  "required": false,
22291
- "description": "Data inicio"
22312
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22292
22313
  },
22293
22314
  {
22294
22315
  "name": "until",
22295
22316
  "type": "string",
22296
22317
  "location": "query",
22297
22318
  "required": false,
22298
- "description": "Data fim"
22319
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22299
22320
  },
22300
22321
  {
22301
22322
  "name": "user_ids",
@@ -22347,14 +22368,14 @@
22347
22368
  "type": "string",
22348
22369
  "location": "query",
22349
22370
  "required": false,
22350
- "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
22371
+ "description": "Inicio do periodo (ex: 1782864000 ou 2026-10-01). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22351
22372
  },
22352
22373
  {
22353
22374
  "name": "until",
22354
22375
  "type": "string",
22355
22376
  "location": "query",
22356
22377
  "required": false,
22357
- "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 — o backend faz strptime %s e a janela quebra em silencio."
22378
+ "description": "Fim do periodo (ex: 1782864000 ou 2026-10-05). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22358
22379
  },
22359
22380
  {
22360
22381
  "name": "user_ids",
@@ -22407,14 +22428,14 @@
22407
22428
  "type": "string",
22408
22429
  "location": "query",
22409
22430
  "required": false,
22410
- "description": "Data inicio"
22431
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22411
22432
  },
22412
22433
  {
22413
22434
  "name": "until",
22414
22435
  "type": "string",
22415
22436
  "location": "query",
22416
22437
  "required": false,
22417
- "description": "Data fim"
22438
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
22418
22439
  }
22419
22440
  ],
22420
22441
  "returns": "arquivo CSV (csat_report.csv)",
@@ -23869,14 +23890,14 @@
23869
23890
  "type": "string",
23870
23891
  "location": "query",
23871
23892
  "required": false,
23872
- "description": "Início ISO 8601"
23893
+ "description": "Início ISO 8601. Tambem aceita unix e AAAA-MM-DD (dia inteiro no fuso da conta)."
23873
23894
  },
23874
23895
  {
23875
23896
  "name": "until",
23876
23897
  "type": "string",
23877
23898
  "location": "query",
23878
23899
  "required": false,
23879
- "description": "Fim ISO 8601 (máx 30 dias após since)"
23900
+ "description": "Fim ISO 8601 (máx 30 dias após since). Tambem aceita unix e AAAA-MM-DD (ate 23:59:59 no fuso da conta)."
23880
23901
  },
23881
23902
  {
23882
23903
  "name": "utm_source",
@@ -26402,7 +26423,7 @@
26402
26423
  "method": "GET",
26403
26424
  "path": "/api/v1/accounts/{account_id}/contacts/{contact_id}/documents",
26404
26425
  "title": "Documentos do Contato",
26405
- "description": "Central de arquivos do contato: uploads diretos + espelho dos anexos dos cards Kanban + das conversas (só imagem/documento). Dedup por arquivo. (25/09) O mesmo arquivo em varias origens vem UMA vez (representado pelo upload da ficha, se houver); cada item traz contacts [{id,name}]. Contrato assinado so aparece para quem pode ver contratos; arquivo de compromisso particular de outra pessoa nao aparece. mirror aceita tambem anexo de compromisso e de contrato.",
26426
+ "description": "Central de arquivos do contato: uploads diretos + espelho dos anexos dos cards Kanban + das conversas (só imagem/documento). Dedup por arquivo. (25/09) O mesmo arquivo em varias origens vem UMA vez (representado pelo upload da ficha, se houver); cada item traz contacts [{id,name}]. Contrato assinado so aparece para quem pode ver contratos; arquivo de compromisso particular de outra pessoa nao aparece. mirror aceita tambem anexo de compromisso e de contrato. (06/10) PAGINACAO OPCIONAL: com `page` (50 por pagina, ate 100) o servidor devolve so aquela pagina e ja aplica os filtros source/type/favorite/q — recomendado para quem tem muitos arquivos, porque so os itens da pagina trazem os links assinados (open_url/download_url/preview_url). Sem `page` continua a lista inteira.",
26406
26427
  "category": "Documentos do Contato",
26407
26428
  "params": [
26408
26429
  {
@@ -26411,9 +26432,51 @@
26411
26432
  "location": "path",
26412
26433
  "required": true,
26413
26434
  "description": "ID do contato"
26435
+ },
26436
+ {
26437
+ "name": "page",
26438
+ "type": "integer",
26439
+ "location": "query",
26440
+ "required": false,
26441
+ "description": "PAGINA (a partir de 1). Ativa a paginacao NO SERVIDOR: devolve so os itens da pagina e `meta`. Sem `page` a resposta e a lista inteira, como sempre. Pagina que nao existe mais vira a ultima."
26442
+ },
26443
+ {
26444
+ "name": "per_page",
26445
+ "type": "integer",
26446
+ "location": "query",
26447
+ "required": false,
26448
+ "description": "Itens por pagina (padrao 50, maximo 100). So vale com `page`."
26449
+ },
26450
+ {
26451
+ "name": "source",
26452
+ "type": "string",
26453
+ "location": "query",
26454
+ "required": false,
26455
+ "description": "Filtra pela origem: contact, kanban, conversation, agenda, lead_form ou esignature. So vale com `page`."
26456
+ },
26457
+ {
26458
+ "name": "type",
26459
+ "type": "string",
26460
+ "location": "query",
26461
+ "required": false,
26462
+ "description": "Filtra pelo tipo do arquivo: images, pdf, sheets, docs ou other. Valor desconhecido e ignorado. So vale com `page`."
26463
+ },
26464
+ {
26465
+ "name": "favorite",
26466
+ "type": "boolean",
26467
+ "location": "query",
26468
+ "required": false,
26469
+ "description": "true = so os favoritos. So vale com `page`."
26470
+ },
26471
+ {
26472
+ "name": "q",
26473
+ "type": "string",
26474
+ "location": "query",
26475
+ "required": false,
26476
+ "description": "Busca no nome do arquivo (sem diferenciar maiuscula). So vale com `page`."
26414
26477
  }
26415
26478
  ],
26416
- "returns": "{payload: [...]} ordenado por favorito e depois data. source tem 5 origens: contact, kanban, conversation, agenda e lead_form (NOVO 18/08 — arquivos que o lead enviou num formulario publico; itens trazem lead_form_id e lead_form_name; aparecem depois que a resposta e ligada ao contato). Anexo de lead_form aceita mirror (renomear/favoritar) mas NAO aceita destroy_mirror (422) — o arquivo pertence a resposta do formulario.",
26479
+ "returns": "{payload: [...]} ordenado por favorito e depois data. source tem 5 origens: contact, kanban, conversation, agenda e lead_form (NOVO 18/08 — arquivos que o lead enviou num formulario publico; itens trazem lead_form_id e lead_form_name; aparecem depois que a resposta e ligada ao contato). Anexo de lead_form aceita mirror (renomear/favoritar) mas NAO aceita destroy_mirror (422) — o arquivo pertence a resposta do formulario. Com `page`: {payload: [so a pagina], meta: {total (ja filtrado), page, per_page, total_pages, contacts, truncated}}; o payload mantem a mesma ordem (favoritos, depois data) e as paginas juntas dao a lista inteira.",
26417
26480
  "common_use_cases": [
26418
26481
  "Ver todos os arquivos de um cliente num lugar só"
26419
26482
  ],
@@ -26754,7 +26817,7 @@
26754
26817
  "method": "GET",
26755
26818
  "path": "/api/v2/accounts/{account_id}/lead_origin_reports",
26756
26819
  "title": "Relatório de Origem dos Leads",
26757
- "description": "SÓ LEITURA. Agregado de origem dos leads/conversas: de qual plataforma, tipo, campanha, conjunto de anúncios e criativo vieram, com totais e taxa de conversão. Janela padrão: últimos 30 dias. Cruza os atributos origin_* das conversas + leads órfãos (contatos sem conversa); 'won' = cards em estágios de ganho do Kanban; leads únicos deduplicados por telefone. Permite drill-down por níveis (plataforma → tipo → campanha → conjunto → criativo).",
26820
+ "description": "SÓ LEITURA. Agregado de origem dos leads/conversas: de qual plataforma, tipo, campanha, conjunto de anúncios e criativo vieram, com totais e taxa de conversão. Janela padrão: últimos 30 dias. Cruza os atributos origin_* das conversas + leads órfãos (contatos sem conversa); 'won' = cards em estágios de ganho do Kanban; leads únicos deduplicados por telefone. Permite drill-down por níveis (plataforma → tipo → campanha → conjunto → criativo). Filtra por caixa (inbox_id) e por responsável (assignee_id) — em conta com mais de uma loja, SEM inbox_id o relatório soma todas as caixas. campaign/adset aceitam o valor especial \"__none__\" = TODO lead sem nome de campanha/conjunto (diretos, orgânicos e também os de anúncio cujo nome a Meta não deixou ler); para isolar só os de anúncio sem nome, combine com kind=paid_ad.",
26758
26821
  "category": "Relatorios",
26759
26822
  "params": [
26760
26823
  {
@@ -26762,14 +26825,14 @@
26762
26825
  "type": "string",
26763
26826
  "location": "query",
26764
26827
  "required": false,
26765
- "description": "Início ISO 8601 (padrão: 30 dias atrás)"
26828
+ "description": "Início ISO 8601 (padrão: 30 dias atrás). Tambem aceita unix e AAAA-MM-DD (dia inteiro no fuso da conta)."
26766
26829
  },
26767
26830
  {
26768
26831
  "name": "until",
26769
26832
  "type": "string",
26770
26833
  "location": "query",
26771
26834
  "required": false,
26772
- "description": "Fim ISO 8601 (padrão: agora)"
26835
+ "description": "Fim ISO 8601 (padrão: agora). Tambem aceita unix e AAAA-MM-DD (ate 23:59:59 no fuso da conta)."
26773
26836
  },
26774
26837
  {
26775
26838
  "name": "funnel_id",
@@ -26797,14 +26860,28 @@
26797
26860
  "type": "string",
26798
26861
  "location": "query",
26799
26862
  "required": false,
26800
- "description": "Filtra por campanha"
26863
+ "description": "Filtra por campanha (nome exato). Valor especial \"__none__\" = leads sem nome de campanha (todos, não só os de anúncio)."
26801
26864
  },
26802
26865
  {
26803
26866
  "name": "adset",
26804
26867
  "type": "string",
26805
26868
  "location": "query",
26806
26869
  "required": false,
26807
- "description": "Filtra por conjunto de anúncios"
26870
+ "description": "Filtra por conjunto de anúncios (nome exato). Valor especial \"__none__\" = leads sem nome de conjunto."
26871
+ },
26872
+ {
26873
+ "name": "inbox_id",
26874
+ "type": "integer",
26875
+ "location": "query",
26876
+ "required": false,
26877
+ "description": "Filtra por caixa de entrada. Essencial em conta com mais de uma loja/unidade: sem ele o relatorio soma TODAS as caixas da conta. Leads orfaos (contato sem conversa nenhuma) saem da contagem quando este filtro esta ligado — eles nao pertencem a caixa nenhuma."
26878
+ },
26879
+ {
26880
+ "name": "assignee_id",
26881
+ "type": "integer",
26882
+ "location": "query",
26883
+ "required": false,
26884
+ "description": "Filtra pelo responsavel (atendente) da conversa. Leads orfaos saem da contagem quando este filtro esta ligado — eles nao tem responsavel."
26808
26885
  },
26809
26886
  {
26810
26887
  "name": "group_by",
@@ -26870,7 +26947,7 @@
26870
26947
  "type": "number",
26871
26948
  "location": "body",
26872
26949
  "required": false,
26873
- "description": "Fuso em HORAS. NAO chute nem assuma -3: LEIA o fuso DA CONTA com `lionchat_account_show` (campo `timezone`, ex.: 'America/Sao_Paulo') e converta pra horas. O padrao da plataforma e America/Sao_Paulo (-3), mas a conta pode ter outro — Mato Grosso do Sul e -4, e cliente fora do Brasil existe. SEMPRE envie: ausente calcula em UTC e o numero nao bate com o que o cliente ve na tela. Em janela de UM DIA (time_range 'today'/'yesterday') isso e decisivo: uma hora de diferenca joga o que aconteceu de madrugada pro dia errado."
26950
+ "description": "Fuso em HORAS. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3). O padrao da conta e America/Sao_Paulo (-3); Mato Grosso do Sul e -4. Em janela de UM DIA ('today'/'yesterday') o fuso decide em que dia cai o que aconteceu de madrugada."
26874
26951
  },
26875
26952
  {
26876
26953
  "name": "time_range",
@@ -27022,7 +27099,7 @@
27022
27099
  "type": "number",
27023
27100
  "location": "query",
27024
27101
  "required": false,
27025
- "description": "Fuso em HORAS. NAO chute nem assuma -3: LEIA o fuso DA CONTA com `lionchat_account_show` (campo `timezone`, ex.: 'America/Sao_Paulo') e converta pra horas. O padrao da plataforma e America/Sao_Paulo (-3), mas a conta pode ter outro — Mato Grosso do Sul e -4, e cliente fora do Brasil existe. SEMPRE envie: ausente calcula em UTC e o numero nao bate com o que o cliente ve na tela. Em janela de UM DIA (time_range 'today'/'yesterday') isso e decisivo: uma hora de diferenca joga o que aconteceu de madrugada pro dia errado."
27102
+ "description": "Fuso em HORAS. Opcional. Ausente usa o fuso DA CONTA (correto para quase todos os casos); so envie para olhar de OUTRO fuso, em horas (ex: -3). O padrao da conta e America/Sao_Paulo (-3); Mato Grosso do Sul e -4. Em janela de UM DIA ('today'/'yesterday') o fuso decide em que dia cai o que aconteceu de madrugada."
27026
27103
  },
27027
27104
  {
27028
27105
  "name": "measure",
@@ -28475,14 +28552,14 @@
28475
28552
  "type": "string",
28476
28553
  "location": "query",
28477
28554
  "required": false,
28478
- "description": "Data inicial no formato AAAA-MM-DD (o dia inteiro entra). NÃO é timestamp Unix — número aqui gera erro"
28555
+ "description": "Data inicial (AAAA-MM-DD; o dia inteiro entra, no fuso da conta). Tambem aceita unix e ISO 8601."
28479
28556
  },
28480
28557
  {
28481
28558
  "name": "until",
28482
28559
  "type": "string",
28483
28560
  "location": "query",
28484
28561
  "required": false,
28485
- "description": "Data final no formato AAAA-MM-DD (o dia inteiro entra). NÃO é timestamp Unix — número aqui gera erro"
28562
+ "description": "Data final (AAAA-MM-DD; o dia inteiro entra, no fuso da conta). Tambem aceita unix e ISO 8601."
28486
28563
  },
28487
28564
  {
28488
28565
  "name": "q",
@@ -33749,14 +33826,14 @@
33749
33826
  "type": "string",
33750
33827
  "location": "query",
33751
33828
  "required": false,
33752
- "description": "Início — timestamp UNIX em SEGUNDOS"
33829
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
33753
33830
  },
33754
33831
  {
33755
33832
  "name": "until",
33756
33833
  "type": "string",
33757
33834
  "location": "query",
33758
33835
  "required": false,
33759
- "description": "Fim — timestamp UNIX em SEGUNDOS"
33836
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
33760
33837
  },
33761
33838
  {
33762
33839
  "name": "inbox_id",
@@ -33825,14 +33902,21 @@
33825
33902
  "type": "string",
33826
33903
  "location": "query",
33827
33904
  "required": false,
33828
- "description": "Início — timestamp UNIX em SEGUNDOS (só com Busca avançada)"
33905
+ "description": "Inicio do periodo (so com Busca avancada). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
33829
33906
  },
33830
33907
  {
33831
33908
  "name": "until",
33832
33909
  "type": "string",
33833
33910
  "location": "query",
33834
33911
  "required": false,
33835
- "description": "Fim — timestamp UNIX em SEGUNDOS (só com Busca avançada)"
33912
+ "description": "Fim do periodo (so com Busca avancada). Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato."
33913
+ },
33914
+ {
33915
+ "name": "date_basis",
33916
+ "type": "string",
33917
+ "location": "query",
33918
+ "required": false,
33919
+ "description": "OPCIONAL. Qual data o periodo (since/until) usa: `activity` (padrao e qualquer outro valor: conversas e contatos pela ULTIMA ATIVIDADE, artigos pela ultima atualizacao) ou `created` (pela data de CRIACAO). Mensagens ja sao por criacao e cards do Kanban nao tem periodo. Valor invalido nunca da erro."
33836
33920
  }
33837
33921
  ],
33838
33922
  "returns": "{payload: {articles: [{id, title, locale, content, slug, portal_slug, account_id, category_name, status, updated_at (unix)}]}}",
@@ -35829,7 +35913,7 @@
35829
35913
  "method": "GET",
35830
35914
  "path": "/api/v1/accounts/{account_id}/companies/{company_id}/documents",
35831
35915
  "title": "Documentos da Empresa",
35832
- "description": "Documentos de TODOS os contatos da empresa juntos (mesmas origens e regras da aba Documentos do contato: ficha, card, conversa, compromisso, formulario e contrato assinado). Cada item traz contacts [{id, name}] (de quem e). O mesmo arquivo mandado a varios contatos vem UMA vez, com todos os nomes. SO LEITURA: favoritar/renomear/enviar/apagar e pela ficha do contato (lionchat_contacts_documents_*). Lista inteira, teto de 1000 (meta.truncated avisa).",
35916
+ "description": "Documentos de TODOS os contatos da empresa juntos (mesmas origens e regras da aba Documentos do contato: ficha, card, conversa, compromisso, formulario e contrato assinado). Cada item traz contacts [{id, name}] (de quem e). O mesmo arquivo mandado a varios contatos vem UMA vez, com todos os nomes. SO LEITURA: favoritar/renomear/enviar/apagar e pela ficha do contato (lionchat_contacts_documents_*). Teto de 1000 (meta.truncated avisa). (06/10) PAGINACAO OPCIONAL: com `page` (50 por pagina, ate 100) devolve so a pagina e aplica os filtros source/type/favorite/q/owner_id no servidor; sem `page`, a lista inteira.",
35833
35917
  "category": "Empresas",
35834
35918
  "params": [
35835
35919
  {
@@ -35838,9 +35922,58 @@
35838
35922
  "location": "path",
35839
35923
  "required": true,
35840
35924
  "description": "ID da empresa"
35925
+ },
35926
+ {
35927
+ "name": "page",
35928
+ "type": "integer",
35929
+ "location": "query",
35930
+ "required": false,
35931
+ "description": "PAGINA (a partir de 1). Ativa a paginacao NO SERVIDOR: devolve so os itens da pagina e `meta`. Sem `page` a resposta e a lista inteira, como sempre. Pagina que nao existe mais vira a ultima."
35932
+ },
35933
+ {
35934
+ "name": "per_page",
35935
+ "type": "integer",
35936
+ "location": "query",
35937
+ "required": false,
35938
+ "description": "Itens por pagina (padrao 50, maximo 100). So vale com `page`."
35939
+ },
35940
+ {
35941
+ "name": "source",
35942
+ "type": "string",
35943
+ "location": "query",
35944
+ "required": false,
35945
+ "description": "Filtra pela origem: contact, kanban, conversation, agenda, lead_form ou esignature. So vale com `page`."
35946
+ },
35947
+ {
35948
+ "name": "type",
35949
+ "type": "string",
35950
+ "location": "query",
35951
+ "required": false,
35952
+ "description": "Filtra pelo tipo do arquivo: images, pdf, sheets, docs ou other. Valor desconhecido e ignorado. So vale com `page`."
35953
+ },
35954
+ {
35955
+ "name": "favorite",
35956
+ "type": "boolean",
35957
+ "location": "query",
35958
+ "required": false,
35959
+ "description": "true = so os favoritos. So vale com `page`."
35960
+ },
35961
+ {
35962
+ "name": "q",
35963
+ "type": "string",
35964
+ "location": "query",
35965
+ "required": false,
35966
+ "description": "Busca no nome do arquivo (sem diferenciar maiuscula). So vale com `page`."
35967
+ },
35968
+ {
35969
+ "name": "owner_id",
35970
+ "type": "integer",
35971
+ "location": "query",
35972
+ "required": false,
35973
+ "description": "Filtra pelo DONO do arquivo (id de um contato da empresa; os donos disponiveis vem em meta.contacts). So vale com `page`."
35841
35974
  }
35842
35975
  ],
35843
- "returns": "{payload: [...], meta: {total, truncated}}",
35976
+ "returns": "{payload: [...], meta: {total, truncated}}. Com `page`: meta = {total (ja filtrado), page, per_page, total_pages, contacts (os donos de TODOS os arquivos, para montar o filtro), truncated}.",
35844
35977
  "common_use_cases": [
35845
35978
  "Achar um arquivo de qualquer pessoa da empresa",
35846
35979
  "Conferir documentos enviados para a empresa"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "1.29.0",
3
+ "version": "1.30.0",
4
4
  "description": "MCP server for LionChat API — 547 tools + 10 resources + 9 prompts. Audit-log aware, completion API, progress notifications.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",