@lionchat/mcp-server 1.25.0 → 1.26.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.
@@ -437,7 +437,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
437
437
  | **Mudar o modo de distribuição da caixa** (Rodízio × Equilibrado) | `lionchat_inboxes_update` (`auto_assignment_config.assignment_order`) | Só vale quando a caixa NÃO tem política vinculada (com política, a política manda). O jsonb é SUBSTITUÍDO, não mesclado: releia o `auto_assignment_config` atual e reenvie as outras chaves junto, senão apaga o `assign_offline_agents` e o freio |
438
438
  | **Criar/atualizar time** | `lionchat_teams_create` / `_update` | **Preencha `description`**: desde 03/08 é ela que o AI Agente lê pra decidir o roteamento por time. Descreva QUANDO mandar pra lá, não o que o time é |
439
439
  | **Trocar um atendente por outro** ("fulano saiu, entrou ciclano") | `lionchat_agents_replace` (`POST /agents/{id}/replace`, body `agent: {email, name, role}`; `inherit_memberships` default `true`) | Faz os dois passos de uma vez: cria o novo (passa pelo limite de vagas do plano por 30 min), manda a carteira inteira (conversas, cards, tarefas, agendamentos) e exclui o antigo em segundo plano. Responde **202** com `new_agent` — o antigo some da lista quando a transferência termina (`replacing: true` em `agents_list` enquanto roda). **Confirme antes** (seção 7a: é exclusão). Recusas 422: substituir a si mesmo, agente de suporte, e-mail já membro, e o **único administrador confirmado só troca por usuário já confirmado** (convide e espere aceitar). `agents_destroy` recusa quem está ENTRANDO numa substituição viva. Admin-only |
440
- | **Pausar a automação no meio** (esperar atribuição/card antes da próxima ação) | ação `wait` em `lionchat_automation_rules_create` / `_update` | Segundos, teto 300. Acima disso é caso de FlowBuilder. Ver `lionchat://docs/conversation-flows` |
440
+ | **Pausar a automação no meio** (esperar atribuição/card antes da próxima ação) | ação `wait` em `lionchat_automation_rules_create` / `_update` | Segundos, teto 300. Acima disso é caso de FlowBuilder. Formato objeto `[{seconds, only_if_open, only_if_no_reply}]` confere na volta se a conversa segue aberta e se ninguém respondeu (25/09). Ver `lionchat://docs/conversation-flows` |
441
441
  | **Buscar contato/conversa/card** | `lionchat_search_*`, `lionchat_contacts_search` | **Termo com letra exige 3+ caracteres** (dígito é isento). Menos que isso volta VAZIO sem erro — não conclua que o registro não existe. Ver `lionchat://docs/api-conventions` |
442
442
  | **Migrar conversas** de uma caixa WhatsApp pra outra (ex.: QR Code → Oficial) | `lionchat_inboxes_inbox_migration_list` (prévia) → `_execute` → acompanhar status | Admin-only e IRREVERSÍVEL: sempre mostre os números da prévia e confirme (seção 7a). Grupos não vão pro canal oficial — ficam na caixa de origem |
443
443
  | Qualquer coisa de Ligação WP (Wavoip) | **INTEGRAÇÃO REMOVIDA em 12/08/2026** — não há tool nem tela | A Wavoip saiu do produto: a aba "Ligação WP" **não existe mais**. NUNCA orientar o usuário a "Configurações da caixa → Ligação WP". Para voz em caixa QR Code, o caminho hoje é o **LionCalls**. As ligações antigas seguem no histórico (`provider: "wavoip"`); as gravações delas ficavam no servidor da Wavoip e vão sumir — ao tentar ouvir, o painel mostra "Esta gravação não está mais disponível", e isso é esperado, não é defeito. |
@@ -9,6 +9,7 @@ Padrões de autenticação, paginação, filtros, formatos e tratamento de erros
9
9
  | Tipo | Header / Param | Quando usar |
10
10
  |---|---|---|
11
11
  | `api_access_token` | Header `api_access_token: <token>` | API principal (você usa isto via MCP) |
12
+ | Chave de API como Bearer | `Authorization: Bearer <token>` (mesma chave de 24 caracteres do perfil) | Desde 26/09/2026, pra n8n, Make e ferramentas que só sabem mandar Bearer. Se os dois vierem, vale o `api_access_token` |
12
13
  | Devise Token Auth | `access-token` + `client` + `uid` | Dashboard web/mobile (não você) |
13
14
  | HMAC | `X-Webhook-Signature` | Webhooks de entrada |
14
15
  | OAuth Bearer | `Authorization: Bearer <token>` | MCP Remote (você usa isto) |
@@ -1001,3 +1001,50 @@ grupo, então o número entraria num grupo que nunca apareceria no painel. O cam
1001
1001
  a opção nas configurações da caixa e tentar de novo.
1002
1002
 
1003
1003
  A resposta do join_info vem no formato cru do motor, em PascalCase (`Name`, não `name`).
1004
+
1005
+ ## Gerenciar um grupo: permissões, pedidos para entrar, link e foto (26/09/2026)
1006
+
1007
+ Só em caixa de WhatsApp QR Code. O `group_id` é o id do WhatsApp **com o sufixo** (`120363...@g.us`),
1008
+ sempre como texto. Toda ação que muda o grupo exige que o número da caixa seja **admin do grupo**
1009
+ (403 se não for) — confira `my_role` em `lionchat_inboxes_waha_groups_show` antes.
1010
+
1011
+ **Permissões** — `lionchat_inboxes_waha_groups_update_2` aceita quatro chaves, todas no mesmo sentido
1012
+ (`true` = só admins / precisa aprovar):
1013
+
1014
+ | Chave | O que faz |
1015
+ |---|---|
1016
+ | `messages_admin_only` | só admins enviam mensagens |
1017
+ | `info_admin_only` | só admins editam nome, foto e descrição |
1018
+ | `members_add_admin_only` | só admins adicionam participantes |
1019
+ | `approval_required` | quem pede para entrar pelo link espera um admin aprovar |
1020
+
1021
+ - Mande só `true` ou `false` nas duas últimas — qualquer outra coisa é recusada com 422 (nunca vira `true`).
1022
+ - A resposta diz o que foi aplicado: com várias chaves, se uma falhar vem 422 com `applied` e `failed`.
1023
+ Informe à pessoa o que mudou e o que não mudou; não repita tudo de novo.
1024
+ - Para LER as duas últimas use `lionchat_inboxes_waha_groups_list_4`. `null` = o WhatsApp não respondeu
1025
+ agora (não é `false`). `approval_supported: false` = o servidor do WhatsApp daquela caixa ainda não
1026
+ tem aprovação de novos participantes: não ofereça a opção.
1027
+ - **Desligar `approval_required` com pedidos esperando:** o WhatsApp pode aprovar todos de uma vez.
1028
+ Liste os pedidos antes (`lionchat_inboxes_waha_groups_list_5`), diga quantos são e só desligue com
1029
+ confirmação explícita.
1030
+
1031
+ **Pedidos para entrar**
1032
+
1033
+ 1. `lionchat_inboxes_waha_groups_list_5` — lista. `supported: false` = servidor sem o recurso;
1034
+ `allowed: false` = o WhatsApp não deixou (o número não é admin do grupo).
1035
+ 2. `lionchat_inboxes_waha_groups_create_7` (aprovar) ou `_create_8` (recusar) com
1036
+ `participants: [{ id }]`, usando o `id` de cada pedido da lista.
1037
+
1038
+ - Aprovar coloca a pessoa no grupo e **aciona a pílula "entrou" e os fluxos "Entrou no grupo"**, igual a
1039
+ quem entra pelo link. Aprovar muitos de uma vez dispara um fluxo por pessoa.
1040
+ - A resposta traz `results` por pessoa e as listas **relidas** (`join_requests` e `participants`). Use
1041
+ essas listas para responder — não chame o `show` de novo (ele faz 6 perguntas ao WhatsApp e leva ~7 s).
1042
+ - 422 com as listas reais = o WhatsApp recusou (o pedido pode ter sido tratado pelo celular). Não repita.
1043
+ - Telefone do pedido só vem em `pn`. Quando vier `null`, o WhatsApp escondeu o número: diga isso; nunca
1044
+ apresente os dígitos do `id` (terminado em `@lid`) como telefone.
1045
+
1046
+ **Link de convite** — `lionchat_inboxes_waha_groups_create_4` gera um link novo e **mata o antigo**,
1047
+ inclusive o que fluxos e campanhas já enviaram. Confirme antes.
1048
+
1049
+ **Foto** — `lionchat_inboxes_waha_groups_update_3` troca; `lionchat_inboxes_waha_groups_destroy` remove
1050
+ (no WhatsApp e na lista de conversas do LionChat).
@@ -721,7 +721,7 @@ Todos os formatos abaixo foram conferidos linha a linha em `app/services/action_
721
721
  | `add_note_to_kanban_item` | `[{"funnel_id": 31, "text": "texto da nota"}]` — a chave e **`text`**, nao `note` |
722
722
  | `set_kanban_item_status` | `[{"funnel_id": 31, "status": "won"}]` — `won`, `lost` ou `open`. Status fora disso e ignorado |
723
723
  | `start_kanban_item_timer` / `stop_kanban_item_timer` | `[{"funnel_id": 31}]` |
724
- | `wait` | `[30]` — segundos. Ver "Acao Aguardar" abaixo |
724
+ | `wait` | `[30]` — segundos. Com conferência na volta: `[{"seconds": 120, "only_if_open": true, "only_if_no_reply": true}]`. Ver "Acao Aguardar" abaixo |
725
725
 
726
726
  **Acoes de Kanban:** todas precisam que a conversa ja tenha um card no funil informado. Sem card,
727
727
  a acao e pulada (fica so no log do servidor). Use `create_kanban_item` antes, na mesma regra.
@@ -756,6 +756,24 @@ conversas esperam ao mesmo tempo sem travar o atendimento. Na volta, o sistema c
756
756
  ainda existe e esta ligada, se a conversa ainda existe e se a caixa nao foi excluida — se algo
757
757
  disso mudou, ele simplesmente nao retoma.
758
758
 
759
+ **Conferir na volta (novo 2026-09-25).** Duas caixinhas opcionais, no formato OBJETO:
760
+
761
+ ```json
762
+ { "action_name": "wait", "action_params": [{ "seconds": 120, "only_if_open": true, "only_if_no_reply": true }] }
763
+ ```
764
+
765
+ | Chave | O que faz na volta |
766
+ |---|---|
767
+ | `only_if_open` | So segue se a conversa ainda estiver **aberta ou pendente**. Resolvida/adiada = o resto da regra NAO roda |
768
+ | `only_if_no_reply` | So segue se **ninguem respondeu** o cliente durante a espera. Conta qualquer mensagem PUBLICA de saida depois da pausa — atendente, IA, outra automacao ou mensagem automatica da caixa (saudacao, ausencia). Nota privada nao conta |
769
+
770
+ - Booleano de verdade (`true`/`false`); texto `"true"` tambem e aceito. Sem as chaves = retoma como sempre.
771
+ - O formato antigo (`[120]`) continua valendo e nao tem conferencia nenhuma.
772
+ - Quando a conferencia barra, o historico da execucao (`lionchat_automation_rules_list_1`) ganha o passo
773
+ `wait_check` com status `skipped` e o motivo. Nao e erro: e a regra fazendo o que foi pedido.
774
+ - Caso tipico: "manda o lembrete em 5 minutos **se ninguem tiver atendido ainda**" — sem `only_if_no_reply`,
775
+ o lembrete sai mesmo depois que o atendente ja respondeu.
776
+
759
777
  Lista autoritativa de nomes validos: `AutomationRule#actions_attributes` no backend. Nome de acao
760
778
  fora dessa lista e recusado com 422 ao salvar — isso a API valida. O que ela **nao** valida e o
761
779
  conteudo do `action_params`. `apply_kanban_checklist_template` existe no motor mas **nao** e uma
@@ -221,6 +221,7 @@ universal); a superfície REST de contatos não mudou.
221
221
  **Padrões de `source_id` por canal:**
222
222
  - Waha: `5511999999999@c.us` (1-on-1) ou `120363xxx@g.us` (grupo) ou `XXXX@lid` (LID)
223
223
  - WhatsApp Cloud: `5511999999999` (E.164 sem prefixo)
224
+ - ou o ID do WhatsApp da Meta (`CO.1046754121506176`) quando o cliente chegou SEM telefone (so nome de usuario). Nesse caso o contato nao tem `phone_number` e guarda `additional_attributes.social_whatsapp_user_id` / `social_whatsapp_user_name` (2026-09-25)
224
225
  - Email: o email mesmo
225
226
  - WebWidget: UUID gerado
226
227
 
@@ -365,6 +366,8 @@ Captain::AssistantResponse (FAQ)
365
366
  ├── question
366
367
  ├── answer
367
368
  ├── status (pending/approved/rejected)
369
+ ├── occurrences_count (int, default 1 — em quantas conversas DIFERENTES a mesma pergunta pendente
370
+ │ apareceu; soma so enquanto pendente. Lista: sort=occurrences = mais perguntadas primeiro, 2026-09-25)
368
371
  ├── embedding (vector, pgvector)
369
372
  └── documentable (polymorphic: Conversation que gerou)
370
373
 
@@ -414,6 +417,8 @@ e `send_conversion` (`[{destinations, event_names, value}]` — só administrado
414
417
  execução). Atributo protegido em `update_*_attribute` é recusado na execução (só no log). Executar
415
418
  (`lionchat_macros_execute`): até 100 conversas por chamada, a mesma conversa em 5 s é pulada em silêncio,
416
419
  30 execuções por minuto por usuário (429). A mensagem de `send_canned_response` sai assinada por quem executou.
420
+ Cada execução deixa na conversa a pílula "Macro: X executada por Fulano" (uma por conversa, 26/09) — vale
421
+ também pelo MCP, então quem executa aparece no histórico da conversa.
417
422
 
418
423
  ## Agenda / Tarefas / Booking
419
424
 
@@ -572,12 +577,12 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
572
577
  |---|---|---|
573
578
  | `eclinica_cliente_id` | text | ID do paciente no e-Clínica (chave de matching) |
574
579
  | `eclinica_unit_id` / `eclinica_unit_name` | text | Unidade/filial que originou o evento |
575
- | `eclinica_idagenda` | text | ID do último agendamento |
576
- | `eclinica_data_consulta` | date | Data da consulta, ISO |
580
+ | `eclinica_idagenda` | text | ID do último agendamento (tela: "e-Clinica - ID do Ultimo Agendamento (ficha)") |
581
+ | `eclinica_data_consulta` | date | Data da consulta do ÚLTIMO aviso recebido, ISO (tela: "e-Clinica - Data da Ultima Consulta (ficha)"). **Nunca use na mensagem de LEMBRETE** — ver "Variáveis do lembrete" abaixo |
577
582
  | `eclinica_hora_consulta` | **time** | Hora da consulta 24h `"HH:MM"` (novo 2026-07-06) |
578
583
  | `eclinica_hora_final` | **time** | Hora final da consulta (novo 2026-07-27) |
579
- | `eclinica_link_confirmacao` | **link** | Link ecli.co para o paciente confirmar/cancelar a ÚLTIMA consulta (novo 2026-09-08; só existe quando a unidade aprendeu o padrão na aba Unidades). No LEMBRETE use a variável `{{link_confirmacao}}` do fluxo (ou `{{agendamento.link_confirmacao}}` na automação): é da consulta certa — a ficha aponta para a última, e quem tem duas marcadas receberia o link errado |
580
- | `eclinica_paciente_nome` | text | Nome do PACIENTE como está no cadastro da e-Clínica (novo 2026-09-09). O nome do contato pode ser o do WhatsApp (mãe que agenda o filho pelo celular dela) — por isso NUNCA use `{{contact.name}}` nas mensagens da clínica. Nos fluxos por evento: `{{ contact.custom_attribute.eclinica_paciente_nome \| default: contact.name \| primeiro_nome }}`; no LEMBRETE use a variável `{{ paciente_nome \| default: contact.name \| primeiro_nome }}` (por consulta) ou `{{agendamento.paciente_nome}}` na automação. `primeiro_nome` = primeira palavra com inicial maiúscula. |
584
+ | `eclinica_link_confirmacao` | **link** | Link ecli.co para o paciente confirmar/cancelar a ÚLTIMA consulta (novo 2026-09-08; só existe quando a unidade aprendeu o padrão na aba Unidades). No LEMBRETE use a variável `{{link_confirmacao}}` do fluxo (ou `{{eclinica_lembrete.link_confirmacao}}` na automação): é da consulta certa — a ficha aponta para a última, e quem tem duas marcadas receberia o link errado |
585
+ | `eclinica_paciente_nome` | text | Nome do PACIENTE como está no cadastro da e-Clínica (novo 2026-09-09). O nome do contato pode ser o do WhatsApp (mãe que agenda o filho pelo celular dela) — por isso NUNCA use `{{contact.name}}` nas mensagens da clínica. Nos fluxos por evento: `{{ contact.custom_attribute.eclinica_paciente_nome \| default: contact.name \| primeiro_nome }}`; no LEMBRETE use a variável `{{ paciente_nome \| default: contact.name \| primeiro_nome }}` (por consulta) ou `{{eclinica_lembrete.paciente_nome}}` na automação. `primeiro_nome` = primeira palavra com inicial maiúscula. |
581
586
  | `eclinica_status_agendamento` | text | `agendado` / `aguardando` (paciente chegou) / `no_show` / `atendido` / `desmarcado`. Vem do TIPO do evento, nunca da letra da situação. **Estado terminal do MESMO agendamento não volta pra `agendado`** (2026-08-20): a e-Clínica manda `agendamento_alterado` a cada edição da consulta, inclusive depois da chegada/atendimento, e isso NÃO reabre o status. Consulta com `eclinica_idagenda` DIFERENTE nasce `agendado` |
582
587
  | `eclinica_situacao` | text | Situação do agendamento no painel, **POR EXTENSO** (2026-08-21, legenda oficial da e-Clínica): AGUARDANDO, NA CADEIRA, PASSAR FINANCEIRO, AGENDAR RETORNO, ATENDIDO, CONFIRMADO, CONFIRMADO PELO LINK, CONFIRMADO PELA API, FALTA, DESMARCADO, CANCELADO PELO LINK, CANCELADO PELA API. Antes guardava a letra crua (`A`, `C`…). Código nunca visto aparece como veio |
583
588
  | `eclinica_compromisso` | text | Tipo da consulta — TEXTO LIVRE da recepção (ex: Consulta, Retorno) |
@@ -658,11 +663,32 @@ linhas ANTIGAS (até 17/09); e `fail_reason = fluxo_ainda_em_andamento_com_este_
658
663
  fluxo do aviso anterior ainda estava em andamento com aquele contato (típico de fluxo que aguarda o
659
664
  paciente clicar num botão) — pode ser reenviado com `lionchat_eclinica_reminder_history_reprocess`.
660
665
  O fluxo do lembrete recebe também `{{cliente_id}}` (código do paciente DAQUELA consulta na e-Clínica) e
661
- `{{agendatipo}}`; na automação, `{{agendamento.cliente_id}}` e `{{agendamento.agendatipo}}`. Ao consultar a
666
+ `{{agendatipo}}`; na automação, `{{eclinica_lembrete.cliente_id}}` e `{{eclinica_lembrete.agendatipo}}`. Ao consultar a
662
667
  agenda do paciente dentro do fluxo, use `{{cliente_id}}` do lembrete — a ficha do contato é uma por
663
668
  TELEFONE e guarda só o último paciente. Quem quiser "só um lembrete por dia" monta no próprio fluxo
664
669
  (condição num atributo da conversa com `{{data_consulta}}` + ação que grava o dia depois de enviar).
665
670
 
671
+ **Variáveis do lembrete — o nome certo (desde 2026-09-28).** Cada lembrete guarda a FOTOGRAFIA da consulta
672
+ dele. A FICHA do contato (`eclinica_data_consulta`, `eclinica_hora_consulta`, `eclinica_profissional`...) guarda
673
+ só a consulta do ÚLTIMO aviso que a e-Clínica mandou — quem marca o retorno no mesmo dia em que é atendido tem
674
+ a ficha sobrescrita e o lembrete sai com a data de OUTRA consulta (caso real: Big Odonto, 28/09). Na tela, os 9
675
+ campos de agendamento da ficha aparecem como "e-Clinica - ... Ultima Consulta (ficha)" (a chave não mudou).
676
+ - **Na AUTOMAÇÃO alvo de lembrete** (`reminder_config[].automation_id`), use SEMPRE
677
+ `{{eclinica_lembrete.<campo>}}`: `data_consulta`, `hora_consulta`, `profissional`, `compromisso`,
678
+ `paciente_nome`, `unidade`, `link_confirmacao`, `idagenda`, `cliente_id`, `agendatipo`, `cor`; no lembrete de
679
+ laboratório `data_prevista`, `data_entrega`, `data_referencia`; no de cobrança `vencimento`, `valor`,
680
+ `descricao`. Vale na mensagem, na nota interna, nos parâmetros do modelo de WhatsApp
681
+ (`processed_params.body`) e em título/descrição de tarefa. A data sai **DD/MM/AAAA** onde vira texto para a
682
+ pessoa; gravada em campo (atualizar atributo/campo do card) fica no formato interno `AAAA-MM-DD`. Filtro
683
+ Liquid (`{{ x | f }}`) NÃO funciona nesse nome. O nome antigo `{{agendamento.<campo>}}` continua funcionando
684
+ (automações antigas), mas não ensine mais.
685
+ - **No FLUXO nada muda**: continue com as variáveis soltas `{{data_consulta}}`, `{{hora_consulta}}`,
686
+ `{{link_confirmacao}}`, `{{paciente_nome}}`, `{{cliente_id}}`... Não use `eclinica_lembrete` em fluxo. Nos
687
+ fluxos de lembrete que conferem a consulta na e-Clínica antes de enviar, essas variáveis soltas são
688
+ CORRIGIDAS pelo próprio fluxo quando a consulta foi remarcada.
689
+ - Automação/fluxo disparado por EVENTO da e-Clínica (não lembrete) continua lendo a ficha — ali ela acabou de
690
+ ser gravada pelo próprio evento e está certa.
691
+
666
692
  ## Relatórios e Métricas
667
693
 
668
694
  ```
@@ -111,6 +111,7 @@ conversa antiga que NÃO aparece no relatório de hoje (régua antiga por criaç
111
111
  | `lionchat_reports_list_3` | Resumo POR LABEL |
112
112
  | `lionchat_reports_list_4` | Resumo POR CANAL (channel) |
113
113
  | `lionchat_reports_list_5` | Série temporal / evolução (timeseries de um `metric`) |
114
+ | `lionchat_reports_drilldown` | As CONVERSAS por trás de UM ponto da série temporal (clique na barra do gráfico) |
114
115
  | `lionchat_reports_list_6` | Resumo do BOT (bot_summary) |
115
116
  | `lionchat_reports_list_7` | Exportação de AGENTES em CSV |
116
117
  | `lionchat_reports_list_8` | Exportação de INBOXES em CSV |
@@ -146,6 +147,7 @@ conversa antiga que NÃO aparece no relatório de hoje (régua antiga por criaç
146
147
  | "qual canal tem mais demanda", "comparar WhatsApp vs Email" | `lionchat_reports_list_2` (inbox) ou `lionchat_reports_list_4` (tipo de canal) |
147
148
  | "quantas conversas urgentes", "por etiqueta" | `lionchat_reports_list_3` |
148
149
  | "evolução dia a dia", "mês a mês", "gráfico de linha" | `lionchat_reports_list_5` |
150
+ | "quais conversas deram aquele pico de terça?", "quem são as 40 conversas do dia 12?" | `lionchat_reports_list_5` pra achar o ponto, depois `lionchat_reports_drilldown` |
149
151
  | "como tá o bot resolvendo", "% de handoff pra humano" | `lionchat_reports_list_6` ou `lionchat_reports_list_14` |
150
152
  | "exportar planilha de agentes/inboxes/labels/times" | `_7` / `_8` / `_9` / `_10` (CSV) |
151
153
  | "horário de pico", "quando tem mais demanda" | `lionchat_reports_list_13` |
@@ -233,6 +235,35 @@ Retorna pontos (data + valor) para UM `metric` por vez:
233
235
  - `business_hours`: `true` faz médias contarem só o horário de atendimento
234
236
  - `timezone_offset`: deslocamento de fuso (horas) — afeta como os pontos são agrupados por dia/hora
235
237
 
238
+ ### `lionchat_reports_drilldown` — As conversas por trás de um ponto do gráfico (2026-09-25)
239
+ **Use quando:** "quais conversas são essas 40 do dia 12?", "por que a terça teve pico?", "quem demorou
240
+ naquela semana?"
241
+
242
+ É o mesmo que clicar numa barra do gráfico nos Relatórios do painel. Conta com a **mesma régua** que
243
+ desenhou a barra — então a lista bate com o número do ponto (ex.: por etiqueta conta pela data em que a
244
+ etiqueta foi APLICADA, não pela criação da conversa).
245
+
246
+ Fluxo: chame `lionchat_reports_list_5` → pegue o `timestamp` do ponto → chame esta ferramenta com:
247
+ - `metric`: a MESMA da série. Aceita só `conversations_count`, `incoming_messages_count`,
248
+ `outgoing_messages_count`, `resolutions_count`, `avg_first_response_time`, `avg_resolution_time`,
249
+ `reply_time`. Métrica de bot ou fora da lista = 422 `invalid metric`.
250
+ - `bucket_timestamp`: o `timestamp` do ponto (Unix em segundos).
251
+ - `group_by`, `type`, `id`, `timezone_offset`, `business_hours`: os MESMOS usados na série — é isso
252
+ que define o começo e o fim do ponto. `group_by` diferente = outro recorte e a lista não bate.
253
+ - `since` / `until`: o período do relatório (recorta o primeiro e o último ponto quando o período começa
254
+ ou termina no meio de uma semana/mês).
255
+ - `page`: 25 conversas por página, mais recentes primeiro.
256
+
257
+ Resposta: `{ meta: { metric, since, until, page, per_page, total_count, visible_count, hidden_count },
258
+ payload: [{ id, display_id, status, created_at, contact_name, inbox_name, assignee_name, detail }] }`.
259
+ `detail` explica o porquê de cada conversa: `{count}` (quantas mensagens/eventos dela caíram no ponto) nas
260
+ contagens de mensagens e de resoluções, `{seconds}` nas médias de tempo, ou `null`. `display_id` é o número que aparece na
261
+ tela da conversa.
262
+
263
+ > A lista mostra **só as conversas que a pessoa do token pode abrir**. `hidden_count` diz quantas ficaram
264
+ > de fora por permissão — diga isso ao usuário em vez de concluir que "faltam conversas". Teto de 5.000
265
+ > conversas por ponto. Exige permissão de ver relatórios.
266
+
236
267
  ### `lionchat_reports_list_6` — Resumo do Bot
237
268
  **Use quando:** "como tá o bot resolvendo", "quantos handoffs pra humano"
238
269
 
@@ -574,7 +605,7 @@ Não é consulta livre: escolha um `widget_type` e preencha **só os campos daqu
574
605
  | `calls_report` | `dimension` (agent/inbox) · `scope_type` (só `inbox`, opcional — recorte por caixa, desde 27/08/2026) + `scope_id` · `time_range` — ligações / atendidas / não atendidas / não concluídas / tempo total / tempo médio | — |
575
606
  | `lead_origin` | `time_range` | `liontrack` |
576
607
  | `agent_report` | `dimension` (agent/team/inbox) · `scope_type`+`scope_id` · `columns[]` · `time_range` | — |
577
- | `eclinica_no_show` | `dimension` (unit / operator / date) · `time_range` · `no_show_over_scheduled` (true/false, nasce desligada) — faltas na agenda da e-Clínica: agendados / compareceram / faltaram / desmarcados / sem desfecho / % de falta (o rótulo da coluna declara a base) | `eclinica_integration` |
608
+ | `eclinica_no_show` | `dimension` (unit / operator / date) · `time_range` · `no_show_over_scheduled` (true/false, nasce desligada) · `only_first_visit` (true/false, nasce desligada) — faltas na agenda da e-Clínica: agendados / compareceram / faltaram / desmarcados / sem desfecho / % de falta (o rótulo da coluna declara a base) | `eclinica_integration` |
578
609
  | `eclinica_conversion` | `dimension` (unit / operator) · `time_range` · `count_retorno_as_consulta` (true/false, nasce LIGADA) — consultas que viraram procedimento: consultas / viraram procedimento (até 60 dias) / % / procedimentos / não classificado | `eclinica_integration` |
579
610
 
580
611
  **Os dois blocos da e-Clínica (09/09/2026)** leem os eventos da agenda (`eclinica_webhook_events`) e
@@ -594,9 +625,20 @@ só existem em conta com a integração ligada. Três regras que mudam o número
594
625
  - **`no_show_over_scheduled`** (true/false, nasce desligada — 10/09/2026): ligada, a % de falta passa a
595
626
  ser `faltaram / agendados`, e a unidade que não anota desfecho aparece como a melhor da rede; o rótulo
596
627
  da coluna declara qual base está valendo. Aceita `"true"`/`"false"` em texto; outro valor = 422.
628
+ - **`only_first_visit`** (true/false, nasce desligada — 28/09/2026, só no `eclinica_no_show`): ligada, a
629
+ tabela conta **só a consulta inicial** — retorno, sessão de tratamento e procedimento ficam de fora — e
630
+ o rótulo da primeira coluna troca de "Agendados" para "Consultas iniciais". A regra lê o TEXTO do
631
+ compromisso, porque a clínica escreve o tipo por extenso: começa com `CONSULTA` **e** não contém
632
+ `RETORNO`. Medido na conta 56 (01 a 24/09/2026): "CONSULTA INICIAL" 1.445 vezes e "CONSULTA DE RETORNO"
633
+ 192; Sorocaba tem 1.023 compromissos para 99 consultas iniciais. Use quando o pedido falar em primeira
634
+ consulta, consulta inicial, paciente novo ou primeiro atendimento. Aceita `"true"`/`"false"` em texto;
635
+ outro valor = 422.
597
636
  - no bloco de conversão, **a lista de nomes de procedimento foi abolida** (10/09/2026): começa com
598
637
  `CONSULTA` ou contém `RETORNO` (em qualquer posição) é consulta; **todo o resto que tem paciente é
599
- procedimento**. Antes, 1.961 agendamentos em 30 dias (13,8% da agenda) caíam em "Não classificado" só
638
+ procedimento**. Desde 28/09/2026 o `RETORNO` é testado ANTES do prefixo `CONSULTA`: até ali
639
+ "CONSULTA DE RETORNO" era lido como consulta NOVA (192 agendamentos em 24 dias, 9,8% do que o bloco
640
+ contava como consulta). Com `count_retorno_as_consulta` ligada o número não muda; só muda para quem a
641
+ desligou — e ali é o conserto do que a chavinha sempre prometeu. Antes, 1.961 agendamentos em 30 dias (13,8% da agenda) caíam em "Não classificado" só
600
642
  por escrita diferente do nome ("ONDAS 1/3" x "ONDAS DE CHOQUE").
601
643
  - **`count_retorno_as_consulta`** (true/false, nasce LIGADA — 10/09/2026): ligada, o bloco responde "de
602
644
  toda consulta atendida, quantas viraram tratamento"; desligada, "do paciente NOVO, quantos fecham" — o
@@ -629,7 +671,7 @@ IDs de etiqueta**, nunca nome de métrica).
629
671
  | `series` | `{series: [{timestamp, value}]}` | `timestamp` é unix em segundos. As duas métricas de tempo vêm em **segundos** e trazem também `count` por ponto |
630
672
  | `categories` | `{categories: [{label, value}]}` | `funnel_stages` vem **na ordem das etapas do funil**, nunca por valor — não reordene |
631
673
  | `scalar` | `{value, total, secondary}` | Use o `total` para separar "ninguém respondeu" de "zero legítimo". **SLA sem nenhum prazo aplicado devolve 100.0** — não anuncie "100% de cumprimento" sem olhar o total |
632
- | `table` | `{dimension, columns, rows, total}` | O `total` **não é a soma das linhas** (contagem própria por métrica). As linhas são os membros **atuais**: quem saiu da equipe some da linha e continua no total |
674
+ | `table` | `{dimension, columns, rows, total}` | O `total` **não é a soma das linhas** (contagem própria por métrica) e pode ser MENOR que ela — a mesma conversa atribuída a duas pessoas no período aparece nas duas linhas e conta uma vez no total. **Desde 28/09/2026 quem saiu da conta TEM linha**, marcada com `former: true` (antes sumia e ficava só no total). Cada linha leva `entity_id` (o código do atendente/equipe/caixa) — **use ele para identificar**, nunca o `label`: dois cadastros podem ter o mesmo nome visível. O total ainda pode ser MAIOR que a soma: ele inclui quem não tem linha (acesso de suporte, e quem saiu sem nome guardado) |
633
675
 
634
676
  ### Armadilhas que fazem o bloco sair errado
635
677
 
package/endpoints.json CHANGED
@@ -5528,7 +5528,7 @@
5528
5528
  "method": "GET",
5529
5529
  "path": "/api/v2/accounts/{account_id}/reports",
5530
5530
  "title": "Relatorios Detalhados",
5531
- "description": "Serie temporal de uma metrica. metric obrigatorio. group_by: hour/day/week/month/year.",
5531
+ "description": "Serie temporal de uma metrica. metric obrigatorio. group_by: hour/day/week/month/year. Pra ver QUAIS conversas formam um ponto, use lionchat_reports_drilldown com o 'timestamp' dele.",
5532
5532
  "category": "Relatorios",
5533
5533
  "params": [
5534
5534
  {
@@ -5597,7 +5597,99 @@
5597
5597
  "related_tools": [
5598
5598
  "lionchat_reports_list",
5599
5599
  "lionchat_reports_list_1",
5600
- "lionchat_reports_list_2"
5600
+ "lionchat_reports_list_2",
5601
+ "lionchat_reports_drilldown"
5602
+ ]
5603
+ },
5604
+ {
5605
+ "id": "lionchat_reports_drilldown",
5606
+ "method": "GET",
5607
+ "path": "/api/v2/accounts/{account_id}/reports/drilldown",
5608
+ "title": "Conversas por trás de um ponto do gráfico",
5609
+ "description": "Lista as CONVERSAS que formam UM ponto da série temporal (lionchat_reports_list_5) — o mesmo que clicar numa barra do gráfico nos Relatórios. Usa a MESMA régua que desenhou o ponto, então a lista bate com o número (ex.: etiqueta conta pela data em que foi APLICADA). Fluxo: chame lionchat_reports_list_5, pegue o 'timestamp' do ponto e passe aqui em bucket_timestamp, repetindo metric, group_by, type, id, timezone_offset e business_hours da série (são eles que definem onde o ponto começa e termina). Mostra SÓ as conversas que a pessoa do token pode abrir: meta.hidden_count diz quantas ficaram de fora por permissão — diga isso ao usuário em vez de concluir que faltam conversas. 25 por página, mais recentes primeiro; teto de 5.000 conversas por ponto. Exige permissão de ver relatórios. Métrica fora da lista = 422 {error: 'invalid metric'}; data fora do formato Unix = 400.",
5610
+ "category": "Relatorios",
5611
+ "params": [
5612
+ {
5613
+ "name": "metric",
5614
+ "type": "string",
5615
+ "location": "query",
5616
+ "required": true,
5617
+ "description": "A MESMA métrica da série. Aceita SÓ: conversations_count | incoming_messages_count | outgoing_messages_count | resolutions_count | avg_first_response_time | avg_resolution_time | reply_time. Métricas de bot (bot_resolutions_count, bot_handoffs_count) NÃO têm lista."
5618
+ },
5619
+ {
5620
+ "name": "bucket_timestamp",
5621
+ "type": "string",
5622
+ "location": "query",
5623
+ "required": true,
5624
+ "description": "Início do ponto: o campo 'timestamp' devolvido por lionchat_reports_list_5 (Unix em SEGUNDOS)."
5625
+ },
5626
+ {
5627
+ "name": "group_by",
5628
+ "type": "string",
5629
+ "location": "query",
5630
+ "required": false,
5631
+ "description": "Tamanho do ponto: hour | day | week | month | year (padrão day). Use o MESMO da série, senão o recorte muda e a lista não bate."
5632
+ },
5633
+ {
5634
+ "name": "type",
5635
+ "type": "string",
5636
+ "location": "query",
5637
+ "required": false,
5638
+ "description": "Escopo: account | inbox | agent | label | team (padrão account). O mesmo da série."
5639
+ },
5640
+ {
5641
+ "name": "id",
5642
+ "type": "string",
5643
+ "location": "query",
5644
+ "required": false,
5645
+ "description": "ID da caixa/agente/etiqueta/time quando type != account. O mesmo da série."
5646
+ },
5647
+ {
5648
+ "name": "since",
5649
+ "type": "string",
5650
+ "location": "query",
5651
+ "required": false,
5652
+ "description": "Início do período do relatório (Unix em SEGUNDOS). Recorta o ponto quando o período começa no meio dele (ex.: semana que começou antes)."
5653
+ },
5654
+ {
5655
+ "name": "until",
5656
+ "type": "string",
5657
+ "location": "query",
5658
+ "required": false,
5659
+ "description": "Fim do período do relatório (Unix em SEGUNDOS). Recorta o último ponto."
5660
+ },
5661
+ {
5662
+ "name": "timezone_offset",
5663
+ "type": "string",
5664
+ "location": "query",
5665
+ "required": false,
5666
+ "description": "Fuso em horas (ex: -3 pra Brasília). O MESMO da série — define a fronteira do dia/hora do ponto."
5667
+ },
5668
+ {
5669
+ "name": "business_hours",
5670
+ "type": "boolean",
5671
+ "location": "query",
5672
+ "required": false,
5673
+ "description": "Só nas médias de tempo: true = mede só o expediente (mesma regra da série). Use o MESMO valor da série."
5674
+ },
5675
+ {
5676
+ "name": "page",
5677
+ "type": "integer",
5678
+ "location": "query",
5679
+ "required": false,
5680
+ "description": "Página (25 por página, fixo). Padrão 1."
5681
+ }
5682
+ ],
5683
+ "returns": "{ meta: { metric, since, until (o recorte REAL do ponto, Unix), page, per_page, total_count (conversas do ponto), visible_count (as que a pessoa pode abrir), hidden_count (fora por permissão) }, payload: [{ id, display_id (número da conversa na tela), status, created_at (Unix), contact_name, inbox_name, assignee_name, detail }] }. detail = o porquê de cada conversa: {count} (quantas mensagens/eventos dela caíram no ponto) nas contagens de mensagens e resoluções, {seconds} nas médias de tempo, ou null.",
5684
+ "common_use_cases": [
5685
+ "Quais conversas formam o pico de terça-feira no gráfico",
5686
+ "Ver quem demorou para responder naquela semana (avg_first_response_time)",
5687
+ "Listar as conversas resolvidas num dia específico"
5688
+ ],
5689
+ "related_tools": [
5690
+ "lionchat_reports_list_5",
5691
+ "lionchat_reports_summary",
5692
+ "lionchat_conversations_show"
5601
5693
  ]
5602
5694
  },
5603
5695
  {
@@ -6410,9 +6502,16 @@
6410
6502
  "location": "query",
6411
6503
  "required": false,
6412
6504
  "description": "Busca textual em pergunta/resposta"
6505
+ },
6506
+ {
6507
+ "name": "sort",
6508
+ "type": "string",
6509
+ "location": "query",
6510
+ "required": false,
6511
+ "description": "occurrences = mais perguntadas primeiro (use com status=pending pra ver as sugestões que mais se repetem). Sem o parâmetro = mais recentes primeiro."
6413
6512
  }
6414
6513
  ],
6415
- "returns": "array de respostas (AssistantResponse)",
6514
+ "returns": "array de respostas (AssistantResponse). Cada uma traz occurrences_count (desde 26/09/2026): em quantas conversas DIFERENTES a mesma pergunta pendente apareceu (começa em 1; só soma enquanto pendente) — é o 'perguntada em N conversas' da tela.",
6416
6515
  "common_use_cases": [
6417
6516
  "Dashboard: contar/exibir assistentes AI",
6418
6517
  "Buscar com filtros antes de outra operação",
@@ -6437,7 +6536,7 @@
6437
6536
  "type": "integer",
6438
6537
  "location": "body",
6439
6538
  "required": true,
6440
- "description": "ID do agente dono da FAQ — NOT NULL no banco"
6539
+ "description": "ID do agente dono da FAQ — NOT NULL no banco. Tem que ser um agente DESTA conta: de outra conta = 404 (25/09/2026)."
6441
6540
  },
6442
6541
  {
6443
6542
  "name": "question",
@@ -10494,46 +10593,102 @@
10494
10593
  "method": "POST",
10495
10594
  "path": "/api/v1/accounts/{account_id}/flows/test_api",
10496
10595
  "title": "Testar Node API",
10497
- "description": "Testa um no de API (executa a requisicao HTTP) e retorna a resposta.",
10596
+ "description": "Executa a requisição HTTP de um bloco de API do FlowBuilder pelo SERVIDOR (o mesmo que o botão 'Testar requisição' da tela) e devolve a resposta. Só administrador. Tudo vai dentro de 'config', com os MESMOS nomes que o bloco de API grava no flow_data (apiUrl, apiMethod, apiHeaders...): dá pra copiar o data do node lido com lionchat_flows_show. Variáveis {{...}} são trocadas pelo valor de test_variables; {{account.custom_attribute.X}} usa a variável da conta (inclusive secreta). Variável sem valor fica como {{nome}} no texto. CORRIGIDO 25/09/2026: antes o servidor descartava em silêncio apiQueryParams, apiBodyMode, apiBodyFields, apiSendHeaders e apiSendQueryParams — o teste saía sem parâmetro de URL e sem body em modo chave-valor. Não segue redirecionamento.",
10498
10597
  "category": "Flows",
10499
10598
  "params": [
10500
10599
  {
10501
- "name": "url",
10600
+ "name": "config.apiUrl",
10502
10601
  "type": "string",
10503
10602
  "location": "body",
10504
10603
  "required": true,
10505
- "description": "URL do endpoint"
10604
+ "description": "URL do endpoint (aceita {{variáveis}})."
10506
10605
  },
10507
10606
  {
10508
- "name": "method",
10607
+ "name": "config.apiMethod",
10509
10608
  "type": "string",
10510
10609
  "location": "body",
10511
10610
  "required": false,
10512
- "description": "GET, POST, PUT, PATCH, DELETE"
10611
+ "description": "GET (padrão), POST, PUT, PATCH, DELETE. Body só é enviado em POST/PUT/PATCH."
10513
10612
  },
10514
10613
  {
10515
- "name": "headers",
10516
- "type": "object",
10614
+ "name": "config.apiQueryParams",
10615
+ "type": "array",
10517
10616
  "location": "body",
10518
10617
  "required": false,
10519
- "description": "Headers customizados"
10618
+ "description": "Parâmetros de URL: lista de {key, value} (aceitam {{variáveis}}). Acrescentados à URL já codificados."
10520
10619
  },
10521
10620
  {
10522
- "name": "body",
10621
+ "name": "config.apiSendQueryParams",
10622
+ "type": "boolean",
10623
+ "location": "body",
10624
+ "required": false,
10625
+ "description": "false = ignora apiQueryParams (chave desligada na tela). Padrão true."
10626
+ },
10627
+ {
10628
+ "name": "config.apiHeaders",
10629
+ "type": "array",
10630
+ "location": "body",
10631
+ "required": false,
10632
+ "description": "Cabeçalhos: lista de {key, value} (aceitam {{variáveis}})."
10633
+ },
10634
+ {
10635
+ "name": "config.apiSendHeaders",
10636
+ "type": "boolean",
10637
+ "location": "body",
10638
+ "required": false,
10639
+ "description": "false = ignora apiHeaders. Padrão true."
10640
+ },
10641
+ {
10642
+ "name": "config.apiAuthType",
10643
+ "type": "string",
10644
+ "location": "body",
10645
+ "required": false,
10646
+ "description": "bearer (vira Authorization: Bearer <token>) | basic (Authorization: Basic <token>, token já em base64) | api_key (X-Api-Key: <token>) | vazio = sem autenticação."
10647
+ },
10648
+ {
10649
+ "name": "config.apiAuthToken",
10523
10650
  "type": "string",
10524
10651
  "location": "body",
10525
10652
  "required": false,
10526
- "description": "Body da requisição"
10653
+ "description": "Token da autenticação (aceita {{variáveis}}, ex. {{account.custom_attribute.minha_chave}})."
10527
10654
  },
10528
10655
  {
10529
- "name": "timeout",
10656
+ "name": "config.apiBodyMode",
10657
+ "type": "string",
10658
+ "location": "body",
10659
+ "required": false,
10660
+ "description": "json (padrão: manda apiBody como está) | fields (monta um JSON a partir de apiBodyFields)."
10661
+ },
10662
+ {
10663
+ "name": "config.apiBody",
10664
+ "type": "string",
10665
+ "location": "body",
10666
+ "required": false,
10667
+ "description": "Corpo em texto (normalmente JSON) quando apiBodyMode=json. Aceita {{variáveis}}."
10668
+ },
10669
+ {
10670
+ "name": "config.apiBodyFields",
10671
+ "type": "array",
10672
+ "location": "body",
10673
+ "required": false,
10674
+ "description": "Corpo em modo chave-valor (apiBodyMode=fields): lista de {key, value}; vira um JSON {key: value}."
10675
+ },
10676
+ {
10677
+ "name": "config.apiTimeout",
10530
10678
  "type": "integer",
10531
10679
  "location": "body",
10532
10680
  "required": false,
10533
- "description": "Timeout em segundos (max 25)"
10681
+ "description": "Tempo limite em SEGUNDOS: padrão 10, máximo 25 (acima disso é limitado a 25)."
10682
+ },
10683
+ {
10684
+ "name": "test_variables",
10685
+ "type": "object",
10686
+ "location": "body",
10687
+ "required": false,
10688
+ "description": "Valores pras variáveis do teste: {\"contact.name\": \"Maria\", \"var.pedido\": \"123\"} — a chave é o texto de dentro das chaves duplas."
10534
10689
  }
10535
10690
  ],
10536
- "returns": "resposta HTTP",
10691
+ "returns": "{ status (código HTTP; 0 = não chegou a responder), ok (true se 2xx), body (resposta como texto; em falha, o motivo — ex. 'URL nao configurada', 'Request timeout apos 10s') }",
10537
10692
  "common_use_cases": [
10538
10693
  "Cadastro inicial de flow",
10539
10694
  "Automação a partir de evento externo",
@@ -10634,7 +10789,7 @@
10634
10789
  "type": "array",
10635
10790
  "location": "body",
10636
10791
  "required": true,
10637
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
10792
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
10638
10793
  },
10639
10794
  {
10640
10795
  "name": "active",
@@ -10732,7 +10887,7 @@
10732
10887
  "type": "array",
10733
10888
  "location": "body",
10734
10889
  "required": false,
10735
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
10890
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
10736
10891
  }
10737
10892
  ],
10738
10893
  "returns": "regra de automação atualizado",
@@ -15314,10 +15469,10 @@
15314
15469
  },
15315
15470
  {
15316
15471
  "name": "group_id",
15317
- "type": "integer",
15472
+ "type": "string",
15318
15473
  "location": "path",
15319
15474
  "required": true,
15320
- "description": "ID do grupo"
15475
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15321
15476
  }
15322
15477
  ],
15323
15478
  "returns": "grupo WhatsApp (objeto completo com associações)",
@@ -15349,10 +15504,10 @@
15349
15504
  },
15350
15505
  {
15351
15506
  "name": "group_id",
15352
- "type": "integer",
15507
+ "type": "string",
15353
15508
  "location": "path",
15354
15509
  "required": true,
15355
- "description": "ID do grupo"
15510
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15356
15511
  },
15357
15512
  {
15358
15513
  "name": "subject",
@@ -15391,10 +15546,10 @@
15391
15546
  },
15392
15547
  {
15393
15548
  "name": "group_id",
15394
- "type": "integer",
15549
+ "type": "string",
15395
15550
  "location": "path",
15396
15551
  "required": true,
15397
- "description": "ID do grupo"
15552
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15398
15553
  },
15399
15554
  {
15400
15555
  "name": "description",
@@ -15433,10 +15588,10 @@
15433
15588
  },
15434
15589
  {
15435
15590
  "name": "group_id",
15436
- "type": "integer",
15591
+ "type": "string",
15437
15592
  "location": "path",
15438
15593
  "required": true,
15439
- "description": "ID do grupo"
15594
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15440
15595
  }
15441
15596
  ],
15442
15597
  "returns": "array de participantes do grupo (id, admin, etc.)",
@@ -15468,10 +15623,10 @@
15468
15623
  },
15469
15624
  {
15470
15625
  "name": "group_id",
15471
- "type": "integer",
15626
+ "type": "string",
15472
15627
  "location": "path",
15473
15628
  "required": true,
15474
- "description": "ID do grupo"
15629
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15475
15630
  },
15476
15631
  {
15477
15632
  "name": "participants",
@@ -15510,10 +15665,10 @@
15510
15665
  },
15511
15666
  {
15512
15667
  "name": "group_id",
15513
- "type": "integer",
15668
+ "type": "string",
15514
15669
  "location": "path",
15515
15670
  "required": true,
15516
- "description": "ID do grupo"
15671
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15517
15672
  },
15518
15673
  {
15519
15674
  "name": "participants",
@@ -15552,10 +15707,10 @@
15552
15707
  },
15553
15708
  {
15554
15709
  "name": "group_id",
15555
- "type": "integer",
15710
+ "type": "string",
15556
15711
  "location": "path",
15557
15712
  "required": true,
15558
- "description": "ID do grupo"
15713
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15559
15714
  },
15560
15715
  {
15561
15716
  "name": "participants",
@@ -15594,10 +15749,10 @@
15594
15749
  },
15595
15750
  {
15596
15751
  "name": "group_id",
15597
- "type": "integer",
15752
+ "type": "string",
15598
15753
  "location": "path",
15599
15754
  "required": true,
15600
- "description": "ID do grupo"
15755
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15601
15756
  },
15602
15757
  {
15603
15758
  "name": "participants",
@@ -15636,10 +15791,10 @@
15636
15791
  },
15637
15792
  {
15638
15793
  "name": "group_id",
15639
- "type": "integer",
15794
+ "type": "string",
15640
15795
  "location": "path",
15641
15796
  "required": true,
15642
- "description": "ID do grupo"
15797
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15643
15798
  }
15644
15799
  ],
15645
15800
  "returns": "link de convite do grupo (ex: { code, url })",
@@ -15659,7 +15814,7 @@
15659
15814
  "method": "POST",
15660
15815
  "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/invite_code/revoke",
15661
15816
  "title": "Revogar Link de Convite",
15662
- "description": "Revoga o link de convite atual do grupo WAHA e gera um novo. O numero conectado precisa ser admin do grupo (403 senao).",
15817
+ "description": "Revoga o link de convite atual do grupo WAHA e gera um novo. O link antigo PARA DE FUNCIONAR, inclusive o que ja foi enviado por fluxos e campanhas — confirme com a pessoa antes. O numero conectado precisa ser admin do grupo (403 senao).",
15663
15818
  "category": "Grupos WhatsApp",
15664
15819
  "params": [
15665
15820
  {
@@ -15671,10 +15826,10 @@
15671
15826
  },
15672
15827
  {
15673
15828
  "name": "group_id",
15674
- "type": "integer",
15829
+ "type": "string",
15675
15830
  "location": "path",
15676
15831
  "required": true,
15677
- "description": "ID do grupo"
15832
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15678
15833
  }
15679
15834
  ],
15680
15835
  "returns": "{ success: true } ou { data: ... }",
@@ -15694,7 +15849,7 @@
15694
15849
  "method": "PUT",
15695
15850
  "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/settings",
15696
15851
  "title": "Atualizar Config do Grupo",
15697
- "description": "Atualiza as permissoes do grupo WAHA.",
15852
+ "description": "Atualiza as permissoes do grupo WAHA. Aplica chave por chave: se uma falhar, responde 422 com `applied` (o que ja foi gravado) e `failed` (a chave que falhou). O numero conectado precisa ser admin do grupo (403 senao). `approval_required` so existe em servidores do WhatsApp mais novos: onde nao existe, 422 dizendo que o servidor ainda nao tem a opcao (confira antes com lionchat_inboxes_waha_groups_list_4, campo approval_supported).",
15698
15853
  "category": "Grupos WhatsApp",
15699
15854
  "params": [
15700
15855
  {
@@ -15706,10 +15861,10 @@
15706
15861
  },
15707
15862
  {
15708
15863
  "name": "group_id",
15709
- "type": "integer",
15864
+ "type": "string",
15710
15865
  "location": "path",
15711
15866
  "required": true,
15712
- "description": "ID do grupo"
15867
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15713
15868
  },
15714
15869
  {
15715
15870
  "name": "info_admin_only",
@@ -15724,9 +15879,23 @@
15724
15879
  "location": "body",
15725
15880
  "required": false,
15726
15881
  "description": "Se true, somente admins podem enviar mensagens"
15882
+ },
15883
+ {
15884
+ "name": "members_add_admin_only",
15885
+ "type": "boolean",
15886
+ "location": "body",
15887
+ "required": false,
15888
+ "description": "Se true, somente admins podem adicionar participantes (o servidor traduz para o sentido invertido do WhatsApp). So true ou false; qualquer outro valor e recusado com 422."
15889
+ },
15890
+ {
15891
+ "name": "approval_required",
15892
+ "type": "boolean",
15893
+ "location": "body",
15894
+ "required": false,
15895
+ "description": "Se true, quem pede para entrar pelo link espera um admin aprovar. So true ou false. ATENCAO ao desligar: com pedidos esperando, o WhatsApp pode aprovar todos de uma vez — liste os pedidos antes (lionchat_inboxes_waha_groups_list_5) e confirme com a pessoa."
15727
15896
  }
15728
15897
  ],
15729
- "returns": "{ success: true } ou { data: ... }",
15898
+ "returns": "{ success: true, applied: [...] } ou 422 { error, applied: [...], failed: \"chave\" }",
15730
15899
  "common_use_cases": [
15731
15900
  "Edição parcial de grupo WhatsApp",
15732
15901
  "Alteração de status/estado",
@@ -15755,10 +15924,10 @@
15755
15924
  },
15756
15925
  {
15757
15926
  "name": "group_id",
15758
- "type": "integer",
15927
+ "type": "string",
15759
15928
  "location": "path",
15760
15929
  "required": true,
15761
- "description": "ID do grupo"
15930
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15762
15931
  },
15763
15932
  {
15764
15933
  "name": "file",
@@ -15797,10 +15966,10 @@
15797
15966
  },
15798
15967
  {
15799
15968
  "name": "group_id",
15800
- "type": "integer",
15969
+ "type": "string",
15801
15970
  "location": "path",
15802
15971
  "required": true,
15803
- "description": "ID do grupo"
15972
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
15804
15973
  }
15805
15974
  ],
15806
15975
  "returns": "{ success: true } ou { data: ... }",
@@ -15884,6 +16053,183 @@
15884
16053
  "lionchat_inboxes_waha_groups_show"
15885
16054
  ]
15886
16055
  },
16056
+ {
16057
+ "id": "lionchat_inboxes_waha_groups_list_4",
16058
+ "method": "GET",
16059
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/security_settings",
16060
+ "title": "Ler Permissoes Extras do Grupo",
16061
+ "description": "SO LEITURA. Le \"apenas admins podem adicionar participantes\" (members_add_admin_only) e \"aprovar novos participantes\" (approval_required), ja no sentido da tela (true = so admins / precisa aprovar). null = o WhatsApp nao respondeu agora: NAO trate como false. approval_supported=false = o servidor do WhatsApp desta caixa ainda nao tem a opcao de aprovacao.",
16062
+ "category": "Grupos WhatsApp",
16063
+ "params": [
16064
+ {
16065
+ "name": "inbox_id",
16066
+ "type": "integer",
16067
+ "location": "path",
16068
+ "required": true,
16069
+ "description": "ID da inbox (precisa ser WhatsApp QR Code)"
16070
+ },
16071
+ {
16072
+ "name": "group_id",
16073
+ "type": "string",
16074
+ "location": "path",
16075
+ "required": true,
16076
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
16077
+ }
16078
+ ],
16079
+ "returns": "{ data: { members_add_admin_only: true|false|null, approval_required: true|false|null, approval_supported: true|false|null } }",
16080
+ "common_use_cases": [
16081
+ "Conferir as permissoes do grupo antes de mudar",
16082
+ "Saber se o grupo exige aprovacao para entrar"
16083
+ ],
16084
+ "related_tools": [
16085
+ "lionchat_inboxes_waha_groups_update_2",
16086
+ "lionchat_inboxes_waha_groups_show"
16087
+ ]
16088
+ },
16089
+ {
16090
+ "id": "lionchat_inboxes_waha_groups_destroy",
16091
+ "method": "DELETE",
16092
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/picture",
16093
+ "title": "Remover Foto do Grupo",
16094
+ "description": "Remove a foto do grupo no WhatsApp e tambem a copia que o LionChat mostra na lista de conversas. O numero conectado precisa ser admin do grupo (403 senao).",
16095
+ "category": "Grupos WhatsApp",
16096
+ "params": [
16097
+ {
16098
+ "name": "inbox_id",
16099
+ "type": "integer",
16100
+ "location": "path",
16101
+ "required": true,
16102
+ "description": "ID da inbox (precisa ser WhatsApp QR Code)"
16103
+ },
16104
+ {
16105
+ "name": "group_id",
16106
+ "type": "string",
16107
+ "location": "path",
16108
+ "required": true,
16109
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
16110
+ }
16111
+ ],
16112
+ "returns": "{ success: true }",
16113
+ "common_use_cases": [
16114
+ "Tirar a foto do grupo"
16115
+ ],
16116
+ "related_tools": [
16117
+ "lionchat_inboxes_waha_groups_update_3",
16118
+ "lionchat_inboxes_waha_groups_show"
16119
+ ]
16120
+ },
16121
+ {
16122
+ "id": "lionchat_inboxes_waha_groups_list_5",
16123
+ "method": "GET",
16124
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/join_requests",
16125
+ "title": "Listar Pedidos para Entrar no Grupo",
16126
+ "description": "SO LEITURA. Pedidos de quem quer entrar no grupo e espera aprovacao. Use o campo `id` de cada pedido para aprovar/recusar. `pn` e o telefone (pode vir null: o WhatsApp esconde o numero — NUNCA use os digitos do id como telefone). `name` so vem se a pessoa ja e contato. supported=false = o servidor do WhatsApp desta caixa ainda nao tem pedidos para entrar; allowed=false = o WhatsApp nao deixou (o numero da caixa nao e admin do grupo).",
16127
+ "category": "Grupos WhatsApp",
16128
+ "params": [
16129
+ {
16130
+ "name": "inbox_id",
16131
+ "type": "integer",
16132
+ "location": "path",
16133
+ "required": true,
16134
+ "description": "ID da inbox (precisa ser WhatsApp QR Code)"
16135
+ },
16136
+ {
16137
+ "name": "group_id",
16138
+ "type": "string",
16139
+ "location": "path",
16140
+ "required": true,
16141
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
16142
+ }
16143
+ ],
16144
+ "returns": "{ data: { supported, allowed, requests: [{ id, requesterId, pn, name, request_method (invite_link|linked_group_join|non_admin_add|unknown), timestamp }] } }",
16145
+ "common_use_cases": [
16146
+ "Ver quem pediu para entrar no grupo",
16147
+ "Aprovar pedidos pendentes em lote"
16148
+ ],
16149
+ "related_tools": [
16150
+ "lionchat_inboxes_waha_groups_create_7",
16151
+ "lionchat_inboxes_waha_groups_create_8",
16152
+ "lionchat_inboxes_waha_groups_list_4"
16153
+ ]
16154
+ },
16155
+ {
16156
+ "id": "lionchat_inboxes_waha_groups_create_7",
16157
+ "method": "POST",
16158
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/join_requests/approve",
16159
+ "title": "Aprovar Pedidos para Entrar no Grupo",
16160
+ "description": "Aprovar pedidos para entrar no grupo. A pessoa entra no grupo e isso aciona a pilula \"entrou\" e os fluxos com gatilho \"Entrou no grupo\". Tentativa unica (nao repita sozinho). A resposta traz o resultado por pessoa e as listas RELIDAS no WhatsApp (pedidos e participantes). Se o WhatsApp recusar (ex.: pedido ja tratado pelo celular), 422 com a mensagem e as listas reais. O numero conectado precisa ser admin do grupo (403 senao); ids fora do formato = 422.",
16161
+ "category": "Grupos WhatsApp",
16162
+ "params": [
16163
+ {
16164
+ "name": "inbox_id",
16165
+ "type": "integer",
16166
+ "location": "path",
16167
+ "required": true,
16168
+ "description": "ID da inbox (precisa ser WhatsApp QR Code)"
16169
+ },
16170
+ {
16171
+ "name": "group_id",
16172
+ "type": "string",
16173
+ "location": "path",
16174
+ "required": true,
16175
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
16176
+ },
16177
+ {
16178
+ "name": "participants",
16179
+ "type": "array",
16180
+ "location": "body",
16181
+ "required": true,
16182
+ "description": "Lista de pedidos no formato [{ id: '...' }], com o `id` que veio em lionchat_inboxes_waha_groups_list_5"
16183
+ }
16184
+ ],
16185
+ "returns": "{ data: { results: [{ id, success, error }], join_requests: [...]|null, participants: [...]|null } } ou 422 { error, data: { join_requests, participants } }",
16186
+ "common_use_cases": [
16187
+ "Aprovar quem pediu para entrar no grupo"
16188
+ ],
16189
+ "related_tools": [
16190
+ "lionchat_inboxes_waha_groups_list_5",
16191
+ "lionchat_inboxes_waha_groups_list_1"
16192
+ ]
16193
+ },
16194
+ {
16195
+ "id": "lionchat_inboxes_waha_groups_create_8",
16196
+ "method": "POST",
16197
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha_groups/{group_id}/join_requests/reject",
16198
+ "title": "Recusar Pedidos para Entrar no Grupo",
16199
+ "description": "Recusar pedidos para entrar no grupo. A pessoa nao entra e nada e disparado. Tentativa unica (nao repita sozinho). A resposta traz o resultado por pessoa e as listas RELIDAS no WhatsApp (pedidos e participantes). Se o WhatsApp recusar (ex.: pedido ja tratado pelo celular), 422 com a mensagem e as listas reais. O numero conectado precisa ser admin do grupo (403 senao); ids fora do formato = 422.",
16200
+ "category": "Grupos WhatsApp",
16201
+ "params": [
16202
+ {
16203
+ "name": "inbox_id",
16204
+ "type": "integer",
16205
+ "location": "path",
16206
+ "required": true,
16207
+ "description": "ID da inbox (precisa ser WhatsApp QR Code)"
16208
+ },
16209
+ {
16210
+ "name": "group_id",
16211
+ "type": "string",
16212
+ "location": "path",
16213
+ "required": true,
16214
+ "description": "ID do grupo no WhatsApp, com o sufixo (ex.: '120363389719781395@g.us')"
16215
+ },
16216
+ {
16217
+ "name": "participants",
16218
+ "type": "array",
16219
+ "location": "body",
16220
+ "required": true,
16221
+ "description": "Lista de pedidos no formato [{ id: '...' }], com o `id` que veio em lionchat_inboxes_waha_groups_list_5"
16222
+ }
16223
+ ],
16224
+ "returns": "{ data: { results: [{ id, success, error }], join_requests: [...]|null, participants: [...]|null } } ou 422 { error, data: { join_requests, participants } }",
16225
+ "common_use_cases": [
16226
+ "Recusar quem pediu para entrar no grupo"
16227
+ ],
16228
+ "related_tools": [
16229
+ "lionchat_inboxes_waha_groups_list_5",
16230
+ "lionchat_inboxes_waha_groups_list_1"
16231
+ ]
16232
+ },
15887
16233
  {
15888
16234
  "id": "lionchat_inboxes_whatsapp_templates_list",
15889
16235
  "method": "GET",
@@ -25863,7 +26209,7 @@
25863
26209
  "method": "GET",
25864
26210
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations",
25865
26211
  "title": "Listar Integração e-Clínica",
25866
- "description": "Lista a integração e-Clínica da conta (no máximo 1 por conta) com id, status e configurações. Use PRIMEIRO para descobrir o {id} exigido pelas ferramentas de histórico de lembretes. Eventos mapeáveis incluem (23/07) os novos cliente_inclusao_pagamento ('Inclusão de cobrança' — cobrança/carnê criado, ainda não pago; grava eclinica_ultima_cobranca_valor/vencimento/descricao no contato) e controle_laboratorio_novo ('Controle de laboratório' — grava eclinica_laboratorio_data_prevista/data_moldagem/data_entrega/situacao). O mapeamento evento→flow É EDITÁVEL via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI o mapeamento inteiro: leia aqui primeiro e devolva completo). [2026-07-25] Cada linha de reminder_config traz agora event_type ('agendamento' padrao, 'controle_laboratorio_novo' para lembrete de laboratorio/medicacao, 'cliente_inclusao_pagamento' para lembrete de vencimento de cobranca), dispatch_time (hora do disparo, OBRIGATORIA: 'HH:MM' fixo ou formula Liquid com variavel de conta/contato) e o filtro opcional filter_field/filter_operator/filter_value. Os lembretes SAO editaveis via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI a lista inteira: leia aqui primeiro e devolva completa). Cada unidade em units[] traz tambem settings {} (18/08). O atributo eclinica_cor (cor da agenda, hex com #) virou campo fresco dos lembretes: filtravel por filter_field e disponivel como variavel {{cor}}. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao.",
26212
+ "description": "Lista a integração e-Clínica da conta (no máximo 1 por conta) com id, status e configurações. Use PRIMEIRO para descobrir o {id} exigido pelas ferramentas de histórico de lembretes. Eventos mapeáveis incluem (23/07) os novos cliente_inclusao_pagamento ('Inclusão de cobrança' — cobrança/carnê criado, ainda não pago; grava eclinica_ultima_cobranca_valor/vencimento/descricao no contato) e controle_laboratorio_novo ('Controle de laboratório' — grava eclinica_laboratorio_data_prevista/data_moldagem/data_entrega/situacao). O mapeamento evento→flow É EDITÁVEL via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI o mapeamento inteiro: leia aqui primeiro e devolva completo). [2026-07-25] Cada linha de reminder_config traz agora event_type ('agendamento' padrao, 'controle_laboratorio_novo' para lembrete de laboratorio/medicacao, 'cliente_inclusao_pagamento' para lembrete de vencimento de cobranca), dispatch_time (hora do disparo, OBRIGATORIA: 'HH:MM' fixo ou formula Liquid com variavel de conta/contato) e o filtro opcional filter_field/filter_operator/filter_value. Os lembretes SAO editaveis via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI a lista inteira: leia aqui primeiro e devolva completa). Cada unidade em units[] traz tambem settings {} (18/08). O atributo eclinica_cor (cor da agenda, hex com #) virou campo fresco dos lembretes: filtravel por filter_field e disponivel como variavel {{cor}}. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao. VARIAVEIS DA MENSAGEM (28/09/2026): na automacao alvo de lembrete use {{eclinica_lembrete.<campo>}} (data_consulta, hora_consulta, profissional, compromisso, paciente_nome, unidade, link_confirmacao, idagenda, cliente_id, agendatipo, cor; laboratorio: data_prevista/data_entrega/data_referencia; cobranca: vencimento/valor/descricao) — e a consulta DAQUELE lembrete, data em DD/MM/AAAA. NUNCA a ficha {{contact.custom_attribute.eclinica_*}}: guarda so a consulta do ULTIMO aviso e manda a data de outra consulta. O nome antigo {{agendamento.*}} ainda funciona. No FLUXO nada muda ({{data_consulta}} etc). Detalhe no resource data-model, secao e-Clinica.",
25867
26213
  "category": "Integracoes",
25868
26214
  "params": [],
25869
26215
  "returns": "200 {payload: {eclinica_integrations: [...]}}",
@@ -26691,6 +27037,13 @@
26691
27037
  "required": false,
26692
27038
  "description": "true/false (padrao false). SO no bloco `eclinica_no_show`: a % de falta passa a ser faltaram/agendados em vez de faltaram/(compareceram+faltaram). Ligado, a unidade que nao anota desfecho parece a melhor da rede — o rotulo da coluna declara a base. Aceita as strings 'true'/'false' (novo 10/09/2026)."
26693
27039
  },
27040
+ {
27041
+ "name": "only_first_visit",
27042
+ "type": "boolean",
27043
+ "location": "body",
27044
+ "required": false,
27045
+ "description": "true/false (padrao false). SO no bloco `eclinica_no_show`: a tabela conta so a consulta INICIAL — retorno, sessao de tratamento e procedimento ficam de fora — e o rotulo da primeira coluna troca de 'Agendados' para 'Consultas iniciais'. A regra le o TEXTO do compromisso, porque a clinica escreve o tipo por extenso: comeca com CONSULTA e NAO contem RETORNO. Medido na conta 56 (01 a 24/09/2026): 'CONSULTA INICIAL' 1.445 vezes e 'CONSULTA DE RETORNO' 192, e Sorocaba tem 1.023 compromissos para 99 consultas iniciais. Use quando o pedido falar em primeira consulta, consulta inicial, paciente novo ou primeiro atendimento. Novo em 28/09/2026."
27046
+ },
26694
27047
  {
26695
27048
  "name": "count_retorno_as_consulta",
26696
27049
  "type": "boolean",
@@ -26739,7 +27092,7 @@
26739
27092
  "type": "array",
26740
27093
  "location": "body",
26741
27094
  "required": false,
26742
- "description": "Lista de blocos. Cada item: {id, widget_type, chart_type, ...} com os mesmos campos do custom_dashboards_preview_widget. Maximo 12. DOIS campos de bloco que faltavam aqui: `follow_report_period` (true/false, tambem aceita as strings; AUSENTE = true) diz se o bloco obedece o calendario do TOPO do relatorio ou usa o periodo proprio — vale pra qualquer bloco, novo em 22/08/2026; e `direction_split` (true/false, padrao false) que SO faz efeito no bloco `calls_report` e troca as colunas fixas por Feitas x Recebidas, com quem atendeu na recebida — OPT-IN de proposito pra nao mexer no relatorio de quem ja usa o bloco, novo em 28/08/2026. Desde 10/09/2026, dois campos SO dos blocos da e-Clinica: `no_show_over_scheduled` (true/false, padrao false — a % de falta passa a ser faltaram/agendados em vez de sobre os desfechos conhecidos; so faz efeito em `eclinica_no_show`) e `count_retorno_as_consulta` (true/false, padrao true — retorno conta como consulta na base da conversao; desligado, o retorno vai para 'Nao classificado'; so faz efeito em `eclinica_conversion`). Aceitam as strings 'true'/'false'; qualquer outro valor = 422 com o motivo."
27095
+ "description": "Lista de blocos. Cada item: {id, widget_type, chart_type, ...} com os mesmos campos do custom_dashboards_preview_widget. Maximo 12. DOIS campos de bloco que faltavam aqui: `follow_report_period` (true/false, tambem aceita as strings; AUSENTE = true) diz se o bloco obedece o calendario do TOPO do relatorio ou usa o periodo proprio — vale pra qualquer bloco, novo em 22/08/2026; e `direction_split` (true/false, padrao false) que SO faz efeito no bloco `calls_report` e troca as colunas fixas por Feitas x Recebidas, com quem atendeu na recebida — OPT-IN de proposito pra nao mexer no relatorio de quem ja usa o bloco, novo em 28/08/2026. Desde 10/09/2026, campos SO dos blocos da e-Clinica: `no_show_over_scheduled` (true/false, padrao false — a % de falta passa a ser faltaram/agendados em vez de sobre os desfechos conhecidos; so faz efeito em `eclinica_no_show`) e `count_retorno_as_consulta` (true/false, padrao true — retorno conta como consulta na base da conversao; desligado, o retorno vai para 'Nao classificado'; so faz efeito em `eclinica_conversion`). E desde 28/09/2026, `only_first_visit` (true/false, padrao false — SO em `eclinica_no_show`: conta so a consulta INICIAL, deixando de fora retorno, sessao de tratamento e procedimento, e o cabecalho da primeira coluna vira 'Consultas iniciais'). Aceitam as strings 'true'/'false'; qualquer outro valor = 422 com o motivo."
26743
27096
  }
26744
27097
  ],
26745
27098
  "returns": "{ id, name, position, widgets, created_at }",
@@ -26788,7 +27141,7 @@
26788
27141
  "type": "array",
26789
27142
  "location": "body",
26790
27143
  "required": false,
26791
- "description": "Lista COMPLETA de blocos — substitui a atual. Preserve o `id` de cada bloco que ja existia, senao a tela perde o vinculo. Maximo 12. DOIS campos de bloco que faltavam aqui: `follow_report_period` (true/false, tambem aceita as strings; AUSENTE = true) diz se o bloco obedece o calendario do TOPO do relatorio ou usa o periodo proprio — vale pra qualquer bloco, novo em 22/08/2026; e `direction_split` (true/false, padrao false) que SO faz efeito no bloco `calls_report` e troca as colunas fixas por Feitas x Recebidas, com quem atendeu na recebida — OPT-IN de proposito pra nao mexer no relatorio de quem ja usa o bloco, novo em 28/08/2026. Desde 10/09/2026, dois campos SO dos blocos da e-Clinica: `no_show_over_scheduled` (true/false, padrao false — a % de falta passa a ser faltaram/agendados em vez de sobre os desfechos conhecidos; so faz efeito em `eclinica_no_show`) e `count_retorno_as_consulta` (true/false, padrao true — retorno conta como consulta na base da conversao; desligado, o retorno vai para 'Nao classificado'; so faz efeito em `eclinica_conversion`). Aceitam as strings 'true'/'false'; qualquer outro valor = 422 com o motivo."
27144
+ "description": "Lista COMPLETA de blocos — substitui a atual. Preserve o `id` de cada bloco que ja existia, senao a tela perde o vinculo. Maximo 12. DOIS campos de bloco que faltavam aqui: `follow_report_period` (true/false, tambem aceita as strings; AUSENTE = true) diz se o bloco obedece o calendario do TOPO do relatorio ou usa o periodo proprio — vale pra qualquer bloco, novo em 22/08/2026; e `direction_split` (true/false, padrao false) que SO faz efeito no bloco `calls_report` e troca as colunas fixas por Feitas x Recebidas, com quem atendeu na recebida — OPT-IN de proposito pra nao mexer no relatorio de quem ja usa o bloco, novo em 28/08/2026. Desde 10/09/2026, campos SO dos blocos da e-Clinica: `no_show_over_scheduled` (true/false, padrao false — a % de falta passa a ser faltaram/agendados em vez de sobre os desfechos conhecidos; so faz efeito em `eclinica_no_show`) e `count_retorno_as_consulta` (true/false, padrao true — retorno conta como consulta na base da conversao; desligado, o retorno vai para 'Nao classificado'; so faz efeito em `eclinica_conversion`). E desde 28/09/2026, `only_first_visit` (true/false, padrao false — SO em `eclinica_no_show`: conta so a consulta INICIAL, deixando de fora retorno, sessao de tratamento e procedimento, e o cabecalho da primeira coluna vira 'Consultas iniciais'). Aceitam as strings 'true'/'false'; qualquer outro valor = 422 com o motivo."
26792
27145
  }
26793
27146
  ],
26794
27147
  "returns": "{ id, name, position, widgets, created_at }",
@@ -28057,7 +28410,7 @@
28057
28410
  "method": "GET",
28058
28411
  "path": "/api/v1/accounts/{account_id}/audit_logs",
28059
28412
  "title": "Registro de Auditoria",
28060
- "description": "Histórico de quem mexeu no quê dentro da conta (criação, edição, exclusão, login e logout), com o autor, o IP e o antes/depois de cada campo. ATENÇÃO ao formato das datas: aqui 'since' e 'until' são DATA POR EXTENSO (AAAA-MM-DD) e NÃO timestamp Unix — é o oposto dos relatórios; mandar um número Unix derruba a chamada com erro. Somente administradores; a conta precisa ter o recurso de auditoria habilitado, senão a lista volta VAZIA sem nenhum aviso de erro.",
28413
+ "description": "Histórico de quem mexeu no quê dentro da conta (criação, edição, exclusão, login e logout), com o autor, o IP e o antes/depois de cada campo. ATENÇÃO ao formato das datas: aqui 'since' e 'until' são DATA POR EXTENSO (AAAA-MM-DD) e NÃO timestamp Unix — é o oposto dos relatórios; mandar um número Unix derruba a chamada com erro. Somente administradores; a conta precisa ter o recurso de auditoria habilitado, senão a lista volta VAZIA sem nenhum aviso de erro. MENSAGEM APAGADA (26/09/2026): quando alguém apaga uma mensagem pelo painel, fica um registro auditable_type 'Message', action 'destroy', com audited_changes = { content (texto, até 2000 caracteres), display_id (conversa), inbox_id, sender_type, sender_id, sender_name, attachments (nomes dos arquivos) } — é a foto tirada ANTES de apagar; auditable vem null nesse caso. Busque com q='trecho da mensagem' ou auditable_type=Message.",
28061
28414
  "category": "Auditoria",
28062
28415
  "params": [
28063
28416
  {
@@ -28093,7 +28446,7 @@
28093
28446
  "type": "string",
28094
28447
  "location": "query",
28095
28448
  "required": false,
28096
- "description": "Tipo de recurso afetado: Account, AccountUser, AutomationRule, Conversation, Inbox, InboxMember, Macro, Team, TeamMember, User, Webhook"
28449
+ "description": "Tipo de recurso afetado: Account, AccountUser, AutomationRule, Conversation, Inbox, InboxMember, Macro, Message (mensagem APAGADA pelo painel, desde 26/09/2026), Team, TeamMember, User, Webhook"
28097
28450
  },
28098
28451
  {
28099
28452
  "name": "remote_address",
@@ -28115,9 +28468,23 @@
28115
28468
  "location": "query",
28116
28469
  "required": false,
28117
28470
  "description": "Data final no formato AAAA-MM-DD (o dia inteiro entra). NÃO é timestamp Unix — número aqui gera erro"
28471
+ },
28472
+ {
28473
+ "name": "q",
28474
+ "type": "string",
28475
+ "location": "query",
28476
+ "required": false,
28477
+ "description": "Busca por texto (3+ letras): nome de quem fez OU conteúdo da mudança (inclusive o texto de mensagem apagada). Menos de 3 letras = ignorado. Em conta grande pode levar ~1 s; combine com since/until pra encurtar."
28478
+ },
28479
+ {
28480
+ "name": "sort",
28481
+ "type": "string",
28482
+ "location": "query",
28483
+ "required": false,
28484
+ "description": "Ordem por data: desc (mais recentes primeiro, padrão) ou asc."
28118
28485
  }
28119
28486
  ],
28120
- "returns": "{ per_page, total_entries, current_page, audit_logs: [{ id, auditable_id, auditable_type, auditable, associated_id, associated_type, user_id, user_type, username, action, audited_changes (antes/depois por campo), version, comment, request_uuid, created_at (Unix em segundos), remote_address }] }",
28487
+ "returns": "{ per_page, total_entries, current_page, audit_logs: [{ id, auditable_id, auditable_type, auditable, associated_id, associated_type, user_id, user_type, username, action, audited_changes (antes/depois por campo), version, comment, request_uuid, created_at (Unix em segundos), remote_address (IP inteiro), ip_masked (IP parcial, ex. 177.12.x.x; null pra IP interno), ip_city, ip_region (cidade/estado do IP — só do que já foi descoberto; o que falta aparece na próxima consulta) }] }",
28121
28488
  "common_use_cases": [
28122
28489
  "Descobrir quem apagou uma caixa de entrada ou uma automação",
28123
28490
  "Ver todos os logins de um agente num intervalo de datas",
@@ -33375,7 +33742,7 @@
33375
33742
  "method": "GET",
33376
33743
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}",
33377
33744
  "title": "Detalhes da Integração e-Clínica",
33378
- "description": "SÓ LEITURA, somente administrador. A integração e-Clínica da conta (1 por conta; o id precisa ser o dela — 404 caso contrário) com status, saúde, mapeamento de eventos, lembretes, webhook_url e as UNIDADES (filiais) com status/token-por-variável/webhook próprio. Mesmo conteúdo de lionchat_eclinica_integrations_list, que já resolve o id. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao.",
33745
+ "description": "SÓ LEITURA, somente administrador. A integração e-Clínica da conta (1 por conta; o id precisa ser o dela — 404 caso contrário) com status, saúde, mapeamento de eventos, lembretes, webhook_url e as UNIDADES (filiais) com status/token-por-variável/webhook próprio. Mesmo conteúdo de lionchat_eclinica_integrations_list, que já resolve o id. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao. VARIAVEIS DA MENSAGEM (28/09/2026): na automacao alvo de lembrete use {{eclinica_lembrete.<campo>}} (data_consulta, hora_consulta, profissional, compromisso, paciente_nome, unidade, link_confirmacao, idagenda, cliente_id, agendatipo, cor; laboratorio: data_prevista/data_entrega/data_referencia; cobranca: vencimento/valor/descricao) — e a consulta DAQUELE lembrete, data em DD/MM/AAAA. NUNCA a ficha {{contact.custom_attribute.eclinica_*}}: guarda so a consulta do ULTIMO aviso e manda a data de outra consulta. O nome antigo {{agendamento.*}} ainda funciona. No FLUXO nada muda ({{data_consulta}} etc). Detalhe no resource data-model, secao e-Clinica.",
33379
33746
  "category": "Integracoes",
33380
33747
  "params": [
33381
33748
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionchat/mcp-server",
3
- "version": "1.25.0",
3
+ "version": "1.26.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",