@lionchat/mcp-server 1.15.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",
@@ -9556,9 +9556,16 @@
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 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. ATENCAO (ago/2026): hoje cada item ainda carrega flow_data inteiro e metricas por bloco, o que deixa a resposta MUITO pesada em conta com muitos fluxos/execucoes (ate 19 MB medidos) — NAO dependa disso: esta em andamento a lista leve, que tira flow_data/node_metrics/waiting_counts/variables e passa a trazer `triggers` (gatilhos do bloco Inicio). Pra flow_data use flows_show; pra conferir gatilho duplicado use flows_check_conflicts.",
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",
@@ -9892,6 +9899,13 @@
9892
9899
  "location": "body",
9893
9900
  "required": false,
9894
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."
9895
9909
  }
9896
9910
  ],
9897
9911
  "returns": "tipo de evento criado (com novo ID)",
@@ -9976,6 +9990,13 @@
9976
9990
  "location": "body",
9977
9991
  "required": false,
9978
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."
9979
10000
  }
9980
10001
  ],
9981
10002
  "returns": "tipo de evento atualizado",
@@ -16553,7 +16574,7 @@
16553
16574
  "type": "object",
16554
16575
  "location": "body",
16555
16576
  "required": false,
16556
- "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."
16557
16578
  },
16558
16579
  {
16559
16580
  "name": "sample_payload",
@@ -16665,7 +16686,7 @@
16665
16686
  "type": "object",
16666
16687
  "location": "body",
16667
16688
  "required": false,
16668
- "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."
16669
16690
  },
16670
16691
  {
16671
16692
  "name": "sample_payload",
@@ -16860,7 +16881,7 @@
16860
16881
  "type": "object",
16861
16882
  "location": "body",
16862
16883
  "required": false,
16863
- "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."
16864
16885
  }
16865
16886
  ],
16866
16887
  "returns": "webhook criado (com novo ID)",
@@ -16965,7 +16986,7 @@
16965
16986
  "type": "object",
16966
16987
  "location": "body",
16967
16988
  "required": false,
16968
- "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."
16969
16990
  }
16970
16991
  ],
16971
16992
  "returns": "webhook atualizado",
@@ -17174,7 +17195,7 @@
17174
17195
  "type": "object",
17175
17196
  "location": "body",
17176
17197
  "required": false,
17177
- "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."
17178
17199
  }
17179
17200
  ],
17180
17201
  "returns": "webhook criado (com novo ID)",
@@ -17272,7 +17293,7 @@
17272
17293
  "type": "object",
17273
17294
  "location": "body",
17274
17295
  "required": false,
17275
- "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."
17276
17297
  }
17277
17298
  ],
17278
17299
  "returns": "webhook atualizado",
@@ -17481,7 +17502,7 @@
17481
17502
  "type": "object",
17482
17503
  "location": "body",
17483
17504
  "required": false,
17484
- "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."
17485
17506
  }
17486
17507
  ],
17487
17508
  "returns": "webhook criado (com novo ID)",
@@ -17579,7 +17600,7 @@
17579
17600
  "type": "object",
17580
17601
  "location": "body",
17581
17602
  "required": false,
17582
- "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."
17583
17604
  }
17584
17605
  ],
17585
17606
  "returns": "webhook atualizado",
@@ -17788,7 +17809,7 @@
17788
17809
  "type": "object",
17789
17810
  "location": "body",
17790
17811
  "required": false,
17791
- "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."
17792
17813
  }
17793
17814
  ],
17794
17815
  "returns": "webhook criado (com novo ID)",
@@ -17886,7 +17907,7 @@
17886
17907
  "type": "object",
17887
17908
  "location": "body",
17888
17909
  "required": false,
17889
- "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."
17890
17911
  }
17891
17912
  ],
17892
17913
  "returns": "webhook atualizado",
@@ -18095,7 +18116,7 @@
18095
18116
  "type": "object",
18096
18117
  "location": "body",
18097
18118
  "required": false,
18098
- "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."
18099
18120
  }
18100
18121
  ],
18101
18122
  "returns": "webhook criado (com novo ID)",
@@ -18193,7 +18214,7 @@
18193
18214
  "type": "object",
18194
18215
  "location": "body",
18195
18216
  "required": false,
18196
- "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."
18197
18218
  }
18198
18219
  ],
18199
18220
  "returns": "webhook atualizado",
@@ -18402,7 +18423,7 @@
18402
18423
  "type": "object",
18403
18424
  "location": "body",
18404
18425
  "required": false,
18405
- "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."
18406
18427
  }
18407
18428
  ],
18408
18429
  "returns": "webhook criado (com novo ID)",
@@ -18500,7 +18521,7 @@
18500
18521
  "type": "object",
18501
18522
  "location": "body",
18502
18523
  "required": false,
18503
- "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."
18504
18525
  }
18505
18526
  ],
18506
18527
  "returns": "webhook atualizado",
@@ -18793,7 +18814,7 @@
18793
18814
  "type": "object",
18794
18815
  "location": "body",
18795
18816
  "required": false,
18796
- "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."
18797
18818
  },
18798
18819
  {
18799
18820
  "name": "event_automation_mapping",
@@ -22803,7 +22824,7 @@
22803
22824
  "description": "ID da caixa de entrada (WhatsApp por QR)"
22804
22825
  }
22805
22826
  ],
22806
- "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).",
22807
22828
  "common_use_cases": [
22808
22829
  "Cliente pergunta por que a importacao de historico parou ou sumiu",
22809
22830
  "Acompanhar a migracao de um cliente novo (quantas conversas ja entraram)"
@@ -26602,6 +26623,13 @@
26602
26623
  "location": "query",
26603
26624
  "required": true,
26604
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."
26605
26633
  }
26606
26634
  ],
26607
26635
  "returns": "{ date, timezone, slots: [...] }",
@@ -28565,7 +28593,7 @@
28565
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.",
28566
28594
  "category": "Formularios",
28567
28595
  "params": [],
28568
- "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).",
28569
28597
  "common_use_cases": [
28570
28598
  "Ver os formularios da conta e seus numeros",
28571
28599
  "Achar o id antes de editar/publicar",
@@ -28611,14 +28639,14 @@
28611
28639
  "type": "object",
28612
28640
  "location": "body",
28613
28641
  "required": false,
28614
- "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."
28615
28643
  },
28616
28644
  {
28617
28645
  "name": "settings",
28618
28646
  "type": "object",
28619
28647
  "location": "body",
28620
28648
  "required": false,
28621
- "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)."
28622
28650
  },
28623
28651
  {
28624
28652
  "name": "inbox_id",
@@ -28635,7 +28663,7 @@
28635
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."
28636
28664
  }
28637
28665
  ],
28638
- "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)",
28639
28667
  "common_use_cases": [
28640
28668
  "Criar formulario de captacao do zero via API",
28641
28669
  "Importar um desenho pronto (form_data completo)"
@@ -28664,7 +28692,7 @@
28664
28692
  "description": "ID do formulario"
28665
28693
  }
28666
28694
  ],
28667
- "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.",
28668
28696
  "common_use_cases": [
28669
28697
  "Ler o form_data atual antes de editar (update substitui o desenho inteiro)",
28670
28698
  "Conferir estado publicado/ativo e o link publico"
@@ -28680,7 +28708,7 @@
28680
28708
  "method": "PATCH",
28681
28709
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}",
28682
28710
  "title": "Atualizar Formulario",
28683
- "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.",
28684
28712
  "category": "Formularios",
28685
28713
  "params": [
28686
28714
  {
@@ -28716,14 +28744,14 @@
28716
28744
  "type": "object",
28717
28745
  "location": "body",
28718
28746
  "required": false,
28719
- "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."
28720
28748
  },
28721
28749
  {
28722
28750
  "name": "settings",
28723
28751
  "type": "object",
28724
28752
  "location": "body",
28725
28753
  "required": false,
28726
- "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."
28727
28755
  },
28728
28756
  {
28729
28757
  "name": "inbox_id",
@@ -28806,7 +28834,7 @@
28806
28834
  "method": "POST",
28807
28835
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}/duplicate",
28808
28836
  "title": "Duplicar Formulario",
28809
- "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.",
28810
28838
  "category": "Formularios",
28811
28839
  "params": [
28812
28840
  {
@@ -28831,7 +28859,7 @@
28831
28859
  "method": "GET",
28832
28860
  "path": "/api/v1/accounts/{account_id}/lead_forms/{id}/stats",
28833
28861
  "title": "Funil do Formulario",
28834
- "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.",
28835
28863
  "category": "Formularios",
28836
28864
  "params": [
28837
28865
  {
@@ -28849,7 +28877,7 @@
28849
28877
  "description": "Janela em dias (default 30, maximo 90)"
28850
28878
  }
28851
28879
  ],
28852
- "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}]}",
28853
28881
  "common_use_cases": [
28854
28882
  "Onde os leads abandonam (funil por bloco)",
28855
28883
  "Taxa de conclusao do formulario",
@@ -28894,10 +28922,10 @@
28894
28922
  "type": "integer",
28895
28923
  "location": "query",
28896
28924
  "required": false,
28897
- "description": "Pagina (default 1)"
28925
+ "description": "Página (default 1, máximo 10.000)"
28898
28926
  }
28899
28927
  ],
28900
- "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.",
28901
28929
  "common_use_cases": [
28902
28930
  "Ver quem respondeu/abandonou",
28903
28931
  "Achar o id de uma resposta pro detalhe"
@@ -28930,7 +28958,7 @@
28930
28958
  "description": "ID da resposta"
28931
28959
  }
28932
28960
  ],
28933
- "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.",
28934
28962
  "common_use_cases": [
28935
28963
  "Ler o que o lead respondeu",
28936
28964
  "Investigar por que a consulta externa/IA falhou (effects)",
@@ -28946,7 +28974,7 @@
28946
28974
  "method": "POST",
28947
28975
  "path": "/api/v1/accounts/{account_id}/lead_forms/{lead_form_id}/test_runs",
28948
28976
  "title": "Testar Formulario (simulador)",
28949
- "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.",
28950
28978
  "category": "Formularios",
28951
28979
  "params": [
28952
28980
  {
@@ -28964,15 +28992,16 @@
28964
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)."
28965
28993
  }
28966
28994
  ],
28967
- "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...)",
28968
28996
  "common_use_cases": [
28969
28997
  "Validar um formulario recem-montado antes de publicar",
28970
28998
  "Reproduzir o caminho de um lead pra depurar condicao/consulta/IA",
28971
28999
  "Conferir mensagens e variaveis sem enviar WhatsApp de verdade"
28972
29000
  ],
28973
29001
  "related_tools": [
28974
- "lionchat_lead_forms_show",
28975
- "lionchat_lead_forms_publish"
29002
+ "lionchat_contacts_form_entries_show",
29003
+ "lionchat_lead_forms_publish",
29004
+ "lionchat_lead_forms_show"
28976
29005
  ]
28977
29006
  },
28978
29007
  {
@@ -28999,5 +29028,2806 @@
28999
29028
  "related_tools": [
29000
29029
  "lionchat_lead_forms_update"
29001
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
+ ]
29002
31832
  }
29003
31833
  ]