@lionchat/mcp-server 1.30.0 → 1.32.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
@@ -713,7 +713,7 @@
713
713
  "method": "POST",
714
714
  "path": "/api/v1/accounts/{account_id}/contacts/filter",
715
715
  "title": "Filtrar Contatos",
716
- "description": "Filtra contatos com condicoes avancadas (payload de condicoes). 15/pagina.\n\nCHAVES FILTRAVEIS: name, email, identifier (equal_to/not_equal_to/contains/does_not_contain — match parcial case-insensitive); phone_number (+starts_with); country_code, city, company_name (Empresa), job_title (Cargo) [company = campo antigo, nunca casa]; cpf, cnpj, rg, profession (cadastral; cpf/cnpj/rg aceitam is_present/is_not_present); labels; created_at, last_activity_at (is_greater_than/is_less_than/days_before); blocked (equal_to true/false); QUALQUER outra chave = atributo personalizado do contato.\n\nREGISTROS VINCULADOS (acha o contato pelo que aconteceu com ele): attribute_key 'conversation_search' (conversa vinculada: conversation_status/conversation_labels/conversation_inbox_id), condicoes com custom_attribute_type 'conversation_attribute' (atributo da conversa vinculada) e attribute_key 'kanban_card' (card vinculado: card_funnel_id/card_stage/card_priority/card_status). Combinaveis com E/OU.\n\nCada condicao: {attribute_key, filter_operator, values[], query_operator:'and'|'or', custom_attribute_type?}. Operador fora da lista da chave = 422. [2026-07-25] Nova chave id (id interno do contato, equal_to/not_equal_to) — serve pra exportar/checar UM contato especifico. NOTA 18/08: data FIXA com is_greater_than/is_less_than corta o dia no FUSO DA CONTA (padrao America/Sao_Paulo), nao mais em UTC — mesmo criterio das datas relativas.\n\nTELEFONE COM E SEM O 9 (desde 05/09/2026): phone_number com equal_to/not_equal_to casa as DUAS formas do celular brasileiro (mande +5541999887766 ou +554199887766 — acham a mesma ficha; not_equal_to exclui as duas). Valor formatado ('(41) 99988-7766') tambem casa. Telefone fixo, estrangeiro ou trecho segue exato. ATENCAO: 'Selecionar todos' + excluir sobre um filtro de telefone apaga as 2 fichas da mesma pessoa (decisao do dono, 05/09).",
716
+ "description": "Filtra contatos com condicoes avancadas (payload de condicoes). 15/pagina.\n\nCHAVES FILTRAVEIS: name, email, identifier (equal_to/not_equal_to/contains/does_not_contain — match parcial case-insensitive); phone_number (+starts_with); country_code, city, company_name (Empresa), job_title (Cargo) [company = campo antigo, nunca casa]; cpf, cnpj, rg, profession (cadastral; cpf/cnpj/rg aceitam is_present/is_not_present); labels; created_at, last_activity_at (is_greater_than/is_less_than/days_before); blocked (equal_to true/false); QUALQUER outra chave = atributo personalizado do contato.\n\nREGISTROS VINCULADOS (acha o contato pelo que aconteceu com ele): attribute_key 'conversation_search' (conversa vinculada: conversation_status/conversation_labels/conversation_inbox_id), condicoes com custom_attribute_type 'conversation_attribute' (atributo da conversa vinculada) e attribute_key 'kanban_card' (card vinculado: card_funnel_id/card_stage/card_priority/card_status). Combinaveis com E/OU. [2026-10-16] Campo PERSONALIZADO da EMPRESA do contato: condicao com custom_attribute_type 'company_attribute' (ex.: {attribute_key:'segmento', filter_operator:'equal_to', values:['Varejo'], custom_attribute_type:'company_attribute'}); operadores pelo tipo (texto: igual/diferente/contains/does_not_contain/preenchido; numero/data/hora: + is_greater_than/is_less_than); negativo inclui contato sem empresa; modulo Empresas desligado = ninguem; chave que nao e atributo de empresa = 422. So atributo personalizado (o cadastro da empresa nao filtra aqui).\n\nCada condicao: {attribute_key, filter_operator, values[], query_operator:'and'|'or', custom_attribute_type?}. Operador fora da lista da chave = 422. [2026-07-25] Nova chave id (id interno do contato, equal_to/not_equal_to) — serve pra exportar/checar UM contato especifico. NOTA 18/08: data FIXA com is_greater_than/is_less_than corta o dia no FUSO DA CONTA (padrao America/Sao_Paulo), nao mais em UTC — mesmo criterio das datas relativas.\n\nTELEFONE COM E SEM O 9 (desde 05/09/2026): phone_number com equal_to/not_equal_to casa as DUAS formas do celular brasileiro (mande +5541999887766 ou +554199887766 — acham a mesma ficha; not_equal_to exclui as duas). Valor formatado ('(41) 99988-7766') tambem casa. Telefone fixo, estrangeiro ou trecho segue exato. ATENCAO: 'Selecionar todos' + excluir sobre um filtro de telefone apaga as 2 fichas da mesma pessoa (decisao do dono, 05/09).",
717
717
  "category": "Contatos",
718
718
  "params": [
719
719
  {
@@ -1268,7 +1268,7 @@
1268
1268
  "type": "string",
1269
1269
  "location": "body",
1270
1270
  "required": false,
1271
- "description": "Mensagem inicial"
1271
+ "description": "Mensagem inicial. Aceita TEXTO solto (\"Ola!\") desde 07/10/2026 (antes dava erro 500) ou o objeto {content, attachments, template_params}. Sem mensagem a conversa nasce vazia"
1272
1272
  },
1273
1273
  {
1274
1274
  "name": "priority",
@@ -1448,7 +1448,7 @@
1448
1448
  "method": "POST",
1449
1449
  "path": "/api/v1/accounts/{account_id}/conversations/filter",
1450
1450
  "title": "Filtrar Conversas",
1451
- "description": "Filtra conversas com condicoes avancadas (payload de condicoes, mesmas da tela). Ordenacao fixa last_activity_at DESC, 25/pagina.\n\nCHAVES FILTRAVEIS (attribute_key -> operadores): status, chat_type, priority (equal_to/not_equal_to); assignee_id, inbox_id, team_id, campaign_id, captain_assistant_id, labels (equal_to/not_equal_to/is_present/is_not_present); display_id (equal_to/not_equal_to/contains/does_not_contain); created_at, last_activity_at (is_greater_than/is_less_than/days_before — valor de data); browser_language, conversation_language, referer, mail_subject; card_funnel_stage (conversa POR CARD do Kanban — valor 'funnel:<id>' ou 'stage:<id>:<chave_etapa>'); QUALQUER outra chave = atributo personalizado (use custom_attribute_type na condicao: 'conversation_attribute' ou 'contact_attribute'). 'contact_attribute' le a FICHA DO CONTATO da conversa (funciona desde 24/09/2026 — antes era ignorado): e o jeito de achar lead de formulario da Meta por meta_lead_form_name/meta_lead_ad_name/origin_first_*, que so existem no contato. A chave precisa de atributo DE CONTATO cadastrado.\n\nCada condicao: {attribute_key, filter_operator, values[], query_operator:'and'|'or', custom_attribute_type?}. Operador fora da lista da chave = 422 'Operador invalido' (ex: labels NAO aceita 'includes' — use equal_to). [2026-07-25] O operador contains em display_id agora funciona de verdade (busca por trecho do numero da conversa; antes dava erro de banco). NOTA 18/08: data FIXA com is_greater_than/is_less_than corta o dia no FUSO DA CONTA (padrao America/Sao_Paulo), nao mais em UTC — mesmo criterio das datas relativas.",
1451
+ "description": "Filtra conversas com condicoes avancadas (payload de condicoes, mesmas da tela). Ordenacao fixa last_activity_at DESC, 25/pagina.\n\nCHAVES FILTRAVEIS (attribute_key -> operadores): status, chat_type, priority (equal_to/not_equal_to); assignee_id, inbox_id, team_id, campaign_id, captain_assistant_id, labels (equal_to/not_equal_to/is_present/is_not_present); display_id (equal_to/not_equal_to/contains/does_not_contain); created_at, last_activity_at (is_greater_than/is_less_than/days_before — valor de data); browser_language, conversation_language, referer, mail_subject; card_funnel_stage (conversa POR CARD do Kanban — valor 'funnel:<id>' ou 'stage:<id>:<chave_etapa>'); QUALQUER outra chave = atributo personalizado (use custom_attribute_type na condicao: 'conversation_attribute' ou 'contact_attribute'). 'contact_attribute' le a FICHA DO CONTATO da conversa (funciona desde 24/09/2026 — antes era ignorado): e o jeito de achar lead de formulario da Meta por meta_lead_form_name/meta_lead_ad_name/origin_first_*, que so existem no contato. A chave precisa de atributo DE CONTATO cadastrado. 'company_attribute' (atributo de EMPRESA) NAO vale aqui: 422 (desde 2026-10-16) — filtre contatos com lionchat_contacts_filter.\n\nCada condicao: {attribute_key, filter_operator, values[], query_operator:'and'|'or', custom_attribute_type?}. Operador fora da lista da chave = 422 'Operador invalido' (ex: labels NAO aceita 'includes' — use equal_to). [2026-07-25] O operador contains em display_id agora funciona de verdade (busca por trecho do numero da conversa; antes dava erro de banco). NOTA 18/08: data FIXA com is_greater_than/is_less_than corta o dia no FUSO DA CONTA (padrao America/Sao_Paulo), nao mais em UTC — mesmo criterio das datas relativas.",
1452
1452
  "category": "Conversas",
1453
1453
  "params": [
1454
1454
  {
@@ -2447,7 +2447,7 @@
2447
2447
  "method": "POST",
2448
2448
  "path": "/api/v1/accounts/{account_id}/funnels",
2449
2449
  "title": "Criar Funil (Kanban)",
2450
- "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa; pra \"criar um kanban\" use ESTA ferramenta. Cria um funil novo JA COM AS ETAPAS via funnel.stages. Obrigatorios: funnel.name. Limite de 2 funis no plano free. Retorna o funil criado com ID atribuido.",
2450
+ "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa; pra \"criar um kanban\" use ESTA ferramenta. Cria um funil novo JA COM AS ETAPAS via funnel.stages. Obrigatorios: funnel.name. Limite de 2 funis no plano free. Retorna o funil criado com ID atribuido. `settings.removed_stages` (a lista das etapas ja excluidas) e do SERVIDOR: se voce mandar essa chave dentro de funnel.settings ela e IGNORADA (nao da erro), e o servidor a mantem sozinho. Para excluir uma etapa que tem cards, NAO reenvie o funil sem a etapa nem use migrate_stage: use lionchat_funnels_remove_stage. Regras create_task em settings.automations seguem o formato descrito em lionchat_funnels_update.",
2451
2451
  "category": "Funis",
2452
2452
  "params": [
2453
2453
  {
@@ -2483,7 +2483,7 @@
2483
2483
  "type": "object",
2484
2484
  "location": "body",
2485
2485
  "required": false,
2486
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; status p/ status_change; vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2486
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; 'won'|'lost'|'snoozed' p/ status_change ('snoozed' desde 11/10/2026: roda quando o card e ADIADO); vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations). `settings.removed_stages` (a lista das etapas ja excluidas) e do SERVIDOR: se voce mandar essa chave dentro de funnel.settings ela e IGNORADA (nao da erro), e o servidor a mantem sozinho. Para excluir uma etapa que tem cards, NAO reenvie o funil sem a etapa nem use migrate_stage: use lionchat_funnels_remove_stage. "
2487
2487
  },
2488
2488
  {
2489
2489
  "name": "funnel.global_custom_attributes",
@@ -2503,7 +2503,8 @@
2503
2503
  ],
2504
2504
  "related_tools": [
2505
2505
  "lionchat_funnels_create_1",
2506
- "lionchat_funnels_create_2"
2506
+ "lionchat_funnels_create_2",
2507
+ "lionchat_funnels_remove_stage"
2507
2508
  ]
2508
2509
  },
2509
2510
  {
@@ -2535,7 +2536,7 @@
2535
2536
  "method": "GET",
2536
2537
  "path": "/api/v1/accounts/{account_id}/funnels/{id}/stage_report",
2537
2538
  "title": "Relatorio de UMA Etapa do Funil (Kanban)",
2538
- "description": "Numeros de UMA etapa do funil calculados no SERVIDOR (antes a tela so somava os cards carregados na tela, mostrando '100' numa etapa de 432): total de cards, faixa de valores, ganhos/perdidos, distribuicao por prioridade e ranking de vendedores da etapa. Aceita escolher a REGUA de data e recortar por periodo. FUNIL = KANBAN (mesma coisa no LionChat). FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros.",
2539
+ "description": "Numeros de UMA etapa do funil calculados no SERVIDOR (antes a tela so somava os cards carregados na tela, mostrando '100' numa etapa de 432): total de cards, faixa de valores, a linha de cada situacao (open/won/lost/snoozed), distribuicao por prioridade e ranking de vendedores da etapa. Aceita escolher a REGUA de data e recortar por periodo. FUNIL = KANBAN (mesma coisa no LionChat). FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros. ATENCAO SITUACAO: este relatorio SEMPRE aplica os botoes de situacao, com o padrao da tela — sem show_* conta SO os abertos nao adiados, e as linhas won/lost/snoozed voltam ZERADAS. Para contar ganhos, perdidos ou adiados mande show_won/show_lost/show_snoozed=true (ou recorte com statuses[]).",
2539
2540
  "category": "Funis",
2540
2541
  "params": [
2541
2542
  {
@@ -2628,9 +2629,45 @@
2628
2629
  "location": "query",
2629
2630
  "required": false,
2630
2631
  "description": "Fim do filtro por agendamento (YYYY-MM-DD)"
2632
+ },
2633
+ {
2634
+ "name": "show_open",
2635
+ "type": "boolean",
2636
+ "location": "query",
2637
+ "required": false,
2638
+ "description": "Inclui os abertos NAO adiados. Padrao true (so \"false\" desliga)"
2639
+ },
2640
+ {
2641
+ "name": "show_won",
2642
+ "type": "boolean",
2643
+ "location": "query",
2644
+ "required": false,
2645
+ "description": "Inclui os ganhos. Padrao false: sem \"true\" a linha won vem zerada"
2646
+ },
2647
+ {
2648
+ "name": "show_lost",
2649
+ "type": "boolean",
2650
+ "location": "query",
2651
+ "required": false,
2652
+ "description": "Inclui os perdidos. Padrao false: sem \"true\" a linha lost vem zerada"
2653
+ },
2654
+ {
2655
+ "name": "show_snoozed",
2656
+ "type": "boolean",
2657
+ "location": "query",
2658
+ "required": false,
2659
+ "description": "Inclui os adiados (11/10/2026). Padrao false: sem \"true\" a linha snoozed vem zerada"
2660
+ },
2661
+ {
2662
+ "name": "statuses",
2663
+ "query_name": "statuses[]",
2664
+ "type": "array",
2665
+ "location": "query",
2666
+ "required": false,
2667
+ "description": "Recorte por situacao (open/won/lost/snoozed; \"open\" = aberto e NAO adiado), aplicado ALEM dos botoes show_*"
2631
2668
  }
2632
2669
  ],
2633
- "returns": "objeto com os numeros da etapa: total de cards, faixa/soma de valores, ganhos vs perdidos, distribuicao por prioridade e ranking de vendedores da etapa",
2670
+ "returns": "{ stage, date_basis, count, values, status: { open, won, lost, snoozed — cada um {count, value} }, priorities, agents }: total de cards, faixa/soma de valores, a linha de cada situacao (open = aberto NAO adiado), distribuicao por prioridade e ranking de vendedores da etapa",
2634
2671
  "common_use_cases": [
2635
2672
  "Ver os numeros REAIS de uma etapa do funil num periodo",
2636
2673
  "Comparar desempenho de vendedores numa etapa especifica"
@@ -2646,7 +2683,7 @@
2646
2683
  "method": "PATCH",
2647
2684
  "path": "/api/v1/accounts/{account_id}/funnels/{id}",
2648
2685
  "title": "Atualizar Funil (Kanban)",
2649
- "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa. Atualiza funil. Atualiza campos do funil existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: funnel.name, funnel.stages, funnel.settings.",
2686
+ "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa. Atualiza funil. Atualiza campos do funil existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: funnel.name, funnel.stages, funnel.settings. Regra com action 'create_task' (cria uma tarefa presa ao card quando o gatilho acontece): action_config = {title (texto, obrigatorio), description, task_type, agenda_id, priority, occupies_agenda (true|false), due: {amount, unit: 'hours'|'days', at: 'HH:MM' (so em dias), business_days: true (so em dias)}, responsible: {mode: 'card_owner'|'fixed'|'funnel_rotation'|'team_rotation', fallback_user_id (card_owner), user_id (fixed), team_id (team_rotation)}}. Cada regra create_task NOVA ou alterada e conferida uma a uma: regra torta recebe 422 que diz a posicao da regra e o campo a consertar; as demais regras do funil nao sao afetadas. `settings.removed_stages` (a lista das etapas ja excluidas) e do SERVIDOR: se voce mandar essa chave dentro de funnel.settings ela e IGNORADA (nao da erro), e o servidor a mantem sozinho. Para excluir uma etapa que tem cards, NAO reenvie o funil sem a etapa nem use migrate_stage: use lionchat_funnels_remove_stage. Reenviar funnel.stages SEM uma etapa que tem cards e recusado com 422 STAGE_HAS_ITEMS: use lionchat_funnels_remove_stage. Se o funil estiver sendo alterado naquele instante por outra pessoa ou por uma exclusao de etapa em andamento, o Salvar responde 409 com code FUNNEL_BUSY (o funil esta sendo alterado agora): espere alguns instantes e repita.",
2650
2687
  "category": "Funis",
2651
2688
  "params": [
2652
2689
  {
@@ -2668,14 +2705,14 @@
2668
2705
  "type": "object",
2669
2706
  "location": "body",
2670
2707
  "required": false,
2671
- "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa, e CADA ETAPA E UM OBJETO com name TEXTO: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas. Etapa como texto, numero ou null derruba a lista de funis e o Kanban da conta. No update o objeto SUBSTITUI as etapas: etapa que nao vier e REMOVIDA (recusado com 422 STAGE_HAS_ITEMS se tiver cards) — leia com lionchat_funnels_show e reenvie todas."
2708
+ "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa, e CADA ETAPA E UM OBJETO com name TEXTO: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas. Etapa como texto, numero ou null derruba a lista de funis e o Kanban da conta. No update o objeto SUBSTITUI as etapas: etapa que nao vier e REMOVIDA, mas so se estiver VAZIA: com cards a resposta e 422 STAGE_HAS_ITEMS, e a exclusao correta e lionchat_funnels_remove_stage. Leia com lionchat_funnels_show e reenvie todas as etapas."
2672
2709
  },
2673
2710
  {
2674
2711
  "name": "funnel.settings",
2675
2712
  "type": "object",
2676
2713
  "location": "body",
2677
2714
  "required": false,
2678
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost' p/ status_change), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2715
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost'|'snoozed' p/ status_change ('snoozed' desde 11/10/2026: roda quando o card e ADIADO)), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations). Regra com action 'create_task' (cria uma tarefa presa ao card quando o gatilho acontece): action_config = {title (texto, obrigatorio), description, task_type, agenda_id, priority, occupies_agenda (true|false), due: {amount, unit: 'hours'|'days', at: 'HH:MM' (so em dias), business_days: true (so em dias)}, responsible: {mode: 'card_owner'|'fixed'|'funnel_rotation'|'team_rotation', fallback_user_id (card_owner), user_id (fixed), team_id (team_rotation)}}. Cada regra create_task NOVA ou alterada e conferida uma a uma: regra torta recebe 422 que diz a posicao da regra e o campo a consertar; as demais regras do funil nao sao afetadas. `settings.removed_stages` (a lista das etapas ja excluidas) e do SERVIDOR: se voce mandar essa chave dentro de funnel.settings ela e IGNORADA (nao da erro), e o servidor a mantem sozinho. Para excluir uma etapa que tem cards, NAO reenvie o funil sem a etapa nem use migrate_stage: use lionchat_funnels_remove_stage. "
2679
2716
  }
2680
2717
  ],
2681
2718
  "returns": "funil atualizado Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
@@ -2684,7 +2721,10 @@
2684
2721
  "Alteração de status/estado",
2685
2722
  "Atualização em massa via automação"
2686
2723
  ],
2687
- "related_tools": []
2724
+ "related_tools": [
2725
+ "lionchat_funnels_show",
2726
+ "lionchat_funnels_remove_stage"
2727
+ ]
2688
2728
  },
2689
2729
  {
2690
2730
  "id": "lionchat_funnels_destroy",
@@ -2825,7 +2865,7 @@
2825
2865
  "method": "POST",
2826
2866
  "path": "/api/v1/accounts/{account_id}/funnels/{id}/migrate_stage",
2827
2867
  "title": "Transferir Cards Entre Etapas do Funil (Kanban)",
2828
- "description": "Funil = kanban. Transfere os cards de uma etapa para outra.",
2868
+ "description": "Funil = kanban. Move os cards de uma etapa para outra DISPARANDO tudo o que esta ligado a etapa de destino (automacoes do funil, regras, fluxos, webhooks, eventos de conversao). não exclui a etapa: a etapa de origem continua no funil, so fica vazia. Exige o cargo de administrador ou a permissao de gerenciar funis (sem ela: 401). to_funnel_id e obrigatorio (use o proprio id do funil para mover dentro dele). Para EXCLUIR a etapa movendo os cards em silencio (sem disparar nada), use lionchat_funnels_remove_stage.",
2829
2869
  "category": "Funis",
2830
2870
  "params": [
2831
2871
  {
@@ -2864,10 +2904,62 @@
2864
2904
  "Importação manual via API"
2865
2905
  ],
2866
2906
  "related_tools": [
2907
+ "lionchat_funnels_remove_stage",
2867
2908
  "lionchat_funnels_create",
2868
2909
  "lionchat_funnels_create_1"
2869
2910
  ]
2870
2911
  },
2912
+ {
2913
+ "id": "lionchat_funnels_remove_stage",
2914
+ "method": "POST",
2915
+ "path": "/api/v1/accounts/{account_id}/funnels/{id}/remove_stage",
2916
+ "title": "Excluir Etapa do Funil com Cards (Kanban)",
2917
+ "description": "Funil = kanban. EXCLUI uma etapa do funil e move os cards dela, EM SILENCIO, para a etapa de destino: o card muda de lugar mas nada dispara (nenhuma automacao do funil, regra, fluxo, webhook, evento de conversao nem aviso ao cliente). A etapa de origem e APAGADA do funil; os cards NAO sao apagados, so mudam de etapa. Exige o cargo de administrador ou a permissao de gerenciar funis (sem ela: 401). Para mover cards DISPARANDO o que esta ligado a etapa de destino, sem excluir a etapa, use lionchat_funnels_create_2 (migrate_stage). COMO USAR: a ferramenta trabalha em pedidos curtos (cada pedido move ate cerca de 8 segundos de cards, em lotes de 125). Antes de tudo, diga ao usuario quantos cards vao para onde (leia a contagem com lionchat_funnels_stage_report, passando o id do funil e a chave da etapa em `stage`, com show_won, show_lost e show_snoozed = true: sem isso o relatorio conta so os abertos nao adiados e a etapa parece ter menos cards do que vai mover) e que a etapa sera excluida, e peça o OK UMA vez. TODA chamada desta ferramenta, inclusive a PRIMEIRA (logo depois do OK do usuario), leva `confirm: true`; sem ele o conector recusa. Se o conector recusar por falta de `confirm`, reenvie com `confirm: true` sem perguntar de novo ao usuario. Depois do primeiro OK, repita a chamada (sempre com confirm: true), SEM perguntar de novo ao usuario a cada lote, ate vir done: true. RESPOSTAS: (1) 200 {done: true, moved: <TOTAL movido na exclusao inteira>, stage_removed: true, funnel: {...}} = terminou, a etapa foi excluida. (2) 200 {done: true, moved: 0} (sem stage_removed) = a etapa ja estava excluida para o mesmo destino (fim normal; por exemplo uma repeticao do pedido). (3) 200 {done: false, moved: <so deste pedido>, remaining: <cards que faltam, ou nulo>, reason} = ainda nao terminou. `remaining` pode vir nulo (a contagem nao coube no tempo do pedido) e nao e erro: repita mesmo assim; pode vir 100001, que quer dizer \"mais de 100 mil\" (nao e a contagem exata). Por `reason`: 'tempo' = acabou o tempo deste pedido, repita agora; 'travado' ou 'faxina' = o banco estava ocupado, espere cerca de 30 segundos e repita; 'destino_excluido' = a etapa de destino deixou de existir, pergunte ao usuario outro destino; 'assumido' = OUTRA PESSOA assumiu a exclusao desta etapa (vem tambem holder_name e to_stage_name): avise o usuario quem esta excluindo e para onde, e PARE, nao repita (se `holder_name` ou `to_stage_name` vier nulo, diga so \"outra pessoa esta excluindo esta etapa\", sem nome). Se duas respostas seguidas vierem com moved: 0 e done: false, PARE e avise o usuario (algo esta preso), nao fique repetindo. ERROS: 422 {error, code} com code = DESTINATION_NOT_FOUND (destino nao encontrado nesta conta), SAME_STAGE (destino igual a origem), LAST_STAGE (o funil precisa ficar com pelo menos uma etapa), ORIGIN_NOT_FOUND (a etapa a excluir nao existe neste funil), STAGE_ALREADY_REMOVED_BY_OTHER (outra pessoa ja excluiu a etapa), FINAL_SAVE_FAILED (os cards ja foram movidos mas o funil nao pode ser salvo; o `error` diz o motivo), FUNNEL_INVALID (o funil nao pode ser salvo; o `error` diz o motivo); o texto de `error` ja vem no idioma da conta, mostre-o ao usuario. 409 STAGE_REMOVAL_IN_PROGRESS = outra pessoa esta excluindo esta etapa agora (vem holder_name e to_stage_name, os dois podem ser nulos): avise o usuario \"outra pessoa esta excluindo esta etapa\" (com o nome, se vier) e pare. 401 = sem a permissao de gerenciar funis. Use lionchat_funnels_show antes para pegar as chaves das etapas (from_stage e to_stage sao as CHAVES das etapas, nao os nomes).",
2918
+ "category": "Funis",
2919
+ "params": [
2920
+ {
2921
+ "name": "id",
2922
+ "type": "integer",
2923
+ "location": "path",
2924
+ "required": true,
2925
+ "description": "ID do funil de origem (o que tem a etapa a excluir)"
2926
+ },
2927
+ {
2928
+ "name": "from_stage",
2929
+ "type": "string",
2930
+ "location": "body",
2931
+ "required": true,
2932
+ "description": "CHAVE da etapa a excluir (a chave do objeto funnel.stages, nao o nome exibido)"
2933
+ },
2934
+ {
2935
+ "name": "to_funnel_id",
2936
+ "type": "integer",
2937
+ "location": "body",
2938
+ "required": true,
2939
+ "description": "ID do funil de destino dos cards (pode ser o mesmo funil)"
2940
+ },
2941
+ {
2942
+ "name": "to_stage",
2943
+ "type": "string",
2944
+ "location": "body",
2945
+ "required": true,
2946
+ "description": "CHAVE da etapa de destino dos cards, dentro do funil de destino"
2947
+ }
2948
+ ],
2949
+ "returns": "{ done: true, moved: N, stage_removed: true, funnel: {...} } ao terminar; { done: true, moved: 0 } se a etapa ja estava excluida para o mesmo destino; { done: false, moved: N, remaining: N|null, reason: 'tempo'|'faxina'|'travado'|'destino_excluido'|'assumido', holder_name?, to_stage_name? } quando ainda falta (repita, salvo 'assumido'); 422 { error, code }; 409 { error, code: 'STAGE_REMOVAL_IN_PROGRESS', holder_name, to_stage_name }; 401 sem permissao.",
2950
+ "common_use_cases": [
2951
+ "Excluir uma etapa que ainda tem cards, mandando os cards para outra etapa sem disparar automacoes",
2952
+ "Juntar duas etapas do funil numa so",
2953
+ "Tirar uma etapa que nao e mais usada, repetindo a chamada ate done: true"
2954
+ ],
2955
+ "related_tools": [
2956
+ "lionchat_funnels_show",
2957
+ "lionchat_funnels_stage_report",
2958
+ "lionchat_funnels_update",
2959
+ "lionchat_funnels_create_2"
2960
+ ],
2961
+ "confirm_required": true
2962
+ },
2871
2963
  {
2872
2964
  "id": "lionchat_funnels_archive",
2873
2965
  "method": "PATCH",
@@ -2921,7 +3013,7 @@
2921
3013
  "method": "GET",
2922
3014
  "path": "/api/v1/accounts/{account_id}/kanban_items",
2923
3015
  "title": "Listar Items",
2924
- "description": "Lista itens filtrados por funil com paginação, ordenação e filtros avançados. Lista itens Kanban paginados (per_page padrão 25, máximo 100). Filtros disponíveis: stage_id, agent_id, page, sort_by, sort_direction. Retorna meta (contadores) + payload (array de item Kanban).",
3016
+ "description": "Lista itens filtrados por funil com paginação, ordenação e filtros avançados. Lista itens Kanban paginados (per_page padrão 25, máximo 100). Filtros disponíveis: stage_id, agent_id, page, sort_by, sort_direction. Retorna meta (contadores) + payload (array de item Kanban). SITUACAO DO CARD (11/10/2026): esta lista NAO le statuses (ignorado aqui — o filtro por statuses[] e o lionchat_kanban_items_filter). Use os botoes show_open/show_won/show_lost/show_snoozed: SEM nenhum deles a lista traz TODAS as situacoes; mandando QUALQUER um, show_open vale true salvo se vier \"false\" (= aberto e NAO adiado) e os outros tres so valem com \"true\". So os adiados: show_snoozed=true E show_open=false. Cada card traz effective_status (open|snoozed|won|lost) e snoozed_until (ISO ou null). No card adiado item_details.status CONTINUA \"open\": a situacao real e o effective_status.",
2925
3017
  "category": "Itens",
2926
3018
  "params": [
2927
3019
  {
@@ -3008,7 +3100,35 @@
3008
3100
  "type": "array",
3009
3101
  "location": "query",
3010
3102
  "required": false,
3011
- "description": "Filtrar por status (open/won/lost)"
3103
+ "description": "IGNORADO por esta ferramenta (a lista nao le este parametro). Para recortar por situacao aqui use show_open/show_won/show_lost/show_snoozed; statuses[] funciona no lionchat_kanban_items_filter"
3104
+ },
3105
+ {
3106
+ "name": "show_open",
3107
+ "type": "boolean",
3108
+ "location": "query",
3109
+ "required": false,
3110
+ "description": "Botao Abertos (desde 11/10/2026 = aberto e NAO adiado). So conta quando algum show_* vem no pedido; ai vale true salvo se vier \"false\""
3111
+ },
3112
+ {
3113
+ "name": "show_won",
3114
+ "type": "boolean",
3115
+ "location": "query",
3116
+ "required": false,
3117
+ "description": "Botao Ganhos: \"true\" inclui os ganhos (so conta quando algum show_* vem no pedido)"
3118
+ },
3119
+ {
3120
+ "name": "show_lost",
3121
+ "type": "boolean",
3122
+ "location": "query",
3123
+ "required": false,
3124
+ "description": "Botao Perdidos: \"true\" inclui os perdidos (so conta quando algum show_* vem no pedido)"
3125
+ },
3126
+ {
3127
+ "name": "show_snoozed",
3128
+ "type": "boolean",
3129
+ "location": "query",
3130
+ "required": false,
3131
+ "description": "Botao Adiados (11/10/2026): \"true\" inclui os adiados. So os adiados = show_snoozed=true e show_open=false"
3012
3132
  },
3013
3133
  {
3014
3134
  "name": "user_ids",
@@ -3068,7 +3188,7 @@
3068
3188
  "description": "Timestamp fim"
3069
3189
  }
3070
3190
  ],
3071
- "returns": "{ items: [...], pagination: {...} } (per_page 50)",
3191
+ "returns": "{ items: [...], pagination: {...} } (per_page 50) Cada card traz effective_status (open|snoozed|won|lost) e snoozed_until (ISO ou null). No card adiado item_details.status CONTINUA \"open\": a situacao real e o effective_status.",
3072
3192
  "common_use_cases": [
3073
3193
  "Dashboard: contar/exibir itens Kanban",
3074
3194
  "Buscar com filtros antes de outra operação",
@@ -3232,7 +3352,7 @@
3232
3352
  "method": "GET",
3233
3353
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}",
3234
3354
  "title": "Detalhe do Item",
3235
- "description": "Retorna detalhes. Retorna detalhes completos de UM item Kanban específico pelo ID. Inclui campos relacionais quando aplicável. Resposta inclui selos de permissao (2026-06): can_edit, can_move, can_delete, can_assign (booleans calculados pro usuario do token).",
3355
+ "description": "Retorna detalhes. Retorna detalhes completos de UM item Kanban específico pelo ID. Inclui campos relacionais quando aplicável. Resposta inclui selos de permissao (2026-06): can_edit, can_move, can_delete, can_assign (booleans calculados pro usuario do token). Desde 11/10/2026: Cada card traz effective_status (open|snoozed|won|lost) e snoozed_until (ISO ou null). No card adiado item_details.status CONTINUA \"open\": a situacao real e o effective_status.",
3236
3356
  "category": "Itens",
3237
3357
  "params": [
3238
3358
  {
@@ -3260,7 +3380,7 @@
3260
3380
  "method": "PUT",
3261
3381
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}",
3262
3382
  "title": "Atualizar Item",
3263
- "description": "Atualiza item (detalhes, agentes, timer, ofertas, automações). Atualiza campos do item Kanban existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: kanban_item.funnel_stage, kanban_item.position, kanban_item.item_details, kanban_item.assigned_agents, kanban_item.custom_attributes, kanban_item.timer_started_at.",
3383
+ "description": "Atualiza item (detalhes, agentes, timer, ofertas, automações). Atualiza campos do item Kanban existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: kanban_item.funnel_stage, kanban_item.position, kanban_item.item_details, kanban_item.assigned_agents, kanban_item.custom_attributes, kanban_item.timer_started_at. CARD ADIADO (11/10/2026): item_details.status \"open\" NAO abre um card adiado (e o mesmo salvar que o aplicativo faz o tempo todo); para abrir use lionchat_kanban_items_unsnooze ou lionchat_kanban_items_create_2. Mandar \"won\"/\"lost\" encerra o adiamento. CO-PARTICIPANTE (13/10/2026): num card GANHO, item_details.co_attributed_to = id do co-participante da venda (ex. o SDR); null tira. Fora de ganho a chave e apagada. Mande so o id — co_attributed_name o card preenche.",
3264
3384
  "category": "Itens",
3265
3385
  "params": [
3266
3386
  {
@@ -3289,7 +3409,7 @@
3289
3409
  "type": "object",
3290
3410
  "location": "body",
3291
3411
  "required": false,
3292
- "description": "Objeto com os detalhes do card. MESCLA SO NO 1o NIVEL: cada chave enviada troca a chave inteira no card; as nao enviadas ficam. Lista FECHADA (outras chaves sao descartadas em silencio): title, description, status, reason, win_reason, loss_reason, attributed_to, duplicated_from_id, priority, value (NUMERO; texto de numero como \"1500.5\" e convertido, \"R$ 1.500,00\" e recusado com 422), currency, custom_attributes, offers, closed_offers, closed_offer, deadline_at, scheduling_type, scheduled_at, conversation_id, automations, notes, retroativo_em. custom_attributes = campos da aba Campos do card: LISTA [{name, type, value}] onde name+type batem EXATAMENTE com a definicao da CONTA (lionchat_kanban_config_list -> global_custom_attributes). Ex.: [{\"name\": \"Origem do Lead\", \"type\": \"string\", \"value\": \"Google\"}]. A lista e TROCADA inteira: leia o card com lionchat_kanban_items_show e reenvie TODOS os campos. Objeto {chave: valor} no lugar da lista APAGA todos os campos do card. notes e offers tambem sao listas trocadas inteiras. Motivo de ganho/perda: status \"won\"/\"lost\" + win_reason/loss_reason = o id (TEXTO) de um motivo de kanban_config.win_reasons/loss_reasons + reason = o titulo dele. Motivo livre (fora da lista): win_reason/loss_reason nulo e o texto em reason. Ex.: {\"status\": \"lost\", \"loss_reason\": \"perda-preco\", \"reason\": \"Preco alto\"}. Lancamento retroativo (marcar o fechamento com data PASSADA): retroativo_em = \"AAAA-MM-DD\" faz o ganho/perda contar no MES ESCOLHIDO em todos os relatorios, em vez do dia de hoje. So funciona JUNTO com um status \"won\"/\"lost\" que MUDA o status do card — card que ja esta ganho ignora a data (pra corrigir uma data lancada errado: mande status \"open\", que apaga o carimbo, e depois \"won\"/\"lost\" com o retroativo_em certo). A chave NAO fica gravada no card: ela so decide o carimbo item_details.status_changed_at, que e o que os relatorios contam. Data FUTURA ou ilegivel = 422. Data anterior a criacao do card e permitida. Vale SO nesta ferramenta — no criar card a chave e descartada. Ex.: {\"status\": \"won\", \"win_reason\": \"indicacao\", \"retroativo_em\": \"2026-08-05\"}."
3412
+ "description": "Objeto com os detalhes do card. MESCLA SO NO 1o NIVEL: cada chave enviada troca a chave inteira no card; as nao enviadas ficam. Lista FECHADA (outras chaves sao descartadas em silencio): title, description, status, reason, win_reason, loss_reason, attributed_to, co_attributed_to (co-participante da venda, so em card ganho; id de agente; null tira), duplicated_from_id, priority, value (NUMERO; texto de numero como \"1500.5\" e convertido, \"R$ 1.500,00\" e recusado com 422), currency, custom_attributes, offers, closed_offers, closed_offer, deadline_at, scheduling_type, scheduled_at, conversation_id, automations, notes, retroativo_em. custom_attributes = campos da aba Campos do card: LISTA [{name, type, value}] onde name+type batem EXATAMENTE com a definicao da CONTA (lionchat_kanban_config_list -> global_custom_attributes). Ex.: [{\"name\": \"Origem do Lead\", \"type\": \"string\", \"value\": \"Google\"}]. A lista e TROCADA inteira: leia o card com lionchat_kanban_items_show e reenvie TODOS os campos. Objeto {chave: valor} no lugar da lista APAGA todos os campos do card. notes e offers tambem sao listas trocadas inteiras. Motivo de ganho/perda: status \"won\"/\"lost\" + win_reason/loss_reason = o id (TEXTO) de um motivo de kanban_config.win_reasons/loss_reasons + reason = o titulo dele. Motivo livre (fora da lista): win_reason/loss_reason nulo e o texto em reason. Ex.: {\"status\": \"lost\", \"loss_reason\": \"perda-preco\", \"reason\": \"Preco alto\"}. Lancamento retroativo (marcar o fechamento com data PASSADA): retroativo_em = \"AAAA-MM-DD\" faz o ganho/perda contar no MES ESCOLHIDO em todos os relatorios, em vez do dia de hoje. So funciona JUNTO com um status \"won\"/\"lost\" que MUDA o status do card — card que ja esta ganho ignora a data (pra corrigir uma data lancada errado: mande status \"open\", que apaga o carimbo, e depois \"won\"/\"lost\" com o retroativo_em certo). A chave NAO fica gravada no card: ela so decide o carimbo item_details.status_changed_at, que e o que os relatorios contam. Data FUTURA ou ilegivel = 422. Data anterior a criacao do card e permitida. Vale SO nesta ferramenta — no criar card a chave e descartada. Ex.: {\"status\": \"won\", \"win_reason\": \"indicacao\", \"retroativo_em\": \"2026-08-05\"}."
3293
3413
  },
3294
3414
  {
3295
3415
  "name": "kanban_item.assigned_agents",
@@ -3345,7 +3465,7 @@
3345
3465
  "method": "DELETE",
3346
3466
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}",
3347
3467
  "title": "Excluir Item",
3348
- "description": "Exclui item. Remove item Kanban permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
3468
+ "description": "Exclui o card (item do Kanban) PERMANENTEMENTE, e nao tem como desfazer. O card e o que mora dentro dele somem. Quanto as TAREFAS presas a este card, so as tarefas SIMPLES sao apagadas (as que nao tem conversa, contato, agendamento, sessao de programa, anexo, nao vieram do Google Agenda e nao sao somente leitura). As demais tarefas presas ao card NAO sao apagadas: apenas se SOLTAM do card e continuam existindo na agenda, na conversa e no contato (tarefas que apenas apontam para o card por linked_kanban_item_id tambem so se soltam). A conversa e o contato do card NAO sao apagados. Quem pede a exclusao e uma pessoa (a regra vale para a exclusao pelo painel, em lote ou por esta ferramenta); expurgos de sistema nao apagam tarefa. Confirme com o usuario antes, dizendo que as tarefas simples presas ao card tambem somem.",
3349
3469
  "category": "Itens",
3350
3470
  "params": [
3351
3471
  {
@@ -3356,16 +3476,16 @@
3356
3476
  "description": "ID"
3357
3477
  }
3358
3478
  ],
3359
- "returns": "204 No Content",
3479
+ "returns": "200 sem corpo (head ok)",
3360
3480
  "common_use_cases": [
3361
3481
  "Limpeza de dados obsoletos",
3362
3482
  "Deduplicação manual",
3363
3483
  "Remoção após confirmação do cliente"
3364
3484
  ],
3365
3485
  "related_tools": [
3366
- "lionchat_kanban_items_list",
3367
- "lionchat_kanban_items_create",
3368
- "lionchat_kanban_items_show"
3486
+ "lionchat_kanban_items_show",
3487
+ "lionchat_kanban_items_tasks_list",
3488
+ "lionchat_kanban_items_list"
3369
3489
  ]
3370
3490
  },
3371
3491
  {
@@ -3485,7 +3605,7 @@
3485
3605
  "method": "POST",
3486
3606
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/change_status",
3487
3607
  "title": "Mudar Status",
3488
- "description": "Altera o status do card (open/won/lost). Param opcional attributed_to (id do responsavel pelo ganho/perda).",
3608
+ "description": "Altera o status do card (open/won/lost). Param opcional attributed_to (id do responsavel pelo ganho/perda). CARD ADIADO (11/10/2026): status \"open\" num card adiado ABRE o card na hora (sai do adiamento, fica no historico e dispara o fluxo \"Card aberto\"); \"won\"/\"lost\" encerram o adiamento. Para ADIAR use lionchat_kanban_items_snooze. Card ocupado = 409. CO-PARTICIPANTE (13/10/2026): com status \"won\" aceita co_attributed_to (id de UM agente, ex. o SDR que trouxe a venda) — a venda conta inteira para o vendedor (attributed_to) e o co-participante ganha numeros proprios no relatorio. Recusa 422 se nao for numero, nao for membro da conta, for o proprio vendedor ou nao tiver acesso ao funil. Reabrir/perder apaga o co-participante.",
3489
3609
  "category": "Itens",
3490
3610
  "params": [
3491
3611
  {
@@ -3508,9 +3628,16 @@
3508
3628
  "location": "body",
3509
3629
  "required": false,
3510
3630
  "description": "ID do responsavel pelo ganho/perda"
3631
+ },
3632
+ {
3633
+ "name": "co_attributed_to",
3634
+ "type": "integer",
3635
+ "location": "body",
3636
+ "required": false,
3637
+ "description": "So com status won: id do CO-PARTICIPANTE da venda (ex. o SDR). Nao pode ser o vendedor. Objeto ou lista = 422. O nome o card preenche sozinho."
3511
3638
  }
3512
3639
  ],
3513
- "returns": "item Kanban criado (com novo ID)",
3640
+ "returns": "o card atualizado (mesmo id). Status fora de won/lost/open = 422 {error}",
3514
3641
  "common_use_cases": [
3515
3642
  "Cadastro inicial de item Kanban",
3516
3643
  "Automação a partir de evento externo",
@@ -3522,6 +3649,83 @@
3522
3649
  "lionchat_kanban_items_show"
3523
3650
  ]
3524
3651
  },
3652
+ {
3653
+ "id": "lionchat_kanban_items_snooze",
3654
+ "method": "POST",
3655
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/snooze",
3656
+ "title": "Adiar Card",
3657
+ "description": "Adia o card ate uma data (o \"Adiar ate\" da tela, desde 11/10/2026): o card SAI da coluna e, na data marcada, ABRE sozinho e volta para a coluna, disparando o fluxo \"Card aberto\" se houver. E uma situacao DO CARD: nao mexe na conversa, e mensagem do cliente NAO abre o card. Regras: so card ABERTO (ganho/perdido = 422 \"So card aberto pode ser adiado.\"); a data precisa estar pelo menos 1 hora a frente (menos = 422 \"Escolha uma data pelo menos 1 hora a frente.\"); sem prazo maximo; adiar um card JA adiado so TROCA a data (nao dispara \"Card adiado\" de novo). Mover de etapa ou de funil, editar, nota, tarefa e responsavel NAO encerram o adiamento; marcar ganho/perdido e abrir (lionchat_kanban_items_unsnooze, ou lionchat_kanban_items_create_2 com status \"open\") encerram. item_details.status CONTINUA \"open\" — leia effective_status (\"snoozed\") e snoozed_until. A primeira passagem de aberto para adiado dispara o gatilho de fluxo \"Card adiado\" (card_snoozed) e as automacoes do funil com gatilho \"Adiado\". Quem pode: quem pode EDITAR o card (so ver = 401; card fora do alcance = 404). Card ocupado por outra operacao no mesmo instante = 409 (tente de novo em instantes). Na data, o card abre numa rodada de ate ~5 minutos depois da hora.",
3658
+ "category": "Itens",
3659
+ "params": [
3660
+ {
3661
+ "name": "account_id",
3662
+ "type": "integer",
3663
+ "location": "path",
3664
+ "required": true,
3665
+ "description": "ID da conta"
3666
+ },
3667
+ {
3668
+ "name": "id",
3669
+ "type": "integer",
3670
+ "location": "path",
3671
+ "required": true,
3672
+ "description": "ID do card do Kanban"
3673
+ },
3674
+ {
3675
+ "name": "snoozed_until",
3676
+ "type": "string",
3677
+ "location": "body",
3678
+ "required": true,
3679
+ "description": "Ate quando adiar. Aceita unix em SEGUNDOS (o mais seguro) ou milissegundos, ISO 8601 com fuso (ex.: \"2026-10-20T09:00:00-03:00\") e data/hora SEM fuso (ex.: \"2026-10-20 09:00\"), lida no fuso da CONTA. Data pura \"AAAA-MM-DD\" vale 00:00 daquele dia no fuso da conta (o card abre de madrugada; mande a hora se quiser outra). Data ilegivel ou ausente = 400 \"Data invalida para adiar o card.\". Precisa estar pelo menos 1 hora a frente."
3680
+ }
3681
+ ],
3682
+ "returns": "O card no formato do detalhe (o mesmo de lionchat_kanban_items_show) com effective_status \"snoozed\", snoozed_until (ISO) e permissions. Erros: 400 {error} data ilegivel; 422 {error} card ganho/perdido ou data a menos de 1 hora; 409 {error} card ocupado; 404 card fora do alcance; 401 sem permissao de editar.",
3683
+ "common_use_cases": [
3684
+ "Adiar um negocio que so volta a importar numa data (\"o cliente pediu para falar em 20 dias\")",
3685
+ "Tirar da coluna os cards que esperam o cliente e fazer voltarem sozinhos na data",
3686
+ "Trocar a data de um card que ja esta adiado"
3687
+ ],
3688
+ "related_tools": [
3689
+ "lionchat_kanban_items_unsnooze",
3690
+ "lionchat_kanban_items_show",
3691
+ "lionchat_kanban_items_list",
3692
+ "lionchat_kanban_items_create_2"
3693
+ ]
3694
+ },
3695
+ {
3696
+ "id": "lionchat_kanban_items_unsnooze",
3697
+ "method": "DELETE",
3698
+ "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/snooze",
3699
+ "title": "Abrir Card Adiado",
3700
+ "description": "Abre AGORA um card adiado (o \"Abrir agora\" da tela, desde 11/10/2026): ele volta para a coluna e o fluxo \"Card aberto\" (card_opened) dispara NA HORA — se esse fluxo manda mensagem, o cliente recebe ja; confirme antes. Nao apaga nada: so encerra o adiamento. Card que NAO esta adiado: nada acontece e a resposta e o card como esta (sem erro e sem aviso). item_details.status nao muda (continua \"open\"). Fica no historico do card (item_unsnoozed, motivo \"person\"). Quem pode: quem pode EDITAR o card (so ver = 401; fora do alcance = 404). Card ocupado = 409.",
3701
+ "category": "Itens",
3702
+ "params": [
3703
+ {
3704
+ "name": "account_id",
3705
+ "type": "integer",
3706
+ "location": "path",
3707
+ "required": true,
3708
+ "description": "ID da conta"
3709
+ },
3710
+ {
3711
+ "name": "id",
3712
+ "type": "integer",
3713
+ "location": "path",
3714
+ "required": true,
3715
+ "description": "ID do card do Kanban"
3716
+ }
3717
+ ],
3718
+ "returns": "O card no formato do detalhe com effective_status \"open\" e snoozed_until null (ou o card como estava, se nao estava adiado). Erros: 409 {error} card ocupado; 404 card fora do alcance; 401 sem permissao de editar.",
3719
+ "common_use_cases": [
3720
+ "Trazer de volta antes da data um card adiado (\"o cliente respondeu antes\")",
3721
+ "Desfazer um adiamento feito por engano"
3722
+ ],
3723
+ "related_tools": [
3724
+ "lionchat_kanban_items_snooze",
3725
+ "lionchat_kanban_items_show",
3726
+ "lionchat_kanban_items_list"
3727
+ ]
3728
+ },
3525
3729
  {
3526
3730
  "id": "lionchat_kanban_items_list_1",
3527
3731
  "method": "GET",
@@ -3611,7 +3815,7 @@
3611
3815
  "method": "GET",
3612
3816
  "path": "/api/v1/accounts/{account_id}/kanban_items/search",
3613
3817
  "title": "Buscar Items",
3614
- "description": "Busca items por título, descrição, nome ou email do cliente. Busca itens Kanban por texto livre. Suporta query parcial em nome/email/telefone. Use para \"encontrar X\" rapidamente.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao).",
3818
+ "description": "Busca items por título, descrição, nome ou email do cliente. Busca itens Kanban por texto livre. Suporta query parcial em nome/email/telefone. Use para \"encontrar X\" rapidamente.\n\nNOVO (2026-06): 'q' aceita multiplos termos (espacos = E/AND, cap 5; cada termo precisa bater) e dados cadastrais (CPF/CNPJ/RG por digitos, ignora pontuacao). Desde 11/10/2026: Cada card traz effective_status (open|snoozed|won|lost) e snoozed_until (ISO ou null). No card adiado item_details.status CONTINUA \"open\": a situacao real e o effective_status.",
3615
3819
  "category": "Itens",
3616
3820
  "params": [
3617
3821
  {
@@ -3674,7 +3878,7 @@
3674
3878
  "method": "GET",
3675
3879
  "path": "/api/v1/accounts/{account_id}/kanban_items/filter",
3676
3880
  "title": "Filtrar Items",
3677
- "description": "Filtra cards do Kanban com o filtro RICO da plataforma (mesmo motor da tela '+ Filtro'). Filtros REAIS aplicados: etapas (stages), prioridades, status do card (open/won/lost), agente, faixa de valor, periodo de criacao (date_start/end), periodo de MOVIMENTACAO PARA A ETAPA atual (stage_date_start/end), periodo de agendamento (scheduled_date_*), tarefas (task_filter), canal, etiqueta da conversa, oferta e atributos personalizados de card/contato/conversa (JSON-string + custom_attribute_match all/any). ATENCAO: SEM paginacao — retorna ate 5000 cards em ordem created_at DESC, shape {items:[], total, filters}. NAO existe filtro por time aqui (use lionchat_kanban_items_list_3 pra relatorio por time, ou filtre por agent_id); ordenacao e fixa. (2026-07-24: removidos os parametros stage_id/inbox_id/sort_by/sort_direction/page — eram aceitos mas IGNORADOS pelo backend; use stages[] no lugar de stage_id.) NOVO 2026-08-13: updated_date_start/end (ultima alteracao, qualquer mexida) e closed_date_start/end (data do DESFECHO — ganho/perdido; use com statuses=['won'] pra 'os ganhos do mes'). FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros.",
3881
+ "description": "Filtra cards do Kanban com o filtro RICO da plataforma (mesmo motor da tela '+ Filtro'). Filtros REAIS aplicados: etapas (stages), prioridades, situacao do card (open/won/lost/snoozed — desde 11/10/2026 \"open\" = aberto e NAO adiado), agente, faixa de valor, periodo de criacao (date_start/end), periodo de MOVIMENTACAO PARA A ETAPA atual (stage_date_start/end), periodo de agendamento (scheduled_date_*), tarefas (task_filter), canal, etiqueta da conversa, oferta e atributos personalizados de card/contato/conversa (JSON-string + custom_attribute_match all/any). ATENCAO: SEM paginacao — retorna ate 5000 cards em ordem created_at DESC, shape {items:[], total, filters}. NAO existe filtro por time aqui (use lionchat_kanban_items_list_3 pra relatorio por time, ou filtre por agent_id); ordenacao e fixa. (2026-07-24: removidos os parametros stage_id/inbox_id/sort_by/sort_direction/page — eram aceitos mas IGNORADOS pelo backend; use stages[] no lugar de stage_id.) NOVO 2026-08-13: updated_date_start/end (ultima alteracao, qualquer mexida) e closed_date_start/end (data do DESFECHO — ganho/perdido; use com statuses=['won'] pra 'os ganhos do mes'). FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros.",
3678
3882
  "category": "Itens",
3679
3883
  "params": [
3680
3884
  {
@@ -3705,7 +3909,7 @@
3705
3909
  "type": "array",
3706
3910
  "location": "query",
3707
3911
  "required": false,
3708
- "description": "Status (open/won/lost)"
3912
+ "description": "Situacao (open/won/lost/snoozed). Desde 11/10/2026: \"open\" = aberto e NAO adiado; \"snoozed\" = adiado. Sem o parametro vem todas as situacoes"
3709
3913
  },
3710
3914
  {
3711
3915
  "name": "value_min",
@@ -3856,7 +4060,7 @@
3856
4060
  "description": "'all' (E — todas as condicoes de atributo, padrao) ou 'any' (OU — qualquer uma)"
3857
4061
  }
3858
4062
  ],
3859
- "returns": "{ items: [cards serializados], total: <int>, filters: <eco dos filtros> } — cap 5000, sem paginacao",
4063
+ "returns": "{ items: [cards serializados], total: <int>, filters: <eco dos filtros> } — cap 5000, sem paginacao Cada card traz effective_status (open|snoozed|won|lost) e snoozed_until (ISO ou null). No card adiado item_details.status CONTINUA \"open\": a situacao real e o effective_status.",
3860
4064
  "common_use_cases": [
3861
4065
  "Relatorio de cards por periodo + etapa + valor",
3862
4066
  "Cards com atributo personalizado especifico (card/contato/conversa)",
@@ -3891,6 +4095,14 @@
3891
4095
  "required": false,
3892
4096
  "description": "Prioridades"
3893
4097
  },
4098
+ {
4099
+ "name": "statuses",
4100
+ "query_name": "statuses[]",
4101
+ "type": "array",
4102
+ "location": "query",
4103
+ "required": false,
4104
+ "description": "Situacao (open/won/lost/snoozed): \"open\" = aberto e NAO adiado; \"snoozed\" = adiado. Sem o parametro exporta todas as situacoes"
4105
+ },
3894
4106
  {
3895
4107
  "name": "agent_id",
3896
4108
  "type": "integer",
@@ -3955,7 +4167,7 @@
3955
4167
  "description": "Agendamento ate (YYYY-MM-DD)"
3956
4168
  }
3957
4169
  ],
3958
- "returns": "NAO devolve JSON. Devolve um ARQUIVO CSV pra download (text/csv, anexo `kanban_items_<funil>_<data>.csv`), com cabecalho e uma linha por card: id, titulo, descricao, status, prioridade, valor, etapa (nome amigavel), funil, agentes, cliente, email, telefone, criado em, atualizado em, prazo, id da conversa, conversas vinculadas e ofertas. Nao ha `meta` nem `payload` — o corpo e o CSV cru. `funnel_id` e OBRIGATORIO (sem ele volta 400 `{error}`). Filtros opcionais: priorities, value_min, value_max, agent_id, date_start/date_end (CRIACAO), stage_date_start/stage_date_end (quando o card ENTROU na etapa atual) e scheduled_date_start/scheduled_date_end. So exporta cards das caixas que o usuario pode ver.",
4170
+ "returns": "NAO devolve JSON. Devolve um ARQUIVO CSV pra download (text/csv, anexo `kanban_items_<funil>_<data>.csv`), com cabecalho e uma linha por card: id, titulo, descricao, status, prioridade, valor, etapa (nome amigavel), funil, agentes, cliente, email, telefone, criado em, atualizado em, prazo, id da conversa, conversas vinculadas, ofertas e, desde 11/10/2026, \"Adiado ate\" (ultima coluna, data/hora no fuso da conta; na coluna status o card adiado sai como \"snoozed\"). Nao ha `meta` nem `payload` — o corpo e o CSV cru. `funnel_id` e OBRIGATORIO (sem ele volta 400 `{error}`). Filtros opcionais: priorities, statuses, value_min, value_max, agent_id, date_start/date_end (CRIACAO), stage_date_start/stage_date_end (quando o card ENTROU na etapa atual) e scheduled_date_start/scheduled_date_end. So exporta cards das caixas que o usuario pode ver.",
3959
4171
  "common_use_cases": [
3960
4172
  "Dashboard: contar/exibir itens Kanban",
3961
4173
  "Buscar com filtros antes de outra operação",
@@ -4049,7 +4261,7 @@
4049
4261
  "method": "GET",
4050
4262
  "path": "/api/v1/accounts/{account_id}/kanban_items/reports",
4051
4263
  "title": "Relatório Agregado do Kanban",
4052
- "description": "RELATORIO AGREGADO do Kanban (funil de vendas) — a resposta e um OBJETO de metricas, nao lista de cards: soma de valores GANHOS no periodo, contagem/valor por etapa, previsao ponderada (forecast), top negocios, cards parados (stale) e metas do funil. Filtra por periodo (from/to), agentes (user_ids[]) e time (team_id). USE ESTA TOOL quando pedirem 'relatorio do funil/vendas/ganhos do mes por agente ou time'. Pra LISTAR os cards em si, use lionchat_kanban_items_filter. ATENCAO wonInPeriod/wonValueInPeriod: em instalacao ANTERIOR a atualizacao de 26/07/2026 eles SUBCONTAM — negocio ganho no periodo cujo card foi criado ANTES do periodo fica de fora (numa conta real, metade dos ganhos e R$3.750 sumiam). Ao responder receita nessas contas, avise que o numero pode estar subestimado em funil de ciclo longo.",
4264
+ "description": "RELATORIO AGREGADO do Kanban (funil de vendas) — a resposta e um OBJETO de metricas, nao lista de cards: soma de valores GANHOS no periodo, contagem/valor por etapa, previsao ponderada (forecast), top negocios, cards parados (stale) e metas do funil. CARD ADIADO (11/10/2026): statusDistribution.open CONTINUA incluindo os adiados (e a soma que o aplicativo le) e statusDistribution.snoozed vem ao lado: abertos de verdade = open - snoozed. Parados, maiores negocios, ranking e previsao ja deixam o adiado de fora. Filtra por periodo (from/to), agentes (user_ids[]) e time (team_id). USE ESTA TOOL quando pedirem 'relatorio do funil/vendas/ganhos do mes por agente ou time'. Pra LISTAR os cards em si, use lionchat_kanban_items_filter. ATENCAO wonInPeriod/wonValueInPeriod: em instalacao ANTERIOR a atualizacao de 26/07/2026 eles SUBCONTAM — negocio ganho no periodo cujo card foi criado ANTES do periodo fica de fora (numa conta real, metade dos ganhos e R$3.750 sumiam). Ao responder receita nessas contas, avise que o numero pode estar subestimado em funil de ciclo longo. CO-PARTICIPANTE DA VENDA (13/10/2026): vem sempre coParticipantRanking [{id, name, sales, value}] — uma linha por co-participante (ex. o SDR marcado no ganho), contando cards GANHOS no periodo com os mesmos recortes; o filtro de pessoa/time vale sobre o co-participante; nenhum numero antigo muda. Com include_shared_sales=true vem tambem sharedSalesSummary {solo, shared, sharedSellerLeft} (cada um {count, value}; sozinho + compartilhadas = ganhos do periodo) e sharedSalesBySeller [{id, sales, value}]. A LISTA das vendas compartilhadas e lionchat_kanban_items_shared_sales.",
4053
4265
  "category": "Itens",
4054
4266
  "params": [
4055
4267
  {
@@ -4088,23 +4300,148 @@
4088
4300
  "required": false,
4089
4301
  "description": "ID do time — restringe aos cards dos agentes do time"
4090
4302
  },
4303
+ {
4304
+ "name": "label_names",
4305
+ "query_name": "label_names[]",
4306
+ "type": "array",
4307
+ "location": "query",
4308
+ "required": false,
4309
+ "description": "Etiquetas (pelo NOME, como aparecem na conversa) — so cards com essas etiquetas"
4310
+ },
4311
+ {
4312
+ "name": "win_reason_ids",
4313
+ "query_name": "win_reason_ids[]",
4314
+ "type": "array",
4315
+ "location": "query",
4316
+ "required": false,
4317
+ "description": "Codigos dos motivos de GANHO (lionchat_kanban_config_list) — so ganhos com esses motivos"
4318
+ },
4091
4319
  {
4092
4320
  "name": "date_basis",
4093
4321
  "type": "string",
4094
4322
  "location": "query",
4095
4323
  "required": false,
4096
4324
  "description": "Qual data o periodo (from/to) considera. 'any' = PADRAO e regua historica (card CRIADO no periodo OU FECHADO no periodo) — omitir mantem exatamente os numeros de sempre. 'created' = so criados. 'moved' = so os que entraram na etapa atual no periodo. 'closed' = so ganhos/perdidos no periodo (a pergunta de receita). Valor invalido cai no padrao sem erro, e a regua aplicada volta em dateBasis."
4325
+ },
4326
+ {
4327
+ "name": "include_shared_sales",
4328
+ "type": "boolean",
4329
+ "location": "query",
4330
+ "required": false,
4331
+ "description": "true = traz sharedSalesSummary e sharedSalesBySeller (vendas sozinho x compartilhadas com co-participante). Sem o parametro a resposta e a de sempre."
4097
4332
  }
4098
4333
  ],
4099
- "returns": "objeto de metricas agregadas do funil (valores ganhos, por etapa, forecast, top deals, stale) — NAO e array de itens",
4334
+ "returns": "objeto de metricas agregadas do funil (valores ganhos, por etapa, forecast, top deals, stale, coParticipantRanking; com include_shared_sales=true tambem sharedSalesSummary e sharedSalesBySeller) — NAO e array de itens",
4100
4335
  "common_use_cases": [
4101
4336
  "Ganhos do mes por agente ou time",
4102
4337
  "Valor total e contagem por etapa do funil",
4103
- "Forecast (previsao ponderada) e negocios parados"
4338
+ "Forecast (previsao ponderada) e negocios parados",
4339
+ "Quanto cada SDR (co-participante) trouxe e vendas sozinho x compartilhadas para comissao dividida"
4104
4340
  ],
4105
4341
  "related_tools": [
4106
4342
  "lionchat_kanban_items_list",
4107
4343
  "lionchat_kanban_items_create",
4344
+ "lionchat_kanban_items_show",
4345
+ "lionchat_kanban_items_shared_sales"
4346
+ ]
4347
+ },
4348
+ {
4349
+ "id": "lionchat_kanban_items_shared_sales",
4350
+ "method": "GET",
4351
+ "path": "/api/v1/accounts/{account_id}/kanban_items/shared_sales",
4352
+ "title": "Vendas Compartilhadas (vendedor + co-participante)",
4353
+ "description": "[13/10/2026] A lista 'Vendas compartilhadas no periodo' do relatorio do Kanban (aba Vendedores): cards GANHOS no periodo com co-participante (ex. o SDR) DIFERENTE do vendedor gravado no card. Mesmos filtros e mesma regua do lionchat_kanban_items_list_3; a mais recente no topo, 50 por vez (limit ate 500). Para a proxima pagina devolva o nextCursor recebido: cursor_at = nextCursor.at e cursor_id = nextCursor.id; nextCursor nulo = acabou (cursor invalido volta a primeira pagina). Com filtro de pessoa/time so entra venda em que alguem do filtro foi VENDEDOR ou CO-PARTICIPANTE e vem asSellerCount/asCoCount (sem filtro, nulos). canOpen por linha diz se quem pediu pode abrir o card; quem ve so parte do Kanban recebe as vendas que nao ve so como hiddenCount (nunca o titulo). Sair da conta NAO transforma venda compartilhada em individual (vale o vendedor gravado). Mesma permissao do relatorio do Kanban.",
4354
+ "category": "Itens",
4355
+ "params": [
4356
+ {
4357
+ "name": "funnel_id",
4358
+ "type": "integer",
4359
+ "location": "query",
4360
+ "required": false,
4361
+ "description": "ID do funil (opcional; sem ele, todos os funis da conta)"
4362
+ },
4363
+ {
4364
+ "name": "from",
4365
+ "type": "string",
4366
+ "location": "query",
4367
+ "required": false,
4368
+ "description": "Inicio do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Mande unix se quiser o instante exato; data SEM hora cobre o dia inteiro no fuso da conta. Padrao: 30 dias atras."
4369
+ },
4370
+ {
4371
+ "name": "to",
4372
+ "type": "string",
4373
+ "location": "query",
4374
+ "required": false,
4375
+ "description": "Fim do periodo. Aceita: unix em SEGUNDOS (o mais seguro), unix em milissegundos, ISO 8601 (com Z ou offset; sem offset vale a hora da conta) e data pura AAAA-MM-DD (dia INTEIRO no fuso da conta: inicio 00:00:00, fim 23:59:59). Texto ilegivel devolve 400 com a explicacao do formato. Data SEM hora cobre o dia inteiro (ate 23:59:59 no fuso da conta). Padrao: agora."
4376
+ },
4377
+ {
4378
+ "name": "date_basis",
4379
+ "type": "string",
4380
+ "location": "query",
4381
+ "required": false,
4382
+ "description": "Qual data o periodo (from/to) considera. 'any' = PADRAO e regua historica (card CRIADO no periodo OU FECHADO no periodo) — omitir mantem exatamente os numeros de sempre. 'created' = so criados. 'moved' = so os que entraram na etapa atual no periodo. 'closed' = so ganhos/perdidos no periodo (a pergunta de receita). Valor invalido cai no padrao sem erro, e a regua aplicada volta em dateBasis."
4383
+ },
4384
+ {
4385
+ "name": "user_ids",
4386
+ "query_name": "user_ids[]",
4387
+ "type": "array",
4388
+ "location": "query",
4389
+ "required": false,
4390
+ "description": "IDs de agentes — so vendas em que um deles foi o VENDEDOR gravado ou o CO-PARTICIPANTE"
4391
+ },
4392
+ {
4393
+ "name": "team_id",
4394
+ "type": "integer",
4395
+ "location": "query",
4396
+ "required": false,
4397
+ "description": "ID do time — mesma regra do user_ids para as pessoas do time"
4398
+ },
4399
+ {
4400
+ "name": "label_names",
4401
+ "query_name": "label_names[]",
4402
+ "type": "array",
4403
+ "location": "query",
4404
+ "required": false,
4405
+ "description": "Etiquetas (pelo NOME) — so cards com essas etiquetas"
4406
+ },
4407
+ {
4408
+ "name": "win_reason_ids",
4409
+ "query_name": "win_reason_ids[]",
4410
+ "type": "array",
4411
+ "location": "query",
4412
+ "required": false,
4413
+ "description": "Codigos dos motivos de GANHO — so ganhos com esses motivos"
4414
+ },
4415
+ {
4416
+ "name": "cursor_at",
4417
+ "type": "string",
4418
+ "location": "query",
4419
+ "required": false,
4420
+ "description": "Pagina seguinte: o nextCursor.at da resposta anterior (data do ganho com 6 casas)"
4421
+ },
4422
+ {
4423
+ "name": "cursor_id",
4424
+ "type": "integer",
4425
+ "location": "query",
4426
+ "required": false,
4427
+ "description": "Pagina seguinte: o nextCursor.id da resposta anterior"
4428
+ },
4429
+ {
4430
+ "name": "limit",
4431
+ "type": "integer",
4432
+ "location": "query",
4433
+ "required": false,
4434
+ "description": "Linhas por pagina (padrao 50, maximo 500; acima disso para no teto)"
4435
+ }
4436
+ ],
4437
+ "returns": "{total, totalValue, asSellerCount, asCoCount, hiddenCount, nextCursor: {at, id} | null, items: [{id, title, value, wonAt, funnelId, sellerId, sellerName, sellerActive, coId, coName, coActive, canOpen}]}",
4438
+ "common_use_cases": [
4439
+ "Listar as vendas feitas com SDR (co-participante) no mes para pagar comissao dividida",
4440
+ "Ver as vendas compartilhadas de um vendedor ou de um SDR especifico (user_ids)"
4441
+ ],
4442
+ "related_tools": [
4443
+ "lionchat_kanban_items_list_3",
4444
+ "lionchat_kanban_items_create_2",
4108
4445
  "lionchat_kanban_items_show"
4109
4446
  ]
4110
4447
  },
@@ -4182,8 +4519,8 @@
4182
4519
  "id": "lionchat_kanban_items_destroy_1",
4183
4520
  "method": "DELETE",
4184
4521
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/unlink_conversation",
4185
- "title": "Desvincular Conversa",
4186
- "description": "Remove vinculo de conversa. Remove item Kanban permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
4522
+ "title": "Desvincular Conversa do Card",
4523
+ "description": "Desvincula UMA conversa do card (rota unlink_conversation). NAO exclui o card, NAO apaga a conversa, as mensagens nem as tarefas: so desfaz o vinculo entre este card e a conversa informada em conversation_display_id (o numero da conversa que aparece na tela). Se a conversa nao estava vinculada ao card, a resposta e 422. Para excluir o card use lionchat_kanban_items_destroy.",
4187
4524
  "category": "Itens",
4188
4525
  "params": [
4189
4526
  {
@@ -4201,16 +4538,16 @@
4201
4538
  "description": "Display ID"
4202
4539
  }
4203
4540
  ],
4204
- "returns": "204 No Content",
4541
+ "returns": "o card (objeto) sem a conversa vinculada; 400 se faltar conversation_display_id; 422 se nao foi possivel desvincular.",
4205
4542
  "common_use_cases": [
4206
4543
  "Limpeza de dados obsoletos",
4207
4544
  "Deduplicação manual",
4208
4545
  "Remoção após confirmação do cliente"
4209
4546
  ],
4210
4547
  "related_tools": [
4548
+ "lionchat_kanban_items_show",
4211
4549
  "lionchat_kanban_items_list",
4212
- "lionchat_kanban_items_create",
4213
- "lionchat_kanban_items_show"
4550
+ "lionchat_kanban_items_destroy"
4214
4551
  ]
4215
4552
  },
4216
4553
  {
@@ -7998,7 +8335,7 @@
7998
8335
  "method": "POST",
7999
8336
  "path": "/api/v1/accounts/{account_id}/macros",
8000
8337
  "title": "Criar Macro",
8001
- "description": "Cria uma nova macro com ações. Obrigatórios: name, actions (visibility: personal ou global). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422. CARDÁPIO (17/09/2026, 41 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 7 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status (todas exigem card já existente no funil informado, exceto create). send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
8338
+ "description": "Cria uma nova macro com ações. Obrigatórios: name, actions (visibility: personal ou global). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422. CARDÁPIO (11/10/2026, 42 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 8 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status, snooze_kanban_item (todas exigem card já existente no funil informado, exceto create). snooze_kanban_item ([{funnel_id, amount, unit: \"hours\"|\"days\"}], desde 11/10/2026) ADIA o card e, ao contrário das irmãs, FALHA visível quando não dá para adiar (card fechado, sem card no funil, tempo inválido); set_kanban_item_status [\"open\"] num card adiado ABRE o card. send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
8002
8339
  "category": "Macros",
8003
8340
  "params": [
8004
8341
  {
@@ -8020,7 +8357,7 @@
8020
8357
  "type": "array",
8021
8358
  "location": "body",
8022
8359
  "required": true,
8023
- "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
8360
+ "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]; snooze_kanban_item [{\"funnel_id\": 31, \"amount\": 3, \"unit\": \"days\"}] (11/10/2026: adia o card por N horas/dias; unit \"hours\" ou \"days\", amount inteiro >= 1; em regra de evento de CARD basta [{\"amount\": 3, \"unit\": \"days\"}]; falha visível se não der para adiar). Tabela completa no resource conversation-flows ('Acoes de automacao')."
8024
8361
  }
8025
8362
  ],
8026
8363
  "returns": "macro criado (com novo ID)",
@@ -8060,7 +8397,7 @@
8060
8397
  "method": "PATCH",
8061
8398
  "path": "/api/v1/accounts/{account_id}/macros/{id}",
8062
8399
  "title": "Atualizar Macro",
8063
- "description": "Atualiza macro. PATCH parcial: só campos enviados são alterados (name, actions, visibility). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado retorna 422. CARDÁPIO (17/09/2026, 41 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 7 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status (todas exigem card já existente no funil informado, exceto create). send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
8400
+ "description": "Atualiza macro. PATCH parcial: só campos enviados são alterados (name, actions, visibility). As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado retorna 422. CARDÁPIO (11/10/2026, 42 ações — os action_params seguem os MESMOS formatos das automações, ver conversation-flows.md 'Acoes de automacao'): send_message, add_private_note, send_canned_response ([id] — na MACRO a mensagem sai assinada pelo EXECUTOR; na automação sai como robô), send_attachment, send_email_transcript, send_email_to_team, send_webhook_event, add_label/remove_label (etiqueta da CONVERSA), add_contact_label/remove_contact_label ([titulos] — etiqueta do CONTATO), assign_agent, assign_team, remove_assigned_team, distribute_agents ([agent_ids] — rodízio de verdade, nunca sorteio), change_status, change_priority, open_conversation/pending_conversation/resolve_conversation, snooze_conversation ([] = até a próxima resposta, ou ['until_tomorrow'] etc.), mute_conversation, mark_unread ([]), add_sla ([sla_policy_id]), assign_captain_assistant ([id] ou [{assistant_id, proactive}]), deactivate_captain ([]), send_signature_document, update_contact_attribute/update_conversation_attribute ([{attribute_key, value}] — chave PROTEGIDA é recusada na execução e fica só no log: prefixos waha_whatsapp_/whatsapp_/origin_/ctwa_/meta_lead_/lt_ e atributos de sistema como utm_*/gclid), update_card_attribute ([{funnel_id, attribute_key, value}]), add_card_checklist ([{funnel_id, checklist_template_ids}]), add_card_offer ([{funnel_id, offer_ids}]), e as 8 de Kanban: create_kanban_item, move_kanban_item_to_stage, assign_agent_to_kanban_item, add_note_to_kanban_item, start_kanban_item_timer, stop_kanban_item_timer, set_kanban_item_status, snooze_kanban_item (todas exigem card já existente no funil informado, exceto create). snooze_kanban_item ([{funnel_id, amount, unit: \"hours\"|\"days\"}], desde 11/10/2026) ADIA o card e, ao contrário das irmãs, FALHA visível quando não dá para adiar (card fechado, sem card no funil, tempo inválido); set_kanban_item_status [\"open\"] num card adiado ABRE o card. send_conversion ([{destinations, event_names, value}] — Meta CAPI/GA4/Google Ads com trigger_type 'macro') só pode ser SALVO por administrador ou cargo com marketing_integrations_manage: para os demais, 422 com o motivo; EXECUTAR segue liberado; teto de 50 conversões por execução (o excedente é pulado com log e as outras ações rodam). Fora do cardápio: send_whatsapp_template. start_flow ([flow_id] — dispara um FLOW DE ACOES (flow_type 'action') na conversa; 17/09/2026). SO flow de acoes entra aqui: a macro roda em qualquer conversa e nao filtra caixa, entao um flow de MENSAGEM apontado aqui rodaria numa caixa que nao e dele. Flow inexistente, desligado ou de outro tipo e ignorado em silencio.",
8064
8401
  "category": "Macros",
8065
8402
  "params": [
8066
8403
  {
@@ -8082,7 +8419,7 @@
8082
8419
  "type": "array",
8083
8420
  "location": "body",
8084
8421
  "required": false,
8085
- "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). No update a lista SUBSTITUI a anterior: mande TODAS as acoes."
8422
+ "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]; snooze_kanban_item [{\"funnel_id\": 31, \"amount\": 3, \"unit\": \"days\"}] (11/10/2026: adia o card por N horas/dias; unit \"hours\" ou \"days\", amount inteiro >= 1; em regra de evento de CARD basta [{\"amount\": 3, \"unit\": \"days\"}]; falha visível se não der para adiar). Tabela completa no resource conversation-flows ('Acoes de automacao'). No update a lista SUBSTITUI a anterior: mande TODAS as acoes."
8086
8423
  },
8087
8424
  {
8088
8425
  "name": "visibility",
@@ -8520,7 +8857,7 @@
8520
8857
  "description": "Recorta por AGENDA (unidade). SEM este parametro a listagem ja vem recortada pelas agendas que o usuario enxerga. Na agenda PRINCIPAL entram tambem os compromissos com agenda nula."
8521
8858
  }
8522
8859
  ],
8523
- "returns": "LISTA PURA (array no topo, SEM embrulho meta/payload) — a resposta JA E a lista de tarefas da agenda. Cada tarefa traz todos os campos da tarefa (id, title, description, task_type, status, scheduled_at, completed, recurrence_*), mais assignees [{id, name, agenda_color}], assignee_ids, conversation_display_id, conversation_contact_name, contact_name/contact_phone/contact_email, meeting_url, calendar_color, is_readonly, is_private, guest_emails, attendee_rsvp e booking_id. Lista vazia = []. Com filtro de data (date_start/date_end) devolve TUDO do periodo sem paginar (teto de 10.000). Sem filtro de data, pagina por `page`/`per_page` — mas a resposta NAO traz numero de paginas nem total: pagina cheia sugere que ha mais.",
8860
+ "returns": "LISTA PURA (array no topo, SEM embrulho meta/payload) — a resposta JA E a lista de tarefas da agenda. Cada tarefa traz todos os campos da tarefa (id, title, description, task_type, status, scheduled_at, completed, recurrence_*), mais assignees [{id, name, agenda_color}], assignee_ids, conversation_display_id, conversation_contact_name, contact_name/contact_phone/contact_email, meeting_url, calendar_color, is_readonly, is_private, guest_emails, attendee_rsvp e booking_id; o compromisso que veio do Booking traz tambem booking_reschedule_url e booking_calendar_url (16/10: link \"salvar na minha agenda\" para mandar ao cliente; nulo quando o compromisso foi cancelado, concluido ou ja passou). Lista vazia = []. Com filtro de data (date_start/date_end) devolve TUDO do periodo sem paginar (teto de 10.000). Sem filtro de data, pagina por `page`/`per_page` — mas a resposta NAO traz numero de paginas nem total: pagina cheia sugere que ha mais. Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
8524
8861
  "common_use_cases": [
8525
8862
  "Dashboard: contar/exibir tarefas/agenda",
8526
8863
  "Buscar com filtros antes de outra operação",
@@ -8536,7 +8873,7 @@
8536
8873
  "method": "POST",
8537
8874
  "path": "/api/v1/accounts/{account_id}/account_tasks",
8538
8875
  "title": "Criar Tarefa",
8539
- "description": "Cria uma tarefa/compromisso. Obrigatorios: title, scheduled_at. Requer feature unified_agenda + LionLab PRO. Para task_type video_call ou meeting, o link do Google Meet é gerado automaticamente após ~5s (campo meeting_url). Reuniões com convidados NÃO suportam recorrência. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida.",
8876
+ "description": "Cria uma tarefa/compromisso. Obrigatorios: title, scheduled_at. Requer feature unified_agenda + LionLab PRO. Para task_type video_call ou meeting, o link do Google Meet é gerado automaticamente após ~5s (campo meeting_url). Reuniões com convidados NÃO suportam recorrência. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida. **Presa a card (20/10):** `kanban_item_id` prende a tarefa a um card do Kanban e `occupies_agenda` diz se ela bloqueia o horario. Tentar prender a card um agendamento, uma sessao de programa ou um evento do Google devolve 422 (errors.kanban_item_id); card inexistente, de outra conta ou que a pessoa nao ve tambem e 422.",
8540
8877
  "category": "Agenda / Tarefas",
8541
8878
  "params": [
8542
8879
  {
@@ -8699,9 +9036,23 @@
8699
9036
  "location": "body",
8700
9037
  "required": false,
8701
9038
  "description": "'Marcar proxima': numero da sessao pedida (1..N); sessao ja marcada = 422 'Essa sessao ja foi marcada'"
9039
+ },
9040
+ {
9041
+ "name": "kanban_item_id",
9042
+ "type": "integer",
9043
+ "location": "body",
9044
+ "required": false,
9045
+ "description": "ID do card do Kanban a que a tarefa fica PRESA (a tarefa aparece na aba Tarefas do card e some junto com ele se for simples; veja lionchat_kanban_items_destroy). A pessoa precisa ver o card; card de outra conta ou invisivel = 422. Agendamento (Booking), sessao de programa/tratamento e evento importado do Google NAO podem ser presos a card (422). Diferente de linked_kanban_item_id. (enviar null para soltar)"
9046
+ },
9047
+ {
9048
+ "name": "occupies_agenda",
9049
+ "type": "boolean",
9050
+ "location": "body",
9051
+ "required": false,
9052
+ "description": "Ocupa a agenda: true (padrao) = o horario da tarefa conta como ocupado na agenda e no Google Agenda; false = e so um lembrete, nao bloqueia o horario. Agendamento do Booking e evento importado do Google SEMPRE ocupam (o servidor forca true)."
8702
9053
  }
8703
9054
  ],
8704
- "returns": "tarefa/agenda criado (com novo ID)",
9055
+ "returns": "tarefa/agenda criado (com novo ID) Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
8705
9056
  "common_use_cases": [
8706
9057
  "Cadastro inicial de tarefa/agenda",
8707
9058
  "Automação a partir de evento externo",
@@ -8728,7 +9079,7 @@
8728
9079
  "description": "ID da tarefa"
8729
9080
  }
8730
9081
  ],
8731
- "returns": "tarefa/agenda (objeto completo com associações)",
9082
+ "returns": "tarefa/agenda (objeto completo com associações; compromisso do Booking traz booking_reschedule_url e booking_calendar_url — link \"salvar na minha agenda\", nulo quando não dá mais para salvar) Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
8732
9083
  "common_use_cases": [
8733
9084
  "Ver dados completos antes de editar",
8734
9085
  "Verificar estado atual antes de uma ação",
@@ -8741,7 +9092,7 @@
8741
9092
  "method": "PATCH",
8742
9093
  "path": "/api/v1/accounts/{account_id}/account_tasks/{id}",
8743
9094
  "title": "Atualizar Tarefa",
8744
- "description": "Atualiza uma tarefa. Campos alterados em video_call/meeting disparam sync com Google Calendar. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, description, task_type, priority, scheduled_at, duration_minutes. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante.",
9095
+ "description": "Atualiza uma tarefa. Campos alterados em video_call/meeting disparam sync com Google Calendar. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, description, task_type, priority, scheduled_at, duration_minutes. **Tratamento em sessoes (15/09):** com tipo `sessions_enabled`, o agendamento pelo painel/API nasce como sessao do tratamento do contato (proxima a marcar; cheio = sessao extra ate 60; concluido = ciclo novo) e a tarefa devolve `tratamento` {id, sessao, total, titulo} (nulo em compromisso comum). `treatment.*` cria o plano; `agenda_treatment_id` + `treatment_session_number` marcam uma sessao pedida. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante. **Presa a card (20/10):** `kanban_item_id` prende a tarefa a um card do Kanban e `occupies_agenda` diz se ela bloqueia o horario. Tentar prender a card um agendamento, uma sessao de programa ou um evento do Google devolve 422 (errors.kanban_item_id); card inexistente, de outra conta ou que a pessoa nao ve tambem e 422.",
8745
9096
  "category": "Agenda / Tarefas",
8746
9097
  "params": [
8747
9098
  {
@@ -8911,9 +9262,23 @@
8911
9262
  "location": "body",
8912
9263
  "required": false,
8913
9264
  "description": "'Marcar proxima': numero da sessao pedida (1..N); sessao ja marcada = 422 'Essa sessao ja foi marcada'"
9265
+ },
9266
+ {
9267
+ "name": "kanban_item_id",
9268
+ "type": "integer",
9269
+ "location": "body",
9270
+ "required": false,
9271
+ "description": "ID do card do Kanban a que a tarefa fica PRESA (a tarefa aparece na aba Tarefas do card e some junto com ele se for simples; veja lionchat_kanban_items_destroy). A pessoa precisa ver o card; card de outra conta ou invisivel = 422. Agendamento (Booking), sessao de programa/tratamento e evento importado do Google NAO podem ser presos a card (422). Diferente de linked_kanban_item_id. (enviar null para soltar)"
9272
+ },
9273
+ {
9274
+ "name": "occupies_agenda",
9275
+ "type": "boolean",
9276
+ "location": "body",
9277
+ "required": false,
9278
+ "description": "Ocupa a agenda: true (padrao) = o horario da tarefa conta como ocupado na agenda e no Google Agenda; false = e so um lembrete, nao bloqueia o horario. Agendamento do Booking e evento importado do Google SEMPRE ocupam (o servidor forca true)."
8914
9279
  }
8915
9280
  ],
8916
- "returns": "tarefa/agenda atualizado",
9281
+ "returns": "tarefa/agenda atualizado Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
8917
9282
  "common_use_cases": [
8918
9283
  "Edição parcial de tarefa/agenda",
8919
9284
  "Alteração de status/estado",
@@ -9043,7 +9408,7 @@
9043
9408
  "method": "PATCH",
9044
9409
  "path": "/api/v1/accounts/{account_id}/account_tasks/{id}/update_future",
9045
9410
  "title": "Atualizar Futuras",
9046
- "description": "Atualiza esta e todas as futuras instâncias de tarefa recorrente. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, scheduled_at. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante.",
9411
+ "description": "Atualiza esta e todas as futuras instâncias de tarefa recorrente. Atualiza campos do tarefa/agenda existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, scheduled_at. **Compromisso de Booking (17/09):** tarefa com `booking_id` tem responsavel FIXO (o profissional do tipo de evento) — `assignee_ids` e IGNORADO (200, o resto da edicao vale). Para mudar quem atende, edite o tipo de evento. **Presenca nao conclui:** mandar `attendance` NAO muda `status`; nao conclua a tarefa so porque a presenca foi marcada (concluir compromisso de Booking encerra lembretes/pos-atendimento e dispara o gatilho de fluxo 'agendamento concluido'). A resposta traz `selo` com o rotulo resultante. **Presa a card (20/10):** `kanban_item_id` prende a tarefa a um card do Kanban e `occupies_agenda` diz se ela bloqueia o horario. Tentar prender a card um agendamento, uma sessao de programa ou um evento do Google devolve 422 (errors.kanban_item_id); card inexistente, de outra conta ou que a pessoa nao ve tambem e 422. Na serie, `kanban_item_id` e `occupies_agenda` valem para esta e todas as ocorrencias futuras.",
9047
9412
  "category": "Agenda / Tarefas",
9048
9413
  "params": [
9049
9414
  {
@@ -9080,9 +9445,23 @@
9080
9445
  "location": "body",
9081
9446
  "required": false,
9082
9447
  "description": "Presenca: attended (compareceu) ou no_show (faltou). E um CARIMBO, nao um status — nao substitui `status`, e marcar falta NAO devolve o horario para a agenda."
9448
+ },
9449
+ {
9450
+ "name": "kanban_item_id",
9451
+ "type": "integer",
9452
+ "location": "body",
9453
+ "required": false,
9454
+ "description": "ID do card do Kanban a que a tarefa fica PRESA (a tarefa aparece na aba Tarefas do card e some junto com ele se for simples; veja lionchat_kanban_items_destroy). A pessoa precisa ver o card; card de outra conta ou invisivel = 422. Agendamento (Booking), sessao de programa/tratamento e evento importado do Google NAO podem ser presos a card (422). Diferente de linked_kanban_item_id. (enviar null para soltar)"
9455
+ },
9456
+ {
9457
+ "name": "occupies_agenda",
9458
+ "type": "boolean",
9459
+ "location": "body",
9460
+ "required": false,
9461
+ "description": "Ocupa a agenda: true (padrao) = o horario da tarefa conta como ocupado na agenda e no Google Agenda; false = e so um lembrete, nao bloqueia o horario. Agendamento do Booking e evento importado do Google SEMPRE ocupam (o servidor forca true)."
9083
9462
  }
9084
9463
  ],
9085
- "returns": "tarefa/agenda atualizado",
9464
+ "returns": "tarefa/agenda atualizado Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
9086
9465
  "common_use_cases": [
9087
9466
  "Edição parcial de tarefa/agenda",
9088
9467
  "Alteração de status/estado",
@@ -9134,7 +9513,7 @@
9134
9513
  "description": "Recorta por AGENDA (unidade). SEM este parametro a listagem ja vem recortada pelas agendas que o usuario enxerga. Na agenda PRINCIPAL entram tambem os compromissos com agenda nula."
9135
9514
  }
9136
9515
  ],
9137
- "returns": "Objeto com QUATRO listas separadas, sem meta e sem payload: { overdue: [...], today: [...], tomorrow: [...], next_7_days: [...] }. Traz APENAS tarefas em aberto (status pendente ou adiada — concluida/cancelada nao aparece) e nao ocultas, ja filtradas pela permissao de quem chama (administrador ve todas; agente ve so as que criou ou em que e responsavel). Agrupamento pela data agendada: overdue = antes de hoje 00:00 (ordenado da mais recente para a mais antiga), today = hoje, tomorrow = amanha, next_7_days = ate 7 dias a frente. Cada item e a tarefa completa (serializacao do modelo AccountTask, ja com assignees/assignee_ids, completed, dados de recorrencia, conversation_display_id, nome/telefone/email do contato, meeting_url e links de booking). Sem paginacao (teto de 10 mil por grupo).",
9516
+ "returns": "Objeto com QUATRO listas separadas, sem meta e sem payload: { overdue: [...], today: [...], tomorrow: [...], next_7_days: [...] }. Traz APENAS tarefas em aberto (status pendente ou adiada — concluida/cancelada nao aparece) e nao ocultas, ja filtradas pela permissao de quem chama (administrador ve todas; agente ve so as que criou ou em que e responsavel). Agrupamento pela data agendada: overdue = antes de hoje 00:00 (ordenado da mais recente para a mais antiga), today = hoje, tomorrow = amanha, next_7_days = ate 7 dias a frente. Cada item e a tarefa completa (serializacao do modelo AccountTask, ja com assignees/assignee_ids, completed, dados de recorrencia, conversation_display_id, nome/telefone/email do contato, meeting_url e links de booking). Sem paginacao (teto de 10 mil por grupo). Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
9138
9517
  "common_use_cases": [
9139
9518
  "Dashboard: contar/exibir tarefas/agenda",
9140
9519
  "Buscar com filtros antes de outra operação",
@@ -9177,7 +9556,7 @@
9177
9556
  "method": "GET",
9178
9557
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/tasks",
9179
9558
  "title": "Tarefas do Card",
9180
- "description": "Lista tarefas de todas as conversas vinculadas ao card (primária + linked). Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Filtros disponíveis: scope, page. Retorna meta (contadores) + payload (array de tarefa/agenda). **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
9559
+ "description": "Lista as TAREFAS DO CARD (aba Tarefas do card): as tarefas PRESAS a este card (kanban_item_id) MAIS as tarefas sem card das conversas dele (principal + vinculadas). Tarefa presa a OUTRO card nao aparece aqui, mesmo na mesma conversa. Respeita a visibilidade da Agenda de quem chama. Paginada (per_page padrao 10, maximo 100). Filtro opcional scope: active (pendentes+adiadas) ou done (concluidas+canceladas). Cada tarefa traz `selo` (17/09): o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
9181
9560
  "category": "Agenda / Tarefas",
9182
9561
  "params": [
9183
9562
  {
@@ -9202,7 +9581,7 @@
9202
9581
  "description": "Página"
9203
9582
  }
9204
9583
  ],
9205
- "returns": "Lista pura (array), sem embrulho: a resposta E o array de tarefas do card, juntando as tarefas de TODAS as conversas vinculadas a ele. Cada tarefa traz os campos do registro mais `assignees` (id, nome, cor na agenda), `assignee_ids`, `completed`, dados de recorrencia (recurrence_type/count/group_id), `conversation_display_id`, `conversation_contact_name` e dados do contato (contact_name, contact_phone, contact_email). Paginada: 10 por pagina por padrao (parametros `page` e `per_page`, teto 100) e o total NAO vem no corpo. Filtro opcional `scope`: active (pendentes+adiadas) ou done (concluidas+canceladas).",
9584
+ "returns": "Lista pura (array), sem embrulho: a resposta E o array de tarefas do card, juntando as tarefas presas ao card com as sem card das conversas dele. Cada tarefa traz os campos do registro mais `assignees` (id, nome, cor na agenda), `assignee_ids`, `completed`, dados de recorrencia (recurrence_type/count/group_id), `conversation_display_id`, `conversation_contact_name` e dados do contato (contact_name, contact_phone, contact_email). Paginada: 10 por pagina por padrao (parametros `page` e `per_page`, teto 100) e o total NAO vem no corpo. Filtro opcional `scope`: active (pendentes+adiadas) ou done (concluidas+canceladas). Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
9206
9585
  "common_use_cases": [
9207
9586
  "Dashboard: contar/exibir tarefas/agenda",
9208
9587
  "Buscar com filtros antes de outra operação",
@@ -9219,7 +9598,7 @@
9219
9598
  "method": "GET",
9220
9599
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/next_task",
9221
9600
  "title": "Próxima Tarefa do Card",
9222
- "description": "Retorna a PROXIMA tarefa pendente ou adiada do card (a de menor scheduled_at), considerando a conversa principal e as vinculadas. Devolve UM OBJETO de tarefa — nao ha meta/payload nem paginacao — e `{}` (objeto vazio) quando nao ha nenhuma. Nao procure um array: procurar array aqui faz voce responder \"esse card nao tem proxima tarefa\" quando tem. ATENCAO: esta rota NAO filtra por privacidade de tarefa — pode devolver tarefa de OUTRO atendente, ao contrario do campo `next_task` que vem dentro do proprio card (esse so mostra tarefa de quem esta consultando). **`selo` (17/09):** cada tarefa traz o rotulo UNICO que o painel mostra ao lado dela, so de leitura — `cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`. Junta `status`, `attendance` e remarcacao (pelo painel ou pelo cliente no link). Para dizer o que aconteceu com o compromisso, leia `selo`: `status: pending` sozinho NAO significa que nada aconteceu (a pessoa pode ter faltado).",
9601
+ "description": "Retorna a PROXIMA tarefa pendente ou adiada do card (a de menor scheduled_at), pela mesma regra da aba Tarefas do card: tarefas presas ao card (kanban_item_id) mais as sem card das conversas dele, inclusive card sem conversa. Devolve UM OBJETO de tarefa — nao ha meta/payload nem paginacao — e `{}` (objeto vazio) quando nao ha nenhuma. Nao procure um array: procurar array aqui faz voce responder \"esse card nao tem proxima tarefa\" quando tem. Segue a MESMA regua de privacidade do campo `next_task` que vem dentro do proprio card: administrador ve todas; atendente so ve tarefa de que e dono ou responsavel. `selo` (17/09): cada tarefa traz o rotulo UNICO que o painel mostra, so de leitura (`cancelled` > `no_show` / `attended` > `completed` > `snoozed` > `rescheduled` > `pending`); `status: pending` sozinho NAO significa que nada aconteceu.",
9223
9602
  "category": "Agenda / Tarefas",
9224
9603
  "params": [
9225
9604
  {
@@ -9230,7 +9609,7 @@
9230
9609
  "description": "ID do card Kanban"
9231
9610
  }
9232
9611
  ],
9233
- "returns": "A tarefa (objeto unico, mesmo formato de uma tarefa da agenda) ou `{}` quando nao ha nenhuma pendente/adiada. Sem meta, sem payload e sem paginacao.",
9612
+ "returns": "A tarefa (objeto unico, mesmo formato de uma tarefa da agenda) ou `{}` quando nao ha nenhuma pendente/adiada. Sem meta, sem payload e sem paginacao. Toda tarefa traz tambem `kanban_item_id` (card a que esta presa, ou nulo), `kanban_item_title` (nome do card, ou nulo), `occupies_agenda` (true|false) e `automation_event_key` (preenchido so nas tarefas criadas por automacao do funil ou bloco do fluxo; identifica o acontecimento que a gerou, nunca e editavel).",
9234
9613
  "common_use_cases": [
9235
9614
  "Dashboard: contar/exibir tarefas/agenda",
9236
9615
  "Buscar com filtros antes de outra operação",
@@ -10294,7 +10673,7 @@
10294
10673
  "type": "string",
10295
10674
  "location": "body",
10296
10675
  "required": false,
10297
- "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}}. Variavel desconhecida sai CRUA para o cliente."
10676
+ "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}} {{link_salvar_na_agenda}} (16/10: abre a parte em que o cliente salva o compromisso no Google Agenda ou na agenda do iPhone/Outlook). Variavel desconhecida sai CRUA para o cliente."
10298
10677
  },
10299
10678
  {
10300
10679
  "name": "booking_event_type.sessions_enabled",
@@ -10490,7 +10869,7 @@
10490
10869
  "type": "string",
10491
10870
  "location": "body",
10492
10871
  "required": false,
10493
- "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}}. Variavel desconhecida sai CRUA para o cliente."
10872
+ "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}} {{link_salvar_na_agenda}} (16/10: abre a parte em que o cliente salva o compromisso no Google Agenda ou na agenda do iPhone/Outlook). Variavel desconhecida sai CRUA para o cliente."
10494
10873
  },
10495
10874
  {
10496
10875
  "name": "booking_event_type.sessions_enabled",
@@ -10804,14 +11183,14 @@
10804
11183
  "type": "array",
10805
11184
  "location": "body",
10806
11185
  "required": true,
10807
- "description": "[{attribute_key, filter_operator, query_operator, values[]}] REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
11186
+ "description": "[{attribute_key, filter_operator, query_operator, values[]}] REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). EMPRESA (2026-10-16): custom_attribute_type 'company_attribute' = campo PERSONALIZADO da empresa do contato (chave definida em lionchat_custom_attributes_list attribute_model=company_attribute; pode ser igual a de contato, o tipo decide). Operadores pelo tipo: todos equal_to/not_equal_to/is_present/is_not_present; texto + contains/does_not_contain; numero/data/hora + is_greater_than/is_less_than. attribute_changed recusado. Negativo inclui contato sem empresa. Modulo Empresas desligado = a condicao nunca casa. filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10808
11187
  },
10809
11188
  {
10810
11189
  "name": "actions",
10811
11190
  "type": "array",
10812
11191
  "location": "body",
10813
11192
  "required": true,
10814
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
11193
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]; snooze_kanban_item [{\"funnel_id\": 31, \"amount\": 3, \"unit\": \"days\"}] (11/10/2026: adia o card por N horas/dias; unit \"hours\" ou \"days\", amount inteiro >= 1; em regra de evento de CARD basta [{\"amount\": 3, \"unit\": \"days\"}]; falha visível se não der para adiar). Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
10815
11194
  },
10816
11195
  {
10817
11196
  "name": "active",
@@ -10902,14 +11281,14 @@
10902
11281
  "type": "array",
10903
11282
  "location": "body",
10904
11283
  "required": false,
10905
- "description": "Condicoes REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
11284
+ "description": "Condicoes REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). EMPRESA (2026-10-16): custom_attribute_type 'company_attribute' = campo PERSONALIZADO da empresa do contato (chave definida em lionchat_custom_attributes_list attribute_model=company_attribute; pode ser igual a de contato, o tipo decide). Operadores pelo tipo: todos equal_to/not_equal_to/is_present/is_not_present; texto + contains/does_not_contain; numero/data/hora + is_greater_than/is_less_than. attribute_changed recusado. Negativo inclui contato sem empresa. Modulo Empresas desligado = a condicao nunca casa. filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10906
11285
  },
10907
11286
  {
10908
11287
  "name": "actions",
10909
11288
  "type": "array",
10910
11289
  "location": "body",
10911
11290
  "required": false,
10912
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
11291
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]; snooze_kanban_item [{\"funnel_id\": 31, \"amount\": 3, \"unit\": \"days\"}] (11/10/2026: adia o card por N horas/dias; unit \"hours\" ou \"days\", amount inteiro >= 1; em regra de evento de CARD basta [{\"amount\": 3, \"unit\": \"days\"}]; falha visível se não der para adiar). Tabela completa no resource conversation-flows ('Acoes de automacao'). ESPERA QUE CONFERE (26/09/2026): 'wait' aceita o formato OBJETO [{\"seconds\": 120, \"only_if_open\": true, \"only_if_no_reply\": true}] — na VOLTA, only_if_open só segue se a conversa ainda estiver aberta/pendente e only_if_no_reply só segue se ninguém respondeu o cliente durante a espera (qualquer mensagem pública de saída conta). Barrou = o resto da regra não roda e o histórico da execução mostra o passo wait_check 'skipped'. O formato antigo [120] continua valendo, sem conferência. Teto 300 s."
10913
11292
  }
10914
11293
  ],
10915
11294
  "returns": "regra de automação atualizado",
@@ -11252,7 +11631,7 @@
11252
11631
  "type": "string",
11253
11632
  "location": "body",
11254
11633
  "required": false,
11255
- "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}}. Variavel desconhecida sai CRUA para o cliente."
11634
+ "description": "Texto de abertura da pagina publica. Aceita {{nome}} {{titulo}} {{tipo}} {{agente}} {{data}} {{horario}} {{dia_semana}} {{duracao}} {{telefone}} {{email}} {{link_cancelar}} {{link_remarcar}} {{link_confirmar}} {{link_salvar_na_agenda}} (16/10: abre a parte em que o cliente salva o compromisso no Google Agenda ou na agenda do iPhone/Outlook). Variavel desconhecida sai CRUA para o cliente."
11256
11635
  }
11257
11636
  ],
11258
11637
  "returns": "tipo de evento criado (com novo ID)",
@@ -11878,7 +12257,7 @@
11878
12257
  "description": "Ordenacao: name, domain, created_at, contacts_count, last_activity_at (prefixo - = decrescente, ex. -last_activity_at)"
11879
12258
  }
11880
12259
  ],
11881
- "returns": "meta (contadores globais) + payload (array de empresas)",
12260
+ "returns": "meta (contadores globais) + payload (array de empresas; cada uma com additional_attributes e custom_attributes)",
11882
12261
  "common_use_cases": [
11883
12262
  "Dashboard: contar/exibir empresas",
11884
12263
  "Buscar com filtros antes de outra operação",
@@ -11891,7 +12270,7 @@
11891
12270
  "method": "POST",
11892
12271
  "path": "/api/v1/accounts/{account_id}/companies",
11893
12272
  "title": "Criar Empresa",
11894
- "description": "Cria uma empresa. Body exige wrapper company. Aceita name, domain, description, avatar e additional_attributes (cadastro). NAO aceita custom_attributes. ENTERPRISE-only. Empresa so nasce assim (manual): o sistema nao cria empresa pelo dominio do e-mail dos contatos. Cadastro da empresa em additional_attributes: { legal_name (razao social), cnpj (validado; grava so digitos), phone, email, address: {cep, street, number, complement, neighborhood, city, state, country}, social_profiles: {linkedin, facebook, instagram, telegram, tiktok, twitter, github} }. A gravacao MESCLA: mande so o que muda; valor vazio (\"\") apaga aquela chave; chave ausente nao mexe. CNPJ ou e-mail invalido = 422. additional_attributes, address e social_profiles precisam ser OBJETOS (texto ou lista = 422, nada e apagado).",
12273
+ "description": "Cria uma empresa. Body exige wrapper company. Aceita name, domain, description, avatar, additional_attributes (cadastro) e custom_attributes (atributos personalizados). custom_attributes (2026-10-15): atributos personalizados da EMPRESA, objeto {chave: valor} de valores SIMPLES (texto, numero, verdadeiro/falso ou null; lista ou objeto dentro = 422). MESCLA: mande so o que muda; null ou texto vazio LIMPA a chave. So chave que ja existe como definicao company_attribute da conta (lionchat_custom_attributes_list com attribute_model=company_attribute); chave desconhecida = 422 com a lista das validas e NADA do pedido e gravado. Teto de 1.500 caracteres por valor; data aceita DD/MM/AAAA. ONDE MAIS APARECE (2026-10-16): o campo personalizado vira variavel {{contact.company.custom_attribute.CHAVE}} (e o cadastro {{contact.company.name|legal_name|cnpj|phone|email|address.city|address.state}}) em mensagem, fluxo, automacao, campanha e modelo oficial; condicao do bloco Condicao do fluxo (attrSource 'company'); condicao de automacao e filtro de contatos (custom_attribute_type 'company_attribute'); a IA (Agente e Copiloto) le a empresa do contato. Modulo Empresas desligado = tudo isso para. ENTERPRISE-only. Empresa so nasce assim (manual): o sistema nao cria empresa pelo dominio do e-mail dos contatos. Cadastro da empresa em additional_attributes: { legal_name (razao social), cnpj (validado; grava so digitos), phone, email, address: {cep, street, number, complement, neighborhood, city, state, country}, social_profiles: {linkedin, facebook, instagram, telegram, tiktok, twitter, github} }. A gravacao MESCLA: mande so o que muda; valor vazio (\"\") apaga aquela chave; chave ausente nao mexe. CNPJ ou e-mail invalido = 422. additional_attributes, address e social_profiles precisam ser OBJETOS (texto ou lista = 422, nada e apagado).",
11895
12274
  "category": "Empresas",
11896
12275
  "params": [
11897
12276
  {
@@ -11899,7 +12278,7 @@
11899
12278
  "type": "object",
11900
12279
  "location": "body",
11901
12280
  "required": true,
11902
- "description": "Wrapper com { name, domain, description, avatar, additional_attributes: { legal_name, cnpj, phone, email, address: {...}, social_profiles: {...} } }"
12281
+ "description": "Wrapper com { name, domain, description, avatar, additional_attributes: { legal_name, cnpj, phone, email, address: {...}, social_profiles: {...} }, custom_attributes: { chave: valor } }"
11903
12282
  }
11904
12283
  ],
11905
12284
  "returns": "empresa criado (com novo ID)",
@@ -11927,7 +12306,7 @@
11927
12306
  "description": "ID da empresa"
11928
12307
  }
11929
12308
  ],
11930
- "returns": "empresa (objeto completo com associações)",
12309
+ "returns": "empresa (objeto completo com associações), incluindo additional_attributes (cadastro) e custom_attributes (atributos personalizados, {} quando vazio)",
11931
12310
  "common_use_cases": [
11932
12311
  "Ver dados completos antes de editar",
11933
12312
  "Verificar estado atual antes de uma ação",
@@ -11944,7 +12323,7 @@
11944
12323
  "method": "PATCH",
11945
12324
  "path": "/api/v1/accounts/{account_id}/companies/{id}",
11946
12325
  "title": "Atualizar Empresa",
11947
- "description": "Atualiza dados da empresa. Suporta atualizacao parcial (PATCH) — so campos enviados sao alterados. Campos suportados: name, domain, description, avatar e additional_attributes (cadastro). Cadastro da empresa em additional_attributes: { legal_name (razao social), cnpj (validado; grava so digitos), phone, email, address: {cep, street, number, complement, neighborhood, city, state, country}, social_profiles: {linkedin, facebook, instagram, telegram, tiktok, twitter, github} }. A gravacao MESCLA: mande so o que muda; valor vazio (\"\") apaga aquela chave; chave ausente nao mexe. CNPJ ou e-mail invalido = 422. additional_attributes, address e social_profiles precisam ser OBJETOS (texto ou lista = 422, nada e apagado).",
12326
+ "description": "Atualiza dados da empresa. Suporta atualizacao parcial (PATCH) — so campos enviados sao alterados. Campos suportados: name, domain, description, avatar, additional_attributes (cadastro) e custom_attributes (atributos personalizados). custom_attributes (2026-10-15): atributos personalizados da EMPRESA, objeto {chave: valor} de valores SIMPLES (texto, numero, verdadeiro/falso ou null; lista ou objeto dentro = 422). MESCLA: mande so o que muda; null ou texto vazio LIMPA a chave. So chave que ja existe como definicao company_attribute da conta (lionchat_custom_attributes_list com attribute_model=company_attribute); chave desconhecida = 422 com a lista das validas e NADA do pedido e gravado. Teto de 1.500 caracteres por valor; data aceita DD/MM/AAAA. ONDE MAIS APARECE (2026-10-16): o campo personalizado vira variavel {{contact.company.custom_attribute.CHAVE}} (e o cadastro {{contact.company.name|legal_name|cnpj|phone|email|address.city|address.state}}) em mensagem, fluxo, automacao, campanha e modelo oficial; condicao do bloco Condicao do fluxo (attrSource 'company'); condicao de automacao e filtro de contatos (custom_attribute_type 'company_attribute'); a IA (Agente e Copiloto) le a empresa do contato. Modulo Empresas desligado = tudo isso para. Cadastro da empresa em additional_attributes: { legal_name (razao social), cnpj (validado; grava so digitos), phone, email, address: {cep, street, number, complement, neighborhood, city, state, country}, social_profiles: {linkedin, facebook, instagram, telegram, tiktok, twitter, github} }. A gravacao MESCLA: mande so o que muda; valor vazio (\"\") apaga aquela chave; chave ausente nao mexe. CNPJ ou e-mail invalido = 422. additional_attributes, address e social_profiles precisam ser OBJETOS (texto ou lista = 422, nada e apagado).",
11948
12327
  "category": "Empresas",
11949
12328
  "params": [
11950
12329
  {
@@ -11959,7 +12338,7 @@
11959
12338
  "type": "object",
11960
12339
  "location": "body",
11961
12340
  "required": true,
11962
- "description": "Wrapper com { name, domain, description, avatar, additional_attributes: { legal_name, cnpj, phone, email, address: {...}, social_profiles: {...} } }"
12341
+ "description": "Wrapper com { name, domain, description, avatar, additional_attributes: { legal_name, cnpj, phone, email, address: {...}, social_profiles: {...} }, custom_attributes: { chave: valor } }"
11963
12342
  }
11964
12343
  ],
11965
12344
  "returns": "empresa atualizado",
@@ -12224,6 +12603,40 @@
12224
12603
  "lionchat_companies_update"
12225
12604
  ]
12226
12605
  },
12606
+ {
12607
+ "id": "lionchat_companies_import_status",
12608
+ "method": "GET",
12609
+ "path": "/api/v1/accounts/{account_id}/companies/import_status/{import_id}",
12610
+ "title": "Andamento da Importacao de Empresas",
12611
+ "description": "Acompanha a importacao de empresas em massa que ja foi enviada (lionchat_companies_bulk_create ou o botao 'Importar empresas' da tela). O import_id e o codigo devolvido na hora de importar — a importacao roda em segundo plano, entao consulte de tempos em tempos ate o status virar 'completed' ou 'failed'. errors = linhas que NAO entraram (sem nome, mais de uma empresa com o mesmo nome sem CNPJ e sem site), com o numero da linha da planilha (o titulo e a linha 1, entao o item N da lista e a linha N+1). skipped = campos que ficaram em branco por valor invalido, com o motivo; a empresa entrou mesmo assim. O registro vive 24 horas: depois disso volta 404 mesmo que a importacao tenha dado certo, entao 404 nao significa fracasso. Exige o modulo Empresas ligado e administrador ou cargo com 'Exportar e importar contatos'. ENTERPRISE-only.",
12612
+ "category": "Empresas",
12613
+ "params": [
12614
+ {
12615
+ "name": "account_id",
12616
+ "type": "integer",
12617
+ "location": "path",
12618
+ "required": true,
12619
+ "description": "ID da conta"
12620
+ },
12621
+ {
12622
+ "name": "import_id",
12623
+ "type": "string",
12624
+ "location": "path",
12625
+ "required": true,
12626
+ "description": "Codigo da importacao (UUID) devolvido por lionchat_companies_bulk_create"
12627
+ }
12628
+ ],
12629
+ "returns": "{ status: 'queued'|'processing'|'completed'|'failed', total, processed, created, updated, error_count, errors: [{row, message}], skipped_fields, skipped: [{row, field, message}], blank_rows, error_message? } — e { error } com 404 se o codigo nao existe ou ja passou de 24 horas",
12630
+ "common_use_cases": [
12631
+ "Avisar quando a lista de empresas terminou de entrar",
12632
+ "Descobrir quantas empresas foram criadas e quantas foram atualizadas",
12633
+ "Ver quais linhas nao entraram e por que"
12634
+ ],
12635
+ "related_tools": [
12636
+ "lionchat_companies_list",
12637
+ "lionchat_companies_search"
12638
+ ]
12639
+ },
12227
12640
  {
12228
12641
  "id": "lionchat_offers_list",
12229
12642
  "method": "GET",
@@ -16363,14 +16776,14 @@
16363
16776
  "type": "array",
16364
16777
  "location": "body",
16365
16778
  "required": true,
16366
- "description": "LISTA de componentes no formato da Meta, cada item um OBJETO com type: HEADER {type, format: TEXT|IMAGE|VIDEO|DOCUMENT, text, example}; BODY {type, text, example: {body_text: [[...]]}} (obrigatorio); FOOTER {type, text}; BUTTONS {type, buttons: [{type: QUICK_REPLY|URL|PHONE_NUMBER, text, url, phone_number, example}]}. Ex.: [{\"type\": \"BODY\", \"text\": \"Ola {{1}}, seu pedido saiu.\", \"example\": {\"body_text\": [[\"Maria\"]]}}]. Variavel {{N}} no corpo exige example. Exemplos completos no resource best-practices (templates)."
16779
+ "description": "LISTA de componentes no formato da Meta, cada item um OBJETO com type: HEADER {type, format: TEXT|IMAGE|VIDEO|DOCUMENT, text, example}; BODY {type, text, example: {body_text: [[...]]}} (obrigatorio); FOOTER {type, text}; BUTTONS {type, buttons: [{type: QUICK_REPLY|URL|PHONE_NUMBER, text, url, phone_number, example} ou {type: FLOW, text (ate 25), flow_id: '<meta_flow_id do formulario PUBLICADO, como texto>', flow_action: 'navigate'} — botao que abre um Formulario do WhatsApp (whatsapp_forms_list); no maximo 1 por modelo]}. Ex.: [{\"type\": \"BODY\", \"text\": \"Ola {{1}}, seu pedido saiu.\", \"example\": {\"body_text\": [[\"Maria\"]]}}]. Variavel {{N}} no corpo exige example. Exemplos completos no resource best-practices (templates)."
16367
16780
  },
16368
16781
  {
16369
16782
  "name": "variable_mapping",
16370
16783
  "type": "object",
16371
16784
  "location": "body",
16372
16785
  "required": false,
16373
- "description": "Opcional. Mapeia variaveis {{N}} do corpo a campos do sistema para auto-preenchimento no envio (NAO vai para a Meta, fica salvo localmente). Chave = posicao da variavel (\"1\", \"2\"...), valor = objeto {source, field, label}. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. Variavel sem mapping continua manual (digitada no envio). Fontes/campos: contact/name (Nome completo), contact/name.split.first (Primeiro nome), contact/name.split[1..] (Sobrenome), contact/phone_number, contact/email, conversation/assignee.name (Atendente), conversation/team.name (Equipe), account/name, ou contact/custom_attributes.CHAVE para campo personalizado. [NOVO 2026-07-25] Botao de link (URL) com variavel — link rastreavel por cliente: a URL do botao pode terminar com {{1}} (regra da Meta: no maximo UMA variavel, exatamente {{1}}, sempre NO FINAL, com base https:// fixa antes). Nesse caso o componente BUTTONS precisa mandar example: [\"<url com o exemplo no lugar do {{1}}>\"] (sem o example a Meta recusa o template na hora, erro 100) e o variable_mapping recebe a chave especial _button_url = {source, field, label, example, button_index}, onde button_index e a POSICAO do botao dentro do componente BUTTONS. source/field usam a mesma tabela das variaveis de corpo (contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/custom_attributes.CHAVE, conversation/display_id, conversation/assignee.name, account/name), mais 'custom' (texto fixo, vai no field). No envio o valor e codificado automaticamente (espaco vira %20), entao o link nunca quebra. A chave comeca com _ de proposito: ela NAO conta como variavel de corpo."
16786
+ "description": "Opcional. Mapeia variaveis {{N}} do corpo a campos do sistema para auto-preenchimento no envio (NAO vai para a Meta, fica salvo localmente). Chave = posicao da variavel (\"1\", \"2\"...), valor = objeto {source, field, label}. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. Variavel sem mapping continua manual (digitada no envio). Fontes/campos: contact/name (Nome completo), contact/name.split.first (Primeiro nome), contact/name.split[1..] (Sobrenome), contact/phone_number, contact/email, conversation/assignee.name (Atendente), conversation/team.name (Equipe), account/name, ou contact/custom_attributes.CHAVE para campo personalizado. [NOVO 2026-07-25] Botao de link (URL) com variavel — link rastreavel por cliente: a URL do botao pode terminar com {{1}} (regra da Meta: no maximo UMA variavel, exatamente {{1}}, sempre NO FINAL, com base https:// fixa antes). Nesse caso o componente BUTTONS precisa mandar example: [\"<url com o exemplo no lugar do {{1}}>\"] (sem o example a Meta recusa o template na hora, erro 100) e o variable_mapping recebe a chave especial _button_url = {source, field, label, example, button_index}, onde button_index e a POSICAO do botao dentro do componente BUTTONS. source/field usam a mesma tabela das variaveis de corpo (contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/custom_attributes.CHAVE, conversation/display_id, conversation/assignee.name, account/name), mais 'custom' (texto fixo, vai no field). No envio o valor e codificado automaticamente (espaco vira %20), entao o link nunca quebra. A chave comeca com _ de proposito: ela NAO conta como variavel de corpo. [2026-10-16] Empresa do contato: campo personalizado {source:'company', field:'custom_attribute.CHAVE'}; cadastro {source:'variable', field:'contact.company.legal_name'} (tambem .cnpj, .phone, .email, .address.city, .address.state). Contato sem empresa (ou modulo Empresas desligado) = posicao vazia."
16374
16787
  }
16375
16788
  ],
16376
16789
  "returns": "template WhatsApp criado (com novo ID)",
@@ -16496,7 +16909,7 @@
16496
16909
  "type": "object",
16497
16910
  "location": "body",
16498
16911
  "required": false,
16499
- "description": "Opcional. Mapeia variaveis {{N}} a campos do sistema para auto-preenchimento no envio (NAO vai para a Meta). Chave = posicao da variavel (\"1\", \"2\"...), valor = objeto {source, field, label}. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. Mesmas fontes/campos do endpoint de criacao. [NOVO 2026-07-25] Botao de link (URL) com variavel — link rastreavel por cliente: a URL do botao pode terminar com {{1}} (regra da Meta: no maximo UMA variavel, exatamente {{1}}, sempre NO FINAL, com base https:// fixa antes). Nesse caso o componente BUTTONS precisa mandar example: [\"<url com o exemplo no lugar do {{1}}>\"] (sem o example a Meta recusa o template na hora, erro 100) e o variable_mapping recebe a chave especial _button_url = {source, field, label, example, button_index}, onde button_index e a POSICAO do botao dentro do componente BUTTONS. source/field usam a mesma tabela das variaveis de corpo (contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/custom_attributes.CHAVE, conversation/display_id, conversation/assignee.name, account/name), mais 'custom' (texto fixo, vai no field). No envio o valor e codificado automaticamente (espaco vira %20), entao o link nunca quebra. A chave comeca com _ de proposito: ela NAO conta como variavel de corpo."
16912
+ "description": "Opcional. Mapeia variaveis {{N}} a campos do sistema para auto-preenchimento no envio (NAO vai para a Meta). Chave = posicao da variavel (\"1\", \"2\"...), valor = objeto {source, field, label}. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. Mesmas fontes/campos do endpoint de criacao. [NOVO 2026-07-25] Botao de link (URL) com variavel — link rastreavel por cliente: a URL do botao pode terminar com {{1}} (regra da Meta: no maximo UMA variavel, exatamente {{1}}, sempre NO FINAL, com base https:// fixa antes). Nesse caso o componente BUTTONS precisa mandar example: [\"<url com o exemplo no lugar do {{1}}>\"] (sem o example a Meta recusa o template na hora, erro 100) e o variable_mapping recebe a chave especial _button_url = {source, field, label, example, button_index}, onde button_index e a POSICAO do botao dentro do componente BUTTONS. source/field usam a mesma tabela das variaveis de corpo (contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/custom_attributes.CHAVE, conversation/display_id, conversation/assignee.name, account/name), mais 'custom' (texto fixo, vai no field). No envio o valor e codificado automaticamente (espaco vira %20), entao o link nunca quebra. A chave comeca com _ de proposito: ela NAO conta como variavel de corpo. [2026-10-16] Empresa do contato: campo personalizado {source:'company', field:'custom_attribute.CHAVE'}; cadastro {source:'variable', field:'contact.company.legal_name'} (tambem .cnpj, .phone, .email, .address.city, .address.state). Contato sem empresa (ou modulo Empresas desligado) = posicao vazia."
16500
16913
  }
16501
16914
  ],
16502
16915
  "returns": "{ success: true }",
@@ -16538,7 +16951,7 @@
16538
16951
  "type": "object",
16539
16952
  "location": "body",
16540
16953
  "required": true,
16541
- "description": "Mapa das variaveis do CORPO. Chave = texto interno de {{...}} do corpo aprovado ('1','2'... ou nomeada). Valor = {source: contact|conversation|account|custom, field: <campo>, label: <opcional>}. Fontes/campos validos: contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/id, conversation/display_id, conversation/assignee.name, conversation/team.name, account/name, {contact|conversation|account}/custom_attribute.<chave>, custom/<texto fixo>. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. AUTORITATIVO: substitui TODO o apontamento de corpo; {} limpa tudo. NAO aceita chaves com _ (cabecalho/botao)."
16954
+ "description": "Mapa das variaveis do CORPO. Chave = texto interno de {{...}} do corpo aprovado ('1','2'... ou nomeada). Valor = {source: contact|conversation|account|custom, field: <campo>, label: <opcional>}. Fontes/campos validos: contact/name, contact/name.split.first, contact/phone_number, contact/email, contact/id, conversation/display_id, conversation/assignee.name, conversation/team.name, account/name, {contact|conversation|account}/custom_attribute.<chave>, custom/<texto fixo>. Ex: {\"1\": {\"source\": \"contact\", \"field\": \"name.split.first\", \"label\": \"Primeiro nome\"}}. AUTORITATIVO: substitui TODO o apontamento de corpo; {} limpa tudo. NAO aceita chaves com _ (cabecalho/botao). [2026-10-16] Empresa do contato: campo personalizado {source:'company', field:'custom_attribute.CHAVE'}; cadastro {source:'variable', field:'contact.company.legal_name'} (tambem .cnpj, .phone, .email, .address.city, .address.state). Contato sem empresa (ou modulo Empresas desligado) = posicao vazia."
16542
16955
  }
16543
16956
  ],
16544
16957
  "returns": "template atualizado com o variable_mapping local salvo; status/review na Meta inalterados",
@@ -21271,7 +21684,7 @@
21271
21684
  "description": "Lista numeros disponiveis para identificacao de chamada. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
21272
21685
  "category": "Chamadas",
21273
21686
  "params": [],
21274
- "returns": "Repassa CRUA a resposta da operadora Zenvia (GET /bina/relatorio) — nao ha meta, payload nem paginacao nossa. O formato e `{ sucesso: true, dados: { relatorio: [ { id, numero_telefone, ... } ] } }`: os numeros ficam em `dados.relatorio`. O conteudo sao NUMEROS DE IDENTIFICACAO DE CHAMADA (binas), nao chamadas VoIP. Se a conta nao tiver VoIP configurado (sem token Zenvia), a chamada falha com erro de servidor. Em resposta nao-JSON da operadora, vem `{ status, body }`.",
21687
+ "returns": "Repassa CRUA a resposta da operadora Zenvia (GET /bina/relatorio) — nao ha meta, payload nem paginacao nossa. O formato e `{ sucesso: true, dados: { relatorio: [ { id, numero_telefone, ... } ] } }`: os numeros ficam em `dados.relatorio`. O conteudo sao NUMEROS DE IDENTIFICACAO DE CHAMADA (binas), nao chamadas VoIP. Se a conta nao tiver VoIP configurado (sem token Zenvia), volta 404 { success: false, error: \"VoIP nao configurado\" } (desde 07/10/2026; antes era erro de servidor). Em resposta nao-JSON da operadora, vem `{ status, body }`.",
21275
21688
  "common_use_cases": [
21276
21689
  "Dashboard: contar/exibir chamadas VoIP",
21277
21690
  "Buscar com filtros antes de outra operação",
@@ -22034,7 +22447,7 @@
22034
22447
  "type": "string",
22035
22448
  "location": "query",
22036
22449
  "required": false,
22037
- "description": "Filtra por modelo: contact ou conversation"
22450
+ "description": "Filtra por modelo, SEMPRE com o sufixo: conversation_attribute | contact_attribute | account_attribute | company_attribute (empresa). So 'conversation' ou 'contact' NAO da erro — devolve a lista VAZIA."
22038
22451
  },
22039
22452
  {
22040
22453
  "name": "include_system",
@@ -22061,7 +22474,7 @@
22061
22474
  "method": "POST",
22062
22475
  "path": "/api/v1/accounts/{account_id}/custom_attribute_definitions",
22063
22476
  "title": "Criar Definicao de Atributo",
22064
- "description": "Cria uma nova definicao de atributo personalizado. **Requer perfil Administrador.** Obrigatórios: attribute_display_name, attribute_display_type, attribute_key. attribute_model tem default 'conversation_attribute' — para um atributo de contato, passe 'contact_attribute'. Retorna o atributo personalizado criado com ID atribuído.",
22477
+ "description": "Cria uma nova definicao de atributo personalizado. **Requer perfil Administrador.** Obrigatórios: attribute_display_name, attribute_display_type, attribute_key. attribute_model tem default 'conversation_attribute' — para um atributo de contato, passe 'contact_attribute'; de EMPRESA, 'company_attribute' (so com o modulo Empresas; depois preencha com lionchat_companies_update custom_attributes). Retorna o atributo personalizado criado com ID atribuído.",
22065
22478
  "category": "Atributos Personalizados",
22066
22479
  "params": [
22067
22480
  {
@@ -22097,7 +22510,7 @@
22097
22510
  "type": "string",
22098
22511
  "location": "body",
22099
22512
  "required": false,
22100
- "description": "contact_attribute ou conversation_attribute (default conversation_attribute)"
22513
+ "description": "conversation_attribute (PADRAO) | contact_attribute | account_attribute (variavel da conta) | company_attribute (atributo personalizado de EMPRESA, 2026-10-15: exige o modulo Empresas ligado na conta, tipo secret recusado, chaves reservadas recusadas: name, domain, description, legal_name, cnpj, phone, email, address, social_profiles, contacts_count, created_at, last_activity_at). SEMPRE com o sufixo _attribute."
22101
22514
  },
22102
22515
  {
22103
22516
  "name": "attribute_description",
@@ -22118,7 +22531,7 @@
22118
22531
  "type": "string",
22119
22532
  "location": "body",
22120
22533
  "required": false,
22121
- "description": "Regex de validacao (opcional)"
22534
+ "description": "Regra de formato (opcional, atributo de texto). Aceita os dois jeitos: CRU como no Ruby (ex. \\A\\d{5}-\\d{3}\\z) ou COM BARRAS como a tela grava (ex. /^\\d{5}-\\d{3}$/, flags i e s). Os dois valem na tela, na IA e no bloco Esperar resposta (desde 13/10/2026)."
22122
22535
  },
22123
22536
  {
22124
22537
  "name": "regex_cue",
@@ -22217,7 +22630,7 @@
22217
22630
  "type": "string",
22218
22631
  "location": "body",
22219
22632
  "required": false,
22220
- "description": "contact_attribute ou conversation_attribute"
22633
+ "description": "conversation_attribute (PADRAO) | contact_attribute | account_attribute (variavel da conta) | company_attribute (atributo personalizado de EMPRESA, 2026-10-15: exige o modulo Empresas ligado na conta, tipo secret recusado, chaves reservadas recusadas: name, domain, description, legal_name, cnpj, phone, email, address, social_profiles, contacts_count, created_at, last_activity_at). SEMPRE com o sufixo _attribute."
22221
22634
  },
22222
22635
  {
22223
22636
  "name": "attribute_description",
@@ -22238,7 +22651,7 @@
22238
22651
  "type": "string",
22239
22652
  "location": "body",
22240
22653
  "required": false,
22241
- "description": "Regex de validacao (opcional)"
22654
+ "description": "Regra de formato (opcional, atributo de texto). Aceita os dois jeitos: CRU como no Ruby (ex. \\A\\d{5}-\\d{3}\\z) ou COM BARRAS como a tela grava (ex. /^\\d{5}-\\d{3}$/, flags i e s). Os dois valem na tela, na IA e no bloco Esperar resposta (desde 13/10/2026)."
22242
22655
  },
22243
22656
  {
22244
22657
  "name": "regex_cue",
@@ -22289,6 +22702,192 @@
22289
22702
  "lionchat_custom_attributes_show"
22290
22703
  ]
22291
22704
  },
22705
+ {
22706
+ "id": "lionchat_custom_attribute_categories_list",
22707
+ "method": "GET",
22708
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories",
22709
+ "title": "Listar Categorias de Atributos",
22710
+ "description": "Lista as categorias (pastas que abrem e fecham) dos atributos personalizados da conta, de TODAS as abas. Qualquer pessoa da conta pode ler. Atributo que nao aparece em nenhum attribute_keys esta em 'Sem categoria' (o normal: categoria e opcional). Uma chave em attribute_keys que nao existe mais como atributo e ignorada pela tela (atributo apagado). Para a aba Card, attribute_keys traz o NOME do campo exatamente como gravado em lionchat_kanban_config (global_custom_attributes[].name).",
22711
+ "category": "Atributos Personalizados",
22712
+ "params": [],
22713
+ "returns": "Lista pura (array): [{id, attribute_model, name, position, attribute_keys: [...]}]. Ordene por attribute_model e position para reproduzir a tela.",
22714
+ "common_use_cases": [
22715
+ "Saber em que categoria cada atributo esta antes de mover",
22716
+ "Mostrar ao cliente como os atributos estao organizados em cada aba",
22717
+ "Achar o id da categoria para colocar um atributo nela"
22718
+ ],
22719
+ "related_tools": [
22720
+ "lionchat_custom_attribute_categories_create",
22721
+ "lionchat_custom_attribute_categories_assign",
22722
+ "lionchat_custom_attributes_list",
22723
+ "lionchat_custom_attribute_categories_reorder"
22724
+ ]
22725
+ },
22726
+ {
22727
+ "id": "lionchat_custom_attribute_categories_create",
22728
+ "method": "POST",
22729
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories",
22730
+ "title": "Criar Categoria de Atributos",
22731
+ "description": "Cria uma categoria (pasta) numa aba de Configuracoes > Atributos personalizados. **Requer perfil Administrador.** A categoria pertence a UMA aba so (attribute_model) e entra no FIM da aba. Nome de 1 a 60 caracteres, sem repetir na mesma aba (sem diferenciar maiuscula); 'Sem categoria' e reservado; maximo 50 categorias por aba. NAO aceita atributos junto: para colocar atributos, use lionchat_custom_attribute_categories_assign depois.",
22732
+ "category": "Atributos Personalizados",
22733
+ "params": [
22734
+ {
22735
+ "name": "name",
22736
+ "type": "string",
22737
+ "location": "body",
22738
+ "required": true,
22739
+ "description": "Nome da categoria (ex: 'Sobre a casa'). Texto de 1 a 60 caracteres."
22740
+ },
22741
+ {
22742
+ "name": "attribute_model",
22743
+ "type": "string",
22744
+ "location": "body",
22745
+ "required": true,
22746
+ "description": "Aba da categoria, SEMPRE com o sufixo: conversation_attribute (Conversas) | contact_attribute (Contato) | company_attribute (Empresa, so com o modulo Empresas) | kanban_item_attribute (Card). Variavel de conta (account_attribute) NAO tem categoria."
22747
+ }
22748
+ ],
22749
+ "returns": "A categoria criada: {id, attribute_model, name, position, attribute_keys: []} (201). 422 {error, code} se o nome repetir, for reservado, passar de 60 caracteres ou a aba ja tiver 50.",
22750
+ "common_use_cases": [
22751
+ "Organizar os atributos de contato em grupos (ex: 'Financeiro', 'Sobre a casa')",
22752
+ "Montar a estrutura de atributos de um cliente novo"
22753
+ ],
22754
+ "related_tools": [
22755
+ "lionchat_custom_attribute_categories_assign",
22756
+ "lionchat_custom_attribute_categories_list",
22757
+ "lionchat_custom_attribute_categories_update"
22758
+ ]
22759
+ },
22760
+ {
22761
+ "id": "lionchat_custom_attribute_categories_update",
22762
+ "method": "PATCH",
22763
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories/{id}",
22764
+ "title": "Renomear Categoria de Atributos",
22765
+ "description": "Renomeia uma categoria. **Requer perfil Administrador.** So muda o nome: a aba (attribute_model) NAO muda e atributos mandados junto sao ignorados. Mesmas regras de nome do create.",
22766
+ "category": "Atributos Personalizados",
22767
+ "params": [
22768
+ {
22769
+ "name": "id",
22770
+ "type": "integer",
22771
+ "location": "path",
22772
+ "required": true,
22773
+ "description": "ID da categoria"
22774
+ },
22775
+ {
22776
+ "name": "name",
22777
+ "type": "string",
22778
+ "location": "body",
22779
+ "required": true,
22780
+ "description": "Novo nome (texto de 1 a 60 caracteres)."
22781
+ }
22782
+ ],
22783
+ "returns": "A categoria atualizada: {id, attribute_model, name, position, attribute_keys}. 404 se for de outra conta.",
22784
+ "common_use_cases": [
22785
+ "Corrigir ou padronizar o nome de uma categoria"
22786
+ ],
22787
+ "related_tools": [
22788
+ "lionchat_custom_attribute_categories_list",
22789
+ "lionchat_custom_attribute_categories_create"
22790
+ ]
22791
+ },
22792
+ {
22793
+ "id": "lionchat_custom_attribute_categories_destroy",
22794
+ "method": "DELETE",
22795
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories/{id}",
22796
+ "title": "Excluir Categoria de Atributos",
22797
+ "description": "Exclui uma categoria. **Requer perfil Administrador.** NUNCA apaga atributo nem valor: os atributos que estavam nela voltam para 'Sem categoria'. Confirme com o cliente antes.",
22798
+ "category": "Atributos Personalizados",
22799
+ "params": [
22800
+ {
22801
+ "name": "id",
22802
+ "type": "integer",
22803
+ "location": "path",
22804
+ "required": true,
22805
+ "description": "ID da categoria"
22806
+ }
22807
+ ],
22808
+ "returns": "200 sem corpo. 404 se for de outra conta.",
22809
+ "common_use_cases": [
22810
+ "Desfazer uma categoria que nao e mais usada (os atributos ficam soltos)"
22811
+ ],
22812
+ "related_tools": [
22813
+ "lionchat_custom_attribute_categories_list",
22814
+ "lionchat_custom_attribute_categories_assign"
22815
+ ]
22816
+ },
22817
+ {
22818
+ "id": "lionchat_custom_attribute_categories_reorder",
22819
+ "method": "POST",
22820
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories/reorder",
22821
+ "title": "Reordenar Categorias de Atributos",
22822
+ "description": "Define a ordem das categorias de UMA aba. **Requer perfil Administrador.** Mande a lista COMPLETA de ids da aba na ordem desejada: faltando ou sobrando id = 422 reorder_mismatch (alguem mexeu no meio; releia com lionchat_custom_attribute_categories_list e mande de novo). 'Sem categoria' sempre aparece primeiro na tela e nao entra na lista.",
22823
+ "category": "Atributos Personalizados",
22824
+ "params": [
22825
+ {
22826
+ "name": "attribute_model",
22827
+ "type": "string",
22828
+ "location": "body",
22829
+ "required": true,
22830
+ "description": "Aba da categoria, SEMPRE com o sufixo: conversation_attribute (Conversas) | contact_attribute (Contato) | company_attribute (Empresa, so com o modulo Empresas) | kanban_item_attribute (Card). Variavel de conta (account_attribute) NAO tem categoria."
22831
+ },
22832
+ {
22833
+ "name": "ids",
22834
+ "type": "array",
22835
+ "location": "body",
22836
+ "required": true,
22837
+ "description": "Lista com TODOS os ids de categoria da aba, na nova ordem (ex: [12, 10, 11]). Numeros."
22838
+ }
22839
+ ],
22840
+ "returns": "Lista pura (array) das categorias DA ABA, na ordem: cada uma com id, attribute_model, name, position e attribute_keys (chaves dos atributos dentro dela, na ordem em que foram colocados).",
22841
+ "common_use_cases": [
22842
+ "Colocar a categoria mais usada no topo da aba"
22843
+ ],
22844
+ "related_tools": [
22845
+ "lionchat_custom_attribute_categories_list"
22846
+ ]
22847
+ },
22848
+ {
22849
+ "id": "lionchat_custom_attribute_categories_assign",
22850
+ "method": "POST",
22851
+ "path": "/api/v1/accounts/{account_id}/custom_attribute_categories/assign",
22852
+ "title": "Colocar ou Tirar Atributo de Categoria",
22853
+ "description": "Coloca um atributo numa categoria (ou tira, com category_id nulo). **Requer perfil Administrador.** Um atributo fica em UMA categoria so: colocar numa nova tira da anterior e ele entra no fim dela. A categoria tem de ser da MESMA aba (attribute_model) e o atributo tem de existir na aba (conversa/contato/empresa: attribute_key da definicao, ver lionchat_custom_attributes_list; Card: o NOME do campo exatamente como gravado em global_custom_attributes, com maiusculas e espacos, NUNCA uma chave em minuscula derivada). Tirar (category_id nulo) funciona mesmo se o atributo ja foi apagado.",
22854
+ "category": "Atributos Personalizados",
22855
+ "params": [
22856
+ {
22857
+ "name": "attribute_model",
22858
+ "type": "string",
22859
+ "location": "body",
22860
+ "required": true,
22861
+ "description": "Aba da categoria, SEMPRE com o sufixo: conversation_attribute (Conversas) | contact_attribute (Contato) | company_attribute (Empresa, so com o modulo Empresas) | kanban_item_attribute (Card). Variavel de conta (account_attribute) NAO tem categoria."
22862
+ },
22863
+ {
22864
+ "name": "attribute_key",
22865
+ "type": "string",
22866
+ "location": "body",
22867
+ "required": true,
22868
+ "description": "Chave do atributo (ex: 'renda'); na aba Card, o nome do campo (ex: 'Metragem Total')."
22869
+ },
22870
+ {
22871
+ "name": "category_id",
22872
+ "type": "integer",
22873
+ "location": "body",
22874
+ "required": false,
22875
+ "description": "ID da categoria de destino. Nulo ou ausente = tirar da categoria (vai para 'Sem categoria')."
22876
+ }
22877
+ ],
22878
+ "returns": "Lista pura (array) das categorias DA ABA, na ordem: cada uma com id, attribute_model, name, position e attribute_keys (chaves dos atributos dentro dela, na ordem em que foram colocados). Erros: 422 {error, code} com code unknown_attribute (atributo nao existe na aba), category_other_tab (categoria de outra aba) ou invalid_format; 404 category_not_found.",
22879
+ "common_use_cases": [
22880
+ "Mover atributos existentes para uma categoria nova",
22881
+ "Tirar um atributo de uma categoria",
22882
+ "Logo depois de criar um atributo (lionchat_custom_attributes_create), coloca-lo na categoria certa"
22883
+ ],
22884
+ "related_tools": [
22885
+ "lionchat_custom_attribute_categories_list",
22886
+ "lionchat_custom_attribute_categories_create",
22887
+ "lionchat_custom_attributes_list",
22888
+ "lionchat_kanban_config_list"
22889
+ ]
22890
+ },
22292
22891
  {
22293
22892
  "id": "lionchat_csat_list",
22294
22893
  "method": "GET",
@@ -26786,7 +27385,7 @@
26786
27385
  "type": "object",
26787
27386
  "location": "body",
26788
27387
  "required": false,
26789
- "description": "Atributos extras do CANAL — vai DENTRO de channel (o nome antigo additional_attributes, fora de channel, era descartado pelo servidor). Nas caixas WhatsApp (QR Code e oficial), Instagram, Facebook e TikTok a gravacao SOMA no 1o nivel: so as chaves enviadas mudam. Na caixa de API o objeto e TROCADO inteiro. QR Code: so estas chaves sao da tela — accept_status, accept_groups, accept_channels, accept_broadcast, reject_calls, mark_as_seen (true/false de verdade, nunca \"false\" em texto) e reject_calls_message (texto); o resto (sessao, importacao, proxy, migracao, coex) e interno do sistema e NAO deve ser mandado. WhatsApp oficial: mark_as_seen (bool). Ex.: {\"accept_groups\": true, \"reject_calls\": false}."
27388
+ "description": "Atributos extras do CANAL — vai DENTRO de channel (o nome antigo additional_attributes, fora de channel, era descartado pelo servidor). Nas caixas WhatsApp (QR Code e oficial), Instagram, Facebook e TikTok a gravacao SOMA no 1o nivel: so as chaves enviadas mudam. Na caixa de API o objeto e TROCADO inteiro. QR Code: so estas chaves sao da tela — accept_groups, reject_calls, mark_as_seen (true/false de verdade, nunca \"false\" em texto) e reject_calls_message (texto). accept_status, accept_channels e accept_broadcast estao SEMPRE desligadas desde 09/10/2026 (status, canais e listas de transmissao nao trazem conversa de cliente): mandar true e desfeito ao salvar, sem erro; o resto (sessao, importacao, proxy, migracao, coex) e interno do sistema e NAO deve ser mandado. WhatsApp oficial: mark_as_seen (bool). Ex.: {\"accept_groups\": true, \"reject_calls\": false}."
26790
27389
  },
26791
27390
  {
26792
27391
  "name": "out_of_office_enabled",
@@ -28143,7 +28742,7 @@
28143
28742
  "type": "string",
28144
28743
  "location": "query",
28145
28744
  "required": false,
28146
- "description": "Filtra pela situacao do card: 'open' (inclui card sem status gravado), 'won' ou 'lost'. Qualquer outro texto e ignorado em silencio e devolve TODOS os status"
28745
+ "description": "Filtra pela situacao do card: 'open' (inclui card sem status gravado; desde 11/10/2026 deixa de fora os ADIADOS), 'snoozed' (adiados), 'won' ou 'lost'. Qualquer outro texto e ignorado em silencio e devolve TODOS os status"
28147
28746
  },
28148
28747
  {
28149
28748
  "name": "funnel_id",
@@ -28160,7 +28759,7 @@
28160
28759
  "description": "Pagina (25 cards por pagina). Valor invalido ou ausente = pagina 1"
28161
28760
  }
28162
28761
  ],
28163
- "returns": "{ meta: { total_count, page, per_page: 25 }, payload: [ { id, funnel_id, funnel_stage, position, conversation_display_id, linked_conversations, item_details, custom_attributes, assigned_agents, checklist, labels, next_task, permissions, funnel: { id, name, description, active, stages, settings } } ] }",
28762
+ "returns": "{ meta: { total_count, page, per_page: 25 }, payload: [ { id, funnel_id, funnel_stage, position, conversation_display_id, linked_conversations, item_details, custom_attributes, assigned_agents, checklist, labels, next_task, permissions, funnel: { id, name, description, active, stages, settings } } ] } Cada card traz tambem effective_status e snoozed_until.",
28164
28763
  "common_use_cases": [
28165
28764
  "Ver todos os negocios abertos de um cliente antes de responder",
28166
28765
  "Conferir se o contato ja tem card antes de criar outro",
@@ -28177,7 +28776,7 @@
28177
28776
  "method": "GET",
28178
28777
  "path": "/api/v1/accounts/{account_id}/funnels/open_counts",
28179
28778
  "title": "Cards Abertos por Funil",
28180
- "description": "Devolve quantos cards ABERTOS cada funil tem — resposta enxuta pra montar os contadores das abas do Kanban sem baixar card nenhum. Conta so status 'open' (ou card sem status gravado); ganhos e perdidos ficam de fora. Traz APENAS funis ativos (arquivado nao aparece) e visiveis ao usuario do token; quem nao tem permissao ampla de Kanban conta so os cards em que e responsavel, e cards de caixas sem acesso saem da conta.",
28779
+ "description": "Devolve quantos cards ABERTOS cada funil tem — resposta enxuta pra montar os contadores das abas do Kanban sem baixar card nenhum. Conta so status 'open' (ou card sem status gravado) e NAO adiado (desde 11/10/2026); ganhos, perdidos e adiados ficam de fora. Traz APENAS funis ativos (arquivado nao aparece) e visiveis ao usuario do token; quem nao tem permissao ampla de Kanban conta so os cards em que e responsavel, e cards de caixas sem acesso saem da conta.",
28181
28780
  "category": "Funis",
28182
28781
  "params": [
28183
28782
  {
@@ -28239,7 +28838,7 @@
28239
28838
  "method": "POST",
28240
28839
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/start_flow",
28241
28840
  "title": "Disparar Fluxo pelo Card",
28242
- "description": "Inicia manualmente um fluxo do FlowBuilder na conversa vinculada ao card — o fluxo passa a FALAR com o cliente, entao confirme antes de disparar. Tres condicoes precisam valer, senao volta 422 explicando: (1) o card precisa ter conversa vinculada (a principal, ou uma vinculada marcada como 'recebe automacao'); (2) o fluxo precisa estar ativo, ser de conversa e ter no inicial; (3) o fluxo precisa ter pelo menos um gatilho de card do Kanban (card criado, movido, ganho, perdido ou atributo alterado) — fluxo de outro gatilho e recusado. Se ja existe sessao ativa daquele fluxo nessa conversa, volta 409. Alem de iniciar, grava uma mensagem de atividade na conversa e um registro no historico do card.",
28841
+ "description": "Inicia manualmente um fluxo do FlowBuilder na conversa vinculada ao card — o fluxo passa a FALAR com o cliente, entao confirme antes de disparar. Tres condicoes precisam valer, senao volta 422 explicando: (1) o card precisa ter conversa vinculada (a principal, ou uma vinculada marcada como 'recebe automacao'); (2) o fluxo precisa estar ativo, ser de conversa e ter no inicial; (3) o fluxo precisa ter pelo menos um gatilho de card do Kanban (card criado, movido, ganho, perdido, atributo alterado e, desde 11/10/2026, card aberto ou card adiado) — fluxo de outro gatilho e recusado. Se ja existe sessao ativa daquele fluxo nessa conversa, volta 409. Alem de iniciar, grava uma mensagem de atividade na conversa e um registro no historico do card.",
28243
28842
  "category": "Itens",
28244
28843
  "params": [
28245
28844
  {
@@ -28460,7 +29059,7 @@
28460
29059
  "method": "GET",
28461
29060
  "path": "/api/v1/accounts/{account_id}/search/kanban_items",
28462
29061
  "title": "Buscar Cards do Kanban",
28463
- "description": "Busca cards do Kanban por texto ou pelo numero do card. Procura em titulo, descricao, nome e e-mail do cliente, nos atributos personalizados do card (menos os do tipo secreto) e tambem na conversa/contato vinculados; com UM termo so de numeros, tenta antes casar o ID exato do card. Varios termos separados por espaco funcionam como E (todos precisam bater, ate 5). PISO DE 3 LETRAS (desde 04/08/2026): termo com letra e menos de 3 caracteres e recusado e a resposta vem VAZIA sem nenhum aviso — se todos os termos forem curtos, isso NAO quer dizer que o card nao existe, quer dizer que a busca nem rodou; refaca com 3+ letras. Termo so de digitos e isento do piso. Devolve no maximo 15 cards e NAO tem paginacao — pra listar de verdade use lionchat_kanban_items_filter. Quem nao e administrador so enxerga cards em que e responsavel. FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros.",
29062
+ "description": "Busca cards do Kanban por texto ou pelo numero do card. Procura em titulo, descricao, nome e e-mail do cliente, nos atributos personalizados do card (menos os do tipo secreto) e tambem na conversa/contato vinculados; com UM termo so de numeros, tenta antes casar o ID exato do card. Varios termos separados por espaco funcionam como E (todos precisam bater, ate 5). PISO DE 3 LETRAS (desde 04/08/2026): termo com letra e menos de 3 caracteres e recusado e a resposta vem VAZIA sem nenhum aviso — se todos os termos forem curtos, isso NAO quer dizer que o card nao existe, quer dizer que a busca nem rodou; refaca com 3+ letras. Termo so de digitos e isento do piso. Devolve no maximo 15 cards e NAO tem paginacao — pra listar de verdade use lionchat_kanban_items_filter. Quem nao e administrador so enxerga cards em que e responsavel. FILTRO DE DATA (02/09/2026): quatro eixos, cada um com janela fixa (_start/_end ISO) ou atalho relativo (_relative + _relative_days): criacao (date_*), entrada na etapa atual (stage_date_*), atualizacao (updated_date_*) e ganho/perdido em (closed_date_*). Operadores do atalho: today, yesterday (estes DOIS sem numero), last_days (ultimos N incluindo hoje), days_ago (o dia exato de N atras), days_before (mais de N atras). N inteiro 1..998; janela no fuso da CONTA. CUIDADO: operador invalido ou N invalido NAO da erro — o atalho e ignorado e a resposta volta MAIOR (ate 5.000 cards) com cara de filtrada; confira a contagem antes de qualquer acao em massa. Ver o resource de filtros. Desde 11/10/2026: em kanban_filters, statuses [\"open\"] = aberto e NAO adiado e [\"snoozed\"] = adiados; cada card traz effective_status e snoozed_until.",
28464
29063
  "category": "Busca",
28465
29064
  "params": [
28466
29065
  {
@@ -29082,7 +29681,7 @@
29082
29681
  "method": "GET",
29083
29682
  "path": "/api/v1/accounts/{account_id}/captain/call_agents",
29084
29683
  "title": "Listar Agentes de Ligacao",
29085
- "description": "Agente de LIGACAO (area \"Agentes de ligacao\", separada dos agentes de texto desde 24/09/2026). Nao ocupa vaga de IA do plano. Exige Admin ou cargo com captain_manage. Devolve tambem meta.dial_inboxes: as caixas que podem fazer ligacao (LionCalls ligada).",
29684
+ "description": "Agente de LIGACAO (area \"Agentes de ligacao\", separada dos agentes de texto desde 24/09/2026). Nao ocupa vaga de IA do plano. Exige Admin ou cargo com captain_manage — EXCETO para quem edita fluxo (Admin ou flowbuilder_manage): esse recebe a forma LEVE (so id e name de cada agente, e as linhas recortadas pelas caixas que ve), que e o que o node ai_call do FlowBuilder precisa. Devolve tambem meta.dial_inboxes: as caixas que podem fazer ligacao (LionCalls ligada) — use o id no data.aiCallInboxId do node ai_call.",
29086
29685
  "category": "Assistentes",
29087
29686
  "params": [],
29088
29687
  "returns": "{ payload: [agente de ligacao], meta: { dial_inboxes: [{id, name}] } }",
@@ -29193,7 +29792,7 @@
29193
29792
  "type": "integer",
29194
29793
  "location": "body",
29195
29794
  "required": false,
29196
- "description": "Duracao maxima da ligacao, 30 a 600 segundos (padrao 180)."
29795
+ "description": "Tempo maximo da ligacao, 30 a 600 segundos (padrao 180). Aparece na tela do agente de ligacao (voltou em 17/10/2026). Quando acaba, o motor desliga a ligacao sozinho, com qualquer fornecedor (OpenAI ou ElevenLabs)."
29197
29796
  },
29198
29797
  {
29199
29798
  "name": "captain_assistant_id",
@@ -29291,7 +29890,7 @@
29291
29890
  "type": "integer",
29292
29891
  "location": "body",
29293
29892
  "required": false,
29294
- "description": "Duracao maxima da ligacao, 30 a 600 segundos (padrao 180)."
29893
+ "description": "Tempo maximo da ligacao, 30 a 600 segundos (padrao 180). Aparece na tela do agente de ligacao (voltou em 17/10/2026). Quando acaba, o motor desliga a ligacao sozinho, com qualquer fornecedor (OpenAI ou ElevenLabs)."
29295
29894
  },
29296
29895
  {
29297
29896
  "name": "captain_assistant_id",
@@ -31039,7 +31638,7 @@
31039
31638
  "method": "GET",
31040
31639
  "path": "/api/v1/accounts/{account_id}/lead_forms/{lead_form_id}/responses",
31041
31640
  "title": "Listar Respostas do Formulario",
31042
- "description": "Lista as respostas (25 por pagina, colunas leves — as respostas em si NAO vem na lista, use o show). Filtra por status e janela de dias.",
31641
+ "description": "Lista as respostas (25 por pagina, colunas leves — as respostas em si NAO vem na lista, use o show). Filtra por status e janela de dias. Cada linha traz filled_by: null (o cliente pelo link) ou {id, name}/{id, removed: true} (a equipe preencheu pela conversa — essas respostas ficam fora do funil e dos contadores, desde 20/10/2026).",
31043
31642
  "category": "Formularios",
31044
31643
  "params": [
31045
31644
  {
@@ -31104,7 +31703,7 @@
31104
31703
  "description": "ID da resposta"
31105
31704
  }
31106
31705
  ],
31107
- "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.",
31706
+ "returns": "{id, status, filled_by ({id, name} | {id, removed: true} | null — null = o cliente pelo link; preenchimento pela equipe na conversa desde 20/10/2026), 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.",
31108
31707
  "common_use_cases": [
31109
31708
  "Ler o que o lead respondeu",
31110
31709
  "Investigar por que a consulta externa/IA falhou (effects)",
@@ -31175,6 +31774,299 @@
31175
31774
  "lionchat_lead_forms_update"
31176
31775
  ]
31177
31776
  },
31777
+ {
31778
+ "id": "lionchat_whatsapp_forms_list",
31779
+ "method": "GET",
31780
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms",
31781
+ "title": "Listar Formularios do WhatsApp",
31782
+ "description": "Lista os Formularios do WhatsApp (formulario nativo da Meta, preenchido DENTRO do WhatsApp e aberto por botao de modelo de mensagem). So caixa do WhatsApp Oficial (Cloud API). Status: draft, publishing, published, deprecated; unpublished_changes diz se o rascunho mudou depois da ultima publicacao. meta_flow_id e o numero do formulario na Meta (vai no botao FLOW do modelo).",
31783
+ "category": "Formularios",
31784
+ "params": [
31785
+ {
31786
+ "name": "inbox_id",
31787
+ "type": "integer",
31788
+ "location": "query",
31789
+ "required": false,
31790
+ "description": "Filtra pela conta do WhatsApp (WABA) desta caixa oficial"
31791
+ },
31792
+ {
31793
+ "name": "refresh",
31794
+ "type": "boolean",
31795
+ "location": "query",
31796
+ "required": false,
31797
+ "description": "true = rele o estado na Meta antes de responder (1 chamada por conta do WhatsApp)"
31798
+ },
31799
+ {
31800
+ "name": "with_questions",
31801
+ "type": "boolean",
31802
+ "location": "query",
31803
+ "required": false,
31804
+ "description": "true = inclui questions: [{code, label}] de cada formulario (as perguntas usadas nas variaveis do fluxo)"
31805
+ }
31806
+ ],
31807
+ "returns": "lista [{id, name, status, meta_status, meta_flow_id, waba_id, inbox, publications_count, unpublished_changes, questions?}]",
31808
+ "common_use_cases": [
31809
+ "Achar o meta_flow_id para por o botao FLOW num modelo",
31810
+ "Escolher o formulario do gatilho \"Formulario do WhatsApp respondido\""
31811
+ ],
31812
+ "related_tools": [
31813
+ "lionchat_whatsapp_forms_show",
31814
+ "lionchat_whatsapp_forms_create",
31815
+ "lionchat_inboxes_whatsapp_templates_create"
31816
+ ]
31817
+ },
31818
+ {
31819
+ "id": "lionchat_whatsapp_forms_show",
31820
+ "method": "GET",
31821
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}",
31822
+ "title": "Ver Formulario do WhatsApp",
31823
+ "description": "Rascunho completo (editor_data), save_targets (\"Salvar em\"), image_urls, limits (limites da Meta por tipo), published_version e version_outdated (true = publicado numa versao que a Meta nao aceita mais: publicar de novo).",
31824
+ "category": "Formularios",
31825
+ "params": [
31826
+ {
31827
+ "name": "id",
31828
+ "type": "integer",
31829
+ "location": "path",
31830
+ "required": true,
31831
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
31832
+ },
31833
+ {
31834
+ "name": "refresh",
31835
+ "type": "boolean",
31836
+ "location": "query",
31837
+ "required": false,
31838
+ "description": "true = rele o estado na Meta"
31839
+ }
31840
+ ],
31841
+ "returns": "formulario completo com editor_data, save_targets, image_urls, limits, published_version, version_outdated",
31842
+ "common_use_cases": [
31843
+ "Ler o rascunho antes de editar (update substitui o rascunho inteiro)",
31844
+ "Conferir os limites antes de montar perguntas"
31845
+ ],
31846
+ "related_tools": [
31847
+ "lionchat_whatsapp_forms_update",
31848
+ "lionchat_whatsapp_forms_publish"
31849
+ ]
31850
+ },
31851
+ {
31852
+ "id": "lionchat_whatsapp_forms_create",
31853
+ "method": "POST",
31854
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms",
31855
+ "title": "Criar Formulario do WhatsApp",
31856
+ "description": "Cria um Formulario do WhatsApp em rascunho (nada vai para a Meta ate publicar). Exige caixa do WhatsApp Oficial da propria conta (senao 422 inbox_must_be_official). O nome precisa ser unico na conta do WhatsApp (a Meta recusa repetido ao publicar). Admin-only.",
31857
+ "category": "Formularios",
31858
+ "params": [
31859
+ {
31860
+ "name": "name",
31861
+ "type": "string",
31862
+ "location": "body",
31863
+ "required": true,
31864
+ "description": "Nome do formulario (aparece no painel da Meta; unico na conta do WhatsApp)"
31865
+ },
31866
+ {
31867
+ "name": "inbox_id",
31868
+ "type": "integer",
31869
+ "location": "body",
31870
+ "required": true,
31871
+ "description": "ID de uma caixa do WhatsApp Oficial (Cloud API) da conta"
31872
+ },
31873
+ {
31874
+ "name": "editor_data",
31875
+ "type": "object",
31876
+ "location": "body",
31877
+ "required": false,
31878
+ "description": "Rascunho {category, next_label (ate 35), submit_label (ate 35), screens: [{title (ate 30), fields: [...]}]}. SUBSTITUI o rascunho inteiro: leia com whatsapp_forms_show e mande de volta completo. Campo: {code (f_<n>; omita no campo NOVO, o servidor da), type, label, helper, required, ...}. Tipos de pergunta: short_text, email, phone, number (pergunta ate 20), long_text (20), date e calendar (40), single_choice e multiple_choice (30; options [{code o_<n>, label ate 30, description ate 300}]), opt_in (120; read_more_url), photo e document (80; description, max_files 1-10, max_size_mb 1-25; a foto sai sempre com no maximo 5 MB, o limite de recebimento, photo: source camera_gallery|camera|gallery, document: file_kinds [pdf, word, spreadsheet, presentation, image, text, compressed, video]). Ajustes: max_chars (NUMERO 1-4000, texto), min_date/max_date 'AAAA-MM-DD' (data/calendario), calendar: mode single|range, end_label, end_helper, title, description, days [Mon..Sun]; multiple_choice: min_selected/max_selected. Conteudo (type + text): heading e subheading (80), paragraph e caption (4096), link (text ate 25 + url http(s), ate 2 por tela); image: suba antes por lionchat_whatsapp_forms_images (link) e use o blob_id em image, com alt_text ate 100. Por tela: 1 foto/arquivo, 3 imagens, 2 links; no formulario inteiro ate 10 arquivos. Limite de caracteres NAO barra o salvar (so o publicar). Codigo f_<n> ja publicado NUNCA e reaproveitado. Contrato completo: resource lionchat://docs/formularios-publicos (secao Formulario do WhatsApp)."
31879
+ }
31880
+ ],
31881
+ "returns": "formulario completo (201)",
31882
+ "common_use_cases": [
31883
+ "Montar um formulario de cadastro, pesquisa ou agendamento que o cliente preenche sem sair do WhatsApp"
31884
+ ],
31885
+ "related_tools": [
31886
+ "lionchat_whatsapp_forms_update",
31887
+ "lionchat_whatsapp_forms_publish",
31888
+ "lionchat_whatsapp_forms_images"
31889
+ ]
31890
+ },
31891
+ {
31892
+ "id": "lionchat_whatsapp_forms_update",
31893
+ "method": "PATCH",
31894
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}",
31895
+ "title": "Atualizar Formulario do WhatsApp",
31896
+ "description": "Salva nome, rascunho e/ou \"Salvar em\". editor_data SUBSTITUI o rascunho inteiro (leia antes com whatsapp_forms_show). Formato errado = 422; limite de caracteres da Meta NAO barra o salvar (so o publicar). Durante a publicacao devolve 409 busy. Mudanca no rascunho so chega ao cliente depois de publicar; o \"Salvar em\" vale na hora. Admin-only.",
31897
+ "category": "Formularios",
31898
+ "params": [
31899
+ {
31900
+ "name": "id",
31901
+ "type": "integer",
31902
+ "location": "path",
31903
+ "required": true,
31904
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
31905
+ },
31906
+ {
31907
+ "name": "name",
31908
+ "type": "string",
31909
+ "location": "body",
31910
+ "required": false,
31911
+ "description": "Novo nome"
31912
+ },
31913
+ {
31914
+ "name": "editor_data",
31915
+ "type": "object",
31916
+ "location": "body",
31917
+ "required": false,
31918
+ "description": "Rascunho {category, next_label (ate 35), submit_label (ate 35), screens: [{title (ate 30), fields: [...]}]}. SUBSTITUI o rascunho inteiro: leia com whatsapp_forms_show e mande de volta completo. Campo: {code (f_<n>; omita no campo NOVO, o servidor da), type, label, helper, required, ...}. Tipos de pergunta: short_text, email, phone, number (pergunta ate 20), long_text (20), date e calendar (40), single_choice e multiple_choice (30; options [{code o_<n>, label ate 30, description ate 300}]), opt_in (120; read_more_url), photo e document (80; description, max_files 1-10, max_size_mb 1-25; a foto sai sempre com no maximo 5 MB, o limite de recebimento, photo: source camera_gallery|camera|gallery, document: file_kinds [pdf, word, spreadsheet, presentation, image, text, compressed, video]). Ajustes: max_chars (NUMERO 1-4000, texto), min_date/max_date 'AAAA-MM-DD' (data/calendario), calendar: mode single|range, end_label, end_helper, title, description, days [Mon..Sun]; multiple_choice: min_selected/max_selected. Conteudo (type + text): heading e subheading (80), paragraph e caption (4096), link (text ate 25 + url http(s), ate 2 por tela); image: suba antes por lionchat_whatsapp_forms_images (link) e use o blob_id em image, com alt_text ate 100. Por tela: 1 foto/arquivo, 3 imagens, 2 links; no formulario inteiro ate 10 arquivos. Limite de caracteres NAO barra o salvar (so o publicar). Codigo f_<n> ja publicado NUNCA e reaproveitado. Contrato completo: resource lionchat://docs/formularios-publicos (secao Formulario do WhatsApp)."
31919
+ },
31920
+ {
31921
+ "name": "save_targets",
31922
+ "type": "object",
31923
+ "location": "body",
31924
+ "required": false,
31925
+ "description": "\"Salvar em\" por codigo de pergunta: {\"f_1\": destino}. Destinos: contact.name, contact.email, contact.cadastral.<cpf|rg|cnpj|passport|profession|marital_status|gender|date_of_birth>, contact.address.<cep|street|number|complement|neighborhood|city|state|country>, custom.<chave de atributo do CONTATO>, conversation_custom.<chave de atributo da CONVERSA>. Telefone nunca. Atributo precisa estar definido na conta e fora dos protegidos; destino invalido = 422. Foto/arquivo nao tem destino (vira anexo; codigo de foto = 422). Pergunta tirada do rascunho mantem o destino ate publicar de novo. Mudar nao exige publicar de novo. Dado novo vence; resposta em branco nao apaga."
31926
+ }
31927
+ ],
31928
+ "returns": "formulario completo; 422 {errors} com formato ou destino invalido",
31929
+ "common_use_cases": [
31930
+ "Acrescentar ou mudar perguntas",
31931
+ "Gravar as respostas na ficha do contato ou em atributos (save_targets)"
31932
+ ],
31933
+ "related_tools": [
31934
+ "lionchat_whatsapp_forms_show",
31935
+ "lionchat_whatsapp_forms_publish",
31936
+ "lionchat_custom_attributes_list",
31937
+ "lionchat_whatsapp_forms_images"
31938
+ ]
31939
+ },
31940
+ {
31941
+ "id": "lionchat_whatsapp_forms_images",
31942
+ "method": "POST",
31943
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}/images",
31944
+ "title": "Subir imagem do Formulario do WhatsApp (por link)",
31945
+ "description": "Sobe a imagem de um componente Image POR LINK (o conector nao envia arquivo): o servidor baixa com protecao contra endereco interno, aceita so imagem (ate 10 MB), reduz para o limite da Meta (ate 1200 px e 300 KB, JPEG/PNG) e anexa ao formulario. Use o blob_id devolvido no campo {type: 'image', image: '<blob_id>', alt_text: '...'} do editor_data. 422 {error}: fetch_failed (link inacessivel, pagina da web ou endereco interno), invalid_image (nao e imagem), file_too_large (acima de 10 MB), too_large (nao coube em 300 KB). Ate 3 imagens por tela. Admin-only.",
31946
+ "category": "Formularios",
31947
+ "params": [
31948
+ {
31949
+ "name": "id",
31950
+ "type": "integer",
31951
+ "location": "path",
31952
+ "required": true,
31953
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
31954
+ },
31955
+ {
31956
+ "name": "url",
31957
+ "type": "string",
31958
+ "location": "body",
31959
+ "required": true,
31960
+ "description": "Endereco http/https de uma imagem publica (o arquivo da imagem, nao a pagina onde ela aparece)"
31961
+ }
31962
+ ],
31963
+ "returns": "{blob_id, url, width, height}; 422 {error}",
31964
+ "common_use_cases": [
31965
+ "Colocar logo ou foto ilustrativa no topo de uma tela do formulario"
31966
+ ],
31967
+ "related_tools": [
31968
+ "lionchat_whatsapp_forms_update",
31969
+ "lionchat_whatsapp_forms_show"
31970
+ ]
31971
+ },
31972
+ {
31973
+ "id": "lionchat_whatsapp_forms_publish",
31974
+ "method": "POST",
31975
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}/publish",
31976
+ "title": "Publicar Formulario do WhatsApp",
31977
+ "description": "Gera o arquivo, cria (ou edita no lugar) o formulario na conta do WhatsApp do cliente e publica. Fica PARA SEMPRE na conta do WhatsApp (so da para aposentar). Republicar mantem os modelos que usam o formulario funcionando, sem nova aprovacao. 422 {problems: [{code, screen, field, limit}], error: {kind, message}, form}: problems = o que corrigir no rascunho (lista completa e o que corrigir em cada um: resource lionchat://docs/formularios-publicos, secao Formulario do WhatsApp); error.kind: no_channel, busy, duplicate_name, validation, meta, network, too_large, unexpected. Admin-only.",
31978
+ "category": "Formularios",
31979
+ "params": [
31980
+ {
31981
+ "name": "id",
31982
+ "type": "integer",
31983
+ "location": "path",
31984
+ "required": true,
31985
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
31986
+ }
31987
+ ],
31988
+ "returns": "formulario publicado; 422 com problems/error",
31989
+ "common_use_cases": [
31990
+ "Colocar o formulario no ar para usar no botao de um modelo",
31991
+ "Publicar de novo depois de editar ou quando version_outdated = true"
31992
+ ],
31993
+ "related_tools": [
31994
+ "lionchat_whatsapp_forms_preview",
31995
+ "lionchat_inboxes_whatsapp_templates_create"
31996
+ ]
31997
+ },
31998
+ {
31999
+ "id": "lionchat_whatsapp_forms_preview",
32000
+ "method": "GET",
32001
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}/preview",
32002
+ "title": "Previa oficial do Formulario do WhatsApp",
32003
+ "description": "Endereco da previa oficial da Meta (abre sem login, vale 30 dias). preview_url nulo = ainda nao publicado.",
32004
+ "category": "Formularios",
32005
+ "params": [
32006
+ {
32007
+ "name": "id",
32008
+ "type": "integer",
32009
+ "location": "path",
32010
+ "required": true,
32011
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
32012
+ }
32013
+ ],
32014
+ "returns": "{preview_url, expires_at}",
32015
+ "common_use_cases": [
32016
+ "Mostrar ao cliente como o formulario aparece no WhatsApp"
32017
+ ],
32018
+ "related_tools": [
32019
+ "lionchat_whatsapp_forms_publish"
32020
+ ]
32021
+ },
32022
+ {
32023
+ "id": "lionchat_whatsapp_forms_deprecate",
32024
+ "method": "POST",
32025
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}/deprecate",
32026
+ "title": "Aposentar Formulario do WhatsApp",
32027
+ "description": "IRREVERSIVEL: desliga o formulario para sempre na Meta e os modelos que o abrem param de funcionar. CONFIRME com o usuario antes. As respostas antigas continuam nas conversas. Admin-only.",
32028
+ "category": "Formularios",
32029
+ "params": [
32030
+ {
32031
+ "name": "id",
32032
+ "type": "integer",
32033
+ "location": "path",
32034
+ "required": true,
32035
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
32036
+ }
32037
+ ],
32038
+ "returns": "formulario com status deprecated; 422 not_published se nunca foi publicado",
32039
+ "common_use_cases": [
32040
+ "Tirar de uso um formulario que nao vale mais"
32041
+ ],
32042
+ "related_tools": [
32043
+ "lionchat_whatsapp_forms_destroy"
32044
+ ]
32045
+ },
32046
+ {
32047
+ "id": "lionchat_whatsapp_forms_destroy",
32048
+ "method": "DELETE",
32049
+ "path": "/api/v1/accounts/{account_id}/whatsapp_forms/{id}",
32050
+ "title": "Excluir Formulario do WhatsApp",
32051
+ "description": "Exclui so rascunho (nunca publicado) ou aposentado. Publicado devolve 422 deprecate_first. Admin-only.",
32052
+ "category": "Formularios",
32053
+ "params": [
32054
+ {
32055
+ "name": "id",
32056
+ "type": "integer",
32057
+ "location": "path",
32058
+ "required": true,
32059
+ "description": "ID do Formulario do WhatsApp (o nosso, nao o da Meta)"
32060
+ }
32061
+ ],
32062
+ "returns": "204; 422 {error: {kind: deprecate_first}}",
32063
+ "common_use_cases": [
32064
+ "Apagar um rascunho de teste"
32065
+ ],
32066
+ "related_tools": [
32067
+ "lionchat_whatsapp_forms_deprecate"
32068
+ ]
32069
+ },
31178
32070
  {
31179
32071
  "id": "lionchat_agents_replace",
31180
32072
  "method": "POST",
@@ -31249,7 +32141,7 @@
31249
32141
  "description": "ID do contato"
31250
32142
  }
31251
32143
  ],
31252
- "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}}",
32144
+ "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, filled_by: {id, name} | {id, removed: true} | null (só 'lead_form'; preenchido pela equipe na conversa)}], meta: {total, truncated}}",
31253
32145
  "common_use_cases": [
31254
32146
  "Responder 'de onde veio este lead e o que ele preencheu?'",
31255
32147
  "Achar a resposta do formulário pra abrir com lionchat_contacts_form_entries_show",
@@ -34232,7 +35124,7 @@
34232
35124
  "path": "/api/v2/accounts/{account_id}/booking_reports",
34233
35125
  "title": "Relatorio de Agendamentos",
34234
35126
  "category": "Relatorios",
34235
- "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 (15/09) = attended / (attended + no_show), em %, pelas marcas Compareceu/Faltou; periodo SEM marca nenhuma cai na regra antiga concluidos / (concluidos + cancelados) — pendentes FORA do denominador (ainda nao aconteceram) — e attendance_basis diz qual valeu ('attendance' ou 'status'); nao recalcule com o total. snoozed (adiado) sai separado de pending. [15/09] totals traz tambem attended/no_show (marcas Compareceu/Faltou da tarefa — eixo proprio, NAO mexem no status nem na taxa) e a resposta ganha `treatments` (bloco Programas, refeito 15/09 a noite): o PERIODO since/until VALE; event_type_id recorta; user_id e status NAO. Programas: em_andamento e atrasados (medidos no FIM do periodo), comecaram/concluidos/encerrados (so se a data cair no periodo), sessoes_planejadas/sessoes_usadas/percentual (so dos em andamento). Sessoes do periodo: previstas = marcadas + nao_marcadas (nao_marcadas e PREVISAO), aconteceram, faltaram, taxa. Mais parados {programas, sessoes_restantes}, duracao {programas, dias_reais, dias_previstos}, linha[] {period, previstas, aconteceram, faltaram, aguardando (16/09), nao_marcadas} e por_tipo[] (mesmos campos + tipo). Sem valor em reais. Detalhe em lionchat://docs/reports-guide. Admin ou agente.",
35127
+ "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 (15/09) = attended / (attended + no_show), em %, pelas marcas Compareceu/Faltou; periodo SEM marca nenhuma cai na regra antiga concluidos / (concluidos + cancelados) — pendentes FORA do denominador (ainda nao aconteceram) — e attendance_basis diz qual valeu ('attendance' ou 'status'); nao recalcule com o total. snoozed (adiado) sai separado de pending. [15/09] totals traz tambem attended/no_show (marcas Compareceu/Faltou da tarefa — eixo proprio, NAO mexem no status nem na taxa) e a resposta ganha `treatments` (bloco Programas, refeito 15/09 a noite): o PERIODO since/until VALE; event_type_id recorta; user_id e status NAO. Programas: em_andamento e atrasados (medidos no FIM do periodo), comecaram/concluidos/encerrados (so se a data cair no periodo), sessoes_planejadas/sessoes_usadas/percentual (so dos em andamento). Sessoes do periodo: previstas = marcadas + nao_marcadas (nao_marcadas e PREVISAO), aconteceram, faltaram, taxa. Mais parados {programas, sessoes_restantes}, duracao {programas, dias_reais, dias_previstos}, linha[] {period, previstas, aconteceram, faltaram, aguardando (16/09), nao_marcadas} e por_tipo[] (mesmos campos + tipo). Sem valor em reais. Detalhe em lionchat://docs/reports-guide. Admin ou agente. [14/10/2026] source=agenda troca a fonte para os compromissos marcados A MAO na Agenda, sem Booking — ligacao, reuniao, videochamada e tipos de compromisso da conta (tarefa comum e evento do Google ficam FORA). Use quando a conta nao usa Booking e o relatorio normal vem zerado. Nessa opcao o tipo vai em task_type (event_type_id e ignorado; a lista de tipos vem em appointment_types da propria resposta), by_agent conta pelos RESPONSAVEIS (quem tem dois aparece nas duas linhas; os totais contam uma vez), by_origin vem vazio e treatments vem nulo.",
34236
35128
  "params": [
34237
35129
  {
34238
35130
  "name": "since",
@@ -34248,12 +35140,26 @@
34248
35140
  "required": false,
34249
35141
  "description": "Fim do periodo. Default: 30 dias a frente"
34250
35142
  },
35143
+ {
35144
+ "name": "source",
35145
+ "type": "string",
35146
+ "location": "query",
35147
+ "required": false,
35148
+ "description": "booking (PADRAO, agendamentos do Booking) | agenda (compromissos marcados a mao na Agenda: ligacao, reuniao, videochamada e tipos da conta; tarefa comum e evento do Google ficam fora). Qualquer outro valor = booking."
35149
+ },
34251
35150
  {
34252
35151
  "name": "event_type_id",
34253
35152
  "type": "integer",
34254
35153
  "location": "query",
34255
35154
  "required": false,
34256
- "description": "Filtra por tipo de agendamento (booking_event_types)"
35155
+ "description": "Filtra por tipo de agendamento (booking_event_types) (so no modo Booking; com source=agenda use task_type)"
35156
+ },
35157
+ {
35158
+ "name": "task_type",
35159
+ "type": "string",
35160
+ "location": "query",
35161
+ "required": false,
35162
+ "description": "So com source=agenda: chave do tipo de compromisso (ex. meeting, call, video_call ou a chave de um tipo da conta). As opcoes vem em appointment_types da resposta com source=agenda."
34257
35163
  },
34258
35164
  {
34259
35165
  "name": "user_id",
@@ -34277,11 +35183,12 @@
34277
35183
  "description": "day | week | month (agrupamento da timeline; default day)"
34278
35184
  }
34279
35185
  ],
34280
- "returns": "{period: {since, until, group_by}, totals: {total, pending, completed, cancelled, snoozed, attended, no_show, attendance_rate, attendance_basis}, timeline: [{period, count}], by_event_type, by_agent, by_origin, treatments: {em_andamento, atrasados, comecaram, concluidos, encerrados, previstas, marcadas, aconteceram, faltaram, nao_marcadas, taxa, percentual, parados, duracao, linha, por_tipo}}",
35186
+ "returns": "{period: {since, until, group_by}, totals: {total, pending, completed, cancelled, snoozed, attended, no_show, attendance_rate, attendance_basis}, timeline: [{period, count}], by_event_type, by_agent, by_origin, treatments: {em_andamento, atrasados, comecaram, concluidos, encerrados, previstas, marcadas, aconteceram, faltaram, nao_marcadas, taxa, percentual, parados, duracao, linha, por_tipo}} | com source=agenda vem tambem source: 'agenda' e appointment_types: [{key, name}]; by_origin vazio e treatments nulo",
34281
35187
  "common_use_cases": [
34282
35188
  "Quantos agendamentos foram marcados/concluidos/cancelados no mes",
34283
35189
  "Taxa de comparecimento por tipo de consulta ou por responsavel",
34284
- "De onde vem os agendamentos (origem/UTM)"
35190
+ "De onde vem os agendamentos (origem/UTM)",
35191
+ "Relatorio dos compromissos marcados a mao na Agenda quando a conta nao usa Booking (source=agenda)"
34285
35192
  ],
34286
35193
  "related_tools": [
34287
35194
  "lionchat_booking_event_types_list",
@@ -34951,7 +35858,7 @@
34951
35858
  "description": "Recorta pelos contatos de uma EMPRESA (aba Contratos da pagina da empresa). Empresa de outra conta = 404."
34952
35859
  }
34953
35860
  ],
34954
- "returns": "payload: [{id, title, status, signature_document_id, document_name, contact_id, contact_name, conversation_id, sent_at, completed_at, expires_at, participants[{id, name, role, status, delivery_channel, phone, email, signed_at, viewed_at, public_url, signs_in_panel}], delivery: {failed[], delivered_participant_ids[]}, has_signed_document, pending_for_me}], meta: {page, per_page, has_more, counts}",
35861
+ "returns": "payload: [{id, title, status, signature_document_id, document_name, contact_id, contact_name, conversation_id, sent_at, completed_at, expires_at, participants[{id, name, role, status, delivery_channel, phone, email, signed_at, viewed_at, public_url, signs_in_panel}], delivery: {failed[{participant_id, reason}], delivered_participant_ids[], copies[{participant_id, status: sent|failed, reason}]}, has_signed_document, pending_for_me}], meta: {page, per_page, has_more, counts}",
34955
35862
  "common_use_cases": [
34956
35863
  "Ver o status dos contratos de um cliente (assinou? abriu? expirou?)",
34957
35864
  "Relatorio de um modelo: quantos aguardando/assinados, quem falta",
@@ -34979,7 +35886,7 @@
34979
35886
  "description": "ID do contrato"
34980
35887
  }
34981
35888
  ],
34982
- "returns": "contrato + events: [{kind, occurred_at, ip, device, location, participant_id, panel}] + original_sha256/sealed_sha256",
35889
+ "returns": "contrato (com delivery: {failed[{participant_id, reason}], delivered_participant_ids[], copies[{participant_id, status: sent|failed, reason}]}, copies = a via assinada de cada pessoa) + events: [{kind, occurred_at, ip, device, location, participant_id, panel}] + original_sha256/sealed_sha256",
34983
35890
  "common_use_cases": [
34984
35891
  "Conferir quando e de onde a pessoa abriu e assinou",
34985
35892
  "Ver por que um contrato nao foi entregue (delivery.failed) ou foi recusado"
@@ -36029,7 +36936,7 @@
36029
36936
  "type": "string",
36030
36937
  "location": "query",
36031
36938
  "required": false,
36032
- "description": "open (padrao na tela), won, lost; omitir = todos"
36939
+ "description": "open (padrao na tela; aberto e NAO adiado desde 11/10/2026), snoozed (adiados), won, lost; omitir = todos"
36033
36940
  },
36034
36941
  {
36035
36942
  "name": "funnel_id",