@lionchat/mcp-server 1.14.0 → 1.16.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.
package/endpoints.json CHANGED
@@ -8416,7 +8416,7 @@
8416
8416
  "type": "integer",
8417
8417
  "location": "body",
8418
8418
  "required": false,
8419
- "description": "Duração em minutos. Sem default fixo — varia por task_type: task/follow_up/deadline=15, call=30, meeting/video_call=60"
8419
+ "description": "Duração em minutos. Sem default fixo — varia por task_type: task/follow_up/deadline=15, call=30, meeting/video_call=60. Com booking_event_type_id aceita duracao DIFERENTE da do tipo (5..1440; fora da faixa o sistema usa a do tipo) — confira os horarios livres com booking_event_types_slots usando a mesma duracao (2026-08-19)."
8420
8420
  },
8421
8421
  {
8422
8422
  "name": "conversation_id",
@@ -9540,7 +9540,7 @@
9540
9540
  "method": "GET",
9541
9541
  "path": "/api/v1/accounts/{account_id}/flows",
9542
9542
  "title": "Listar Flows",
9543
- "description": "Lista todos os flows da conta com estatísticas de execução. Lista flows paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de flow). Cada flow retorna também o campo tags (array de strings, novo 22/07) — use para organizar/agrupar flows.",
9543
+ "description": "Lista os fluxos da conta. SEM paginacao e SEM meta: devolve todos de uma vez, com os filtros opcionais inbox_id, with_webhook_trigger e with_campaign_trigger. Use a lista pra ESCOLHER e FILTRAR fluxos (id, name, description, flow_type, conversation_mode, active, inbox_ids/inboxes, tags, session_stats = totais de execucao). Pra ler o DESENHO de um fluxo (blocos, conexoes, variaveis) use flows_show — a lista nao e o lugar de inspecionar blocos. Cada flow traz o campo tags (array de strings, 22/07) — use pra organizar/agrupar.",
9544
9544
  "category": "Flows",
9545
9545
  "params": [
9546
9546
  {
@@ -9556,15 +9556,26 @@
9556
9556
  "location": "query",
9557
9557
  "required": false,
9558
9558
  "description": "Filtra os flows vinculados a essa caixa de entrada."
9559
+ },
9560
+ {
9561
+ "name": "with_session_stats",
9562
+ "type": "boolean",
9563
+ "location": "query",
9564
+ "required": false,
9565
+ "description": "true = cada flow vem com session_stats{total,active,waiting,completed,exited,error} (conta as sessoes no banco — mais lento em conta grande). Sem o param o campo NAO aparece."
9559
9566
  }
9560
9567
  ],
9561
- "returns": "Objeto { data: [flows] } — a lista fica em data, sem meta e sem payload. Sem paginacao nenhuma (o controller so filtra por inbox_id / with_webhook_trigger / with_campaign_trigger). Cada flow traz o flow_data inteiro, entao a resposta pode ser MUITO grande em conta com muitos fluxos.",
9568
+ "returns": "Objeto { data: [flows] } — a lista fica em data, sem meta e sem paginacao. Campos de cada item: id, name, description, tool_name, tool_description, flow_type, conversation_mode, active, inbox_ids, inboxes[{id,name,channel_type}], tags, session_stats{total,active,waiting,completed,exited,error}, created_at, updated_at. LISTA LEVE (desde 20/08/2026): o index NAO traz flow_data, node_metrics, waiting_counts nem variables — so os campos acima mais trigger_types (array com as chaves dos gatilhos do bloco Inicio, ex. [\"card_created\",\"campaign_trigger\"]; vazio = sem gatilho). session_stats{total,active,waiting,completed,exited,error} so vem quando a chamada manda with_session_stats=true (param opcional desta tool — sem ele o campo NAO vem). executions_count e errors_count sao colunas mortas (sempre 0): ignore. Pra ler o desenho (blocos, conexoes, variaveis) use flows_show; pra conferir gatilho duplicado use flows_check_conflicts.",
9562
9569
  "common_use_cases": [
9563
9570
  "Dashboard: contar/exibir flows",
9564
9571
  "Buscar com filtros antes de outra operação",
9565
9572
  "Auditoria/relatório de flows ativas"
9566
9573
  ],
9567
- "related_tools": []
9574
+ "related_tools": [
9575
+ "lionchat_flows_show",
9576
+ "lionchat_flows_check_conflicts",
9577
+ "lionchat_flows_toggle"
9578
+ ]
9568
9579
  },
9569
9580
  {
9570
9581
  "id": "lionchat_flows_create",
@@ -9888,6 +9899,13 @@
9888
9899
  "location": "body",
9889
9900
  "required": false,
9890
9901
  "description": "Endereco do link publico do tipo de evento. EDITAVEL (18/08): normalizado no servidor, 3..60 chars, minusculas+numeros+hifen, unico. Vazio = mantem; duplicado = 422. Trocar derruba link ja enviado, codigo de incorporar e anuncio — NAO quebra agendamentos feitos, IA nem links de cancelar/remarcar (trabalham por id)."
9902
+ },
9903
+ {
9904
+ "name": "booking_event_type.color",
9905
+ "type": "string",
9906
+ "location": "body",
9907
+ "required": false,
9908
+ "description": "Cor hex (#RRGGBB) dos compromissos deste tipo no calendario (2026-08-19); vazio = cor do agente. A tarefa devolve booking_color ja resolvido."
9891
9909
  }
9892
9910
  ],
9893
9911
  "returns": "tipo de evento criado (com novo ID)",
@@ -9972,6 +9990,13 @@
9972
9990
  "location": "body",
9973
9991
  "required": false,
9974
9992
  "description": "Endereco do link publico do tipo de evento. EDITAVEL (18/08): normalizado no servidor, 3..60 chars, minusculas+numeros+hifen, unico. Vazio = mantem; duplicado = 422. Trocar derruba link ja enviado, codigo de incorporar e anuncio — NAO quebra agendamentos feitos, IA nem links de cancelar/remarcar (trabalham por id)."
9993
+ },
9994
+ {
9995
+ "name": "booking_event_type.color",
9996
+ "type": "string",
9997
+ "location": "body",
9998
+ "required": false,
9999
+ "description": "Cor hex (#RRGGBB) dos compromissos deste tipo no calendario (2026-08-19); vazio = cor do agente. A tarefa devolve booking_color ja resolvido."
9975
10000
  }
9976
10001
  ],
9977
10002
  "returns": "tipo de evento atualizado",
@@ -16549,7 +16574,7 @@
16549
16574
  "type": "object",
16550
16575
  "location": "body",
16551
16576
  "required": false,
16552
- "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration)"
16577
+ "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
16553
16578
  },
16554
16579
  {
16555
16580
  "name": "sample_payload",
@@ -16661,7 +16686,7 @@
16661
16686
  "type": "object",
16662
16687
  "location": "body",
16663
16688
  "required": false,
16664
- "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration)"
16689
+ "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
16665
16690
  },
16666
16691
  {
16667
16692
  "name": "sample_payload",
@@ -16856,7 +16881,7 @@
16856
16881
  "type": "object",
16857
16882
  "location": "body",
16858
16883
  "required": false,
16859
- "description": "Mapeamento de evento para automacao (dentro de guru_webhook)"
16884
+ "description": "Mapeamento de evento para automacao (dentro de guru_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
16860
16885
  }
16861
16886
  ],
16862
16887
  "returns": "webhook criado (com novo ID)",
@@ -16961,7 +16986,7 @@
16961
16986
  "type": "object",
16962
16987
  "location": "body",
16963
16988
  "required": false,
16964
- "description": "Mapeamento de evento para automacao (dentro de guru_webhook)"
16989
+ "description": "Mapeamento de evento para automacao (dentro de guru_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
16965
16990
  }
16966
16991
  ],
16967
16992
  "returns": "webhook atualizado",
@@ -17170,7 +17195,7 @@
17170
17195
  "type": "object",
17171
17196
  "location": "body",
17172
17197
  "required": false,
17173
- "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook)"
17198
+ "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17174
17199
  }
17175
17200
  ],
17176
17201
  "returns": "webhook criado (com novo ID)",
@@ -17268,7 +17293,7 @@
17268
17293
  "type": "object",
17269
17294
  "location": "body",
17270
17295
  "required": false,
17271
- "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook)"
17296
+ "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17272
17297
  }
17273
17298
  ],
17274
17299
  "returns": "webhook atualizado",
@@ -17477,7 +17502,7 @@
17477
17502
  "type": "object",
17478
17503
  "location": "body",
17479
17504
  "required": false,
17480
- "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook)"
17505
+ "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17481
17506
  }
17482
17507
  ],
17483
17508
  "returns": "webhook criado (com novo ID)",
@@ -17575,7 +17600,7 @@
17575
17600
  "type": "object",
17576
17601
  "location": "body",
17577
17602
  "required": false,
17578
- "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook)"
17603
+ "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17579
17604
  }
17580
17605
  ],
17581
17606
  "returns": "webhook atualizado",
@@ -17784,7 +17809,7 @@
17784
17809
  "type": "object",
17785
17810
  "location": "body",
17786
17811
  "required": false,
17787
- "description": "Mapeamento de evento para automacao (dentro de ticto_webhook)"
17812
+ "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17788
17813
  }
17789
17814
  ],
17790
17815
  "returns": "webhook criado (com novo ID)",
@@ -17882,7 +17907,7 @@
17882
17907
  "type": "object",
17883
17908
  "location": "body",
17884
17909
  "required": false,
17885
- "description": "Mapeamento de evento para automacao (dentro de ticto_webhook)"
17910
+ "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
17886
17911
  }
17887
17912
  ],
17888
17913
  "returns": "webhook atualizado",
@@ -18091,7 +18116,7 @@
18091
18116
  "type": "object",
18092
18117
  "location": "body",
18093
18118
  "required": false,
18094
- "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook)"
18119
+ "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
18095
18120
  }
18096
18121
  ],
18097
18122
  "returns": "webhook criado (com novo ID)",
@@ -18189,7 +18214,7 @@
18189
18214
  "type": "object",
18190
18215
  "location": "body",
18191
18216
  "required": false,
18192
- "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook)"
18217
+ "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
18193
18218
  }
18194
18219
  ],
18195
18220
  "returns": "webhook atualizado",
@@ -18398,7 +18423,7 @@
18398
18423
  "type": "object",
18399
18424
  "location": "body",
18400
18425
  "required": false,
18401
- "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook)"
18426
+ "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
18402
18427
  }
18403
18428
  ],
18404
18429
  "returns": "webhook criado (com novo ID)",
@@ -18496,7 +18521,7 @@
18496
18521
  "type": "object",
18497
18522
  "location": "body",
18498
18523
  "required": false,
18499
- "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook)"
18524
+ "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). Cada entrada aceita tambem conversation_attribute_keys: [...] (2026-08-21): chaves do catalogo de pagamento (product_name, offer_name, invoice_url, purchase_price, payment_method, purchase_email, pix_code, pix_qr_code_url, pix_expiration_date, ticket_hash_url, event_name, event_date, charged_times, subscription_cycle, subscription_status, customer_document, transaction_id, payment_installments, payment_source) que serao gravadas como atributo da CONVERSA que a automacao/fluxo abrir (no contato a 2a compra apaga a 1a). Chave reservada da conversa e recusada; valor e convertido pelo TIPO do atributo e descartado se irreconhecivel; gravar por integracao NAO dispara automacao/flow."
18500
18525
  }
18501
18526
  ],
18502
18527
  "returns": "webhook atualizado",
@@ -18789,7 +18814,7 @@
18789
18814
  "type": "object",
18790
18815
  "location": "body",
18791
18816
  "required": false,
18792
- "description": "Mapeamento de campos (singular), dentro de form"
18817
+ "description": "Mapeamento de campos (singular), dentro de form. Destino tambem pode ser conversation_attr_<chave> (2026-08-21): o atributo vai pra CONVERSA que a automacao/fluxo mapeado abrir pro lead (sem automacao/fluxo nao nasce conversa e o valor e descartado). Chaves reservadas (imported_from, type, in_reply_to...) sao recusadas; valor convertido pelo TIPO do atributo."
18793
18818
  },
18794
18819
  {
18795
18820
  "name": "event_automation_mapping",
@@ -22799,7 +22824,7 @@
22799
22824
  "description": "ID da caixa de entrada (WhatsApp por QR)"
22800
22825
  }
22801
22826
  ],
22802
- "returns": "situacao e progresso da importacao (status, contadores de conversas/mensagens/contatos, erro)",
22827
+ "returns": "situacao e progresso da importacao (status, contadores de conversas/mensagens/contatos, erro) + desde 20/08/2026: media_pending (arquivos ainda na fila desta caixa; 0 = tudo pedido), media_swept_at e media_swept_count (varredura final que recolocou orfas na fila). A midia chega DEPOIS do texto, em fila por caixa — status 'completed' com media_pending > 0 e normal (texto pronto, fotos a caminho); mensagem com content_attributes.media_failed {retryable: true} = arquivo chegando; retryable false = o WhatsApp ja apagou o arquivo (definitivo).",
22803
22828
  "common_use_cases": [
22804
22829
  "Cliente pergunta por que a importacao de historico parou ou sumiu",
22805
22830
  "Acompanhar a migracao de um cliente novo (quantas conversas ja entraram)"
@@ -25457,122 +25482,466 @@
25457
25482
  ]
25458
25483
  },
25459
25484
  {
25460
- "id": "lionchat_inboxes_whatsapp_history_start",
25485
+ "id": "lionchat_custom_dashboards_list",
25486
+ "method": "GET",
25487
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards",
25488
+ "title": "Relatorios Personalizados (listar)",
25489
+ "description": "[GET] Lista TODOS os relatorios personalizados da conta (a aba 'Personalizados' em Relatorios), cada um JA com o array `widgets` completo — id e desenho de cada bloco. E daqui que sai o `widget_id` pra calcular um bloco. So administrador (401 caso contrario). ATENCAO: NAO tem paginacao nem filtro. Com muitos relatorios cheios a resposta pode vir CORTADA no limite do conector — se vier o aviso de corte, NUNCA use essa lista pra montar um `custom_dashboards_update`: voce apagaria os blocos que nao chegaram.",
25490
+ "category": "Relatorios",
25491
+ "params": [],
25492
+ "returns": "Array de { id, name, position, widgets: [...], created_at }",
25493
+ "common_use_cases": [
25494
+ "Descobrir quais relatorios personalizados o cliente montou",
25495
+ "Pegar o widget_id de um bloco pra calcular o numero dele",
25496
+ "Ler o desenho de um bloco antes de alterar o relatorio"
25497
+ ],
25498
+ "related_tools": [
25499
+ "lionchat_custom_dashboards_widget_data",
25500
+ "lionchat_custom_dashboards_update"
25501
+ ]
25502
+ },
25503
+ {
25504
+ "id": "lionchat_custom_dashboards_widget_data",
25461
25505
  "method": "POST",
25462
- "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/start",
25463
- "title": "Importar Histórico WhatsApp Cloud (Iniciar)",
25464
- "description": "AÇÃO DE ESCRITA. Inicia a importação do histórico de conversas antigas para uma caixa WhatsApp Cloud (API oficial), lendo um QR Code (coexistência — não desconecta o número oficial). Só admin + requer a feature qr_history_import. Acompanhe pelo status.",
25465
- "category": "Caixas de Entrada",
25506
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards/{id}/widget_data",
25507
+ "title": "Calcular Bloco Salvo",
25508
+ "description": "[POST] Calcula UM bloco que JA esta salvo num relatorio personalizado e devolve os numeros. O desenho e lido de dentro do relatorio salvo — o corpo so diz QUAL bloco (widget_id). Pra calcular um desenho que ainda nao existe, use `custom_dashboards_preview_widget`. So administrador (401 caso contrario). Formato da resposta pelo campo `shape`: series {series:[{timestamp,value}]} (timestamp unix em segundos; metricas de tempo trazem tambem `count` por ponto) · categories {categories:[{label,value}]} (funnel_stages vem na ORDEM DAS ETAPAS, nunca por valor) · scalar {value,total,secondary} (use `total` pra separar 'ninguem respondeu' de 'zero legitimo'; SLA sem nenhum prazo aplicado devolve 100.0) · table {dimension,columns,rows,total} (o `total` NAO e a soma das linhas, e contagem propria por metrica). Erros: 401 = quem chamou NAO e administrador (nao mande reconectar o conector). 422 com {error} = desenho invalido ou recurso nao liberado (code:'feature_unavailable' distingue) — o motivo vem em texto, corrija e tente de novo. 422 com {message,attributes} = teto atingido (50 relatorios por conta, 12 blocos por relatorio). PERIODO SOB DEMANDA: `time_range`/`from`/`to`/`bucket` recalculam o bloco em outra janela SEM alterar o relatorio salvo — e assim que se monta um resumo DIARIO a partir de um relatorio que o cliente deixou salvo em 30 dias (peca `time_range:'yesterday'` e escreva o texto). Recorte (scope/dimension/funnel) e metrica NAO sao aceitos aqui de proposito: janela nao amplia permissao, recorte ampliaria.",
25509
+ "category": "Relatorios",
25466
25510
  "params": [
25467
25511
  {
25468
- "name": "inbox_id",
25512
+ "name": "id",
25469
25513
  "type": "integer",
25470
25514
  "location": "path",
25471
25515
  "required": true,
25472
- "description": "ID da caixa WhatsApp Cloud"
25516
+ "description": "Id do relatorio personalizado (vem do custom_dashboards_list)"
25473
25517
  },
25474
25518
  {
25475
- "name": "days",
25476
- "type": "integer",
25519
+ "name": "widget_id",
25520
+ "type": "string",
25521
+ "location": "body",
25522
+ "required": true,
25523
+ "description": "Id do bloco DENTRO daquele relatorio (campo `id` de um item de `widgets`)"
25524
+ },
25525
+ {
25526
+ "name": "timezone_offset",
25527
+ "type": "number",
25477
25528
  "location": "body",
25478
25529
  "required": false,
25479
- "description": "Quantidade de dias de histórico a importar (valor inválido cai para 30)"
25530
+ "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."
25531
+ },
25532
+ {
25533
+ "name": "time_range",
25534
+ "type": "string",
25535
+ "location": "body",
25536
+ "required": false,
25537
+ "description": "RECALCULA o bloco salvo em OUTRO periodo, sem alterar o que esta gravado (a tela do cliente nao muda). E o que permite pedir 'o relatorio de ontem' a partir de um relatorio salvo em 'ultimos 30 dias'. Valores: today, yesterday, last_7_days, last_30_days, this_month, last_month, custom. Ausente = usa o periodo salvo no bloco."
25538
+ },
25539
+ {
25540
+ "name": "from",
25541
+ "type": "string",
25542
+ "location": "body",
25543
+ "required": false,
25544
+ "description": "Inicio do periodo (AAAA-MM-DD). SO com time_range=custom; sozinho e ignorado. Janela maxima de 92 dias — acima disso volta 422 com o motivo."
25545
+ },
25546
+ {
25547
+ "name": "to",
25548
+ "type": "string",
25549
+ "location": "body",
25550
+ "required": false,
25551
+ "description": "Fim do periodo (AAAA-MM-DD). SO com time_range=custom."
25552
+ },
25553
+ {
25554
+ "name": "bucket",
25555
+ "type": "string",
25556
+ "location": "body",
25557
+ "required": false,
25558
+ "description": "Agrupamento no tempo (day, week, month) para blocos de serie. Ausente = usa o agrupamento salvo."
25480
25559
  }
25481
25560
  ],
25482
- "returns": "{ state, qr, days }",
25561
+ "returns": "Um dos 4 formatos normalizados (series | categories | scalar | table), com o campo `shape` dizendo qual",
25483
25562
  "common_use_cases": [
25484
- "Trazer o histórico antigo ao migrar para WhatsApp oficial"
25563
+ "Responder 'o que meu relatorio de vendas mostra hoje?'",
25564
+ "Ler o numero de um grafico que o cliente montou na tela"
25485
25565
  ],
25486
25566
  "related_tools": [
25487
- "lionchat_inboxes_whatsapp_history_status",
25488
- "lionchat_inboxes_whatsapp_history_cancel"
25567
+ "lionchat_custom_dashboards_list",
25568
+ "lionchat_custom_dashboards_preview_widget"
25489
25569
  ]
25490
25570
  },
25491
25571
  {
25492
- "id": "lionchat_inboxes_whatsapp_history_status",
25493
- "method": "GET",
25494
- "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/status",
25495
- "title": "Importar Histórico WhatsApp Cloud (Status)",
25496
- "description": "SÓ LEITURA. Status da importação de histórico da caixa WhatsApp Cloud: estado, QR Code (quando precisa parear), progresso e estatísticas. Estados: idle → scan_qr → importing → migrating → cleaning → done/failed.",
25497
- "category": "Caixas de Entrada",
25572
+ "id": "lionchat_custom_dashboards_preview_widget",
25573
+ "method": "POST",
25574
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards/preview_widget",
25575
+ "title": "Calcular Bloco na Hora (sem salvar)",
25576
+ "description": "[POST] Monta um bloco de relatorio NA HORA e devolve os numeros, SEM salvar nada. E a ferramenta pra responder pergunta de relatorio que nao tem grafico pronto — ex.: 'quantos cards foram GANHOS em cada etapa do funil X nos ultimos 30 dias' (funnel_stages + date_basis:closed + status:won). Nao existe consulta livre: escolha um `widget_type` e preencha SO os campos daquele tipo; o servidor revalida tudo antes de calcular. So administrador (401 caso contrario). Campo que nao esta na lista abaixo e DESCARTADO EM SILENCIO. Formato da resposta pelo campo `shape`: series {series:[{timestamp,value}]} (timestamp unix em segundos; metricas de tempo trazem tambem `count` por ponto) · categories {categories:[{label,value}]} (funnel_stages vem na ORDEM DAS ETAPAS, nunca por valor) · scalar {value,total,secondary} (use `total` pra separar 'ninguem respondeu' de 'zero legitimo'; SLA sem nenhum prazo aplicado devolve 100.0) · table {dimension,columns,rows,total} (o `total` NAO e a soma das linhas, e contagem propria por metrica). Erros: 401 = quem chamou NAO e administrador (nao mande reconectar o conector). 422 com {error} = desenho invalido ou recurso nao liberado (code:'feature_unavailable' distingue) — o motivo vem em texto, corrija e tente de novo. 422 com {message,attributes} = teto atingido (50 relatorios por conta, 12 blocos por relatorio). Tabela completa de tipos, metricas e armadilhas no resource lionchat://docs/reports-guide. TIPOS NOVOS (21/08): `calls_report` = tabela de LIGACOES (feitas, atendidas, nao atendidas, nao concluidas, tempo total e medio) por atendente (`dimension:'agent'`) ou por caixa (`dimension:'inbox'`); ligacao sem atendente ganha linha propria. `stage_entries` = quantos cards ENTRARAM em cada etapa de um funil no periodo, lido do historico de movimentacao — DIFERENTE de `funnel_stages`, que conta quem ESTA na etapa agora: card que entrou e depois saiu aparece no stage_entries e SOME do funnel_stages (medido: 25% de diferenca). Use stage_entries pra 'quantos agendamentos/negocios aconteceram' e funnel_stages pra 'como esta o funil hoje'. stage_entries conta CARD DISTINTO (card que reentra na etapa conta uma vez) e o historico so existe a partir de 12/07/2026, com retencao de 365 dias — periodo anterior devolve menos do que aconteceu. PARAM NOVO `measure` em funnel_stages e stage_entries: 'count' (padrao, conta cards) ou 'value' (soma o VALOR dos cards = faturamento). Com status:'won' + date_basis:'closed' + measure:'value' sai o faturamento ganho da etapa no periodo. PERIODOS NOVOS: 'today' e 'yesterday'. CAMPO NOVO `title` em cada bloco: o nome que aparece no cabecalho. Sem ele varios blocos do mesmo tipo saem com rotulos identicos e nem a pessoa nem o agente sabem qual e qual — SEMPRE nomeie.",
25577
+ "category": "Relatorios",
25498
25578
  "params": [
25499
25579
  {
25500
- "name": "inbox_id",
25580
+ "name": "widget_type",
25581
+ "type": "string",
25582
+ "location": "body",
25583
+ "required": false,
25584
+ "description": "OBRIGATORIO. Um de: conversations_timeseries (evolucao no tempo) | entity_ranking (comparar agente/caixa/equipe/etiqueta) | csat_summary (satisfacao) | sla_summary (cumprimento de prazo, exige o recurso 'sla') | funnel_stages (cards por etapa de UM funil, exige 'kanban_board') | lead_origin (origem do lead, exige 'liontrack') | agent_report (tabela de produtividade por operador)."
25585
+ },
25586
+ {
25587
+ "name": "chart_type",
25588
+ "type": "string",
25589
+ "location": "body",
25590
+ "required": false,
25591
+ "description": "line|bar (timeseries) · bar|table (entity_ranking, funnel_stages) · number (csat_summary, sla_summary) · bar|pie (lead_origin) · table (agent_report). Omitir aplica o padrao do tipo."
25592
+ },
25593
+ {
25594
+ "name": "metric",
25595
+ "type": "string",
25596
+ "location": "body",
25597
+ "required": false,
25598
+ "description": "timeseries: conversations | incoming_messages | outgoing_messages | resolutions | reopens | avg_first_response_time | avg_resolution_time. entity_ranking: conversations | resolutions | avg_first_response_time | avg_resolution_time. Os dois tempos vem em SEGUNDOS."
25599
+ },
25600
+ {
25601
+ "name": "dimension",
25602
+ "type": "string",
25603
+ "location": "body",
25604
+ "required": false,
25605
+ "description": "entity_ranking: agent|inbox|team|label. agent_report: agent|team|inbox (as LINHAS da tabela)."
25606
+ },
25607
+ {
25608
+ "name": "bucket",
25609
+ "type": "string",
25610
+ "location": "body",
25611
+ "required": false,
25612
+ "description": "So no timeseries: day | week | month."
25613
+ },
25614
+ {
25615
+ "name": "funnel_id",
25501
25616
  "type": "integer",
25502
- "location": "path",
25503
- "required": true,
25504
- "description": "ID da caixa WhatsApp Cloud"
25617
+ "location": "body",
25618
+ "required": false,
25619
+ "description": "So no funnel_stages. Precisa ser funil DESTA conta."
25620
+ },
25621
+ {
25622
+ "name": "date_basis",
25623
+ "type": "string",
25624
+ "location": "body",
25625
+ "required": false,
25626
+ "description": "So no funnel_stages: created (entrou no funil) | moved (entrou na etapa, padrao) | closed (foi fechado) | any. Combine com status: closed+won = 'ganhos no periodo'."
25627
+ },
25628
+ {
25629
+ "name": "status",
25630
+ "type": "string",
25631
+ "location": "body",
25632
+ "required": false,
25633
+ "description": "So no funnel_stages: all | open | won | lost."
25634
+ },
25635
+ {
25636
+ "name": "scope_type",
25637
+ "type": "string",
25638
+ "location": "body",
25639
+ "required": false,
25640
+ "description": "ATENCAO — sentido DIFERENTE por tipo. No timeseries: 'o grafico e SO daquela entidade' (agent|inbox|team). No agent_report: 'mostre so as LINHAS de quem e dessa equipe/caixa'. Exige scope_id junto, senao e recusado."
25641
+ },
25642
+ {
25643
+ "name": "scope_id",
25644
+ "type": "integer",
25645
+ "location": "body",
25646
+ "required": false,
25647
+ "description": "Id da entidade do scope_type. Precisa ser DESTA conta."
25648
+ },
25649
+ {
25650
+ "name": "time_range",
25651
+ "type": "string",
25652
+ "location": "body",
25653
+ "required": false,
25654
+ "description": "last_7_days | last_30_days | this_month | last_month | custom. 'custom' SO existe em conversations_timeseries e agent_report, exige from+to, e a janela nao pode passar de 92 DIAS (o teto e da janela, vale pros dois). Pedir 'esse ano' e recusado."
25655
+ },
25656
+ {
25657
+ "name": "from",
25658
+ "type": "string",
25659
+ "location": "body",
25660
+ "required": false,
25661
+ "description": "AAAA-MM-DD. Obrigatorio quando time_range=custom."
25662
+ },
25663
+ {
25664
+ "name": "to",
25665
+ "type": "string",
25666
+ "location": "body",
25667
+ "required": false,
25668
+ "description": "AAAA-MM-DD. Obrigatorio quando time_range=custom."
25669
+ },
25670
+ {
25671
+ "name": "columns",
25672
+ "type": "array",
25673
+ "location": "body",
25674
+ "required": false,
25675
+ "description": "So no agent_report — as COLUNAS da tabela. Cada item: {metric, as?} com metric em leads | atendidos | resolvidas | abertas | pendentes | adiadas | label_count | conversao. label_count exige label_id (id de etiqueta DESTA conta). conversao exige denominator (uma das metricas do nucleo) e numerator = LISTA DE IDS DE ETIQUETA (ex: [5,9]) — NUNCA nome de metrica."
25676
+ },
25677
+ {
25678
+ "name": "timezone_offset",
25679
+ "type": "number",
25680
+ "location": "query",
25681
+ "required": false,
25682
+ "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."
25683
+ },
25684
+ {
25685
+ "name": "measure",
25686
+ "type": "string",
25687
+ "location": "body",
25688
+ "required": false,
25689
+ "description": "Contar cards ('count', padrao) ou somar o VALOR deles ('value'). So em funnel_stages e stage_entries."
25690
+ },
25691
+ {
25692
+ "name": "title",
25693
+ "type": "string",
25694
+ "location": "body",
25695
+ "required": false,
25696
+ "description": "Nome do bloco, exibido no cabecalho (ate 80 caracteres). Vazio = mostra o rotulo do tipo."
25505
25697
  }
25506
25698
  ],
25507
- "returns": "{ state, qr, days, progress, stats, error }",
25699
+ "returns": "Um dos 4 formatos normalizados (series | categories | scalar | table), com o campo `shape` dizendo qual",
25508
25700
  "common_use_cases": [
25509
- "Acompanhar o andamento da importação",
25510
- "Pegar o QR Code para parear"
25701
+ "Responder pergunta de relatorio que nenhuma outra ferramenta cobre",
25702
+ "Comparar atendentes/caixas/equipes num periodo",
25703
+ "Cards por etapa de um funil, com recorte por situacao e por data de fechamento",
25704
+ "Tabela de produtividade por operador com colunas escolhidas"
25511
25705
  ],
25512
25706
  "related_tools": [
25513
- "lionchat_inboxes_whatsapp_history_start",
25514
- "lionchat_inboxes_whatsapp_history_cancel"
25515
- ]
25707
+ "lionchat_custom_dashboards_create",
25708
+ "lionchat_custom_dashboards_widget_data"
25709
+ ],
25710
+ "body_wrapper": "widget"
25516
25711
  },
25517
25712
  {
25518
- "id": "lionchat_inboxes_whatsapp_history_cancel",
25713
+ "id": "lionchat_custom_dashboards_create",
25519
25714
  "method": "POST",
25520
- "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/cancel",
25521
- "title": "Importar Histórico WhatsApp Cloud (Cancelar)",
25522
- "description": "AÇÃO DE ESCRITA. Cancela uma importação de histórico em andamento na caixa WhatsApp Cloud.",
25523
- "category": "Caixas de Entrada",
25715
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards",
25716
+ "title": "Criar Relatorio Personalizado",
25717
+ "description": "[POST] Cria um relatorio personalizado que passa a APARECER NA TELA do cliente, na aba 'Personalizados' de Relatorios. ALTERA O QUE O CLIENTE VE: exige confirm:true depois de confirmar com ele. So administrador (401 caso contrario). Cada bloco de `widgets` usa os MESMOS campos do preview_widget (teste o desenho la antes de salvar) e PRECISA de um `id` proprio e unico — se faltar, o servidor gera. Um bloco invalido barra a criacao INTEIRA com 422 e o motivo em texto: nunca salva pela metade. Tetos: 50 relatorios por conta, 12 blocos por relatorio. Erros: 401 = quem chamou NAO e administrador (nao mande reconectar o conector). 422 com {error} = desenho invalido ou recurso nao liberado (code:'feature_unavailable' distingue) — o motivo vem em texto, corrija e tente de novo. 422 com {message,attributes} = teto atingido (50 relatorios por conta, 12 blocos por relatorio). TIPOS NOVOS (21/08): `calls_report` = tabela de LIGACOES (feitas, atendidas, nao atendidas, nao concluidas, tempo total e medio) por atendente (`dimension:'agent'`) ou por caixa (`dimension:'inbox'`); ligacao sem atendente ganha linha propria. `stage_entries` = quantos cards ENTRARAM em cada etapa de um funil no periodo, lido do historico de movimentacao — DIFERENTE de `funnel_stages`, que conta quem ESTA na etapa agora: card que entrou e depois saiu aparece no stage_entries e SOME do funnel_stages (medido: 25% de diferenca). Use stage_entries pra 'quantos agendamentos/negocios aconteceram' e funnel_stages pra 'como esta o funil hoje'. stage_entries conta CARD DISTINTO (card que reentra na etapa conta uma vez) e o historico so existe a partir de 12/07/2026, com retencao de 365 dias — periodo anterior devolve menos do que aconteceu. PARAM NOVO `measure` em funnel_stages e stage_entries: 'count' (padrao, conta cards) ou 'value' (soma o VALOR dos cards = faturamento). Com status:'won' + date_basis:'closed' + measure:'value' sai o faturamento ganho da etapa no periodo. PERIODOS NOVOS: 'today' e 'yesterday'. CAMPO NOVO `title` em cada bloco: o nome que aparece no cabecalho. Sem ele varios blocos do mesmo tipo saem com rotulos identicos e nem a pessoa nem o agente sabem qual e qual — SEMPRE nomeie.",
25718
+ "category": "Relatorios",
25524
25719
  "params": [
25525
25720
  {
25526
- "name": "inbox_id",
25527
- "type": "integer",
25528
- "location": "path",
25721
+ "name": "name",
25722
+ "type": "string",
25723
+ "location": "body",
25529
25724
  "required": true,
25530
- "description": "ID da caixa WhatsApp Cloud"
25725
+ "description": "Nome do relatorio, como aparece na aba do cliente"
25726
+ },
25727
+ {
25728
+ "name": "position",
25729
+ "type": "integer",
25730
+ "location": "body",
25731
+ "required": false,
25732
+ "description": "Ordem na lista (padrao 0)"
25733
+ },
25734
+ {
25735
+ "name": "widgets",
25736
+ "type": "array",
25737
+ "location": "body",
25738
+ "required": false,
25739
+ "description": "Lista de blocos. Cada item: {id, widget_type, chart_type, ...} com os mesmos campos do custom_dashboards_preview_widget. Maximo 12."
25531
25740
  }
25532
25741
  ],
25533
- "returns": "{ state }",
25742
+ "returns": "{ id, name, position, widgets, created_at }",
25534
25743
  "common_use_cases": [
25535
- "Interromper uma importação demorada ou iniciada por engano"
25744
+ "Montar pro cliente um relatorio que ele pediu em palavras",
25745
+ "Deixar salvo na tela um recorte que ele consulta toda semana"
25536
25746
  ],
25537
25747
  "related_tools": [
25538
- "lionchat_inboxes_whatsapp_history_start",
25539
- "lionchat_inboxes_whatsapp_history_status"
25540
- ]
25748
+ "lionchat_custom_dashboards_preview_widget",
25749
+ "lionchat_custom_dashboards_update"
25750
+ ],
25751
+ "body_wrapper": "custom_dashboard",
25752
+ "confirm_required": true
25541
25753
  },
25542
25754
  {
25543
- "id": "lionchat_inboxes_coex_backup_connect",
25544
- "method": "POST",
25545
- "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/coex_backup/connect",
25546
- "title": "Conectar Saida de Emergencia (Coex)",
25547
- "description": "Provisiona/conecta a sessao WAHA so-envio (retorna QR) de uma caixa WhatsApp Cloud em coexistencia, usada para enviar texto fora da janela de 24h. Requer admin + feature 'coexistence_backup_send' + caixa Cloud em coexistencia.",
25548
- "category": "Caixas de Entrada",
25755
+ "id": "lionchat_custom_dashboards_update",
25756
+ "method": "PATCH",
25757
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards/{id}",
25758
+ "title": "Alterar Relatorio Personalizado",
25759
+ "description": "[PATCH] Altera um relatorio personalizado. ALTERA O QUE O CLIENTE VE: exige confirm:true depois de confirmar com ele. So administrador (401 caso contrario). ATENCAO — `widgets` SUBSTITUI a lista inteira, nao acrescenta: mandar um bloco APAGA os outros. Leia o relatorio com custom_dashboards_list, altere o array e devolva-o COMPLETO. Se a listagem tiver vindo cortada, NAO use: voce apagaria o que nao chegou. Nao ha historico de alteracao — bloco apagado nao volta. Erros: 401 = quem chamou NAO e administrador (nao mande reconectar o conector). 422 com {error} = desenho invalido ou recurso nao liberado (code:'feature_unavailable' distingue) — o motivo vem em texto, corrija e tente de novo. 422 com {message,attributes} = teto atingido (50 relatorios por conta, 12 blocos por relatorio). TIPOS NOVOS (21/08): `calls_report` = tabela de LIGACOES (feitas, atendidas, nao atendidas, nao concluidas, tempo total e medio) por atendente (`dimension:'agent'`) ou por caixa (`dimension:'inbox'`); ligacao sem atendente ganha linha propria. `stage_entries` = quantos cards ENTRARAM em cada etapa de um funil no periodo, lido do historico de movimentacao — DIFERENTE de `funnel_stages`, que conta quem ESTA na etapa agora: card que entrou e depois saiu aparece no stage_entries e SOME do funnel_stages (medido: 25% de diferenca). Use stage_entries pra 'quantos agendamentos/negocios aconteceram' e funnel_stages pra 'como esta o funil hoje'. stage_entries conta CARD DISTINTO (card que reentra na etapa conta uma vez) e o historico so existe a partir de 12/07/2026, com retencao de 365 dias — periodo anterior devolve menos do que aconteceu. PARAM NOVO `measure` em funnel_stages e stage_entries: 'count' (padrao, conta cards) ou 'value' (soma o VALOR dos cards = faturamento). Com status:'won' + date_basis:'closed' + measure:'value' sai o faturamento ganho da etapa no periodo. PERIODOS NOVOS: 'today' e 'yesterday'. CAMPO NOVO `title` em cada bloco: o nome que aparece no cabecalho. Sem ele varios blocos do mesmo tipo saem com rotulos identicos e nem a pessoa nem o agente sabem qual e qual — SEMPRE nomeie.",
25760
+ "category": "Relatorios",
25549
25761
  "params": [
25550
25762
  {
25551
- "name": "inbox_id",
25763
+ "name": "id",
25552
25764
  "type": "integer",
25553
25765
  "location": "path",
25554
25766
  "required": true,
25555
- "description": "ID da caixa de entrada (inbox)"
25767
+ "description": "Id do relatorio personalizado"
25768
+ },
25769
+ {
25770
+ "name": "name",
25771
+ "type": "string",
25772
+ "location": "body",
25773
+ "required": false,
25774
+ "description": "Novo nome"
25775
+ },
25776
+ {
25777
+ "name": "position",
25778
+ "type": "integer",
25779
+ "location": "body",
25780
+ "required": false,
25781
+ "description": "Nova ordem na lista"
25782
+ },
25783
+ {
25784
+ "name": "widgets",
25785
+ "type": "array",
25786
+ "location": "body",
25787
+ "required": false,
25788
+ "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."
25556
25789
  }
25557
25790
  ],
25558
- "returns": "Estado da sessao de emergencia (state, qr, connected)",
25791
+ "returns": "{ id, name, position, widgets, created_at }",
25559
25792
  "common_use_cases": [
25560
- "Ativar o envio fora da janela de 24h numa caixa Cloud",
25561
- "Exibir o QR para parear o numero de emergencia"
25793
+ "Acrescentar um bloco a um relatorio que ja existe",
25794
+ "Trocar o periodo ou o recorte de um bloco"
25562
25795
  ],
25563
25796
  "related_tools": [
25564
- "lionchat_inboxes_coex_backup_status",
25565
- "lionchat_inboxes_coex_backup_disconnect"
25566
- ]
25797
+ "lionchat_custom_dashboards_list",
25798
+ "lionchat_custom_dashboards_create"
25799
+ ],
25800
+ "body_wrapper": "custom_dashboard",
25801
+ "confirm_required": true
25567
25802
  },
25568
25803
  {
25569
- "id": "lionchat_inboxes_coex_backup_status",
25570
- "method": "GET",
25571
- "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/coex_backup/status",
25572
- "title": "Status da Saida de Emergencia (Coex)",
25573
- "description": "Retorna o estado da sessao WAHA so-envio da caixa (state, qr, connected). Nunca levanta erro. Requer admin + feature 'coexistence_backup_send'.",
25574
- "category": "Caixas de Entrada",
25575
- "params": [
25804
+ "id": "lionchat_custom_dashboards_destroy",
25805
+ "method": "DELETE",
25806
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards/{id}",
25807
+ "title": "Apagar Relatorio Personalizado",
25808
+ "description": "[DELETE] Apaga um relatorio personalizado da tela do cliente. SEM LIXEIRA E SEM DESFAZER. Exige confirm:true depois de confirmar com o usuario EXATAMENTE qual relatorio sera apagado (confira o nome com custom_dashboards_list antes). So administrador (401 caso contrario).",
25809
+ "category": "Relatorios",
25810
+ "params": [
25811
+ {
25812
+ "name": "id",
25813
+ "type": "integer",
25814
+ "location": "path",
25815
+ "required": true,
25816
+ "description": "Id do relatorio personalizado a apagar"
25817
+ }
25818
+ ],
25819
+ "returns": "204 sem corpo",
25820
+ "common_use_cases": [
25821
+ "Remover um relatorio que o cliente nao usa mais"
25822
+ ],
25823
+ "related_tools": [
25824
+ "lionchat_custom_dashboards_list"
25825
+ ],
25826
+ "confirm_required": true
25827
+ },
25828
+ {
25829
+ "id": "lionchat_inboxes_whatsapp_history_start",
25830
+ "method": "POST",
25831
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/start",
25832
+ "title": "Importar Histórico WhatsApp Cloud (Iniciar)",
25833
+ "description": "AÇÃO DE ESCRITA. Inicia a importação do histórico de conversas antigas para uma caixa WhatsApp Cloud (API oficial), lendo um QR Code (coexistência — não desconecta o número oficial). Só admin + requer a feature qr_history_import. Acompanhe pelo status.",
25834
+ "category": "Caixas de Entrada",
25835
+ "params": [
25836
+ {
25837
+ "name": "inbox_id",
25838
+ "type": "integer",
25839
+ "location": "path",
25840
+ "required": true,
25841
+ "description": "ID da caixa WhatsApp Cloud"
25842
+ },
25843
+ {
25844
+ "name": "days",
25845
+ "type": "integer",
25846
+ "location": "body",
25847
+ "required": false,
25848
+ "description": "Quantidade de dias de histórico a importar (valor inválido cai para 30)"
25849
+ }
25850
+ ],
25851
+ "returns": "{ state, qr, days }",
25852
+ "common_use_cases": [
25853
+ "Trazer o histórico antigo ao migrar para WhatsApp oficial"
25854
+ ],
25855
+ "related_tools": [
25856
+ "lionchat_inboxes_whatsapp_history_status",
25857
+ "lionchat_inboxes_whatsapp_history_cancel"
25858
+ ]
25859
+ },
25860
+ {
25861
+ "id": "lionchat_inboxes_whatsapp_history_status",
25862
+ "method": "GET",
25863
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/status",
25864
+ "title": "Importar Histórico WhatsApp Cloud (Status)",
25865
+ "description": "SÓ LEITURA. Status da importação de histórico da caixa WhatsApp Cloud: estado, QR Code (quando precisa parear), progresso e estatísticas. Estados: idle → scan_qr → importing → migrating → cleaning → done/failed.",
25866
+ "category": "Caixas de Entrada",
25867
+ "params": [
25868
+ {
25869
+ "name": "inbox_id",
25870
+ "type": "integer",
25871
+ "location": "path",
25872
+ "required": true,
25873
+ "description": "ID da caixa WhatsApp Cloud"
25874
+ }
25875
+ ],
25876
+ "returns": "{ state, qr, days, progress, stats, error }",
25877
+ "common_use_cases": [
25878
+ "Acompanhar o andamento da importação",
25879
+ "Pegar o QR Code para parear"
25880
+ ],
25881
+ "related_tools": [
25882
+ "lionchat_inboxes_whatsapp_history_start",
25883
+ "lionchat_inboxes_whatsapp_history_cancel"
25884
+ ]
25885
+ },
25886
+ {
25887
+ "id": "lionchat_inboxes_whatsapp_history_cancel",
25888
+ "method": "POST",
25889
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_history/cancel",
25890
+ "title": "Importar Histórico WhatsApp Cloud (Cancelar)",
25891
+ "description": "AÇÃO DE ESCRITA. Cancela uma importação de histórico em andamento na caixa WhatsApp Cloud.",
25892
+ "category": "Caixas de Entrada",
25893
+ "params": [
25894
+ {
25895
+ "name": "inbox_id",
25896
+ "type": "integer",
25897
+ "location": "path",
25898
+ "required": true,
25899
+ "description": "ID da caixa WhatsApp Cloud"
25900
+ }
25901
+ ],
25902
+ "returns": "{ state }",
25903
+ "common_use_cases": [
25904
+ "Interromper uma importação demorada ou iniciada por engano"
25905
+ ],
25906
+ "related_tools": [
25907
+ "lionchat_inboxes_whatsapp_history_start",
25908
+ "lionchat_inboxes_whatsapp_history_status"
25909
+ ]
25910
+ },
25911
+ {
25912
+ "id": "lionchat_inboxes_coex_backup_connect",
25913
+ "method": "POST",
25914
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/coex_backup/connect",
25915
+ "title": "Conectar Saida de Emergencia (Coex)",
25916
+ "description": "Provisiona/conecta a sessao WAHA so-envio (retorna QR) de uma caixa WhatsApp Cloud em coexistencia, usada para enviar texto fora da janela de 24h. Requer admin + feature 'coexistence_backup_send' + caixa Cloud em coexistencia.",
25917
+ "category": "Caixas de Entrada",
25918
+ "params": [
25919
+ {
25920
+ "name": "inbox_id",
25921
+ "type": "integer",
25922
+ "location": "path",
25923
+ "required": true,
25924
+ "description": "ID da caixa de entrada (inbox)"
25925
+ }
25926
+ ],
25927
+ "returns": "Estado da sessao de emergencia (state, qr, connected)",
25928
+ "common_use_cases": [
25929
+ "Ativar o envio fora da janela de 24h numa caixa Cloud",
25930
+ "Exibir o QR para parear o numero de emergencia"
25931
+ ],
25932
+ "related_tools": [
25933
+ "lionchat_inboxes_coex_backup_status",
25934
+ "lionchat_inboxes_coex_backup_disconnect"
25935
+ ]
25936
+ },
25937
+ {
25938
+ "id": "lionchat_inboxes_coex_backup_status",
25939
+ "method": "GET",
25940
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/coex_backup/status",
25941
+ "title": "Status da Saida de Emergencia (Coex)",
25942
+ "description": "Retorna o estado da sessao WAHA so-envio da caixa (state, qr, connected). Nunca levanta erro. Requer admin + feature 'coexistence_backup_send'.",
25943
+ "category": "Caixas de Entrada",
25944
+ "params": [
25576
25945
  {
25577
25946
  "name": "inbox_id",
25578
25947
  "type": "integer",
@@ -26254,6 +26623,13 @@
26254
26623
  "location": "query",
26255
26624
  "required": true,
26256
26625
  "description": "Data no formato AAAA-MM-DD"
26626
+ },
26627
+ {
26628
+ "name": "duration_minutes",
26629
+ "type": "integer",
26630
+ "location": "query",
26631
+ "required": false,
26632
+ "description": "Duracao sob medida (5..1440; fora da faixa usa a do tipo). Os horarios MUDAM com a duracao — peca os slots com a MESMA duracao que vai gravar em tasks_create."
26257
26633
  }
26258
26634
  ],
26259
26635
  "returns": "{ date, timezone, slots: [...] }",
@@ -28217,7 +28593,7 @@
28217
28593
  "description": "Lista os formularios publicos de captacao da conta (estilo Typeform/Typebot), mais recentes primeiro. Cada item traz form_data (rascunho), settings, public_url e counts {views, responses, completed}. NAO traz media_urls (so no show). Leitura liberada a qualquer agente.",
28218
28594
  "category": "Formularios",
28219
28595
  "params": [],
28220
- "returns": "array de formularios (id, name, slug, display_mode, active, form_data, published_at, settings, public_url, counts)",
28596
+ "returns": "array de formulários, mais recentes primeiro, sem paginação nem filtro: [{id, name (nome INTERNO — o que o lead vê é settings.public_title), slug, display_mode, active, inbox_id, inbox: {id, name, channel_type}|null (caixa resolvida do rascunho), published_inbox_id (caixa que está NA FOTO publicada; null = nunca publicou), form_data, published_at, settings, public_url, counts: {views, responses, completed}, created_at, updated_at}]. NÃO traz media_urls (só no show).",
28221
28597
  "common_use_cases": [
28222
28598
  "Ver os formularios da conta e seus numeros",
28223
28599
  "Achar o id antes de editar/publicar",
@@ -28263,14 +28639,14 @@
28263
28639
  "type": "object",
28264
28640
  "location": "body",
28265
28641
  "required": false,
28266
- "description": "Desenho do formulario {nodes:[{id,type,position:{x,y},data}], edges:[{id,source,target,sourceHandle}]}. Tipos: start, question, choice, message, condition, action, send_message, booking, set_variable, embed, end, api_request, ai. Bloco action usa items:[{key,config}]; send_message usa messageItems; api_request aceita method (GET/POST/PUT/PATCH/DELETE) e body. Chave de data fora da lista permitida do tipo e DESCARTADA em silencio. Teto 2MB. Contrato completo, variaveis e exemplos: resource lionchat://docs/formularios-publicos. ATENCAO: substitui o desenho INTEIRO — leia com lead_forms_show antes de editar."
28642
+ "description": "Desenho do formulario {nodes:[{id,type,position:{x,y},data}], edges:[{id,source,target,sourceHandle}]}. Tipos: start, question, choice, message, condition, action, send_message, booking, set_variable, embed, end, api_request, ai. Bloco action usa items:[{key,config}]; send_message usa messageItems; api_request aceita method (GET/POST/PUT/PATCH/DELETE) e body. Chave de data fora da lista permitida do tipo é gravada mas o motor NÃO a lê, e o editor a remove no próximo salvamento pela tela — não dá erro. Teto 2MB. Contrato completo, variaveis e exemplos: resource lionchat://docs/formularios-publicos. ATENCAO: substitui o desenho INTEIRO — leia com lead_forms_show antes de editar."
28267
28643
  },
28268
28644
  {
28269
28645
  "name": "settings",
28270
28646
  "type": "object",
28271
28647
  "location": "body",
28272
28648
  "required": false,
28273
- "description": "Configuracao visual/comportamento: {primary_color: '#7C3AED', theme: 'light'|'dark', abandon_minutes: 1..15 (default 15), button_label: string|null, resume: bool (continuar de onde parou, default true), chat_avatar: id de blob ja subido (foto dos baloes no formato chat)}."
28649
+ "description": "Configuração visual/comportamento: {primary_color: '#7C3AED', theme: 'light'|'dark', abandon_minutes: 1..15 (default 15), button_label: string|null, resume: bool (continuar de onde parou, default true), chat_avatar: id de blob já subido (foto dos balões no formato chat), public_title: string (título que o LEAD vê na aba do navegador e no link — até 100 caracteres; vazio/ausente = usa o name, que é o nome INTERNO do painel)}. O objeto é gravado como vier (nenhuma chave é obrigatória)."
28274
28650
  },
28275
28651
  {
28276
28652
  "name": "inbox_id",
@@ -28287,7 +28663,7 @@
28287
28663
  "description": "Endereco do link publico. EDITAVEL (mudou 16/08): normalizado no servidor (acento vira letra, resto vira hifen), 3..60 chars, minusculas+numeros+hifen, unico na conta. Vazio = mantem o atual; duplicado = 422. Trocar derruba links ja divulgados."
28288
28664
  }
28289
28665
  ],
28290
- "returns": "formulario criado (201) com slug, public_url, inbox {id,name,channel_type}|null e published_inbox_id; 422 {errors} em validacao (inclusive errors.inbox_id)",
28666
+ "returns": "formulário criado (201) com id, slug, public_url, inbox_id, inbox {id,name,channel_type}|null, published_inbox_id (null), counts zerados, created_at/updated_at; 422 {errors} em validação (inclusive errors.inbox_id e errors.slug)",
28291
28667
  "common_use_cases": [
28292
28668
  "Criar formulario de captacao do zero via API",
28293
28669
  "Importar um desenho pronto (form_data completo)"
@@ -28316,7 +28692,7 @@
28316
28692
  "description": "ID do formulario"
28317
28693
  }
28318
28694
  ],
28319
- "returns": "formulario (objeto completo + media_urls + counts)",
28695
+ "returns": "objeto completo do formulário (mesmos campos do list: id, name, slug, display_mode, active, inbox_id, inbox, published_inbox_id, form_data, published_at, settings, public_url, counts, created_at, updated_at) + media_urls: {\"<blob_id>\": url} com TODAS as imagens do acervo do formulário (imagem de bloco, imagem de opção da Escolha e a foto do chat em settings.chat_avatar). published_data NUNCA sai.",
28320
28696
  "common_use_cases": [
28321
28697
  "Ler o form_data atual antes de editar (update substitui o desenho inteiro)",
28322
28698
  "Conferir estado publicado/ativo e o link publico"
@@ -28332,7 +28708,7 @@
28332
28708
  "method": "PATCH",
28333
28709
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}",
28334
28710
  "title": "Atualizar Formulario",
28335
- "description": "Edita um formulario. form_data SUBSTITUI o desenho inteiro (leia antes com lead_forms_show). Aceita trocar inbox_id (so por caixa do MESMO tipo de canal) e slug (editavel, normalizado; trocar derruba links ja divulgados). Mudancas no desenho/caixa so valem pra quem preenche depois de um novo publish. Admin-only.",
28711
+ "description": "Edita um formulário. form_data SUBSTITUI o desenho inteiro e settings SUBSTITUI o objeto inteiro (não há merge em nenhum dos dois): leia com lead_forms_show e mande o objeto completo de volta. ATENÇÃO — apagar referência de imagem custa o ARQUIVO: logo após salvar, toda imagem do acervo que não estiver mais no form_data, na foto publicada ou em settings.chat_avatar é apagada (só upload com menos de 1h escapa). Um settings sem chat_avatar apaga a foto do chat; um form_data sem o image de um bloco apaga a imagem daquele bloco. Aceita trocar inbox_id (só por caixa do MESMO tipo de canal) e slug (editável, normalizado; trocar derruba links já divulgados). Mudanças no desenho/caixa só valem pra quem preenche depois de um novo publish; active vale na hora. Admin-only.",
28336
28712
  "category": "Formularios",
28337
28713
  "params": [
28338
28714
  {
@@ -28368,14 +28744,14 @@
28368
28744
  "type": "object",
28369
28745
  "location": "body",
28370
28746
  "required": false,
28371
- "description": "Desenho do formulario {nodes:[{id,type,position:{x,y},data}], edges:[{id,source,target,sourceHandle}]}. Tipos: start, question, choice, message, condition, action, send_message, booking, set_variable, embed, end, api_request, ai. Bloco action usa items:[{key,config}]; send_message usa messageItems; api_request aceita method (GET/POST/PUT/PATCH/DELETE) e body. Chave de data fora da lista permitida do tipo e DESCARTADA em silencio. Teto 2MB. Contrato completo, variaveis e exemplos: resource lionchat://docs/formularios-publicos. ATENCAO: substitui o desenho INTEIRO — leia com lead_forms_show antes de editar."
28747
+ "description": "Desenho do formulario {nodes:[{id,type,position:{x,y},data}], edges:[{id,source,target,sourceHandle}]}. Tipos: start, question, choice, message, condition, action, send_message, booking, set_variable, embed, end, api_request, ai. Bloco action usa items:[{key,config}]; send_message usa messageItems; api_request aceita method (GET/POST/PUT/PATCH/DELETE) e body. Chave de data fora da lista permitida do tipo é gravada mas o motor NÃO a lê, e o editor a remove no próximo salvamento pela tela — não dá erro. Teto 2MB. Contrato completo, variaveis e exemplos: resource lionchat://docs/formularios-publicos. ATENCAO: substitui o desenho INTEIRO — leia com lead_forms_show antes de editar."
28372
28748
  },
28373
28749
  {
28374
28750
  "name": "settings",
28375
28751
  "type": "object",
28376
28752
  "location": "body",
28377
28753
  "required": false,
28378
- "description": "Configuracao visual/comportamento: {primary_color: '#7C3AED', theme: 'light'|'dark', abandon_minutes: 1..15 (default 15), button_label: string|null, resume: bool (continuar de onde parou, default true), chat_avatar: id de blob ja subido (foto dos baloes no formato chat)}."
28754
+ "description": "Configuração visual/comportamento: {primary_color: '#7C3AED', theme: 'light'|'dark', abandon_minutes: 1..15 (default 15), button_label: string|null, resume: bool (continuar de onde parou, default true), chat_avatar: id de blob já subido (foto dos balões no formato chat), public_title: string (título que o LEAD vê na aba do navegador e no link — até 100 caracteres; vazio/ausente = usa o name, que é o nome INTERNO do painel)}. O objeto é gravado como vier (nenhuma chave é obrigatória). SUBSTITUI o objeto inteiro — mande todas as chaves que quer manter."
28379
28755
  },
28380
28756
  {
28381
28757
  "name": "inbox_id",
@@ -28458,7 +28834,7 @@
28458
28834
  "method": "POST",
28459
28835
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}/duplicate",
28460
28836
  "title": "Duplicar Formulario",
28461
- "description": "Cria uma copia do formulario: nome + ' (copia)', slug novo, INATIVA e NAO publicada; as imagens dos blocos sao duplicadas (arquivos novos). Admin-only. A copia nasce inativa e nao publicada, com slug novo, imagens duplicadas de verdade e o MESMO inbox_id do original.",
28837
+ "description": "Cria uma cópia do formulário: nome + \" (cópia)\", slug novo sorteado, INATIVA e NÃO publicada, mesmo display_mode, mesmo inbox_id, mesmo settings (inclusive public_title; chat_avatar aponta pro arquivo novo) e as imagens dos blocos duplicadas de verdade (arquivos novos, ids reescritos no desenho — referência morta vira sem imagem). Admin-only.",
28462
28838
  "category": "Formularios",
28463
28839
  "params": [
28464
28840
  {
@@ -28483,7 +28859,7 @@
28483
28859
  "method": "GET",
28484
28860
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}/stats",
28485
28861
  "title": "Funil do Formulario",
28486
- "description": "Estatisticas agregadas: views, starts, completed, abandoned, completion_rate (%), funil bloco a bloco (reached + percent, so blocos visiveis, ordem do desenho publicado) e marcos (milestones).",
28862
+ "description": "Estatísticas agregadas na janela days: starts (respostas iniciadas), completed, abandoned, completion_rate (% inteiro = completed/starts), funil bloco a bloco (reached + percent, só blocos visíveis, na ordem da foto PUBLICADA) e milestones. ATENÇÃO: views é o contador de VIDA INTEIRA do formulário (não obedece days). Marcos: hoje só blocos de Ações no formato antigo (action_type: milestone) entram em milestones — marco configurado em items (formato atual do editor) não aparece aqui, só em responses_show. Acima de 50.000 respostas na janela o funil sai parcial.",
28487
28863
  "category": "Formularios",
28488
28864
  "params": [
28489
28865
  {
@@ -28501,7 +28877,7 @@
28501
28877
  "description": "Janela em dias (default 30, maximo 90)"
28502
28878
  }
28503
28879
  ],
28504
- "returns": "{views, starts, completed, abandoned, completion_rate, funnel: [{node_id, type, label, reached, percent}], milestones: [{node_id, name, reached}]}",
28880
+ "returns": "{views (total, sem janela), starts, completed, abandoned, completion_rate, funnel: [{node_id, type, label, reached, percent}], milestones: [{node_id, name, reached}]}",
28505
28881
  "common_use_cases": [
28506
28882
  "Onde os leads abandonam (funil por bloco)",
28507
28883
  "Taxa de conclusao do formulario",
@@ -28546,10 +28922,10 @@
28546
28922
  "type": "integer",
28547
28923
  "location": "query",
28548
28924
  "required": false,
28549
- "description": "Pagina (default 1)"
28925
+ "description": "Página (default 1, máximo 10.000)"
28550
28926
  }
28551
28927
  ],
28552
- "returns": "{payload: [{id, status, contact, current_node_label, answered_count, created_at, completed_at}], meta}. contact pode vir {id: null, name, phone, pending: true} = pessoa AINDA preenchendo (o contato so nasce ao concluir, no fechamento do abandono ou antes de um envio de WhatsApp). NUNCA traz as respostas em si.",
28928
+ "returns": "{payload: [{id, status, contact, current_node_label, answered_count, created_at, completed_at}], meta: {current_page, per_page: 25, total_count}}. contact pode vir {id: null, name, phone, pending: true} = pessoa AINDA preenchendo (o contato só nasce ao concluir, no fechamento do abandono ou antes de um envio de WhatsApp) ou null (nada digitado). answered_count conta chaves de answers, inclusive as sintéticas do bloco de Ações. NUNCA traz as respostas em si.",
28553
28929
  "common_use_cases": [
28554
28930
  "Ver quem respondeu/abandonou",
28555
28931
  "Achar o id de uma resposta pro detalhe"
@@ -28582,7 +28958,7 @@
28582
28958
  "description": "ID da resposta"
28583
28959
  }
28584
28960
  ],
28585
- "returns": "Resposta completa: answers [{label, value_label, at, download_url?}] (ATENCAO: o bloco de Acoes grava entradas sinteticas com chave '<node_id>::<n>' — nem toda chave e id de bloco), conversation {id, display_id}|null (a conversa aberta na caixa vinculada), milestones, effects [{node_id, label, state, error, status, url_short, at}] e utm_params",
28961
+ "returns": "{id, status, contact ({id, name, phone} | {id: null, name, phone, pending: true} | null), current_node_label, started_at, completed_at, abandoned_at, created_at, answers: [{label, value_label, at, download_url?}] ordenado por at, milestones: [{node_id, name, at}], effects: [{node_id, label, state: pending|done|error, error, status (HTTP), url_short, at}], conversation: {id, display_id}|null, utm_params}. ATENÇÃO em answers: (1) o bloco de Ações grava entradas sintéticas com chave \"<node_id>::<n>\" e o fim degradado grava \"_walk_ended\" — nem toda chave é id de bloco; (2) no bloco de Agendamento value_label é o ID da reserva, não a data (use lionchat_contacts_form_entries_show, que mostra a data); (3) envio de WhatsApp pulado por falta de telefone aparece como entrada vazia do bloco de mensagem. Motivos possíveis em effects.error: invalid_method, invalid_url, http_<código> (http_0 = falha de transporte sem código), timeout, ssrf_blocked, result_too_large, stale, effect_failed, effect_runs_exceeded, budget_exceeded, no_ai_key, ai_error.",
28586
28962
  "common_use_cases": [
28587
28963
  "Ler o que o lead respondeu",
28588
28964
  "Investigar por que a consulta externa/IA falhou (effects)",
@@ -28598,7 +28974,7 @@
28598
28974
  "method": "POST",
28599
28975
  "path": "/api/v1/accounts/{account_id}/lead_forms/{lead_form_id}/test_runs",
28600
28976
  "title": "Testar Formulario (simulador)",
28601
- "description": "Roda o RASCUNHO (form_data, nao a foto publicada) no motor de verdade e desfaz tudo no fim — nada fica no banco: sem contato, sem conversa, sem WhatsApp, sem pixel, sem resposta nos relatorios. NAO exige admin (qualquer agente da conta). O estado do teste vive em quem chama: cada chamada reproduz o caminho inteiro a partir da lista de respostas. Item cujo node_id nao e o bloco atual PARA a reproducao ali.",
28977
+ "description": "Roda o RASCUNHO (form_data, não a foto publicada) no motor de verdade e desfaz tudo no fim — nada fica no banco: sem contato, sem conversa, sem WhatsApp, sem pixel, sem resposta nos relatórios. NÃO exige admin. O estado do teste vive em quem chama: cada chamada reproduz o caminho inteiro a partir da lista de respostas. LIMITES DO SIMULADOR: (1) blocos de Consulta externa (api_request) e IA (ai) NÃO executam — ao chegar neles a resposta volta block {type: 'wait'} e a reprodução para ali (itens seguintes são ignorados); pra testar o que vem depois, teste pela página pública; (2) Agendamento: value '' segue por \"não agendou\" (se o bloco não for obrigatório); pra simular \"agendou\" só com o id de um agendamento JÁ existente da conta (o simulador não cria reserva); (3) Envio de arquivo obrigatório não tem como passar (422 invalid_value) — só com required: false e value ''. Item cujo node_id não é o bloco atual PARA a reprodução ali.",
28602
28978
  "category": "Formularios",
28603
28979
  "params": [
28604
28980
  {
@@ -28616,15 +28992,16 @@
28616
28992
  "description": "Respostas a reproduzir, na ordem: [{node_id, value}]. Ate 60 itens. Vazio/ausente = comeca do inicio (devolve o primeiro bloco). value null avanca bloco sem resposta (start/message/embed)."
28617
28993
  }
28618
28994
  ],
28619
- "returns": "{block, log, answers, variables, form}. block = envelope do bloco atual (mesmo shape da pagina publica); log = caminho percorrido [{node_id, type, label, answer, detail}] (detail mostra variavel criada, acoes executadas, resultado de consulta/IA e o rumo das condicoes); 422 {error: 'invalid_value'|'test_run_failed', reason}",
28995
+ "returns": "{block, log, answers, variables, form}. block = envelope do bloco atual (mesmo shape da página pública; type 'wait' = parou num bloco de consulta/IA, que o simulador não roda); log = caminho percorrido [{node_id, type, label, answer?, detail?}] (detail mostra variável criada, ações executadas e o rumo das condições; answer/detail só aparecem quando existem); variables = {{var.*}} criadas; form = {name (nome interno), display_mode, settings, account_name}; 422 {error: 'invalid_value'|'test_run_failed', reason} (reason de invalid_value = o código de validação: required, invalid_email, invalid_phone, invalid_cpf, invalid_option, value_too_long...)",
28620
28996
  "common_use_cases": [
28621
28997
  "Validar um formulario recem-montado antes de publicar",
28622
28998
  "Reproduzir o caminho de um lead pra depurar condicao/consulta/IA",
28623
28999
  "Conferir mensagens e variaveis sem enviar WhatsApp de verdade"
28624
29000
  ],
28625
29001
  "related_tools": [
28626
- "lionchat_lead_forms_show",
28627
- "lionchat_lead_forms_publish"
29002
+ "lionchat_contacts_form_entries_show",
29003
+ "lionchat_lead_forms_publish",
29004
+ "lionchat_lead_forms_show"
28628
29005
  ]
28629
29006
  },
28630
29007
  {
@@ -28651,5 +29028,2806 @@
28651
29028
  "related_tools": [
28652
29029
  "lionchat_lead_forms_update"
28653
29030
  ]
29031
+ },
29032
+ {
29033
+ "id": "lionchat_agents_replace",
29034
+ "method": "POST",
29035
+ "path": "/api/v1/accounts/{account_id}/agents/{id}/replace",
29036
+ "title": "Substituir Atendente (troca 1:1)",
29037
+ "description": "AÇÃO DE ESCRITA IRREVERSÍVEL — confirme com o usuário e reenvie com confirm:true. Cria um atendente NOVO (email/name/role), transfere pra ele a carteira inteira do atendente que SAI (conversas, cards do Kanban, times e caixas com o mesmo cargo Agente/Supervisor — inclusive os vínculos PENDENTES de um convite nunca confirmado) e enfileira a EXCLUSÃO do antigo. Funciona mesmo com a conta no limite de vagas: a criação não passa pelo validate_limit e a conta ganha uma concessão temporária de +1 até a troca terminar. A transferência roda em SEGUNDO PLANO (202): o antigo some da lista só quando o job termina; nesse meio tempo a lista de agentes mostra replacing/deleting. O novo nasce offline, com auto_offline ligado, SEM política de capacidade (assumiria a carteira inteira já acima do teto) e com o cargo personalizado copiado só se o papel for o mesmo. Recusas 422 com mensagem em português: substituir a si mesmo; agente de suporte; agente que está ENTRANDO numa substituição viva (A->B seguida de B->C é barrada); sem nome/e-mail; e-mail já é membro da conta; único administrador confirmado (convide o novo admin, espere confirmar e só então substitua); e-mail inválido. 409 agent_already_being_deleted quando já há exclusão/substituição em andamento (NÃO repita — aguarde). Somente administrador.",
29038
+ "category": "Agentes",
29039
+ "params": [
29040
+ {
29041
+ "name": "id",
29042
+ "type": "integer",
29043
+ "location": "path",
29044
+ "required": true,
29045
+ "description": "ID do atendente que SAI"
29046
+ },
29047
+ {
29048
+ "name": "email",
29049
+ "type": "string",
29050
+ "location": "body",
29051
+ "required": true,
29052
+ "description": "E-mail do atendente NOVO (não pode ser membro da conta)"
29053
+ },
29054
+ {
29055
+ "name": "name",
29056
+ "type": "string",
29057
+ "location": "body",
29058
+ "required": true,
29059
+ "description": "Nome do atendente novo"
29060
+ },
29061
+ {
29062
+ "name": "role",
29063
+ "type": "string",
29064
+ "location": "body",
29065
+ "required": false,
29066
+ "description": "agent ou administrator. Ausente = mesmo papel do atendente que sai"
29067
+ },
29068
+ {
29069
+ "name": "inherit_memberships",
29070
+ "type": "boolean",
29071
+ "location": "body",
29072
+ "required": false,
29073
+ "description": "Padrão true: o novo herda times e caixas (com o cargo) do antigo. false = nasce sem vínculos"
29074
+ }
29075
+ ],
29076
+ "returns": "202 {message:'Substituição iniciada', status:'transfer_running' | 'transfer_not_started' (enfileirar falhou — a tela oferece Concluir/Desfazer), new_agent:{id,name,email}} | 409 {error:'agent_already_being_deleted'} | 422 {error: texto da recusa}",
29077
+ "common_use_cases": [
29078
+ "Trocar um atendente que saiu da empresa pelo substituto sem perder a carteira",
29079
+ "Substituir com a conta no limite de vagas, sem comprar licença",
29080
+ "Conferir antes com lionchat_agents_assigned_resources o que será transferido"
29081
+ ],
29082
+ "related_tools": [
29083
+ "lionchat_agents_assigned_resources",
29084
+ "lionchat_agents_destroy",
29085
+ "lionchat_agents_create",
29086
+ "lionchat_agents_list"
29087
+ ],
29088
+ "confirm_required": true
29089
+ },
29090
+ {
29091
+ "id": "lionchat_contacts_form_entries_list",
29092
+ "method": "GET",
29093
+ "path": "/api/v1/accounts/{account_id}/contacts/{contact_id}/form_entries",
29094
+ "title": "Preenchimentos do Contato",
29095
+ "description": "Aba 'Preenchimentos' da ficha: tudo que ESTA pessoa preencheu ou que entrou por ela, das 4 origens numa lista só, mais recente primeiro — source 'lead_form' (formulário público da conta; status da resposta e a conversa aberta), 'meta_lead' (lead de formulário do Meta), 'custom_webhook' (Webhook Universal criado pelo cliente) e 'flow' (webhook que o FlowBuilder criou pro gatilho de um fluxo, mostrado com o NOME do fluxo). Só entram eventos PROCESSADOS (pendente/falhado/ignorado não gravou nada no contato). Sem paginação, de propósito: a lista vem inteira com teto de 250 por origem; truncated=true avisa que passou do teto (nunca corta calado). NÃO traz o conteúdo cru — só contagem de campos (count); use a ferramenta de detalhe. Qualquer agente da conta (é a ficha do contato).",
29096
+ "category": "Contatos",
29097
+ "params": [
29098
+ {
29099
+ "name": "contact_id",
29100
+ "type": "integer",
29101
+ "location": "path",
29102
+ "required": true,
29103
+ "description": "ID do contato"
29104
+ }
29105
+ ],
29106
+ "returns": "{payload: [{source: 'lead_form'|'meta_lead'|'custom_webhook'|'flow', id, title (nome do formulário/fluxo/integração), status ('received' nas origens de fora; status da resposta no formulário), at (ISO), count (nº de campos gravados), conversation: {id, display_id} | null}], meta: {total, truncated}}",
29107
+ "common_use_cases": [
29108
+ "Responder 'de onde veio este lead e o que ele preencheu?'",
29109
+ "Achar a resposta do formulário pra abrir com lionchat_contacts_form_entries_show",
29110
+ "Auditar se o webhook/fluxo gravou algo na ficha"
29111
+ ],
29112
+ "related_tools": [
29113
+ "lionchat_contacts_form_entries_show",
29114
+ "lionchat_contacts_show",
29115
+ "lionchat_lead_forms_responses_list",
29116
+ "lionchat_meta_lead_list_1"
29117
+ ]
29118
+ },
29119
+ {
29120
+ "id": "lionchat_contacts_form_entries_show",
29121
+ "method": "GET",
29122
+ "path": "/api/v1/accounts/{account_id}/contacts/{contact_id}/form_entries/{source}/{id}",
29123
+ "title": "Detalhe de um Preenchimento do Contato",
29124
+ "description": "Abre UM preenchimento da aba Preenchimentos. Para source='lead_form' devolve as RESPOSTAS pergunta a pergunta (label = título da pergunta no desenho publicado, value = texto legível, at, arquivo/imagens quando houver), o que aquele preenchimento GRAVOU na ficha (written) e os UTMs. Para 'meta_lead', 'custom_webhook' e 'flow' devolve só os campos que foram vinculados a atributos e realmente gravados (fields [{label, value}]) — por decisão do dono a aba nunca mostra o conteúdo cru da origem. O par source+id tem que bater com o contato da URL (404 se não for dele ou se a origem for desconhecida).",
29125
+ "category": "Contatos",
29126
+ "params": [
29127
+ {
29128
+ "name": "contact_id",
29129
+ "type": "integer",
29130
+ "location": "path",
29131
+ "required": true,
29132
+ "description": "ID do contato"
29133
+ },
29134
+ {
29135
+ "name": "source",
29136
+ "type": "string",
29137
+ "location": "path",
29138
+ "required": true,
29139
+ "description": "Origem: lead_form | meta_lead | custom_webhook | flow (lista fechada)"
29140
+ },
29141
+ {
29142
+ "name": "id",
29143
+ "type": "integer",
29144
+ "location": "path",
29145
+ "required": true,
29146
+ "description": "ID do registro naquela origem (vem de lionchat_contacts_form_entries_list)"
29147
+ }
29148
+ ],
29149
+ "returns": "lead_form: {fields: [], answers: [{label, value, at, file?, images?}], written: [...], utm: {}} | outras origens: {fields: [{label, value}], answers: [], written: [], utm: {}} | 404 {error:'not found'}",
29150
+ "common_use_cases": [
29151
+ "Ler o que o lead respondeu no formulário antes de atender",
29152
+ "Conferir quais campos o webhook gravou na ficha"
29153
+ ],
29154
+ "related_tools": [
29155
+ "lionchat_contacts_form_entries_list",
29156
+ "lionchat_lead_forms_responses_show"
29157
+ ]
29158
+ },
29159
+ {
29160
+ "id": "lionchat_captain_assistants_quality",
29161
+ "method": "GET",
29162
+ "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}/quality",
29163
+ "title": "Revisar como a IA foi montada (Arquiteto de IA)",
29164
+ "description": "SÓ LEITURA, ZERO chamada de IA (contagem, listas e regex — custo zero). Revisa a CONSTRUÇÃO do AI Agente (instruções, cenários, conhecimento, ferramentas) e devolve achados como SUGESTÃO de boa prática, sem gravidade — cada um com o trecho (excerpt) pra quem julga ser o humano. Códigos: unknown_variable (variável {{...}} que o motor não preenche, com reason), manual_scheduling (texto manda a IA calcular horários por conta própria em vez de consultar a agenda), unknown_tool (ferramenta citada que não existe), long_instructions_no_scenarios (instruções acima de 2.500 caracteres sem cenário), balloon_separator, no_knowledge, no_guardrails. Cada achado traz fix = o que o botão Aplicar faria: kind 'swap_variable' | 'strip_separators' | 'create_custom_attribute' (mecânicos, vão por quality_apply), 'rewrite' (proposta por IA, vai por quality_rewrite) ou 'navigate' (só aponta a tela). Também devolve revisions (últimas 20 correções ainda desfazíveis). Admin ou gestor de IA.",
29165
+ "category": "Assistentes",
29166
+ "params": [
29167
+ {
29168
+ "name": "id",
29169
+ "type": "integer",
29170
+ "location": "path",
29171
+ "required": true,
29172
+ "description": "ID do assistente"
29173
+ }
29174
+ ],
29175
+ "returns": "{summary: {instructions_length, scenarios_count, ...}, findings: [{code, where: 'instructions'|'scenario'|'assistant', label, target ('instructions' | 'scenario:<id>' | 'assistant'), evidence: [], excerpt, reason?, anchor?, fix: {kind, ...}}], revisions: [{id, code, target, created_at}]}",
29176
+ "common_use_cases": [
29177
+ "Diagnosticar por que a IA inventa horários ou ignora uma variável",
29178
+ "Revisar um assistente recém-montado antes de ligar",
29179
+ "Listar o que dá pra consertar com um clique"
29180
+ ],
29181
+ "related_tools": [
29182
+ "lionchat_captain_assistants_quality_apply",
29183
+ "lionchat_captain_assistants_quality_rewrite",
29184
+ "lionchat_captain_assistants_quality_undo",
29185
+ "lionchat_captain_assistants_show"
29186
+ ]
29187
+ },
29188
+ {
29189
+ "id": "lionchat_captain_assistants_quality_apply",
29190
+ "method": "POST",
29191
+ "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}/quality_apply",
29192
+ "title": "Aplicar conserto mecânico da revisão da IA",
29193
+ "description": "AÇÃO DE ESCRITA. Aplica UM conserto MECÂNICO apontado por lionchat_captain_assistants_quality — só fix.kind 'swap_variable', 'strip_separators' ou 'create_custom_attribute'; os demais respondem 422 not_applicable. O corpo manda o ENDEREÇO do achado (code + target + evidence), nunca texto: o serviço reexecuta a revisão e aplica o conserto que o próprio sistema calculou — assim só dá pra aplicar o que foi realmente proposto. Grava uma revisão desfazível (quality_undo). 422: finding_gone (o achado não existe mais — texto mudou), not_applicable, unexpected. Devolve a revisão completa já recalculada.",
29194
+ "category": "Assistentes",
29195
+ "params": [
29196
+ {
29197
+ "name": "id",
29198
+ "type": "integer",
29199
+ "location": "path",
29200
+ "required": true,
29201
+ "description": "ID do assistente"
29202
+ },
29203
+ {
29204
+ "name": "code",
29205
+ "type": "string",
29206
+ "location": "body",
29207
+ "required": true,
29208
+ "description": "Código do achado (ex.: unknown_variable, balloon_separator)"
29209
+ },
29210
+ {
29211
+ "name": "target",
29212
+ "type": "string",
29213
+ "location": "body",
29214
+ "required": true,
29215
+ "description": "Alvo do achado: 'instructions', 'scenario:<id>' ou 'assistant' (campo target do achado)"
29216
+ },
29217
+ {
29218
+ "name": "evidence",
29219
+ "type": "array",
29220
+ "location": "body",
29221
+ "required": false,
29222
+ "description": "Evidence do achado (ex.: a variável desconhecida) — obrigatório quando o achado tem evidence, pra localizar o item certo"
29223
+ }
29224
+ ],
29225
+ "returns": "200 = mesma resposta de lionchat_captain_assistants_quality (summary, findings, revisions) já recalculada | 422 {error: 'finding_gone'|'not_applicable'|'unexpected'}",
29226
+ "common_use_cases": [
29227
+ "Trocar uma variável inexistente pela certa nas instruções",
29228
+ "Criar o atributo personalizado que a instrução cita"
29229
+ ],
29230
+ "related_tools": [
29231
+ "lionchat_captain_assistants_quality",
29232
+ "lionchat_captain_assistants_quality_undo"
29233
+ ]
29234
+ },
29235
+ {
29236
+ "id": "lionchat_captain_assistants_quality_rewrite",
29237
+ "method": "POST",
29238
+ "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}/quality_rewrite",
29239
+ "title": "Propor reescrita com IA (revisão da IA)",
29240
+ "description": "CHAMA A IA DA CONTA (custo de tokens), mas NÃO GRAVA NADA: devolve o antes/depois pra pessoa aprovar e um token de 1 hora que só lionchat_captain_assistants_quality_apply_proposal aceita. Só pra achados com fix.kind 'rewrite': code 'manual_scheduling' (reescreve a FRASE apontada por anchor pra consultar a agenda em vez de calcular) e 'long_instructions_no_scenarios' (quebra as instruções longas em cenários). 422: empty (a IA não devolveu proposta), llm (falha do provedor), no_key (conta sem chave de IA), unexpected.",
29241
+ "category": "Assistentes",
29242
+ "params": [
29243
+ {
29244
+ "name": "id",
29245
+ "type": "integer",
29246
+ "location": "path",
29247
+ "required": true,
29248
+ "description": "ID do assistente"
29249
+ },
29250
+ {
29251
+ "name": "code",
29252
+ "type": "string",
29253
+ "location": "body",
29254
+ "required": true,
29255
+ "description": "manual_scheduling ou long_instructions_no_scenarios"
29256
+ },
29257
+ {
29258
+ "name": "target",
29259
+ "type": "string",
29260
+ "location": "body",
29261
+ "required": true,
29262
+ "description": "Alvo do achado ('instructions' ou 'scenario:<id>')"
29263
+ },
29264
+ {
29265
+ "name": "anchor",
29266
+ "type": "string",
29267
+ "location": "body",
29268
+ "required": false,
29269
+ "description": "Trecho âncora da frase (campo anchor do achado) — obrigatório em manual_scheduling"
29270
+ }
29271
+ ],
29272
+ "returns": "200 {token, proposal: {antes/depois da reescrita}} | 422 {error: 'empty'|'llm'|'no_key'|'unexpected'}",
29273
+ "common_use_cases": [
29274
+ "Ver como a IA reescreveria a instrução que manda inventar horário",
29275
+ "Dividir instruções gigantes em cenários, com aprovação humana"
29276
+ ],
29277
+ "related_tools": [
29278
+ "lionchat_captain_assistants_quality",
29279
+ "lionchat_captain_assistants_quality_apply_proposal"
29280
+ ]
29281
+ },
29282
+ {
29283
+ "id": "lionchat_captain_assistants_quality_apply_proposal",
29284
+ "method": "POST",
29285
+ "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}/quality_apply_proposal",
29286
+ "title": "Aplicar proposta de reescrita (revisão da IA)",
29287
+ "description": "AÇÃO DE ESCRITA — confirme com o usuário mostrando o antes/depois devolvido por quality_rewrite. Grava a proposta identificada pelo token (válido por 1 hora, de uso único). Recusa 422 changed_since se o texto do assistente mudou desde que a proposta foi gerada (gere de novo) e proposal_gone se o token expirou. Cria revisão desfazível.",
29288
+ "category": "Assistentes",
29289
+ "params": [
29290
+ {
29291
+ "name": "id",
29292
+ "type": "integer",
29293
+ "location": "path",
29294
+ "required": true,
29295
+ "description": "ID do assistente"
29296
+ },
29297
+ {
29298
+ "name": "token",
29299
+ "type": "string",
29300
+ "location": "body",
29301
+ "required": true,
29302
+ "description": "Token devolvido por lionchat_captain_assistants_quality_rewrite"
29303
+ }
29304
+ ],
29305
+ "returns": "200 = revisão recalculada (summary, findings, revisions) | 422 {error: 'proposal_gone'|'changed_since'|'no_change'|'unexpected'}",
29306
+ "common_use_cases": [
29307
+ "Aprovar a reescrita proposta pela IA"
29308
+ ],
29309
+ "related_tools": [
29310
+ "lionchat_captain_assistants_quality_rewrite",
29311
+ "lionchat_captain_assistants_quality_undo"
29312
+ ],
29313
+ "confirm_required": true
29314
+ },
29315
+ {
29316
+ "id": "lionchat_captain_assistants_quality_undo",
29317
+ "method": "POST",
29318
+ "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}/quality_undo",
29319
+ "title": "Desfazer correção da revisão da IA",
29320
+ "description": "AÇÃO DE ESCRITA. Desfaz UMA correção aplicada pela revisão (quality_apply ou apply_proposal), devolvendo o texto anterior. Só funciona se o texto ainda for exatamente o que a correção deixou: 422 changed_since se alguém editou depois, already_undone se já foi desfeita, wrong_assistant se a revisão é de outro assistente. 404 se revision_id não existir ou não for mais desfazível. As revisões desfazíveis vêm em revisions[] de lionchat_captain_assistants_quality.",
29321
+ "category": "Assistentes",
29322
+ "params": [
29323
+ {
29324
+ "name": "id",
29325
+ "type": "integer",
29326
+ "location": "path",
29327
+ "required": true,
29328
+ "description": "ID do assistente"
29329
+ },
29330
+ {
29331
+ "name": "revision_id",
29332
+ "type": "integer",
29333
+ "location": "body",
29334
+ "required": true,
29335
+ "description": "ID da revisão (revisions[].id da revisão de qualidade)"
29336
+ }
29337
+ ],
29338
+ "returns": "200 = revisão recalculada | 404 {error:'not_found'} | 422 {error: 'changed_since'|'already_undone'|'wrong_assistant'|'unexpected'}",
29339
+ "common_use_cases": [
29340
+ "Voltar atrás numa correção aplicada por engano"
29341
+ ],
29342
+ "related_tools": [
29343
+ "lionchat_captain_assistants_quality",
29344
+ "lionchat_captain_assistants_quality_apply"
29345
+ ]
29346
+ },
29347
+ {
29348
+ "id": "lionchat_captain_supervisor_show",
29349
+ "method": "GET",
29350
+ "path": "/api/v1/accounts/{account_id}/captain/supervisor",
29351
+ "title": "Supervisor de IA (placar comparativo, teste A/B)",
29352
+ "description": "SÓ LEITURA, zero chamada de IA. Placar que compara TODAS as IAs da conta num período: conversas atendidas, resolvidas/abertas/pendentes, quantas o humano assumiu (human_takeover_rate), engajamento (cliente respondeu), mensagens enviadas, follow-ups, agendamentos feitos, mensagens agendadas, etiquetas aplicadas, distribuição por caixa, CSAT, cards ganhos e a CONVERSÃO pela régua escolhida. A régua é 'de cada X, quantas viraram Y': base conversations|engaged|booked|resolved (unidade conversa) ou cards (unidade card) e resultado compatível — conversations: engaged|booked|won_card|label|flow|resolved; engaged: booked|won_card|label|flow|resolved; booked: won_card|label|flow|resolved; resolved: booked|won_card|label|flow; cards: won|lost. label e flow exigem target (título da etiqueta / id do fluxo). Combinação inválida cai no padrão (conversations -> won_card) SEM erro. Os números de cada IA não dependem da seleção; os AVISOS sim: low_volume (menos de 30 conversas num braço — diferença é sorte) e inbox_imbalance (uma IA tirando 30 pontos a mais de uma caixa que a outra — públicos diferentes). Taxas vêm nulas (não zero) quando não há conversa. Admin ou gestor de IA.",
29353
+ "category": "Assistentes",
29354
+ "params": [
29355
+ {
29356
+ "name": "days",
29357
+ "type": "integer",
29358
+ "location": "query",
29359
+ "required": false,
29360
+ "description": "Janela em dias a partir de hoje: 1 a 180 (padrão 30)"
29361
+ },
29362
+ {
29363
+ "name": "assistant_ids",
29364
+ "type": "array",
29365
+ "location": "query",
29366
+ "required": false,
29367
+ "description": "IDs das IAs em comparação (só muda os avisos; os números voltam de todas)",
29368
+ "query_name": "assistant_ids[]"
29369
+ },
29370
+ {
29371
+ "name": "conversion_base",
29372
+ "type": "string",
29373
+ "location": "query",
29374
+ "required": false,
29375
+ "description": "Base da régua: conversations (padrão) | engaged | booked | resolved | cards",
29376
+ "query_name": "conversion[base]"
29377
+ },
29378
+ {
29379
+ "name": "conversion_result",
29380
+ "type": "string",
29381
+ "location": "query",
29382
+ "required": false,
29383
+ "description": "Resultado da régua (tem que caber na base; padrão won_card)",
29384
+ "query_name": "conversion[result]"
29385
+ },
29386
+ {
29387
+ "name": "conversion_target",
29388
+ "type": "string",
29389
+ "location": "query",
29390
+ "required": false,
29391
+ "description": "Obrigatório quando result = label (título da etiqueta) ou flow (id do fluxo)",
29392
+ "query_name": "conversion[target]"
29393
+ }
29394
+ ],
29395
+ "returns": "{period: {days, from, to}, assistants: [{id, name, conversations, resolved, open, pending, handling_now, human_took_over, failed_messages, went_silent, promised_not_done, engaged, messages_sent, follow_ups, bookings_made, scheduled_messages, labels, inboxes, csat..., conversion: {base, result, target, base_total, hits, rate}, conversion_rate, human_takeover_rate, engagement_rate, resolution_rate, messages_per_conversation}], warnings: [{code: 'low_volume'|'inbox_imbalance', ...}]}",
29396
+ "common_use_cases": [
29397
+ "Decidir qual prompt de IA converte mais num teste A/B",
29398
+ "Medir quanto a IA está sendo assumida por humanos",
29399
+ "Responder 'a IA está agendando?' com número"
29400
+ ],
29401
+ "related_tools": [
29402
+ "lionchat_captain_assistants_list",
29403
+ "lionchat_captain_assistants_show",
29404
+ "lionchat_reports_summary"
29405
+ ]
29406
+ },
29407
+ {
29408
+ "id": "lionchat_inboxes_whatsapp_templates_media_library",
29409
+ "method": "GET",
29410
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/media_library",
29411
+ "title": "Biblioteca de Mídia dos Modelos (caixa oficial)",
29412
+ "description": "SÓ LEITURA. Lista os arquivos de mídia de modelo JÁ anexados nesta caixa WhatsApp Cloud (tudo que já subiu por upload_media/upload_header_media), pra reaproveitar como mídia padrão de cabeçalho sem subir de novo — o MCP não faz upload de arquivo, então esta é a ÚNICA forma de obter uma url NOSSA aceita por lionchat_inboxes_whatsapp_templates_header_media. Até 60 itens, mais novos primeiro, sem repetir o mesmo arquivo (dedup por checksum). kind filtra ANTES do teto.",
29413
+ "category": "Templates WhatsApp",
29414
+ "params": [
29415
+ {
29416
+ "name": "inbox_id",
29417
+ "type": "integer",
29418
+ "location": "path",
29419
+ "required": true,
29420
+ "description": "ID da caixa WhatsApp Cloud"
29421
+ },
29422
+ {
29423
+ "name": "kind",
29424
+ "type": "string",
29425
+ "location": "query",
29426
+ "required": false,
29427
+ "description": "image | video | document — filtra por tipo de cabeçalho"
29428
+ }
29429
+ ],
29430
+ "returns": "{data: [{url (pública, do nosso armazenamento), filename, type: 'image'|'video'|'document', content_type, byte_size, created_at}]}",
29431
+ "common_use_cases": [
29432
+ "Escolher um arquivo já existente como mídia padrão de um modelo",
29433
+ "Conferir quais mídias a caixa já tem antes de pedir upload pelo painel"
29434
+ ],
29435
+ "related_tools": [
29436
+ "lionchat_inboxes_whatsapp_templates_header_media",
29437
+ "lionchat_inboxes_whatsapp_templates_list"
29438
+ ]
29439
+ },
29440
+ {
29441
+ "id": "lionchat_inboxes_whatsapp_templates_header_media",
29442
+ "method": "PATCH",
29443
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/{id}/header_media",
29444
+ "title": "Definir Mídia Padrão do Cabeçalho do Modelo",
29445
+ "description": "AÇÃO DE ESCRITA LOCAL — ZERO chamada à Meta (o cabeçalho de mídia é uma VAGA do modelo aprovado; o arquivo vai como parâmetro em cada envio, então o status 'Aprovado' fica intacto). Define, troca ou REMOVE a mídia padrão do cabeçalho: mande header_media com url (obrigatória; http/https até 2000 caracteres); corpo sem header_media = remover. Se a url for do NOSSO armazenamento, o arquivo PRECISA ser desta caixa (lista de lionchat_inboxes_whatsapp_templates_media_library) e o tipo/nome saem do próprio arquivo — declarar type errado não engana; link de FORA vale o type declarado (e pode sair do ar: a resposta marca own=false). SOMENTE caixa WhatsApp Cloud e SOMENTE administrador. 422: modelo sem cabeçalho de mídia; tipo diferente do que o modelo espera ('Este modelo espera foto/vídeo/documento'); endereço inválido/longo; arquivo de outra conta ou fora da biblioteca. 404: modelo não é desta caixa.",
29446
+ "category": "Templates WhatsApp",
29447
+ "params": [
29448
+ {
29449
+ "name": "inbox_id",
29450
+ "type": "integer",
29451
+ "location": "path",
29452
+ "required": true,
29453
+ "description": "ID da caixa WhatsApp Cloud"
29454
+ },
29455
+ {
29456
+ "name": "id",
29457
+ "type": "string",
29458
+ "location": "path",
29459
+ "required": true,
29460
+ "description": "ID do modelo (id da Meta, como vem em lionchat_inboxes_whatsapp_templates_list)"
29461
+ },
29462
+ {
29463
+ "name": "header_media",
29464
+ "type": "object",
29465
+ "location": "body",
29466
+ "required": false,
29467
+ "description": "{url, type: 'image'|'video'|'document', filename?}. Ausente = remover a mídia padrão"
29468
+ }
29469
+ ],
29470
+ "returns": "200 {success: true, data: modelo atualizado (variable_mapping._header_media = {url, type, filename, own})} | 404 {error} | 422 {error}",
29471
+ "common_use_cases": [
29472
+ "Deixar o folheto/foto fixo no modelo pra campanhas e fluxos não precisarem informar a mídia",
29473
+ "Remover a mídia padrão que saiu do ar"
29474
+ ],
29475
+ "related_tools": [
29476
+ "lionchat_inboxes_whatsapp_templates_media_library",
29477
+ "lionchat_inboxes_whatsapp_templates_update",
29478
+ "lionchat_inboxes_whatsapp_templates_list"
29479
+ ]
29480
+ },
29481
+ {
29482
+ "id": "lionchat_campaigns_dispatch_days",
29483
+ "method": "GET",
29484
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/dispatch_days",
29485
+ "title": "Agenda de Disparo da Campanha (dia por dia)",
29486
+ "description": "SÓ LEITURA. A agenda de uma campanha de FLUXO ou de WhatsApp QR Code quebrada POR DIA, no fuso da conta: para cada dia, quantas pessoas estavam planejadas, quantas já dispararam (fired), pendentes, puladas (skipped, com os motivos), canceladas, falhadas, a janela de horário (window from/to) e as MENSAGENS que saíram naquele dia (sent/delivered/read/failed). Duas contas diferentes, nunca somadas: disparos = pessoas que o fluxo começou; mensagens = o que saiu (fluxo com espera cria mensagem DIAS depois). Traz também daily_cap (teto por dia), ends_at (previsão de término) e schedule_log (histórico das edições da agenda, inclusive o freio automático da Meta). Campanha terminada devolve a foto congelada. 422 'This campaign has no schedule' para campanha de mensagem comum/site (sem agenda).",
29487
+ "category": "Campanhas",
29488
+ "params": [
29489
+ {
29490
+ "name": "id",
29491
+ "type": "integer",
29492
+ "location": "path",
29493
+ "required": true,
29494
+ "description": "ID da campanha (de fluxo ou QR Code)"
29495
+ }
29496
+ ],
29497
+ "returns": "{timezone, daily_cap, ends_at, schedule_log: [...], days: [{date 'YYYY-MM-DD', planned, fired, pending, skipped, cancelled, failed, window: {from 'HH:MM', to}, skips: [{reason, count}], messages: {sent, delivered, read, failed}}], totals: {fired, pending, skipped, cancelled, failed, planned, days}} | 422 {error}",
29498
+ "common_use_cases": [
29499
+ "Responder 'quando a campanha termina?' e 'quantos saíram hoje?'",
29500
+ "Ver em que dia houve pulos e por quê",
29501
+ "Escolher a data antes de mover/pular um dia"
29502
+ ],
29503
+ "related_tools": [
29504
+ "lionchat_campaigns_dispatch_day_entries",
29505
+ "lionchat_campaigns_skip_dispatch_day",
29506
+ "lionchat_campaigns_move_dispatch_day",
29507
+ "lionchat_campaigns_reprogram_dispatch",
29508
+ "lionchat_campaigns_flow_report",
29509
+ "lionchat_campaigns_statistics"
29510
+ ]
29511
+ },
29512
+ {
29513
+ "id": "lionchat_campaigns_dispatch_day_entries",
29514
+ "method": "GET",
29515
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/dispatch_day_entries",
29516
+ "title": "Pessoas de um Dia da Agenda da Campanha",
29517
+ "description": "SÓ LEITURA. QUEM sai num dia da agenda (campanha de fluxo ou QR Code): contato, telefone, minuto (no fuso da conta), status e o motivo quando foi pulado/falhou. Devolve no máximo 100 linhas ordenadas pela hora; total diz quantas existem de verdade ('mostrando 100 de 250'). É aqui que se descobre o firing_id (entries[].id) usado por lionchat_campaigns_remove_dispatch_entry. 422 'data invalida' ou campanha sem agenda.",
29518
+ "category": "Campanhas",
29519
+ "params": [
29520
+ {
29521
+ "name": "id",
29522
+ "type": "integer",
29523
+ "location": "path",
29524
+ "required": true,
29525
+ "description": "ID da campanha"
29526
+ },
29527
+ {
29528
+ "name": "date",
29529
+ "type": "string",
29530
+ "location": "query",
29531
+ "required": true,
29532
+ "description": "Dia no formato YYYY-MM-DD (fuso da conta)"
29533
+ }
29534
+ ],
29535
+ "returns": "{date, total, shown, limit: 100, entries: [{id (firing_id), contact_id, name, phone, at 'HH:MM', status: 'pending'|'fired'|'skipped'|'cancelled'|'failed', reason}]} | 422 {error}",
29536
+ "common_use_cases": [
29537
+ "Ver quem ainda vai receber hoje",
29538
+ "Achar a pessoa certa pra tirar da fila",
29539
+ "Explicar por que alguém foi pulado"
29540
+ ],
29541
+ "related_tools": [
29542
+ "lionchat_campaigns_dispatch_days",
29543
+ "lionchat_campaigns_remove_dispatch_entry"
29544
+ ]
29545
+ },
29546
+ {
29547
+ "id": "lionchat_campaigns_skip_dispatch_day",
29548
+ "method": "POST",
29549
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/skip_dispatch_day",
29550
+ "title": "Pular um Dia da Agenda da Campanha",
29551
+ "description": "AÇÃO DE ESCRITA. PULAR o dia: as pessoas pendentes daquele dia NÃO ficam de fora — vão pro FIM da fila, preenchendo os dias seguintes até o teto diário e criando dias novos pro que não couber (pular ATRASA a campanha, não reduz o alcance; ninguém é cancelado). Nunca toca em quem já foi disparado e nunca estoura o teto por dia. Registra no schedule_log. 422: 'data invalida', 'esse dia nao tem ninguem na fila', campanha sem agenda.",
29552
+ "category": "Campanhas",
29553
+ "params": [
29554
+ {
29555
+ "name": "id",
29556
+ "type": "integer",
29557
+ "location": "path",
29558
+ "required": true,
29559
+ "description": "ID da campanha"
29560
+ },
29561
+ {
29562
+ "name": "date",
29563
+ "type": "string",
29564
+ "location": "body",
29565
+ "required": true,
29566
+ "description": "Dia a pular, YYYY-MM-DD (fuso da conta)"
29567
+ }
29568
+ ],
29569
+ "returns": "200 {moved (pessoas realocadas), ends_at, days_used, days: agenda atualizada (mesmo formato de dispatch_days)} | 422 {error}",
29570
+ "common_use_cases": [
29571
+ "Não disparar no feriado/domingo sem perder ninguém"
29572
+ ],
29573
+ "related_tools": [
29574
+ "lionchat_campaigns_dispatch_days",
29575
+ "lionchat_campaigns_shift_dispatch_from",
29576
+ "lionchat_campaigns_move_dispatch_day"
29577
+ ]
29578
+ },
29579
+ {
29580
+ "id": "lionchat_campaigns_move_dispatch_day",
29581
+ "method": "POST",
29582
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/move_dispatch_day",
29583
+ "title": "Mover um Dia da Agenda da Campanha",
29584
+ "description": "AÇÃO DE ESCRITA. Move as pessoas PENDENTES de um dia inteiro pra outro dia, mantendo o espaçamento entre elas (mesmo delta). RECUSA 422 quando o dia de destino não cabe no teto diário — a mensagem diz quanto já tem e qual o limite; nesse caso use lionchat_campaigns_shift_dispatch_from (cascata). Também 422 para data inválida, destino no passado, destino igual à origem ou dia sem ninguém na fila. Quem já disparou nunca é tocado.",
29585
+ "category": "Campanhas",
29586
+ "params": [
29587
+ {
29588
+ "name": "id",
29589
+ "type": "integer",
29590
+ "location": "path",
29591
+ "required": true,
29592
+ "description": "ID da campanha"
29593
+ },
29594
+ {
29595
+ "name": "date",
29596
+ "type": "string",
29597
+ "location": "body",
29598
+ "required": true,
29599
+ "description": "Dia de origem, YYYY-MM-DD"
29600
+ },
29601
+ {
29602
+ "name": "new_date",
29603
+ "type": "string",
29604
+ "location": "body",
29605
+ "required": true,
29606
+ "description": "Dia de destino, YYYY-MM-DD (não pode ser no passado)"
29607
+ }
29608
+ ],
29609
+ "returns": "200 {moved, ends_at, days: agenda atualizada} | 422 {error}",
29610
+ "common_use_cases": [
29611
+ "Adiar o disparo de um dia específico pra outra data"
29612
+ ],
29613
+ "related_tools": [
29614
+ "lionchat_campaigns_dispatch_days",
29615
+ "lionchat_campaigns_shift_dispatch_from"
29616
+ ]
29617
+ },
29618
+ {
29619
+ "id": "lionchat_campaigns_shift_dispatch_from",
29620
+ "method": "POST",
29621
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/shift_dispatch_from",
29622
+ "title": "Empurrar a Agenda da Campanha dali pra frente (cascata)",
29623
+ "description": "AÇÃO DE ESCRITA. Empurra o dia informado E TODOS os seguintes pelo mesmo número de dias — ninguém muda de posição relativa e nenhum dia estoura o teto (todos andam juntos). É a operação certa pra 'pula o domingo' quando mover um dia só não cabe. Só pendentes; quem já disparou fica. 422: data inválida, days <= 0, ninguém na fila daquele dia em diante.",
29624
+ "category": "Campanhas",
29625
+ "params": [
29626
+ {
29627
+ "name": "id",
29628
+ "type": "integer",
29629
+ "location": "path",
29630
+ "required": true,
29631
+ "description": "ID da campanha"
29632
+ },
29633
+ {
29634
+ "name": "date",
29635
+ "type": "string",
29636
+ "location": "body",
29637
+ "required": true,
29638
+ "description": "Primeiro dia a empurrar, YYYY-MM-DD"
29639
+ },
29640
+ {
29641
+ "name": "days",
29642
+ "type": "integer",
29643
+ "location": "body",
29644
+ "required": true,
29645
+ "description": "Quantos dias empurrar (1 ou mais)"
29646
+ }
29647
+ ],
29648
+ "returns": "200 {moved, ends_at, days: agenda atualizada} | 422 {error}",
29649
+ "common_use_cases": [
29650
+ "Atrasar a campanha inteira a partir de uma data sem estourar o limite diário"
29651
+ ],
29652
+ "related_tools": [
29653
+ "lionchat_campaigns_dispatch_days",
29654
+ "lionchat_campaigns_move_dispatch_day",
29655
+ "lionchat_campaigns_reschedule_flow"
29656
+ ]
29657
+ },
29658
+ {
29659
+ "id": "lionchat_campaigns_reprogram_dispatch",
29660
+ "method": "PATCH",
29661
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/reprogram_dispatch",
29662
+ "title": "Reprogramar o que falta da Campanha",
29663
+ "description": "AÇÃO DE ESCRITA — confirme com o usuário (refaz a agenda inteira do que ainda não saiu). Remonta a agenda SÓ das pessoas pendentes com teto por dia, data de início e intervalo entre pessoas novos; quem já recebeu nunca é tocado. Parâmetros ausentes mantêm o valor atual (start_at ausente = a partir da próxima pendente ou agora). 422: 'nao ha ninguem na fila', daily_cap < 1, start_at no passado, delay_min > delay_max, campanha sem agenda. Grava daily_cap novo na campanha e registra no schedule_log.",
29664
+ "category": "Campanhas",
29665
+ "params": [
29666
+ {
29667
+ "name": "id",
29668
+ "type": "integer",
29669
+ "location": "path",
29670
+ "required": true,
29671
+ "description": "ID da campanha"
29672
+ },
29673
+ {
29674
+ "name": "daily_cap",
29675
+ "type": "integer",
29676
+ "location": "body",
29677
+ "required": false,
29678
+ "description": "Máximo de pessoas por dia (1 ou mais)"
29679
+ },
29680
+ {
29681
+ "name": "start_at",
29682
+ "type": "string",
29683
+ "location": "body",
29684
+ "required": false,
29685
+ "description": "Data/hora de início (ISO 8601), precisa ser futura"
29686
+ },
29687
+ {
29688
+ "name": "delay_min",
29689
+ "type": "integer",
29690
+ "location": "body",
29691
+ "required": false,
29692
+ "description": "Intervalo mínimo entre pessoas, em segundos"
29693
+ },
29694
+ {
29695
+ "name": "delay_max",
29696
+ "type": "integer",
29697
+ "location": "body",
29698
+ "required": false,
29699
+ "description": "Intervalo máximo entre pessoas, em segundos (>= delay_min)"
29700
+ }
29701
+ ],
29702
+ "returns": "200 {moved, daily_cap, ends_at, days: agenda atualizada} | 422 {error}",
29703
+ "common_use_cases": [
29704
+ "Baixar o ritmo diário de uma campanha que está estourando o limite do número",
29705
+ "Reagendar o restante pra começar amanhã às 9h"
29706
+ ],
29707
+ "related_tools": [
29708
+ "lionchat_campaigns_dispatch_days",
29709
+ "lionchat_campaigns_reschedule_flow",
29710
+ "lionchat_campaigns_stop_flow"
29711
+ ],
29712
+ "confirm_required": true
29713
+ },
29714
+ {
29715
+ "id": "lionchat_campaigns_remove_dispatch_entry",
29716
+ "method": "DELETE",
29717
+ "path": "/api/v1/accounts/{account_id}/campaigns/{id}/remove_dispatch_entry",
29718
+ "title": "Tirar uma Pessoa da Fila da Campanha",
29719
+ "description": "AÇÃO DE ESCRITA — confirme com o usuário. O ÚNICO caminho que tira alguém da campanha de verdade: a linha vira 'cancelled' (não é apagada — o dono precisa saber que a pessoa ficou de fora). Não redistribui nada (remover é diferente de pular). O firing_id vem de lionchat_campaigns_dispatch_day_entries. 422: 'essa pessoa nao esta mais na fila' (já saiu, já foi cancelada ou o id não é desta campanha) e 'essa pessoa acabou de ser disparada' (corrida com o despertador).",
29720
+ "category": "Campanhas",
29721
+ "params": [
29722
+ {
29723
+ "name": "id",
29724
+ "type": "integer",
29725
+ "location": "path",
29726
+ "required": true,
29727
+ "description": "ID da campanha"
29728
+ },
29729
+ {
29730
+ "name": "firing_id",
29731
+ "type": "integer",
29732
+ "location": "query",
29733
+ "required": true,
29734
+ "description": "ID da pessoa na fila (entries[].id de dispatch_day_entries)"
29735
+ }
29736
+ ],
29737
+ "returns": "200 {removed: 1, ends_at, days: agenda atualizada} | 422 {error}",
29738
+ "common_use_cases": [
29739
+ "Cliente pediu pra não receber — tirar da campanha antes do disparo"
29740
+ ],
29741
+ "related_tools": [
29742
+ "lionchat_campaigns_dispatch_day_entries",
29743
+ "lionchat_campaigns_dispatch_days"
29744
+ ],
29745
+ "confirm_required": true
29746
+ },
29747
+ {
29748
+ "id": "lionchat_captain_voices_list",
29749
+ "method": "GET",
29750
+ "path": "/api/v1/accounts/{account_id}/captain/voices",
29751
+ "title": "Vozes disponíveis pra resposta em áudio da IA",
29752
+ "description": "SÓ LEITURA. Catálogo de vozes do provedor pra configurar a resposta em ÁUDIO do AI Agente: provider 'openai' (padrão; vozes fixas, exige chave OpenAI na conta) ou 'elevenlabs' (lista as vozes da conta ElevenLabs, inclusive clonadas). NUNCA levanta: configured=false + error quando a chave do provedor não está configurada; provedor desconhecido devolve lista vazia. O id da voz é o que vai em config do assistente (lionchat_captain_assistants_update). A prévia de áudio (preview) NÃO existe no MCP — é arquivo binário; ouvir pelo painel. Somente administrador.",
29753
+ "category": "Assistentes",
29754
+ "params": [
29755
+ {
29756
+ "name": "provider",
29757
+ "type": "string",
29758
+ "location": "query",
29759
+ "required": false,
29760
+ "description": "openai (padrão) | elevenlabs"
29761
+ }
29762
+ ],
29763
+ "returns": "{voices: [{id, name, category, available, ...}], configured: bool, error: null|string, cloning_allowed?}",
29764
+ "common_use_cases": [
29765
+ "Listar as vozes antes de ligar a resposta por áudio",
29766
+ "Descobrir o id da voz ElevenLabs clonada do cliente"
29767
+ ],
29768
+ "related_tools": [
29769
+ "lionchat_captain_assistants_update",
29770
+ "lionchat_captain_assistants_show"
29771
+ ]
29772
+ },
29773
+ {
29774
+ "id": "lionchat_account_variables_show",
29775
+ "method": "GET",
29776
+ "path": "/api/v1/accounts/{account_id}/account_variables/{id}",
29777
+ "title": "Ver uma Variável da Conta",
29778
+ "description": "SÓ LEITURA. Devolve UMA variável da conta pelo id, no MESMO formato da lista ({definitions: [1 definição], values: {chave: valor}}). Use em vez da lista quando a conta tem muitas variáveis (Instituto Homem tem 100+): a lista é cortada pelo teto de resposta e os últimos itens em ordem alfabética SOMEM — já fez parecer que tokens da e-Clínica tinham sido apagados. Variável secreta não devolve o valor: em values vem {has_value: true/false}. **Requer perfil Administrador.**",
29779
+ "category": "Variaveis da Conta",
29780
+ "params": [
29781
+ {
29782
+ "name": "id",
29783
+ "type": "integer",
29784
+ "location": "path",
29785
+ "required": true,
29786
+ "description": "ID da definição da variável (definitions[].id da lista)"
29787
+ }
29788
+ ],
29789
+ "returns": "{definitions: [{id, attribute_key, attribute_display_name, attribute_display_type, ...}], values: {<attribute_key>: valor | {has_value: bool} (secreta)}}",
29790
+ "common_use_cases": [
29791
+ "Conferir o valor/estado de UMA variável sem depender da lista truncada",
29792
+ "Verificar se um token secreto está preenchido"
29793
+ ],
29794
+ "related_tools": [
29795
+ "lionchat_account_variables_list",
29796
+ "lionchat_account_variables_update"
29797
+ ]
29798
+ },
29799
+ {
29800
+ "id": "lionchat_agents_assignments",
29801
+ "method": "GET",
29802
+ "path": "/api/v1/accounts/{account_id}/agents/{id}/assignments",
29803
+ "title": "Times e Caixas de um Atendente",
29804
+ "description": "SÓ LEITURA. Estado atual dos vínculos do atendente: times (com papel: supervisor=true quando NÃO entra na distribuição automática) e caixas (inbox_id + supervisor). Agente CONFIRMADO -> vínculos reais (TeamMember/InboxMember). Agente com convite NÃO confirmado -> as pendências guardadas no convite, que serão aplicadas quando ele confirmar. team_ids é só a lista de ids (compatibilidade). É o que o modal Editar usa pra pré-preencher; e é o que lionchat_agents_replace herda.",
29805
+ "category": "Agentes",
29806
+ "params": [
29807
+ {
29808
+ "name": "id",
29809
+ "type": "integer",
29810
+ "location": "path",
29811
+ "required": true,
29812
+ "description": "ID do atendente"
29813
+ }
29814
+ ],
29815
+ "returns": "{teams: [{team_id, supervisor}], team_ids: [...], inboxes: [{inbox_id, supervisor}]}",
29816
+ "common_use_cases": [
29817
+ "Ver em quais caixas e times o atendente está antes de editar",
29818
+ "Conferir o que um convite pendente vai aplicar"
29819
+ ],
29820
+ "related_tools": [
29821
+ "lionchat_agents_update",
29822
+ "lionchat_agents_assigned_resources",
29823
+ "lionchat_inbox_members_show",
29824
+ "lionchat_teams_show"
29825
+ ]
29826
+ },
29827
+ {
29828
+ "id": "lionchat_announcements_read_all",
29829
+ "method": "POST",
29830
+ "path": "/api/v1/accounts/{account_id}/announcements/read_all",
29831
+ "title": "Marcar todos os Avisos como lidos",
29832
+ "description": "AÇÃO DE ESCRITA leve. Marca como lidos, de uma vez, todos os avisos (anúncios) visíveis ainda não lidos pelo usuário logado — par do lionchat_announcements_read (que marca um por vez). Sem corpo. Idempotente (nada pendente = 200 sem efeito).",
29833
+ "category": "Anuncios",
29834
+ "params": [],
29835
+ "returns": "200 sem corpo",
29836
+ "common_use_cases": [
29837
+ "Limpar o contador de avisos pendentes de uma vez"
29838
+ ],
29839
+ "related_tools": [
29840
+ "lionchat_announcements_read",
29841
+ "lionchat_announcements_list_1",
29842
+ "lionchat_announcements_list"
29843
+ ]
29844
+ },
29845
+ {
29846
+ "id": "lionchat_assignable_agents_list",
29847
+ "method": "GET",
29848
+ "path": "/api/v1/accounts/{account_id}/assignable_agents",
29849
+ "title": "Atendentes atribuíveis em VÁRIAS caixas",
29850
+ "description": "SÓ LEITURA. Quem pode receber uma conversa considerando VÁRIAS caixas ao mesmo tempo: devolve os agentes membros de TODAS as caixas informadas (interseção) mais os administradores da conta. Exclui super admins com acesso de suporte ativo. Para UMA caixa use lionchat_inboxes_list_1 (inboxes/{id}/assignable_agents). 404 se alguma caixa não for da conta.",
29851
+ "category": "Agentes",
29852
+ "params": [
29853
+ {
29854
+ "name": "inbox_ids",
29855
+ "type": "array",
29856
+ "location": "query",
29857
+ "required": true,
29858
+ "description": "IDs das caixas (o agente precisa ser membro de todas)",
29859
+ "query_name": "inbox_ids[]"
29860
+ }
29861
+ ],
29862
+ "returns": "{payload: [agente (mesmo formato de lionchat_agents_list)]}",
29863
+ "common_use_cases": [
29864
+ "Montar a lista de destino de uma atribuição em lote que cruza caixas"
29865
+ ],
29866
+ "related_tools": [
29867
+ "lionchat_inboxes_list_1",
29868
+ "lionchat_agents_list",
29869
+ "lionchat_kanban_bulk_bulk_actions"
29870
+ ]
29871
+ },
29872
+ {
29873
+ "id": "lionchat_contact_inboxes_filter",
29874
+ "method": "POST",
29875
+ "path": "/api/v1/accounts/{account_id}/contact_inboxes/filter",
29876
+ "title": "Achar o Contato pelo identificador numa Caixa",
29877
+ "description": "SÓ LEITURA (é POST por herança do Chatwoot, mas não grava nada). Responde 'qual contato tem este source_id nesta caixa?': procura o crachá (contact_inbox) pelo par inbox_id + source_id EXATO e devolve o contato com todos os crachás (contact_inboxes). ATENÇÃO nas caixas WhatsApp QR (WAHA): o mesmo contato pode ter o crachá em 3 formatos (5511999999999@lid, 5511999999999@c.us ou só dígitos) — a busca é exata, então tente o formato que a caixa usa; na caixa oficial (Cloud) o source_id são os dígitos do telefone. 404 sem corpo quando não existe.",
29878
+ "category": "Contatos",
29879
+ "params": [
29880
+ {
29881
+ "name": "inbox_id",
29882
+ "type": "integer",
29883
+ "location": "body",
29884
+ "required": true,
29885
+ "description": "ID da caixa"
29886
+ },
29887
+ {
29888
+ "name": "source_id",
29889
+ "type": "string",
29890
+ "location": "body",
29891
+ "required": true,
29892
+ "description": "Identificador do contato naquele canal (telefone em dígitos na Cloud; @c.us/@lid no QR; e-mail no canal de e-mail)"
29893
+ }
29894
+ ],
29895
+ "returns": "200 contato (com contact_inboxes) | 404 sem corpo",
29896
+ "common_use_cases": [
29897
+ "Descobrir se um número já é contato numa caixa específica antes de criar",
29898
+ "Mapear telefone -> contato numa integração"
29899
+ ],
29900
+ "related_tools": [
29901
+ "lionchat_contacts_search",
29902
+ "lionchat_contacts_create_2",
29903
+ "lionchat_contacts_show"
29904
+ ]
29905
+ },
29906
+ {
29907
+ "id": "lionchat_contacts_tracking_events_presence",
29908
+ "method": "GET",
29909
+ "path": "/api/v1/accounts/{account_id}/contacts/{contact_id}/tracking_events/presence",
29910
+ "title": "Presença do Lead no site agora (LionTrack)",
29911
+ "description": "SÓ LEITURA. Diz se o contato está ONLINE no site neste instante (heartbeat do rastreador LionTrack, válido por 60 segundos) e, quando está, em que página (page_url) e dispositivo. Fora do site ou sem rastreador instalado = {online: false} e mais nada. Leitura de Redis, custo zero.",
29912
+ "category": "LionTrack",
29913
+ "params": [
29914
+ {
29915
+ "name": "contact_id",
29916
+ "type": "integer",
29917
+ "location": "path",
29918
+ "required": true,
29919
+ "description": "ID do contato"
29920
+ }
29921
+ ],
29922
+ "returns": "{online: bool, page_url?, device_name?, visitor_id?, ...dados do último heartbeat}",
29923
+ "common_use_cases": [
29924
+ "Saber se o lead está navegando agora antes de ligar/chamar",
29925
+ "Mostrar 'online no site' numa automação"
29926
+ ],
29927
+ "related_tools": [
29928
+ "lionchat_contacts_tracking_events_list",
29929
+ "lionchat_contacts_show"
29930
+ ]
29931
+ },
29932
+ {
29933
+ "id": "lionchat_contacts_tracking_events_debug_timeline",
29934
+ "method": "GET",
29935
+ "path": "/api/v1/accounts/{account_id}/contacts/{contact_id}/tracking_events/debug_timeline",
29936
+ "title": "Linha do tempo crua de rastreamento do Contato (admin)",
29937
+ "description": "SÓ LEITURA, SOMENTE ADMINISTRADOR (403 pros demais). Últimos eventos do LionTrack com o event_data INTEIRO — fbp, fbc, landing_url, user_agent, UTMs, fbclid/gclid, cidade/estado, IP, sessão, navegador/dispositivo — pra inspecionar a atribuição quando o relatório de origem ou o pixel parece errado. Não passa pela redação de dados pessoais da lista normal; use só pra depurar.",
29938
+ "category": "LionTrack",
29939
+ "params": [
29940
+ {
29941
+ "name": "contact_id",
29942
+ "type": "integer",
29943
+ "location": "path",
29944
+ "required": true,
29945
+ "description": "ID do contato"
29946
+ },
29947
+ {
29948
+ "name": "limit",
29949
+ "type": "integer",
29950
+ "location": "query",
29951
+ "required": false,
29952
+ "description": "Quantos eventos (1 a 100, padrão 10)"
29953
+ }
29954
+ ],
29955
+ "returns": "{contact_id, contact_name, total_events, events: [{id, event_name, event_data, duration_seconds, page_url, page_title, referrer, utm_source, utm_medium, utm_campaign, utm_content, utm_term, fbclid, gclid, country, state, city, ip_address, session_id, browser_name, device_name, platform_name, created_at}]}",
29956
+ "common_use_cases": [
29957
+ "Depurar por que o lead ficou sem origem/campanha",
29958
+ "Conferir fbp/fbc antes de um disparo manual de conversão"
29959
+ ],
29960
+ "related_tools": [
29961
+ "lionchat_contacts_tracking_events_list",
29962
+ "lionchat_kanban_items_recapture_attribution",
29963
+ "lionchat_lead_origin_reports"
29964
+ ]
29965
+ },
29966
+ {
29967
+ "id": "lionchat_csat_update",
29968
+ "method": "PATCH",
29969
+ "path": "/api/v1/accounts/{account_id}/csat_survey_responses/{id}",
29970
+ "title": "Anotar uma Resposta de CSAT (nota de revisão)",
29971
+ "description": "AÇÃO DE ESCRITA. Grava/atualiza a NOTA DE REVISÃO (csat_review_notes) de uma resposta de satisfação — o comentário interno do gestor sobre aquela avaliação; registra quem anotou e quando. Não altera a nota do cliente. Administrador ou cargo com permissão report_manage (403 caso contrário). Recurso Enterprise.",
29972
+ "category": "CSAT",
29973
+ "params": [
29974
+ {
29975
+ "name": "id",
29976
+ "type": "integer",
29977
+ "location": "path",
29978
+ "required": true,
29979
+ "description": "ID da resposta de CSAT (de lionchat_csat_list)"
29980
+ },
29981
+ {
29982
+ "name": "csat_review_notes",
29983
+ "type": "string",
29984
+ "location": "body",
29985
+ "required": true,
29986
+ "description": "Texto da anotação (vazio limpa)"
29987
+ }
29988
+ ],
29989
+ "returns": "200 resposta de CSAT atualizada (mesmo formato da lista, com csat_review_notes, review_notes_updated_by, review_notes_updated_at)",
29990
+ "common_use_cases": [
29991
+ "Registrar o que foi feito sobre uma avaliação negativa"
29992
+ ],
29993
+ "related_tools": [
29994
+ "lionchat_csat_list",
29995
+ "lionchat_csat_metrics"
29996
+ ]
29997
+ },
29998
+ {
29999
+ "id": "lionchat_flow_sessions_show",
30000
+ "method": "GET",
30001
+ "path": "/api/v1/accounts/{account_id}/flow_sessions/{id}",
30002
+ "title": "Detalhe de uma Execução de Flow (passo a passo)",
30003
+ "description": "SÓ LEITURA, ADMIN-ONLY, rate limit 30/min por usuário. O detalhe de UMA execução (sessão) de fluxo de conversa: log passo a passo enriquecido (execution_steps, com status e erro por bloco — inclusive falha de entrega assíncrona registrada no passo do bloco), variáveis no fim (variables_snapshot, filtradas), blocos visitados, setas percorridas (traversed_edges) e a conversa. Resolve a FOTO da versão do fluxo da época (flow_snapshot); flow_snapshot_stale=true avisa que o fluxo foi editado durante a execução. execution_log_truncated=true quando o log passou do teto. Os ids vêm de lionchat_flows_executions_list. 404 {error:'Nao encontrado'}.",
30004
+ "category": "Flows",
30005
+ "params": [
30006
+ {
30007
+ "name": "id",
30008
+ "type": "integer",
30009
+ "location": "path",
30010
+ "required": true,
30011
+ "description": "ID da sessão (data[].id de lionchat_flows_executions_list)"
30012
+ }
30013
+ ],
30014
+ "returns": "{id, flow_id, status, started_at, updated_at, duration_ms, trigger_label, trigger_type, conversation: {id, display_id, status, ...}, execution_steps: [...], variables_snapshot, visited_node_ids, traversed_edges, execution_log_truncated, flow_snapshot, flow_snapshot_stale}",
30015
+ "common_use_cases": [
30016
+ "Explicar em que bloco o fluxo parou e por quê",
30017
+ "Ver o valor das variáveis no fim da execução",
30018
+ "Mostrar o motivo de uma entrega recusada pelo canal dentro do fluxo"
30019
+ ],
30020
+ "related_tools": [
30021
+ "lionchat_flows_executions_list",
30022
+ "lionchat_flow_sessions_update",
30023
+ "lionchat_conversations_flow_sessions_list",
30024
+ "lionchat_flow_tool_executions_show"
30025
+ ]
30026
+ },
30027
+ {
30028
+ "id": "lionchat_funnels_meta_events_config",
30029
+ "method": "PATCH",
30030
+ "path": "/api/v1/accounts/{account_id}/funnels/{id}/meta_events_config",
30031
+ "title": "Configurar Eventos de Conversão do Funil (Meta/GA4/Ads)",
30032
+ "description": "AÇÃO DE ESCRITA — confirme com o usuário. Define quais eventos de conversão o funil dispara automaticamente: por ETAPA (stages.<id da etapa>) e nos desfechos won/lost. Cada bloco aceita SÓ: enabled, name (nome do evento, ex. Lead, Purchase), is_standard, value_strategy, value_fixed, currency — qualquer outra chave é descartada em silêncio. O merge é PROFUNDO e atômico: mande só o que muda; etapas não citadas ficam como estão. Administrador ou cargo com marketing_integrations_manage (403). Devolve a configuração inteira depois do merge.",
30033
+ "category": "Funis",
30034
+ "params": [
30035
+ {
30036
+ "name": "id",
30037
+ "type": "integer",
30038
+ "location": "path",
30039
+ "required": true,
30040
+ "description": "ID do funil"
30041
+ },
30042
+ {
30043
+ "name": "meta_events_config",
30044
+ "type": "object",
30045
+ "location": "body",
30046
+ "required": true,
30047
+ "description": "{stages: {<stage_id>: {enabled, name, is_standard, value_strategy, value_fixed, currency}}, won: {...}, lost: {...}} — parcial"
30048
+ }
30049
+ ],
30050
+ "returns": "200 meta_events_config completo do funil após o merge | 403",
30051
+ "common_use_cases": [
30052
+ "Disparar 'Purchase' quando o card for ganho",
30053
+ "Ligar o evento 'Lead' na etapa de qualificação"
30054
+ ],
30055
+ "related_tools": [
30056
+ "lionchat_funnels_show",
30057
+ "lionchat_meta_pixel_integrations_list",
30058
+ "lionchat_ga4_integrations_list",
30059
+ "lionchat_google_ads_integrations_list"
30060
+ ]
30061
+ },
30062
+ {
30063
+ "id": "lionchat_funnels_meta_capi_events_list",
30064
+ "method": "GET",
30065
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/meta_capi_events",
30066
+ "title": "Histórico de Eventos Meta CAPI do Funil",
30067
+ "description": "SÓ LEITURA. Lista os eventos de conversão Meta CAPI disparados pelo funil (50 por página, mais novos primeiro) com status (pending | sent | failed | duplicate), nome do evento, como foi disparado (trigger_type: stage_move | card_won | card_lost | manual | automation | auto_create | test | booking_reservation | lead_form), motivo da falha e o card de origem (kanban_item_title). Responde 'por que a venda não apareceu no Meta CAPI?'. Administrador ou cargo com marketing_integrations_manage (403).",
30068
+ "category": "Integracoes",
30069
+ "params": [
30070
+ {
30071
+ "name": "funnel_id",
30072
+ "type": "integer",
30073
+ "location": "path",
30074
+ "required": true,
30075
+ "description": "ID do funil"
30076
+ },
30077
+ {
30078
+ "name": "status",
30079
+ "type": "string",
30080
+ "location": "query",
30081
+ "required": false,
30082
+ "description": "Filtra por status: pending | sent | failed | duplicate"
30083
+ },
30084
+ {
30085
+ "name": "event_name",
30086
+ "type": "string",
30087
+ "location": "query",
30088
+ "required": false,
30089
+ "description": "Filtra pelo nome do evento (ex.: Lead, Purchase)"
30090
+ },
30091
+ {
30092
+ "name": "trigger_type",
30093
+ "type": "string",
30094
+ "location": "query",
30095
+ "required": false,
30096
+ "description": "Filtra pela origem do disparo: stage_move | card_won | card_lost | manual | automation | auto_create | test | booking_reservation | lead_form"
30097
+ },
30098
+ {
30099
+ "name": "kanban_item_id",
30100
+ "type": "integer",
30101
+ "location": "query",
30102
+ "required": false,
30103
+ "description": "Só eventos deste card"
30104
+ },
30105
+ {
30106
+ "name": "since",
30107
+ "type": "string",
30108
+ "location": "query",
30109
+ "required": false,
30110
+ "description": "Início (ISO 8601) — created_at >= since"
30111
+ },
30112
+ {
30113
+ "name": "until",
30114
+ "type": "string",
30115
+ "location": "query",
30116
+ "required": false,
30117
+ "description": "Fim (ISO 8601) — created_at <= until"
30118
+ },
30119
+ {
30120
+ "name": "page",
30121
+ "type": "integer",
30122
+ "location": "query",
30123
+ "required": false,
30124
+ "description": "Página (50 por página)"
30125
+ }
30126
+ ],
30127
+ "returns": "{data: [{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, kanban_item_id, kanban_item_title, fbtrace_id}], meta: {total, page}}",
30128
+ "common_use_cases": [
30129
+ "Ver se o evento de conversão chegou no Meta CAPI",
30130
+ "Listar os disparos falhados pra reenviar"
30131
+ ],
30132
+ "related_tools": [
30133
+ "lionchat_funnels_meta_capi_events_show",
30134
+ "lionchat_funnels_meta_capi_events_retry",
30135
+ "lionchat_meta_pixel_integrations_list",
30136
+ "lionchat_funnels_meta_events_config"
30137
+ ]
30138
+ },
30139
+ {
30140
+ "id": "lionchat_funnels_meta_capi_events_show",
30141
+ "method": "GET",
30142
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/meta_capi_events/{id}",
30143
+ "title": "Detalhe de um Evento Meta CAPI",
30144
+ "description": "SÓ LEITURA. Um evento Meta CAPI com os DADOS BRUTOS: payload_sent (o que foi mandado) e response_body (o que o provedor respondeu), ambos com dados sensíveis redigidos, mais response_status. É o bloco 'Ver detalhes' do histórico. 404 se o evento não for deste funil/conta.",
30145
+ "category": "Integracoes",
30146
+ "params": [
30147
+ {
30148
+ "name": "funnel_id",
30149
+ "type": "integer",
30150
+ "location": "path",
30151
+ "required": true,
30152
+ "description": "ID do funil"
30153
+ },
30154
+ {
30155
+ "name": "id",
30156
+ "type": "integer",
30157
+ "location": "path",
30158
+ "required": true,
30159
+ "description": "ID do evento"
30160
+ }
30161
+ ],
30162
+ "returns": "{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, response_status, kanban_item_id, kanban_item_title, fbtrace_id, payload_sent, response_body} | 404",
30163
+ "common_use_cases": [
30164
+ "Ler a mensagem de erro exata do provedor",
30165
+ "Conferir que dados de usuário foram enviados"
30166
+ ],
30167
+ "related_tools": [
30168
+ "lionchat_funnels_meta_capi_events_list",
30169
+ "lionchat_funnels_meta_capi_events_retry"
30170
+ ]
30171
+ },
30172
+ {
30173
+ "id": "lionchat_funnels_meta_capi_events_retry",
30174
+ "method": "POST",
30175
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/meta_capi_events/{id}/retry",
30176
+ "title": "Reenviar Evento Meta CAPI falhado",
30177
+ "description": "AÇÃO DE ESCRITA. Reenfileira UM evento Meta CAPI com status 'failed' (volta pra pending e o job envia de novo). Só failed: qualquer outro status responde 422 {error:'not failed'}. 404 se não for deste funil.",
30178
+ "category": "Integracoes",
30179
+ "params": [
30180
+ {
30181
+ "name": "funnel_id",
30182
+ "type": "integer",
30183
+ "location": "path",
30184
+ "required": true,
30185
+ "description": "ID do funil"
30186
+ },
30187
+ {
30188
+ "name": "id",
30189
+ "type": "integer",
30190
+ "location": "path",
30191
+ "required": true,
30192
+ "description": "ID do evento falhado"
30193
+ }
30194
+ ],
30195
+ "returns": "200 {ok: true} | 422 {error:'not failed'} | 404 {error:'not found'}",
30196
+ "common_use_cases": [
30197
+ "Reenviar a conversão depois de corrigir o token/pixel"
30198
+ ],
30199
+ "related_tools": [
30200
+ "lionchat_funnels_meta_capi_events_list",
30201
+ "lionchat_meta_pixel_integrations_list"
30202
+ ]
30203
+ },
30204
+ {
30205
+ "id": "lionchat_funnels_ga4_events_list",
30206
+ "method": "GET",
30207
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/ga4_events",
30208
+ "title": "Histórico de Eventos GA4 do Funil",
30209
+ "description": "SÓ LEITURA. Lista os eventos de conversão GA4 disparados pelo funil (50 por página, mais novos primeiro) com status (pending | sent | failed), nome do evento, como foi disparado (trigger_type: stage_move | card_won | card_lost | auto_create | manual | automation | booking_reservation | test | lead_form), motivo da falha e o card de origem (kanban_item_title). Responde 'por que a venda não apareceu no GA4?'. Administrador ou cargo com marketing_integrations_manage (403).",
30210
+ "category": "Integracoes",
30211
+ "params": [
30212
+ {
30213
+ "name": "funnel_id",
30214
+ "type": "integer",
30215
+ "location": "path",
30216
+ "required": true,
30217
+ "description": "ID do funil"
30218
+ },
30219
+ {
30220
+ "name": "status",
30221
+ "type": "string",
30222
+ "location": "query",
30223
+ "required": false,
30224
+ "description": "Filtra por status: pending | sent | failed"
30225
+ },
30226
+ {
30227
+ "name": "event_name",
30228
+ "type": "string",
30229
+ "location": "query",
30230
+ "required": false,
30231
+ "description": "Filtra pelo nome do evento (ex.: Lead, Purchase)"
30232
+ },
30233
+ {
30234
+ "name": "trigger_type",
30235
+ "type": "string",
30236
+ "location": "query",
30237
+ "required": false,
30238
+ "description": "Filtra pela origem do disparo: stage_move | card_won | card_lost | auto_create | manual | automation | booking_reservation | test | lead_form"
30239
+ },
30240
+ {
30241
+ "name": "kanban_item_id",
30242
+ "type": "integer",
30243
+ "location": "query",
30244
+ "required": false,
30245
+ "description": "Só eventos deste card"
30246
+ },
30247
+ {
30248
+ "name": "since",
30249
+ "type": "string",
30250
+ "location": "query",
30251
+ "required": false,
30252
+ "description": "Início (ISO 8601) — created_at >= since"
30253
+ },
30254
+ {
30255
+ "name": "until",
30256
+ "type": "string",
30257
+ "location": "query",
30258
+ "required": false,
30259
+ "description": "Fim (ISO 8601) — created_at <= until"
30260
+ },
30261
+ {
30262
+ "name": "page",
30263
+ "type": "integer",
30264
+ "location": "query",
30265
+ "required": false,
30266
+ "description": "Página (50 por página)"
30267
+ }
30268
+ ],
30269
+ "returns": "{data: [{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, kanban_item_id, kanban_item_title}], meta: {total, page}}",
30270
+ "common_use_cases": [
30271
+ "Ver se o evento de conversão chegou no GA4",
30272
+ "Listar os disparos falhados pra reenviar"
30273
+ ],
30274
+ "related_tools": [
30275
+ "lionchat_funnels_ga4_events_show",
30276
+ "lionchat_funnels_ga4_events_retry",
30277
+ "lionchat_ga4_integrations_list",
30278
+ "lionchat_funnels_meta_events_config"
30279
+ ]
30280
+ },
30281
+ {
30282
+ "id": "lionchat_funnels_ga4_events_show",
30283
+ "method": "GET",
30284
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/ga4_events/{id}",
30285
+ "title": "Detalhe de um Evento GA4",
30286
+ "description": "SÓ LEITURA. Um evento GA4 com os DADOS BRUTOS: payload_sent (o que foi mandado) e response_body (o que o provedor respondeu), ambos com dados sensíveis redigidos, mais response_status. É o bloco 'Ver detalhes' do histórico. 404 se o evento não for deste funil/conta.",
30287
+ "category": "Integracoes",
30288
+ "params": [
30289
+ {
30290
+ "name": "funnel_id",
30291
+ "type": "integer",
30292
+ "location": "path",
30293
+ "required": true,
30294
+ "description": "ID do funil"
30295
+ },
30296
+ {
30297
+ "name": "id",
30298
+ "type": "integer",
30299
+ "location": "path",
30300
+ "required": true,
30301
+ "description": "ID do evento"
30302
+ }
30303
+ ],
30304
+ "returns": "{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, response_status, kanban_item_id, kanban_item_title, payload_sent, response_body} | 404",
30305
+ "common_use_cases": [
30306
+ "Ler a mensagem de erro exata do provedor",
30307
+ "Conferir que dados de usuário foram enviados"
30308
+ ],
30309
+ "related_tools": [
30310
+ "lionchat_funnels_ga4_events_list",
30311
+ "lionchat_funnels_ga4_events_retry"
30312
+ ]
30313
+ },
30314
+ {
30315
+ "id": "lionchat_funnels_ga4_events_retry",
30316
+ "method": "POST",
30317
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/ga4_events/{id}/retry",
30318
+ "title": "Reenviar Evento GA4 falhado",
30319
+ "description": "AÇÃO DE ESCRITA. Reenfileira UM evento GA4 com status 'failed' (volta pra pending e o job envia de novo). Só failed: qualquer outro status responde 422 {error:'not failed'}. 404 se não for deste funil.",
30320
+ "category": "Integracoes",
30321
+ "params": [
30322
+ {
30323
+ "name": "funnel_id",
30324
+ "type": "integer",
30325
+ "location": "path",
30326
+ "required": true,
30327
+ "description": "ID do funil"
30328
+ },
30329
+ {
30330
+ "name": "id",
30331
+ "type": "integer",
30332
+ "location": "path",
30333
+ "required": true,
30334
+ "description": "ID do evento falhado"
30335
+ }
30336
+ ],
30337
+ "returns": "200 {ok: true} | 422 {error:'not failed'} | 404 {error:'not found'}",
30338
+ "common_use_cases": [
30339
+ "Reenviar a conversão depois de corrigir o token/pixel"
30340
+ ],
30341
+ "related_tools": [
30342
+ "lionchat_funnels_ga4_events_list",
30343
+ "lionchat_ga4_integrations_list"
30344
+ ]
30345
+ },
30346
+ {
30347
+ "id": "lionchat_funnels_google_ads_conversions_list",
30348
+ "method": "GET",
30349
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/google_ads_conversions",
30350
+ "title": "Histórico de Eventos Google Ads do Funil",
30351
+ "description": "SÓ LEITURA. Lista os eventos de conversão Google Ads disparados pelo funil (50 por página, mais novos primeiro) com status (pending | sent | failed), nome do evento, como foi disparado (trigger_type: stage_move | card_won | card_lost | auto_create | manual | automation | booking_reservation | test), motivo da falha e o card de origem (kanban_item_title). Responde 'por que a venda não apareceu no Google Ads?'. Administrador ou cargo com marketing_integrations_manage (403).",
30352
+ "category": "Integracoes",
30353
+ "params": [
30354
+ {
30355
+ "name": "funnel_id",
30356
+ "type": "integer",
30357
+ "location": "path",
30358
+ "required": true,
30359
+ "description": "ID do funil"
30360
+ },
30361
+ {
30362
+ "name": "status",
30363
+ "type": "string",
30364
+ "location": "query",
30365
+ "required": false,
30366
+ "description": "Filtra por status: pending | sent | failed"
30367
+ },
30368
+ {
30369
+ "name": "event_name",
30370
+ "type": "string",
30371
+ "location": "query",
30372
+ "required": false,
30373
+ "description": "Filtra pelo nome do evento (ex.: Lead, Purchase)"
30374
+ },
30375
+ {
30376
+ "name": "trigger_type",
30377
+ "type": "string",
30378
+ "location": "query",
30379
+ "required": false,
30380
+ "description": "Filtra pela origem do disparo: stage_move | card_won | card_lost | auto_create | manual | automation | booking_reservation | test"
30381
+ },
30382
+ {
30383
+ "name": "kanban_item_id",
30384
+ "type": "integer",
30385
+ "location": "query",
30386
+ "required": false,
30387
+ "description": "Só eventos deste card"
30388
+ },
30389
+ {
30390
+ "name": "since",
30391
+ "type": "string",
30392
+ "location": "query",
30393
+ "required": false,
30394
+ "description": "Início (ISO 8601) — created_at >= since"
30395
+ },
30396
+ {
30397
+ "name": "until",
30398
+ "type": "string",
30399
+ "location": "query",
30400
+ "required": false,
30401
+ "description": "Fim (ISO 8601) — created_at <= until"
30402
+ },
30403
+ {
30404
+ "name": "page",
30405
+ "type": "integer",
30406
+ "location": "query",
30407
+ "required": false,
30408
+ "description": "Página (50 por página)"
30409
+ }
30410
+ ],
30411
+ "returns": "{data: [{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, kanban_item_id, kanban_item_title}], meta: {total, page}}",
30412
+ "common_use_cases": [
30413
+ "Ver se o evento de conversão chegou no Google Ads",
30414
+ "Listar os disparos falhados pra reenviar"
30415
+ ],
30416
+ "related_tools": [
30417
+ "lionchat_funnels_google_ads_conversions_show",
30418
+ "lionchat_funnels_google_ads_conversions_retry",
30419
+ "lionchat_google_ads_integrations_list",
30420
+ "lionchat_funnels_meta_events_config"
30421
+ ]
30422
+ },
30423
+ {
30424
+ "id": "lionchat_funnels_google_ads_conversions_show",
30425
+ "method": "GET",
30426
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/google_ads_conversions/{id}",
30427
+ "title": "Detalhe de um Evento Google Ads",
30428
+ "description": "SÓ LEITURA. Um evento Google Ads com os DADOS BRUTOS: payload_sent (o que foi mandado) e response_body (o que o provedor respondeu), ambos com dados sensíveis redigidos, mais response_status. É o bloco 'Ver detalhes' do histórico. 404 se o evento não for deste funil/conta.",
30429
+ "category": "Integracoes",
30430
+ "params": [
30431
+ {
30432
+ "name": "funnel_id",
30433
+ "type": "integer",
30434
+ "location": "path",
30435
+ "required": true,
30436
+ "description": "ID do funil"
30437
+ },
30438
+ {
30439
+ "name": "id",
30440
+ "type": "integer",
30441
+ "location": "path",
30442
+ "required": true,
30443
+ "description": "ID do evento"
30444
+ }
30445
+ ],
30446
+ "returns": "{id, event_name, event_id, status, trigger_type, failure_reason, created_at, sent_at, response_status, kanban_item_id, kanban_item_title, payload_sent, response_body} | 404",
30447
+ "common_use_cases": [
30448
+ "Ler a mensagem de erro exata do provedor",
30449
+ "Conferir que dados de usuário foram enviados"
30450
+ ],
30451
+ "related_tools": [
30452
+ "lionchat_funnels_google_ads_conversions_list",
30453
+ "lionchat_funnels_google_ads_conversions_retry"
30454
+ ]
30455
+ },
30456
+ {
30457
+ "id": "lionchat_funnels_google_ads_conversions_retry",
30458
+ "method": "POST",
30459
+ "path": "/api/v1/accounts/{account_id}/funnels/{funnel_id}/google_ads_conversions/{id}/retry",
30460
+ "title": "Reenviar Evento Google Ads falhado",
30461
+ "description": "AÇÃO DE ESCRITA. Reenfileira UM evento Google Ads com status 'failed' (volta pra pending e o job envia de novo). Só failed: qualquer outro status responde 422 {error:'not failed'}. 404 se não for deste funil.",
30462
+ "category": "Integracoes",
30463
+ "params": [
30464
+ {
30465
+ "name": "funnel_id",
30466
+ "type": "integer",
30467
+ "location": "path",
30468
+ "required": true,
30469
+ "description": "ID do funil"
30470
+ },
30471
+ {
30472
+ "name": "id",
30473
+ "type": "integer",
30474
+ "location": "path",
30475
+ "required": true,
30476
+ "description": "ID do evento falhado"
30477
+ }
30478
+ ],
30479
+ "returns": "200 {ok: true} | 422 {error:'not failed'} | 404 {error:'not found'}",
30480
+ "common_use_cases": [
30481
+ "Reenviar a conversão depois de corrigir o token/pixel"
30482
+ ],
30483
+ "related_tools": [
30484
+ "lionchat_funnels_google_ads_conversions_list",
30485
+ "lionchat_google_ads_integrations_list"
30486
+ ]
30487
+ },
30488
+ {
30489
+ "id": "lionchat_kanban_items_meta_capi_fire",
30490
+ "method": "POST",
30491
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/meta_capi/fire",
30492
+ "title": "Disparo manual de Conversão a partir do Card (Meta + GA4 + Google Ads)",
30493
+ "description": "AÇÃO DE ESCRITA com efeito externo — confirme com o usuário. Dispara MANUALMENTE um evento de conversão a partir de um card do Kanban nos TRÊS destinos de uma vez (Meta CAPI, GA4 e Google Ads); cada destino decide sozinho se está configurado/permitido e falhas individuais não derrubam os outros (destino sem integração volta null). O contato vem do card (item_details.contact_id), do contact_id informado, ou da 1ª conversa não-grupo vinculada — sem contato: 422 'contact not found'. event_name: letras/números/_ até 40 caracteres (422 'invalid event_name'). currency vale só pro Meta. Rate limit: 10/min por usuário e 100/hora por conta (429). Administrador ou cargo com marketing_integrations_manage.",
30494
+ "category": "Itens",
30495
+ "params": [
30496
+ {
30497
+ "name": "id",
30498
+ "type": "integer",
30499
+ "location": "path",
30500
+ "required": true,
30501
+ "description": "ID do card"
30502
+ },
30503
+ {
30504
+ "name": "event_name",
30505
+ "type": "string",
30506
+ "location": "body",
30507
+ "required": true,
30508
+ "description": "Nome do evento (ex.: Lead, Purchase, Schedule)"
30509
+ },
30510
+ {
30511
+ "name": "value",
30512
+ "type": "number",
30513
+ "location": "body",
30514
+ "required": false,
30515
+ "description": "Valor monetário do evento"
30516
+ },
30517
+ {
30518
+ "name": "currency",
30519
+ "type": "string",
30520
+ "location": "body",
30521
+ "required": false,
30522
+ "description": "Moeda ISO (ex.: BRL) — só o Meta usa"
30523
+ },
30524
+ {
30525
+ "name": "contact_id",
30526
+ "type": "integer",
30527
+ "location": "body",
30528
+ "required": false,
30529
+ "description": "Força o contato quando o card não tem contato vinculado"
30530
+ },
30531
+ {
30532
+ "name": "custom_data_extra",
30533
+ "type": "object",
30534
+ "location": "body",
30535
+ "required": false,
30536
+ "description": "Campos extras de custom_data (chave/valor)"
30537
+ }
30538
+ ],
30539
+ "returns": "200 {event_id, status (do Meta, compatibilidade), destinations: {meta_capi: {id, event_name, status}|null, ga4_mp: {...}|null, google_ads: {...}|null}} | 422 {error} | 429",
30540
+ "common_use_cases": [
30541
+ "Mandar a conversão de uma venda fechada fora do fluxo normal",
30542
+ "Testar o pixel com um card real"
30543
+ ],
30544
+ "related_tools": [
30545
+ "lionchat_funnels_meta_capi_events_list",
30546
+ "lionchat_funnels_ga4_events_list",
30547
+ "lionchat_funnels_google_ads_conversions_list",
30548
+ "lionchat_kanban_items_show"
30549
+ ],
30550
+ "confirm_required": true
30551
+ },
30552
+ {
30553
+ "id": "lionchat_kanban_items_ga4_mp_fire",
30554
+ "method": "POST",
30555
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/ga4_mp/fire",
30556
+ "title": "Disparo manual de Evento GA4 a partir do Card",
30557
+ "description": "AÇÃO DE ESCRITA com efeito externo — confirme com o usuário. Dispara SÓ no GA4 (Measurement Protocol) um evento a partir do card; event_name ausente = 'Lead'. Mesma resolução de contato do disparo Meta (card -> contact_id -> 1ª conversa não-grupo; 422 'contact not found'). Sem integração GA4 configurada, devolve event_id null. Administrador ou cargo com marketing_integrations_manage.",
30558
+ "category": "Itens",
30559
+ "params": [
30560
+ {
30561
+ "name": "id",
30562
+ "type": "integer",
30563
+ "location": "path",
30564
+ "required": true,
30565
+ "description": "ID do card"
30566
+ },
30567
+ {
30568
+ "name": "event_name",
30569
+ "type": "string",
30570
+ "location": "body",
30571
+ "required": false,
30572
+ "description": "Nome do evento (padrão Lead)"
30573
+ },
30574
+ {
30575
+ "name": "value",
30576
+ "type": "number",
30577
+ "location": "body",
30578
+ "required": false,
30579
+ "description": "Valor do evento"
30580
+ },
30581
+ {
30582
+ "name": "contact_id",
30583
+ "type": "integer",
30584
+ "location": "body",
30585
+ "required": false,
30586
+ "description": "Força o contato"
30587
+ },
30588
+ {
30589
+ "name": "custom_data_extra",
30590
+ "type": "object",
30591
+ "location": "body",
30592
+ "required": false,
30593
+ "description": "Parâmetros extras do evento"
30594
+ }
30595
+ ],
30596
+ "returns": "200 {event_id, status} | 422 {error}",
30597
+ "common_use_cases": [
30598
+ "Reenviar um evento GA4 de um card sem tocar no Meta"
30599
+ ],
30600
+ "related_tools": [
30601
+ "lionchat_funnels_ga4_events_list",
30602
+ "lionchat_ga4_integrations_list",
30603
+ "lionchat_kanban_items_meta_capi_fire"
30604
+ ],
30605
+ "confirm_required": true
30606
+ },
30607
+ {
30608
+ "id": "lionchat_kanban_items_google_ads_fire",
30609
+ "method": "POST",
30610
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/google_ads/fire",
30611
+ "title": "Disparo manual de Conversão Google Ads a partir do Card",
30612
+ "description": "AÇÃO DE ESCRITA com efeito externo — confirme com o usuário. Dispara SÓ no Google Ads uma conversão a partir do card; event_name ausente = 'Lead'. Mesma resolução de contato (422 'contact not found'). Sem integração Google Ads, devolve conversão nula. Administrador ou cargo com marketing_integrations_manage.",
30613
+ "category": "Itens",
30614
+ "params": [
30615
+ {
30616
+ "name": "id",
30617
+ "type": "integer",
30618
+ "location": "path",
30619
+ "required": true,
30620
+ "description": "ID do card"
30621
+ },
30622
+ {
30623
+ "name": "event_name",
30624
+ "type": "string",
30625
+ "location": "body",
30626
+ "required": false,
30627
+ "description": "Nome da ação de conversão (padrão Lead)"
30628
+ },
30629
+ {
30630
+ "name": "value",
30631
+ "type": "number",
30632
+ "location": "body",
30633
+ "required": false,
30634
+ "description": "Valor da conversão"
30635
+ },
30636
+ {
30637
+ "name": "contact_id",
30638
+ "type": "integer",
30639
+ "location": "body",
30640
+ "required": false,
30641
+ "description": "Força o contato"
30642
+ },
30643
+ {
30644
+ "name": "custom_data_extra",
30645
+ "type": "object",
30646
+ "location": "body",
30647
+ "required": false,
30648
+ "description": "Dados extras"
30649
+ }
30650
+ ],
30651
+ "returns": "200 {conversion_id, status} | 422 {error}",
30652
+ "common_use_cases": [
30653
+ "Registrar a conversão offline de um card no Google Ads"
30654
+ ],
30655
+ "related_tools": [
30656
+ "lionchat_funnels_google_ads_conversions_list",
30657
+ "lionchat_google_ads_integrations_list",
30658
+ "lionchat_kanban_items_meta_capi_fire"
30659
+ ],
30660
+ "confirm_required": true
30661
+ },
30662
+ {
30663
+ "id": "lionchat_kanban_items_recapture_attribution",
30664
+ "method": "POST",
30665
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/recapture_attribution",
30666
+ "title": "Recapturar Atribuição (LionTrack) do Card",
30667
+ "description": "AÇÃO DE ESCRITA. Refaz a foto de atribuição do card (item_details.tracking_attributes) a partir do estado ATUAL: conversa + contato + último evento de rastreamento. Sobrescreve a foto anterior. Útil pra cards criados antes do rastreador funcionar ou quando a origem foi corrigida no contato. Precisa de permissão de edição do card.",
30668
+ "category": "Itens",
30669
+ "params": [
30670
+ {
30671
+ "name": "id",
30672
+ "type": "integer",
30673
+ "location": "path",
30674
+ "required": true,
30675
+ "description": "ID do card"
30676
+ }
30677
+ ],
30678
+ "returns": "200 {tracking_attributes: {origin_*, utm_*, fbclid, gclid, ...}}",
30679
+ "common_use_cases": [
30680
+ "Consertar a origem de um card antigo pro relatório de origem"
30681
+ ],
30682
+ "related_tools": [
30683
+ "lionchat_kanban_items_show",
30684
+ "lionchat_contacts_tracking_events_debug_timeline",
30685
+ "lionchat_contacts_set_origin"
30686
+ ]
30687
+ },
30688
+ {
30689
+ "id": "lionchat_google_calendar_reactivate",
30690
+ "method": "POST",
30691
+ "path": "/api/v1/accounts/{account_id}/google_calendar/reactivate",
30692
+ "title": "Reativar a sincronização do Google Calendar",
30693
+ "description": "AÇÃO DE ESCRITA. O botão 'Tentar novamente' do aviso amarelo da Agenda: tenta renovar o token, refazer a assinatura de mudanças (watch) se expirou e recuperar tarefas órfãs. 1 tentativa a cada 30 segundos por usuário (429 'Aguarde alguns segundos'). Se não reativar, 422 com message e requires_reconnect=true quando o token foi REVOGADO — aí só reconectar (lionchat_google_calendar_list_1).",
30694
+ "category": "Google Calendar",
30695
+ "params": [],
30696
+ "returns": "200 {success: true, sync_enabled: true} | 422 {success: false, requires_reconnect: bool, message} | 429 {success: false, message}",
30697
+ "common_use_cases": [
30698
+ "Religar a Agenda depois de um erro de sincronização sem reconectar a conta Google"
30699
+ ],
30700
+ "related_tools": [
30701
+ "lionchat_google_calendar_list",
30702
+ "lionchat_google_calendar_list_1",
30703
+ "lionchat_google_calendar_create_1"
30704
+ ]
30705
+ },
30706
+ {
30707
+ "id": "lionchat_google_contacts_status",
30708
+ "method": "GET",
30709
+ "path": "/api/v1/accounts/{account_id}/google_contacts/status",
30710
+ "title": "Status da Integração Google Contatos",
30711
+ "description": "SÓ LEITURA. Estado da conexão única da conta com o Google Contatos: conta Google conectada, sincronização ligada, último erro (sync_error/sync_error_code) e o andamento do envio em lote (backfill_status/total/done/skipped). {connected: false} quando nunca foi conectado. Somente administrador.",
30712
+ "category": "Integracoes",
30713
+ "params": [],
30714
+ "returns": "{connected: false} | {connected: true, google_email, sync_enabled, sync_error, sync_error_code, backfill_status, backfill_total, backfill_done, backfill_skipped}",
30715
+ "common_use_cases": [
30716
+ "Conferir se os contatos estão indo pro Google",
30717
+ "Acompanhar o envio em lote"
30718
+ ],
30719
+ "related_tools": [
30720
+ "lionchat_google_contacts_connect",
30721
+ "lionchat_google_contacts_toggle_sync",
30722
+ "lionchat_google_contacts_backfill",
30723
+ "lionchat_google_contacts_disconnect"
30724
+ ]
30725
+ },
30726
+ {
30727
+ "id": "lionchat_google_contacts_connect",
30728
+ "method": "GET",
30729
+ "path": "/api/v1/accounts/{account_id}/google_contacts/connect",
30730
+ "title": "Conectar Google Contatos (link de autorização)",
30731
+ "description": "Gera o LINK de autorização do Google pra conectar a conta de Contatos — não conecta sozinho: a pessoa precisa abrir auth_url no navegador e autorizar. Uma conexão por conta LionChat. 412 se as credenciais do Google não estiverem configuradas na instalação ('Contate o suporte'). Somente administrador.",
30732
+ "category": "Integracoes",
30733
+ "params": [],
30734
+ "returns": "{auth_url} | 412 {error}",
30735
+ "common_use_cases": [
30736
+ "Entregar ao cliente o link pra autorizar o Google Contatos"
30737
+ ],
30738
+ "related_tools": [
30739
+ "lionchat_google_contacts_status",
30740
+ "lionchat_google_calendar_list_1"
30741
+ ]
30742
+ },
30743
+ {
30744
+ "id": "lionchat_google_contacts_disconnect",
30745
+ "method": "DELETE",
30746
+ "path": "/api/v1/accounts/{account_id}/google_contacts/disconnect",
30747
+ "title": "Desconectar Google Contatos",
30748
+ "description": "AÇÃO DE ESCRITA IRREVERSÍVEL — confirme com o usuário. Revoga a autorização no Google e remove a conexão; os contatos já enviados ficam no Google. 404 'Nenhuma conexao encontrada' sem conexão. Somente administrador.",
30749
+ "category": "Integracoes",
30750
+ "params": [],
30751
+ "returns": "200 {success: true} | 404 {error}",
30752
+ "common_use_cases": [
30753
+ "Trocar a conta Google usada pela integração"
30754
+ ],
30755
+ "related_tools": [
30756
+ "lionchat_google_contacts_status",
30757
+ "lionchat_google_contacts_connect"
30758
+ ],
30759
+ "confirm_required": true
30760
+ },
30761
+ {
30762
+ "id": "lionchat_google_contacts_toggle_sync",
30763
+ "method": "POST",
30764
+ "path": "/api/v1/accounts/{account_id}/google_contacts/toggle_sync",
30765
+ "title": "Ligar/Desligar a sincronização do Google Contatos",
30766
+ "description": "AÇÃO DE ESCRITA. ALTERNA o estado (ligado vira desligado e vice-versa — confira antes em status) e limpa o último erro. Sem corpo. 404 sem conexão. Somente administrador.",
30767
+ "category": "Integracoes",
30768
+ "params": [],
30769
+ "returns": "200 {sync_enabled: bool} | 404 {error}",
30770
+ "common_use_cases": [
30771
+ "Pausar o envio de contatos pro Google"
30772
+ ],
30773
+ "related_tools": [
30774
+ "lionchat_google_contacts_status"
30775
+ ]
30776
+ },
30777
+ {
30778
+ "id": "lionchat_google_contacts_backfill",
30779
+ "method": "POST",
30780
+ "path": "/api/v1/accounts/{account_id}/google_contacts/backfill",
30781
+ "title": "Enviar contatos existentes pro Google (lote)",
30782
+ "description": "AÇÃO DE ESCRITA em segundo plano. Dispara o envio em lote dos contatos já existentes pro Google Contatos; acompanhe por status (backfill_status/total/done/skipped). Um lote por vez por conta: 422 'Envio ja em andamento'. 404 sem conexão. Somente administrador.",
30783
+ "category": "Integracoes",
30784
+ "params": [],
30785
+ "returns": "200 {success: true} | 422 {error} | 404 {error}",
30786
+ "common_use_cases": [
30787
+ "Levar a base inteira pro Google logo depois de conectar"
30788
+ ],
30789
+ "related_tools": [
30790
+ "lionchat_google_contacts_status",
30791
+ "lionchat_google_contacts_toggle_sync"
30792
+ ]
30793
+ },
30794
+ {
30795
+ "id": "lionchat_greenn_webhooks_list",
30796
+ "method": "GET",
30797
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks",
30798
+ "title": "Listar Integracoes Greenn",
30799
+ "description": "Retorna a(s) configuração(ões) de webhook Greenn (8ª plataforma de pagamento, ao lado de Guru, Hotmart, Kiwify, Ticto, Eduzz, Monetizze e Webhook Universal). Somente administrador.",
30800
+ "category": "Integracoes E-commerce",
30801
+ "params": [],
30802
+ "returns": "array de configurações de webhook (id, name, inbox_id, active, events, event_automation_mapping, webhook_url, ...)",
30803
+ "common_use_cases": [
30804
+ "Dashboard: contar/exibir integrações de pagamento",
30805
+ "Achar o id antes de ver eventos"
30806
+ ],
30807
+ "related_tools": [
30808
+ "lionchat_greenn_webhooks_create",
30809
+ "lionchat_greenn_webhooks_show",
30810
+ "lionchat_ecommerce_webhooks_list_2"
30811
+ ]
30812
+ },
30813
+ {
30814
+ "id": "lionchat_greenn_webhooks_create",
30815
+ "method": "POST",
30816
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks",
30817
+ "title": "Criar Integracao Greenn",
30818
+ "description": "AÇÃO DE ESCRITA. Cria a integração de webhook Greenn. O mapeamento evento->automação/fluxo é validado: automation_id/flow_id de outra conta = 422. Depois de criar, cadastre a webhook_url devolvida no painel da Greenn. Somente administrador.",
30819
+ "category": "Integracoes E-commerce",
30820
+ "params": [
30821
+ {
30822
+ "name": "name",
30823
+ "type": "string",
30824
+ "location": "body",
30825
+ "required": true,
30826
+ "description": "Nome da integração"
30827
+ },
30828
+ {
30829
+ "name": "greenn_token",
30830
+ "type": "string",
30831
+ "location": "body",
30832
+ "required": false,
30833
+ "description": "Token do webhook da Greenn (valida a assinatura do que chega)"
30834
+ },
30835
+ {
30836
+ "name": "inbox_id",
30837
+ "type": "integer",
30838
+ "location": "body",
30839
+ "required": false,
30840
+ "description": "Caixa onde a conversa do comprador é aberta"
30841
+ },
30842
+ {
30843
+ "name": "active",
30844
+ "type": "boolean",
30845
+ "location": "body",
30846
+ "required": false,
30847
+ "description": "Integração ativa"
30848
+ },
30849
+ {
30850
+ "name": "events",
30851
+ "type": "array",
30852
+ "location": "body",
30853
+ "required": false,
30854
+ "description": "Eventos a processar"
30855
+ },
30856
+ {
30857
+ "name": "event_automation_mapping",
30858
+ "type": "object",
30859
+ "location": "body",
30860
+ "required": false,
30861
+ "description": "Mapeamento evento -> {automation_id | flow_id, first_purchase_only?: bool (pula renovações), conversation_attribute_keys?: [chaves de atributo de conversa a preencher, respeitando o tipo]} — ids precisam ser desta conta (422)"
30862
+ }
30863
+ ],
30864
+ "returns": "webhook criado (com novo ID e webhook_url)",
30865
+ "common_use_cases": [
30866
+ "Cadastro inicial da integração Greenn",
30867
+ "Automação a partir de compra aprovada"
30868
+ ],
30869
+ "related_tools": [
30870
+ "lionchat_greenn_webhooks_list",
30871
+ "lionchat_greenn_webhooks_update"
30872
+ ],
30873
+ "body_wrapper": "greenn_webhook"
30874
+ },
30875
+ {
30876
+ "id": "lionchat_greenn_webhooks_show",
30877
+ "method": "GET",
30878
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}",
30879
+ "title": "Detalhes Integracao Greenn",
30880
+ "description": "SÓ LEITURA. Detalhes da integração de webhook Greenn, com o mapeamento de eventos. Somente administrador.",
30881
+ "category": "Integracoes E-commerce",
30882
+ "params": [
30883
+ {
30884
+ "name": "id",
30885
+ "type": "integer",
30886
+ "location": "path",
30887
+ "required": true,
30888
+ "description": "ID da integração"
30889
+ }
30890
+ ],
30891
+ "returns": "webhook",
30892
+ "common_use_cases": [
30893
+ "Ver dados completos antes de editar"
30894
+ ],
30895
+ "related_tools": [
30896
+ "lionchat_greenn_webhooks_list",
30897
+ "lionchat_greenn_webhooks_update"
30898
+ ]
30899
+ },
30900
+ {
30901
+ "id": "lionchat_greenn_webhooks_update",
30902
+ "method": "PATCH",
30903
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}",
30904
+ "title": "Atualizar Integracao Greenn",
30905
+ "description": "AÇÃO DE ESCRITA. Atualização parcial da integração Greenn (só o que for enviado). event_automation_mapping enviado SUBSTITUI o objeto inteiro — mande o mapa completo. Ids de automação/fluxo de outra conta = 422. Somente administrador.",
30906
+ "category": "Integracoes E-commerce",
30907
+ "params": [
30908
+ {
30909
+ "name": "id",
30910
+ "type": "integer",
30911
+ "location": "path",
30912
+ "required": true,
30913
+ "description": "ID da integração"
30914
+ },
30915
+ {
30916
+ "name": "name",
30917
+ "type": "string",
30918
+ "location": "body",
30919
+ "required": false,
30920
+ "description": "Nome da integração"
30921
+ },
30922
+ {
30923
+ "name": "greenn_token",
30924
+ "type": "string",
30925
+ "location": "body",
30926
+ "required": false,
30927
+ "description": "Token do webhook da Greenn (valida a assinatura do que chega)"
30928
+ },
30929
+ {
30930
+ "name": "inbox_id",
30931
+ "type": "integer",
30932
+ "location": "body",
30933
+ "required": false,
30934
+ "description": "Caixa onde a conversa do comprador é aberta"
30935
+ },
30936
+ {
30937
+ "name": "active",
30938
+ "type": "boolean",
30939
+ "location": "body",
30940
+ "required": false,
30941
+ "description": "Integração ativa"
30942
+ },
30943
+ {
30944
+ "name": "events",
30945
+ "type": "array",
30946
+ "location": "body",
30947
+ "required": false,
30948
+ "description": "Eventos a processar"
30949
+ },
30950
+ {
30951
+ "name": "event_automation_mapping",
30952
+ "type": "object",
30953
+ "location": "body",
30954
+ "required": false,
30955
+ "description": "Mapeamento evento -> {automation_id | flow_id, first_purchase_only?: bool (pula renovações), conversation_attribute_keys?: [chaves de atributo de conversa a preencher, respeitando o tipo]} — ids precisam ser desta conta (422)"
30956
+ }
30957
+ ],
30958
+ "returns": "webhook atualizado",
30959
+ "common_use_cases": [
30960
+ "Trocar a caixa de destino",
30961
+ "Ligar/desligar a integração",
30962
+ "Apontar evento pra outro fluxo"
30963
+ ],
30964
+ "related_tools": [
30965
+ "lionchat_greenn_webhooks_show",
30966
+ "lionchat_greenn_webhooks_list"
30967
+ ],
30968
+ "body_wrapper": "greenn_webhook"
30969
+ },
30970
+ {
30971
+ "id": "lionchat_greenn_webhooks_destroy",
30972
+ "method": "DELETE",
30973
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}",
30974
+ "title": "Excluir Integracao Greenn",
30975
+ "description": "AÇÃO DE ESCRITA IRREVERSÍVEL — confirme com o usuário. Remove a integração Greenn e o histórico de eventos dela. Somente administrador.",
30976
+ "category": "Integracoes E-commerce",
30977
+ "params": [
30978
+ {
30979
+ "name": "id",
30980
+ "type": "integer",
30981
+ "location": "path",
30982
+ "required": true,
30983
+ "description": "ID da integração"
30984
+ }
30985
+ ],
30986
+ "returns": "200 sem corpo",
30987
+ "common_use_cases": [
30988
+ "Remoção após confirmação do cliente"
30989
+ ],
30990
+ "related_tools": [
30991
+ "lionchat_greenn_webhooks_list"
30992
+ ],
30993
+ "confirm_required": true
30994
+ },
30995
+ {
30996
+ "id": "lionchat_greenn_webhooks_events",
30997
+ "method": "GET",
30998
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}/events",
30999
+ "title": "Eventos Greenn",
31000
+ "description": "SÓ LEITURA. Últimos 50 eventos recebidos da Greenn nos últimos 7 dias (mais novos primeiro) com tipo, status do evento na Greenn, situação do processamento (pending/processed/failed/rejected/skipped), erro e o payload bruto. Somente administrador.",
31001
+ "category": "Integracoes E-commerce",
31002
+ "params": [
31003
+ {
31004
+ "name": "id",
31005
+ "type": "integer",
31006
+ "location": "path",
31007
+ "required": true,
31008
+ "description": "ID da integração"
31009
+ }
31010
+ ],
31011
+ "returns": "array de eventos: [{id, event_type, event_status, processing_status, error_message, payload, created_at}]",
31012
+ "common_use_cases": [
31013
+ "Auditar se a compra chegou",
31014
+ "Achar o evento falhado pra reprocessar"
31015
+ ],
31016
+ "related_tools": [
31017
+ "lionchat_greenn_webhooks_retry_event",
31018
+ "lionchat_greenn_webhooks_retry_preflight"
31019
+ ]
31020
+ },
31021
+ {
31022
+ "id": "lionchat_greenn_webhooks_retry_event",
31023
+ "method": "POST",
31024
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}/events/{event_id}/retry",
31025
+ "title": "Reprocessar Evento Greenn",
31026
+ "description": "AÇÃO DE ESCRITA. Reprocessa um evento com processing_status failed, rejected OU processed (reprocessar um já processado pode repetir ações do mapeamento — use lionchat_greenn_webhooks_retry_preflight antes). Outros status: 422. Somente administrador.",
31027
+ "category": "Integracoes E-commerce",
31028
+ "params": [
31029
+ {
31030
+ "name": "id",
31031
+ "type": "integer",
31032
+ "location": "path",
31033
+ "required": true,
31034
+ "description": "ID da integração"
31035
+ },
31036
+ {
31037
+ "name": "event_id",
31038
+ "type": "integer",
31039
+ "location": "path",
31040
+ "required": true,
31041
+ "description": "ID do evento"
31042
+ }
31043
+ ],
31044
+ "returns": "200 {success: true} | 422 {error}",
31045
+ "common_use_cases": [
31046
+ "Reprocessar a compra que falhou por fluxo desligado"
31047
+ ],
31048
+ "related_tools": [
31049
+ "lionchat_greenn_webhooks_events",
31050
+ "lionchat_greenn_webhooks_retry_preflight"
31051
+ ]
31052
+ },
31053
+ {
31054
+ "id": "lionchat_greenn_webhooks_retry_preflight",
31055
+ "method": "GET",
31056
+ "path": "/api/v1/accounts/{account_id}/greenn_webhooks/{id}/events/{event_id}/retry_preflight",
31057
+ "title": "Pre-verificacao Retry Greenn",
31058
+ "description": "SÓ LEITURA. Antes de reprocessar: diz se já existe OUTRO evento processado com a mesma transação (has_duplicate) e quando foi — reprocessar nesse caso repetiria a venda. Somente administrador.",
31059
+ "category": "Integracoes E-commerce",
31060
+ "params": [
31061
+ {
31062
+ "name": "id",
31063
+ "type": "integer",
31064
+ "location": "path",
31065
+ "required": true,
31066
+ "description": "ID da integração"
31067
+ },
31068
+ {
31069
+ "name": "event_id",
31070
+ "type": "integer",
31071
+ "location": "path",
31072
+ "required": true,
31073
+ "description": "ID do evento"
31074
+ }
31075
+ ],
31076
+ "returns": "{has_duplicate: bool, duplicate_processed_at: ISO|null}",
31077
+ "common_use_cases": [
31078
+ "Evitar reprocessar uma transação já contabilizada"
31079
+ ],
31080
+ "related_tools": [
31081
+ "lionchat_greenn_webhooks_retry_event",
31082
+ "lionchat_greenn_webhooks_events"
31083
+ ]
31084
+ },
31085
+ {
31086
+ "id": "lionchat_inboxes_health",
31087
+ "method": "GET",
31088
+ "path": "/api/v1/accounts/{account_id}/inboxes/{id}/health",
31089
+ "title": "Saúde da Caixa WhatsApp Oficial (por que o número não envia)",
31090
+ "description": "Painel de saúde de uma caixa WhatsApp CLOUD (API oficial): o veredito da Meta (health_status.can_send_message AVAILABLE/LIMITED/BLOCKED com os motivos, ex. verificação de empresa pendente), nota de qualidade (quality_rating/quality_score), faixa de limite diário (messaging_limit_tier) e quanto já foi usado nas últimas 24h (limit_usage cap/used_24h/remaining), status do nome, modo da conta, throughput, webhook configurado x esperado (expected_webhook_url) e o resumo das FALHAS de envio das últimas 24h por classe (failures_24h.reasons — pode trazer account_locked = bloqueio por pagamento 131031, nunca reenviável; truncated quando passa de 500). ATENÇÃO: este GET ESCREVE um efeito colateral desejado — quando a Meta diz AVAILABLE ele LIMPA o bloqueio por pagamento (whatsapp_send_blocked_billing) da caixa; é o único jeito de limpar sem um template OK. 400 em caixa que não é Cloud; 422 quando a Meta não responde (error com a mensagem).",
31091
+ "category": "Caixas de Entrada",
31092
+ "params": [
31093
+ {
31094
+ "name": "id",
31095
+ "type": "integer",
31096
+ "location": "path",
31097
+ "required": true,
31098
+ "description": "ID da caixa WhatsApp Cloud"
31099
+ }
31100
+ ],
31101
+ "returns": "{id, display_phone_number, verified_name, name_status, quality_rating, quality_score, messaging_limit_tier, account_mode, code_verification_status, webhook_configuration, expected_webhook_url, throughput, last_onboarded_time, platform_type, certificate, business_id, health_status: {can_send_message, entities[]...}, is_official_business_account, limit_usage: {cap, used_24h, remaining}, failures_24h: {total, reasons: {classe: n}, truncated}} | 400 | 422 {error}",
31102
+ "common_use_cases": [
31103
+ "Responder 'por que meu número não envia?' com o veredito da Meta em vez de chutar",
31104
+ "Ver quanto do limite diário já foi consumido antes de uma campanha",
31105
+ "Destravar a caixa após regularizar o pagamento na Meta"
31106
+ ],
31107
+ "related_tools": [
31108
+ "lionchat_inboxes_show",
31109
+ "lionchat_inboxes_failed_messages_summary",
31110
+ "lionchat_inboxes_register_webhook",
31111
+ "lionchat_campaigns_estimate_audience"
31112
+ ]
31113
+ },
31114
+ {
31115
+ "id": "lionchat_inboxes_register_webhook",
31116
+ "method": "POST",
31117
+ "path": "/api/v1/accounts/{account_id}/inboxes/{id}/register_webhook",
31118
+ "title": "Registrar de novo o Webhook da caixa WhatsApp Oficial",
31119
+ "description": "AÇÃO DE ESCRITA de reparo. Refaz na Meta a assinatura do webhook desta caixa WhatsApp Cloud (o endereço que a Meta chama pra entregar mensagens). Use quando a caixa parou de RECEBER e lionchat_inboxes_health mostra webhook_configuration diferente de expected_webhook_url. Não mexe em token nem em número. 400 em caixa que não é Cloud; 422 com a mensagem da Meta quando falha. Somente administrador.",
31120
+ "category": "Caixas de Entrada",
31121
+ "params": [
31122
+ {
31123
+ "name": "id",
31124
+ "type": "integer",
31125
+ "location": "path",
31126
+ "required": true,
31127
+ "description": "ID da caixa WhatsApp Cloud"
31128
+ }
31129
+ ],
31130
+ "returns": "200 {message: 'Webhook registered successfully'} | 400 | 422 {error}",
31131
+ "common_use_cases": [
31132
+ "Consertar caixa oficial que não recebe mensagens"
31133
+ ],
31134
+ "related_tools": [
31135
+ "lionchat_inboxes_health",
31136
+ "lionchat_inboxes_show"
31137
+ ]
31138
+ },
31139
+ {
31140
+ "id": "lionchat_inboxes_waha_connect",
31141
+ "method": "POST",
31142
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha/connect",
31143
+ "title": "Conectar/Iniciar a sessão WhatsApp QR Code (WAHA)",
31144
+ "description": "AÇÃO DE ESCRITA. Inicia (ou reinicia) a sessão WhatsApp QR Code da caixa no servidor WAHA e a deixa pronta pra ler o QR. Idempotente: se a sessão já está STARTING, SCAN_QR_CODE ou WORKING devolve o estado atual sem recriar. Apaga a marca de 'desconectada de propósito' (a caixa volta a ser elegível ao religamento automático) e reaproveita o mesmo proxy/IP quando a caixa já tinha um. Depois de chamar, o QR vem por lionchat_inboxes_waha_qrcode e a leitura precisa ser feita no CELULAR do cliente — o MCP não conclui o pareamento. 422 com a mensagem do WAHA quando falha. Somente administrador.",
31145
+ "category": "Caixas de Entrada",
31146
+ "params": [
31147
+ {
31148
+ "name": "inbox_id",
31149
+ "type": "integer",
31150
+ "location": "path",
31151
+ "required": true,
31152
+ "description": "ID da caixa WhatsApp QR Code"
31153
+ }
31154
+ ],
31155
+ "returns": "200 {status: 'starting'|'STARTING'|'SCAN_QR_CODE'|'WORKING', session_name, result} | 422 {error}",
31156
+ "common_use_cases": [
31157
+ "Religar uma caixa QR que ficou STOPPED/FAILED",
31158
+ "Preparar a caixa pra um novo pareamento"
31159
+ ],
31160
+ "related_tools": [
31161
+ "lionchat_inboxes_waha_status",
31162
+ "lionchat_inboxes_waha_qrcode"
31163
+ ]
31164
+ },
31165
+ {
31166
+ "id": "lionchat_inboxes_waha_qrcode",
31167
+ "method": "GET",
31168
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha/qrcode",
31169
+ "title": "QR Code da sessão WhatsApp (WAHA)",
31170
+ "description": "SÓ LEITURA. Devolve o QR Code atual da sessão em formato RAW (value = o TEXTO do QR, não uma imagem): pra escanear é preciso transformar esse texto em imagem de QR. Só faz sentido com a sessão em SCAN_QR_CODE (confira em lionchat_inboxes_waha_status); em outros estados o WAHA responde erro (422). O QR expira em ~20-60 segundos — chame de novo se o cliente demorar. Somente administrador.",
31171
+ "category": "Caixas de Entrada",
31172
+ "params": [
31173
+ {
31174
+ "name": "inbox_id",
31175
+ "type": "integer",
31176
+ "location": "path",
31177
+ "required": true,
31178
+ "description": "ID da caixa WhatsApp QR Code"
31179
+ }
31180
+ ],
31181
+ "returns": "{value: '<texto do QR>'} | 422 {error}",
31182
+ "common_use_cases": [
31183
+ "Gerar o QR pra um cliente parear o número"
31184
+ ],
31185
+ "related_tools": [
31186
+ "lionchat_inboxes_waha_connect",
31187
+ "lionchat_inboxes_waha_status"
31188
+ ]
31189
+ },
31190
+ {
31191
+ "id": "lionchat_inboxes_waha_import_history",
31192
+ "method": "POST",
31193
+ "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/waha/import_history",
31194
+ "title": "Puxar Histórico de conversas da caixa WhatsApp QR (iniciar)",
31195
+ "description": "AÇÃO DE ESCRITA pesada em segundo plano. Inicia a importação do histórico de conversas do aparelho pra caixa QR Code (WAHA), dos últimos N dias (1 a 90). O texto entra em conversas de HISTÓRICO separadas (encerradas, datadas no passado, sem acordar IA/automação); a mídia vai pra uma fila de espera e chega depois (bolha âmbar 'chegando'; vermelha = o WhatsApp já apagou o arquivo, não volta). Uma rodada por vez: 409 se já está importando, pausada ou aguardando retomada; 403 se foi cancelada pelo suporte ou se já houve importação CONCLUÍDA com dados (reimportar é só pelo Super Admin); 429 se acabou de ser pedida (aguarde alguns segundos). Acompanhe por lionchat_inboxes_waha_import_status. Somente administrador.",
31196
+ "category": "Caixas de Entrada",
31197
+ "params": [
31198
+ {
31199
+ "name": "inbox_id",
31200
+ "type": "integer",
31201
+ "location": "path",
31202
+ "required": true,
31203
+ "description": "ID da caixa WhatsApp QR Code"
31204
+ },
31205
+ {
31206
+ "name": "days",
31207
+ "type": "integer",
31208
+ "location": "body",
31209
+ "required": false,
31210
+ "description": "Quantos dias pra trás (1 a 90; fora da faixa é ajustado)"
31211
+ }
31212
+ ],
31213
+ "returns": "200 {status: 'started', days} | 409 {error} | 403 {error} | 429 {error}",
31214
+ "common_use_cases": [
31215
+ "Trazer as conversas antigas de um número recém-conectado"
31216
+ ],
31217
+ "related_tools": [
31218
+ "lionchat_inboxes_waha_import_status",
31219
+ "lionchat_inboxes_waha_status",
31220
+ "lionchat_inboxes_whatsapp_history_start"
31221
+ ]
31222
+ },
31223
+ {
31224
+ "id": "lionchat_lead_origins_list",
31225
+ "method": "GET",
31226
+ "path": "/api/v1/accounts/{account_id}/lead_origins",
31227
+ "title": "Listar Origens de Lead personalizadas",
31228
+ "description": "SÓ LEITURA. As origens de lead PERSONALIZADAS da conta (Configurações > Origens de Lead), ativas e inativas, em ordem alfabética. O valor usado em lionchat_contacts_set_origin e nos relatórios é custom:<slug>. Qualquer agente.",
31229
+ "category": "Contatos",
31230
+ "params": [],
31231
+ "returns": "[{id, name, slug, color, active}]",
31232
+ "common_use_cases": [
31233
+ "Descobrir o slug antes de marcar a origem de um contato",
31234
+ "Listar as origens disponíveis no relatório"
31235
+ ],
31236
+ "related_tools": [
31237
+ "lionchat_lead_origins_create",
31238
+ "lionchat_contacts_set_origin",
31239
+ "lionchat_lead_origin_reports"
31240
+ ]
31241
+ },
31242
+ {
31243
+ "id": "lionchat_lead_origins_create",
31244
+ "method": "POST",
31245
+ "path": "/api/v1/accounts/{account_id}/lead_origins",
31246
+ "title": "Criar Origem de Lead personalizada",
31247
+ "description": "AÇÃO DE ESCRITA. Cria uma origem personalizada (nome até 60 caracteres; slug gerado do nome e IMUTÁVEL). Se já existir origem com o mesmo slug (inclusive inativa), REATIVA e atualiza nome/cor em vez de duplicar. color no formato #RRGGBB (opcional). Somente administrador.",
31248
+ "category": "Contatos",
31249
+ "params": [
31250
+ {
31251
+ "name": "name",
31252
+ "type": "string",
31253
+ "location": "body",
31254
+ "required": true,
31255
+ "description": "Nome da origem (até 60)"
31256
+ },
31257
+ {
31258
+ "name": "color",
31259
+ "type": "string",
31260
+ "location": "body",
31261
+ "required": false,
31262
+ "description": "Cor #RRGGBB"
31263
+ }
31264
+ ],
31265
+ "returns": "{id, name, slug, color, active: true}",
31266
+ "common_use_cases": [
31267
+ "Cadastrar 'Indicação' ou 'Evento' como origem marcável"
31268
+ ],
31269
+ "related_tools": [
31270
+ "lionchat_lead_origins_list",
31271
+ "lionchat_contacts_set_origin"
31272
+ ],
31273
+ "body_wrapper": "lead_origin"
31274
+ },
31275
+ {
31276
+ "id": "lionchat_lead_origins_update",
31277
+ "method": "PATCH",
31278
+ "path": "/api/v1/accounts/{account_id}/lead_origins/{id}",
31279
+ "title": "Atualizar Origem de Lead personalizada",
31280
+ "description": "AÇÃO DE ESCRITA. Altera nome, cor e/ou active de uma origem. O slug NÃO muda (o histórico dos leads referencia custom:<slug>). Somente administrador.",
31281
+ "category": "Contatos",
31282
+ "params": [
31283
+ {
31284
+ "name": "id",
31285
+ "type": "integer",
31286
+ "location": "path",
31287
+ "required": true,
31288
+ "description": "ID da origem"
31289
+ },
31290
+ {
31291
+ "name": "name",
31292
+ "type": "string",
31293
+ "location": "body",
31294
+ "required": false,
31295
+ "description": "Novo nome"
31296
+ },
31297
+ {
31298
+ "name": "color",
31299
+ "type": "string",
31300
+ "location": "body",
31301
+ "required": false,
31302
+ "description": "Cor #RRGGBB"
31303
+ },
31304
+ {
31305
+ "name": "active",
31306
+ "type": "boolean",
31307
+ "location": "body",
31308
+ "required": false,
31309
+ "description": "Reativar (true) ou desativar (false)"
31310
+ }
31311
+ ],
31312
+ "returns": "{id, name, slug, color, active}",
31313
+ "common_use_cases": [
31314
+ "Renomear uma origem",
31315
+ "Reativar uma origem desativada"
31316
+ ],
31317
+ "related_tools": [
31318
+ "lionchat_lead_origins_list",
31319
+ "lionchat_lead_origins_destroy"
31320
+ ],
31321
+ "body_wrapper": "lead_origin"
31322
+ },
31323
+ {
31324
+ "id": "lionchat_lead_origins_destroy",
31325
+ "method": "DELETE",
31326
+ "path": "/api/v1/accounts/{account_id}/lead_origins/{id}",
31327
+ "title": "Desativar Origem de Lead personalizada",
31328
+ "description": "AÇÃO DE ESCRITA. 'Excluir' = DESATIVAR (active: false): a origem some das opções de marcação mas o histórico e os relatórios antigos continuam. Pra voltar, crie de novo com o mesmo nome ou use update active=true. Somente administrador.",
31329
+ "category": "Contatos",
31330
+ "params": [
31331
+ {
31332
+ "name": "id",
31333
+ "type": "integer",
31334
+ "location": "path",
31335
+ "required": true,
31336
+ "description": "ID da origem"
31337
+ }
31338
+ ],
31339
+ "returns": "200 sem corpo",
31340
+ "common_use_cases": [
31341
+ "Tirar uma origem que não é mais usada das opções"
31342
+ ],
31343
+ "related_tools": [
31344
+ "lionchat_lead_origins_list",
31345
+ "lionchat_lead_origins_update"
31346
+ ]
31347
+ },
31348
+ {
31349
+ "id": "lionchat_meta_lead_refresh_sample",
31350
+ "method": "POST",
31351
+ "path": "/api/v1/accounts/{account_id}/integrations/meta_lead_forms/{id}/refresh_sample",
31352
+ "title": "Buscar campos do formulário no Meta (amostra)",
31353
+ "description": "AÇÃO DE ESCRITA leve. O botão 'Buscar campos do Meta': atualiza a AMOSTRA de payload do formulário de Lead Ads pra destravar o mapeamento de campos — tenta, em cascata, o último evento em cache, o último lead do formulário, os leads via Graph API e, por fim, as perguntas do formulário (refresh_source diz qual fonte venceu). Se o formulário ainda não tem field_mapping, monta um mapeamento automático. 401 'token_expired' (reconectar a conta Meta); 422 'no_data_available' | 'graph_error' | 'rate_limited'. Somente administrador.",
31354
+ "category": "Meta Lead Ads",
31355
+ "params": [
31356
+ {
31357
+ "name": "id",
31358
+ "type": "integer",
31359
+ "location": "path",
31360
+ "required": true,
31361
+ "description": "ID do formulário Meta Lead"
31362
+ }
31363
+ ],
31364
+ "returns": "200 formulário (mesmo formato de lionchat_meta_lead_show) + refresh_source: 'cached_event'|'latest_leadgen'|'graph_leads'|'graph_questions' | 401 {error:'token_expired'} | 422 {error}",
31365
+ "common_use_cases": [
31366
+ "Destravar um formulário que ficou sem campos pra mapear",
31367
+ "Ver os campos reais antes de configurar o mapeamento"
31368
+ ],
31369
+ "related_tools": [
31370
+ "lionchat_meta_lead_show",
31371
+ "lionchat_meta_lead_update",
31372
+ "lionchat_meta_lead_create_1"
31373
+ ]
31374
+ },
31375
+ {
31376
+ "id": "lionchat_reporting_events_list",
31377
+ "method": "GET",
31378
+ "path": "/api/v1/accounts/{account_id}/reporting_events",
31379
+ "title": "Eventos de Métrica da Conta (primeira resposta, resolução...)",
31380
+ "description": "SÓ LEITURA, SOMENTE ADMINISTRADOR, recurso Enterprise. Lista os eventos brutos que alimentam os relatórios — first_response, reply_time, conversation_resolved, conversation_opened, conversation_bot_handoff — da conta inteira, 25 por página, mais novos primeiro, com valor em segundos e valor só dentro do horário de atendimento. since/until são timestamp UNIX em SEGUNDOS (data por extenso não é aceita); mandar só um dos dois vale como janela aberta. Versão por conversa: lionchat_conversations_reporting_events.",
31381
+ "category": "Relatorios",
31382
+ "params": [
31383
+ {
31384
+ "name": "since",
31385
+ "type": "string",
31386
+ "location": "query",
31387
+ "required": false,
31388
+ "description": "Início — timestamp UNIX em SEGUNDOS"
31389
+ },
31390
+ {
31391
+ "name": "until",
31392
+ "type": "string",
31393
+ "location": "query",
31394
+ "required": false,
31395
+ "description": "Fim — timestamp UNIX em SEGUNDOS"
31396
+ },
31397
+ {
31398
+ "name": "inbox_id",
31399
+ "type": "integer",
31400
+ "location": "query",
31401
+ "required": false,
31402
+ "description": "Filtra por caixa"
31403
+ },
31404
+ {
31405
+ "name": "user_id",
31406
+ "type": "integer",
31407
+ "location": "query",
31408
+ "required": false,
31409
+ "description": "Filtra por atendente"
31410
+ },
31411
+ {
31412
+ "name": "name",
31413
+ "type": "string",
31414
+ "location": "query",
31415
+ "required": false,
31416
+ "description": "Tipo do evento: first_response | reply_time | conversation_resolved | conversation_opened | conversation_bot_handoff"
31417
+ },
31418
+ {
31419
+ "name": "page",
31420
+ "type": "integer",
31421
+ "location": "query",
31422
+ "required": false,
31423
+ "description": "Página (25 por página)"
31424
+ }
31425
+ ],
31426
+ "returns": "{payload: [{id, name, value, value_in_business_hours, event_start_time, event_end_time, account_id, inbox_id, user_id, conversation_id, created_at, updated_at}], meta: {count, current_page, total_pages}}",
31427
+ "common_use_cases": [
31428
+ "Auditar de onde saiu o tempo médio de primeira resposta de um atendente",
31429
+ "Exportar os eventos de resolução de um período"
31430
+ ],
31431
+ "related_tools": [
31432
+ "lionchat_conversations_reporting_events",
31433
+ "lionchat_reports_summary",
31434
+ "lionchat_reports_list"
31435
+ ]
31436
+ },
31437
+ {
31438
+ "id": "lionchat_search_articles",
31439
+ "method": "GET",
31440
+ "path": "/api/v1/accounts/{account_id}/search/articles",
31441
+ "title": "Buscar Artigos da Base de Conhecimento",
31442
+ "description": "Busca por texto nos artigos dos portais (central de ajuda) da conta — irmã de search/conversations, contacts e messages. 15 por página. Termos muito curtos devolvem lista vazia. since/until (timestamp UNIX em segundos) filtram por updated_at do artigo e só valem com a 'Busca avançada' ligada na conta.",
31443
+ "category": "Busca",
31444
+ "params": [
31445
+ {
31446
+ "name": "q",
31447
+ "type": "string",
31448
+ "location": "query",
31449
+ "required": true,
31450
+ "description": "Termo"
31451
+ },
31452
+ {
31453
+ "name": "page",
31454
+ "type": "integer",
31455
+ "location": "query",
31456
+ "required": false,
31457
+ "description": "Página (15 por página)"
31458
+ },
31459
+ {
31460
+ "name": "since",
31461
+ "type": "string",
31462
+ "location": "query",
31463
+ "required": false,
31464
+ "description": "Início — timestamp UNIX em SEGUNDOS (só com Busca avançada)"
31465
+ },
31466
+ {
31467
+ "name": "until",
31468
+ "type": "string",
31469
+ "location": "query",
31470
+ "required": false,
31471
+ "description": "Fim — timestamp UNIX em SEGUNDOS (só com Busca avançada)"
31472
+ }
31473
+ ],
31474
+ "returns": "{payload: {articles: [{id, title, locale, content, slug, portal_slug, account_id, category_name, status, updated_at (unix)}]}}",
31475
+ "common_use_cases": [
31476
+ "Achar o artigo certo pra mandar o link ao cliente",
31477
+ "Conferir se já existe artigo sobre um assunto antes de criar"
31478
+ ],
31479
+ "related_tools": [
31480
+ "lionchat_search_search",
31481
+ "lionchat_portals_list",
31482
+ "lionchat_search_list"
31483
+ ]
31484
+ },
31485
+ {
31486
+ "id": "lionchat_upload_validate",
31487
+ "method": "POST",
31488
+ "path": "/api/v1/accounts/{account_id}/upload/validate",
31489
+ "title": "Testar uma URL de mídia (sem gravar nada)",
31490
+ "description": "SÓ LEITURA na prática: baixa a URL pra validar tipo, tamanho e segurança (SSRF) com a MESMA lista de aceite que o FlowBuilder usa ao enviar mídia por URL — e descarta. Não cria arquivo. Como o MCP não faz upload, é o jeito de conferir se um link de foto/vídeo/áudio/documento vai funcionar num fluxo, campanha ou mensagem ANTES de usar. Sempre 200: valid=true com media_kind/content_type/size_mb/limit_mb, ou valid=false com error_key: 'web_page' (o link é uma página, não o arquivo), 'too_large' (com size_mb/limit_mb), 'unsupported', 'fetch_failed', 'invalid', 'unexpected'.",
31491
+ "category": "Upload",
31492
+ "params": [
31493
+ {
31494
+ "name": "external_url",
31495
+ "type": "string",
31496
+ "location": "body",
31497
+ "required": true,
31498
+ "description": "URL pública do arquivo (http/https)"
31499
+ }
31500
+ ],
31501
+ "returns": "{valid: true, media_kind: 'image'|'video'|'audio'|'file', content_type, size_mb, limit_mb} | {valid: false, error_key, size_mb?, limit_mb?}",
31502
+ "common_use_cases": [
31503
+ "Validar o link da imagem antes de montar o bloco de mídia do fluxo",
31504
+ "Explicar por que a mídia por URL não saiu (página web em vez de arquivo, tamanho)"
31505
+ ],
31506
+ "related_tools": [
31507
+ "lionchat_upload_create",
31508
+ "lionchat_upload_limits_show",
31509
+ "lionchat_flows_update"
31510
+ ]
31511
+ },
31512
+ {
31513
+ "id": "lionchat_webhooks_deliveries_list",
31514
+ "method": "GET",
31515
+ "path": "/api/v1/accounts/{account_id}/webhooks/{webhook_id}/deliveries",
31516
+ "title": "Logs de Entrega de um Webhook da conta",
31517
+ "description": "SÓ LEITURA, somente administradores (403). As tentativas de entrega de um webhook configurado na conta, mais novas primeiro, com evento, código HTTP, duração, número da tentativa e erro. Quando o disjuntor pausou o webhook (error_class Webhooks::Blocked) há UMA linha por janela de pausa e a mensagem ganha o total de eventos descartados naquela pausa. Registros apagados depois de 7 dias — lista vazia pode ser só o período. Responde 'o webhook disparou? o sistema do outro lado recebeu?'.",
31518
+ "category": "Webhooks",
31519
+ "params": [
31520
+ {
31521
+ "name": "webhook_id",
31522
+ "type": "integer",
31523
+ "location": "path",
31524
+ "required": true,
31525
+ "description": "ID do webhook (de lionchat_webhooks_list)"
31526
+ },
31527
+ {
31528
+ "name": "status",
31529
+ "type": "string",
31530
+ "location": "query",
31531
+ "required": false,
31532
+ "description": "failed | success (sem filtro = todos)"
31533
+ },
31534
+ {
31535
+ "name": "event",
31536
+ "type": "string",
31537
+ "location": "query",
31538
+ "required": false,
31539
+ "description": "Filtra pelo nome do evento (ex.: conversation_created)"
31540
+ },
31541
+ {
31542
+ "name": "page",
31543
+ "type": "integer",
31544
+ "location": "query",
31545
+ "required": false,
31546
+ "description": "Página"
31547
+ },
31548
+ {
31549
+ "name": "per_page",
31550
+ "type": "integer",
31551
+ "location": "query",
31552
+ "required": false,
31553
+ "description": "Itens por página (padrão 25, máximo 100)"
31554
+ }
31555
+ ],
31556
+ "returns": "{deliveries: [{id, event_name, http_status, duration_ms, attempt_number, error_class, error_message, delivery_id, webhook_type, source_type, source_id, webhook_id, inbox_id, account_id, created_at}], meta: {total (com filtro), failures, success, page, per_page}}",
31557
+ "common_use_cases": [
31558
+ "Diagnosticar integração que 'parou de receber'",
31559
+ "Ver se o disjuntor pausou o webhook e quantos eventos perdeu"
31560
+ ],
31561
+ "related_tools": [
31562
+ "lionchat_webhooks_deliveries_show",
31563
+ "lionchat_webhooks_list",
31564
+ "lionchat_macros_deliveries_list"
31565
+ ]
31566
+ },
31567
+ {
31568
+ "id": "lionchat_webhooks_deliveries_show",
31569
+ "method": "GET",
31570
+ "path": "/api/v1/accounts/{account_id}/webhooks/{webhook_id}/deliveries/{id}",
31571
+ "title": "Detalhe de uma Entrega de Webhook",
31572
+ "description": "SÓ LEITURA, somente administradores. Uma tentativa de entrega (mesmos campos da lista). 404 se não for deste webhook.",
31573
+ "category": "Webhooks",
31574
+ "params": [
31575
+ {
31576
+ "name": "webhook_id",
31577
+ "type": "integer",
31578
+ "location": "path",
31579
+ "required": true,
31580
+ "description": "ID do webhook"
31581
+ },
31582
+ {
31583
+ "name": "id",
31584
+ "type": "integer",
31585
+ "location": "path",
31586
+ "required": true,
31587
+ "description": "ID da entrega"
31588
+ }
31589
+ ],
31590
+ "returns": "{id, event_name, http_status, duration_ms, attempt_number, error_class, error_message, delivery_id, webhook_type, source_type, source_id, webhook_id, inbox_id, account_id, created_at}",
31591
+ "common_use_cases": [
31592
+ "Ler o erro de uma entrega específica"
31593
+ ],
31594
+ "related_tools": [
31595
+ "lionchat_webhooks_deliveries_list"
31596
+ ]
31597
+ },
31598
+ {
31599
+ "id": "lionchat_kanban_deliveries_list",
31600
+ "method": "GET",
31601
+ "path": "/api/v1/accounts/{account_id}/kanban/deliveries",
31602
+ "title": "Logs de Entrega do Webhook do Kanban",
31603
+ "description": "SÓ LEITURA, somente administradores (403). As tentativas de entrega do WEBHOOK DO KANBAN (configurado em lionchat_kanban_config_*; source_type kanban_webhook), mais novas primeiro, com evento, código HTTP, duração e erro. Mesmo formato e mesma retenção de 7 dias dos logs de webhook da conta.",
31604
+ "category": "Config Kanban",
31605
+ "params": [
31606
+ {
31607
+ "name": "status",
31608
+ "type": "string",
31609
+ "location": "query",
31610
+ "required": false,
31611
+ "description": "failed | success"
31612
+ },
31613
+ {
31614
+ "name": "event",
31615
+ "type": "string",
31616
+ "location": "query",
31617
+ "required": false,
31618
+ "description": "Filtra pelo nome do evento"
31619
+ },
31620
+ {
31621
+ "name": "page",
31622
+ "type": "integer",
31623
+ "location": "query",
31624
+ "required": false,
31625
+ "description": "Página"
31626
+ },
31627
+ {
31628
+ "name": "per_page",
31629
+ "type": "integer",
31630
+ "location": "query",
31631
+ "required": false,
31632
+ "description": "Itens por página (padrão 25, máximo 100)"
31633
+ }
31634
+ ],
31635
+ "returns": "{deliveries: [{id, event_name, http_status, duration_ms, attempt_number, error_class, error_message, delivery_id, webhook_type, source_type, source_id, webhook_id, inbox_id, account_id, created_at}], meta: {total, failures, success, page, per_page}}",
31636
+ "common_use_cases": [
31637
+ "Conferir se o webhook do Kanban está entregando os movimentos de card"
31638
+ ],
31639
+ "related_tools": [
31640
+ "lionchat_kanban_config_list",
31641
+ "lionchat_kanban_config_create_1",
31642
+ "lionchat_webhooks_deliveries_list"
31643
+ ]
31644
+ },
31645
+ {
31646
+ "id": "lionchat_eclinica_integrations_show",
31647
+ "method": "GET",
31648
+ "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}",
31649
+ "title": "Detalhes da Integração e-Clínica",
31650
+ "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.",
31651
+ "category": "Integracoes",
31652
+ "params": [
31653
+ {
31654
+ "name": "id",
31655
+ "type": "integer",
31656
+ "location": "path",
31657
+ "required": true,
31658
+ "description": "ID da integração"
31659
+ }
31660
+ ],
31661
+ "returns": "{payload: {eclinica_integration: {id, name, account_id, status, active, has_api_token, last_event_at, last_error, error_count, event_mapping, settings, reminder_config, webhook_token, webhook_url, healthy, units: [{id, name, city_slug, address, has_api_token, token_is_variable, token_reference, webhook_token, webhook_url, status, last_event_at, last_error, error_count, active, settings}], created_at, updated_at}}} | 404",
31662
+ "common_use_cases": [
31663
+ "Ver o mapeamento e os lembretes atuais"
31664
+ ],
31665
+ "related_tools": [
31666
+ "lionchat_eclinica_integrations_list"
31667
+ ]
31668
+ },
31669
+ {
31670
+ "id": "lionchat_eclinica_integrations_events",
31671
+ "method": "GET",
31672
+ "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}/events",
31673
+ "title": "Eventos recebidos da e-Clínica",
31674
+ "description": "SÓ LEITURA, somente administrador. Os eventos de webhook recebidos da e-Clínica (50 por página, mais novos primeiro, janela de 7 dias) com tipo, situação do processamento (pending/processed/failed/skipped), erro em português, unidade, o contato resolvido e os dados do paciente no payload (nome, celular, e-mail, CPF) mais o payload bruto. event_type filtra NO SERVIDOR (tipos de menor volume somem atrás da agenda sem o filtro). É onde mora a mensagem de erro quando 'o evento chegou e o fluxo não disparou'.",
31675
+ "category": "Integracoes",
31676
+ "params": [
31677
+ {
31678
+ "name": "id",
31679
+ "type": "integer",
31680
+ "location": "path",
31681
+ "required": true,
31682
+ "description": "ID da integração"
31683
+ },
31684
+ {
31685
+ "name": "event_type",
31686
+ "type": "string",
31687
+ "location": "query",
31688
+ "required": false,
31689
+ "description": "Filtra por tipo (ex.: cliente_novo, agendamento_novo, falta)"
31690
+ },
31691
+ {
31692
+ "name": "page",
31693
+ "type": "integer",
31694
+ "location": "query",
31695
+ "required": false,
31696
+ "description": "Página (50 por página)"
31697
+ }
31698
+ ],
31699
+ "returns": "{payload: {events: [{id, event_type, eclinica_event_id, processing_status, processed_at, error_message, created_at, raw_payload, contact_id, contact_name, contact_email, contact_phone, unit_name, customer_name, customer_phone, customer_email, customer_cpf, ...chips}]}}",
31700
+ "common_use_cases": [
31701
+ "Ver se a consulta marcada chegou do e-Clínica",
31702
+ "Achar o evento falhado e o motivo"
31703
+ ],
31704
+ "related_tools": [
31705
+ "lionchat_eclinica_integrations_retry_event",
31706
+ "lionchat_eclinica_integrations_list",
31707
+ "lionchat_eclinica_reminder_history_list"
31708
+ ]
31709
+ },
31710
+ {
31711
+ "id": "lionchat_eclinica_integrations_retry_event",
31712
+ "method": "POST",
31713
+ "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}/events/{event_id}/retry",
31714
+ "title": "Reprocessar Evento da e-Clínica",
31715
+ "description": "AÇÃO DE ESCRITA, somente administrador. Reprocessa UM evento com processing_status failed ou skipped (volta pra pending e o job roda de novo — pode disparar o fluxo mapeado). Outros status: 422 'Only failed/skipped can retry'.",
31716
+ "category": "Integracoes",
31717
+ "params": [
31718
+ {
31719
+ "name": "id",
31720
+ "type": "integer",
31721
+ "location": "path",
31722
+ "required": true,
31723
+ "description": "ID da integração"
31724
+ },
31725
+ {
31726
+ "name": "event_id",
31727
+ "type": "integer",
31728
+ "location": "path",
31729
+ "required": true,
31730
+ "description": "ID do evento"
31731
+ }
31732
+ ],
31733
+ "returns": "200 {success: true} | 422 {error}",
31734
+ "common_use_cases": [
31735
+ "Reprocessar o evento que falhou por fluxo desligado"
31736
+ ],
31737
+ "related_tools": [
31738
+ "lionchat_eclinica_integrations_events",
31739
+ "lionchat_omie_integrations_retry_event",
31740
+ "lionchat_conta_azul_integrations_retry_event"
31741
+ ]
31742
+ },
31743
+ {
31744
+ "id": "lionchat_booking_reports",
31745
+ "method": "GET",
31746
+ "path": "/api/v2/accounts/{account_id}/booking_reports",
31747
+ "title": "Relatorio de Agendamentos",
31748
+ "category": "Relatorios",
31749
+ "description": "[GET] A aba Relatorios > Agendamentos (2026-08-19). Unidade = o AGENDAMENTO (Booking nativo: link publico, IA e Agenda do painel — NAO e e-Clinica). Padrao de periodo: 30 dias pra TRAS e 30 pra FRENTE (agenda tem futuro). A SITUACAO vem da TAREFA da Agenda (account_tasks.status), nao de bookings.status — quem conclui/cancela pela Agenda deixa o booking parado em 'confirmado'; ler bookings direto pra contar concluidos da zero. attendance_rate = concluidos / (concluidos + cancelados), em % — pendentes ficam FORA do denominador (ainda nao aconteceram); nao recalcule com o total. snoozed (adiado) sai separado de pending. Admin ou agente.",
31750
+ "params": [
31751
+ {
31752
+ "name": "since",
31753
+ "type": "string",
31754
+ "location": "query",
31755
+ "required": false,
31756
+ "description": "Inicio do periodo (qualquer data parseavel, ex. 2026-08-01). Default: 30 dias atras"
31757
+ },
31758
+ {
31759
+ "name": "until",
31760
+ "type": "string",
31761
+ "location": "query",
31762
+ "required": false,
31763
+ "description": "Fim do periodo. Default: 30 dias a frente"
31764
+ },
31765
+ {
31766
+ "name": "event_type_id",
31767
+ "type": "integer",
31768
+ "location": "query",
31769
+ "required": false,
31770
+ "description": "Filtra por tipo de agendamento (booking_event_types)"
31771
+ },
31772
+ {
31773
+ "name": "user_id",
31774
+ "type": "integer",
31775
+ "location": "query",
31776
+ "required": false,
31777
+ "description": "Filtra pelo RESPONSAVEL da tarefa (id de usuario)"
31778
+ },
31779
+ {
31780
+ "name": "status",
31781
+ "type": "string",
31782
+ "location": "query",
31783
+ "required": false,
31784
+ "description": "pending | completed | cancelled | snoozed (situacao da TAREFA da Agenda)"
31785
+ },
31786
+ {
31787
+ "name": "group_by",
31788
+ "type": "string",
31789
+ "location": "query",
31790
+ "required": false,
31791
+ "description": "day | week | month (agrupamento da timeline; default day)"
31792
+ }
31793
+ ],
31794
+ "returns": "{period: {since, until, group_by}, totals: {total, pending, completed, cancelled, snoozed, attendance_rate}, timeline: [{period, count}], by_event_type, by_agent, by_origin}",
31795
+ "common_use_cases": [
31796
+ "Quantos agendamentos foram marcados/concluidos/cancelados no mes",
31797
+ "Taxa de comparecimento por tipo de consulta ou por responsavel",
31798
+ "De onde vem os agendamentos (origem/UTM)"
31799
+ ],
31800
+ "related_tools": [
31801
+ "lionchat_booking_event_types_list",
31802
+ "lionchat_tasks_list",
31803
+ "lionchat_custom_dashboards_preview_widget"
31804
+ ]
31805
+ },
31806
+ {
31807
+ "id": "lionchat_custom_dashboards_show",
31808
+ "method": "GET",
31809
+ "path": "/api/v2/accounts/{account_id}/custom_dashboards/{id}",
31810
+ "title": "Relatorio Personalizado (detalhe)",
31811
+ "category": "Relatorios",
31812
+ "description": "[GET] Um relatorio personalizado so, com o array `widgets` completo (id e desenho de cada bloco). Use no lugar de custom_dashboards_list quando a lista vier CORTADA pelo limite do conector (conta com muitos relatorios cheios) ou quando ja souber o id — e o jeito seguro de ler os blocos antes de um custom_dashboards_update. So administrador (401 caso contrario); 404 se o relatorio nao e da conta.",
31813
+ "params": [
31814
+ {
31815
+ "name": "id",
31816
+ "type": "integer",
31817
+ "location": "path",
31818
+ "required": true,
31819
+ "description": "ID do relatorio personalizado"
31820
+ }
31821
+ ],
31822
+ "returns": "{ id, name, position, widgets: [...], created_at }",
31823
+ "common_use_cases": [
31824
+ "Ler os blocos de UM relatorio antes de editar",
31825
+ "Pegar o widget_id pra calcular um bloco com custom_dashboards_widget_data"
31826
+ ],
31827
+ "related_tools": [
31828
+ "lionchat_custom_dashboards_list",
31829
+ "lionchat_custom_dashboards_widget_data",
31830
+ "lionchat_custom_dashboards_update"
31831
+ ]
28654
31832
  }
28655
31833
  ]