@lionchat/mcp-server 1.32.0 → 1.34.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
@@ -36,7 +36,7 @@
36
36
  "method": "PUT",
37
37
  "path": "/api/v1/profile",
38
38
  "title": "Atualizar Perfil",
39
- "description": "Atualiza o perfil do usuário atual. Campos (nested em profile): name, email, display_name, avatar, message_signature, timezone, ui_settings, current_password, password. NÃO altera availability aqui. NOVO 22/07: aceita working_hours_enabled + working_hours (horário comercial único da conta; SLA com only_during_business_hours passa a contar só o expediente).",
39
+ "description": "Atualiza o perfil do usuário atual. Campos (nested em profile): name, email, display_name, avatar, message_signature, timezone, ui_settings, current_password, password. NÃO altera availability aqui. Esta ferramenta grava o PERFIL do usuário (/profile): NÃO grava o horário comercial da conta (working_hours) — isso se ajusta no painel.",
40
40
  "category": "Conta",
41
41
  "params": [
42
42
  {
@@ -683,7 +683,7 @@
683
683
  "type": "string",
684
684
  "location": "query",
685
685
  "required": false,
686
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
686
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
687
687
  },
688
688
  {
689
689
  "name": "contact_filters",
@@ -1443,12 +1443,46 @@
1443
1443
  "lionchat_conversations_destroy_2"
1444
1444
  ]
1445
1445
  },
1446
+ {
1447
+ "id": "lionchat_conversations_bulk_destroy",
1448
+ "method": "POST",
1449
+ "path": "/api/v1/accounts/{account_id}/conversations/bulk_destroy",
1450
+ "title": "Excluir Conversas em Lote",
1451
+ "description": "APAGA DE VEZ varias conversas (mensagens e anexos juntos), numa acao de fundo. Irreversivel: exige confirm:true depois de listar ao usuario QUAIS conversas vao sair. So administrador ou cargo com 'Excluir conversa' (conversation_delete); a permissao e conferida conversa a conversa e as que o usuario nao pode excluir sao puladas em silencio. Responde 200 na hora (o trabalho segue em segundo plano). Ate 300 ids por chamada (acima = 422 bulk_ids_limit_exceeded).",
1452
+ "category": "Conversas",
1453
+ "confirm_required": true,
1454
+ "params": [
1455
+ {
1456
+ "name": "ids",
1457
+ "type": "array",
1458
+ "location": "body",
1459
+ "required": true,
1460
+ "description": "display_id das conversas (o numero que aparece na tela), ate 300"
1461
+ },
1462
+ {
1463
+ "name": "batch_id",
1464
+ "type": "string",
1465
+ "location": "body",
1466
+ "required": false,
1467
+ "description": "Identificador do lote (opcional); volta no aviso de fim bulk_action.finished"
1468
+ }
1469
+ ],
1470
+ "returns": "200 sem corpo; o fim chega pelo evento bulk_action.finished",
1471
+ "common_use_cases": [
1472
+ "Limpar conversas de teste ou de spam escolhidas pelo usuario"
1473
+ ],
1474
+ "related_tools": [
1475
+ "lionchat_conversations_destroy",
1476
+ "lionchat_conversations_filter",
1477
+ "lionchat_conversations_list"
1478
+ ]
1479
+ },
1446
1480
  {
1447
1481
  "id": "lionchat_conversations_filter",
1448
1482
  "method": "POST",
1449
1483
  "path": "/api/v1/accounts/{account_id}/conversations/filter",
1450
1484
  "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. '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.",
1485
+ "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>'); origin_paid (25/10/2026, equal_to/not_equal_to — 'veio de anuncio pago?': valores paid, not_paid, unknown, unclassified; paid = clique no anuncio OU formulario do anuncio; not_equal_to paid inclui a conversa sem origem); 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. [27/10/2026] assignee_id aceita o valor 'current_user' (= quem esta perguntando); texto em assignee_id que nao seja numero nem 'current_user' = 422.",
1452
1486
  "category": "Conversas",
1453
1487
  "params": [
1454
1488
  {
@@ -1501,7 +1535,7 @@
1501
1535
  "type": "string",
1502
1536
  "location": "query",
1503
1537
  "required": false,
1504
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
1538
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
1505
1539
  },
1506
1540
  {
1507
1541
  "name": "contact_filters",
@@ -1953,7 +1987,7 @@
1953
1987
  "method": "GET",
1954
1988
  "path": "/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages",
1955
1989
  "title": "Listar Mensagens",
1956
- "description": "Lista mensagens de uma conversa (mais recentes primeiro). Lista mensagens paginados (per_page padrão 25, máximo 100). Filtros disponíveis: page, before_id. Retorna meta (contadores) + payload (array de mensagem).",
1990
+ "description": "Lista mensagens de uma conversa, da mais ANTIGA para a mais nova (a mais antiga recebida e a PRIMEIRA do payload). Sem parâmetro vêm as ÚLTIMAS 20 mensagens. Para as anteriores use before_id = id da mais antiga recebida (vem 20 por vez); after_id e around_id também existem. NÃO há paginação por página: o servidor ignora page. Retorna meta (etiquetas, contato e responsável da conversa, SEM contadores) + payload (array de mensagem). Cada mensagem traz original_sent_at (20/10/2026): unix s da hora em que foi ENVIADA quando chegou atrasada mais de 2 min (WhatsApp oficial e QR Code, mensagens de 20/10/2026 em diante); null no resto. created_at continua sendo a hora de CHEGADA e a ordem da lista nao muda.",
1957
1991
  "category": "Mensagens",
1958
1992
  "params": [
1959
1993
  {
@@ -1968,17 +2002,34 @@
1968
2002
  "type": "integer",
1969
2003
  "location": "query",
1970
2004
  "required": false,
1971
- "description": "Página"
2005
+ "description": "Sem efeito nesta lista (o servidor pagina por before_id/after_id/around_id). Mantido por compatibilidade."
1972
2006
  },
1973
2007
  {
1974
2008
  "name": "before_id",
1975
2009
  "type": "integer",
1976
2010
  "location": "query",
1977
2011
  "required": false,
1978
- "description": "Mensagens antes deste ID"
2012
+ "description": "Traz as 20 mensagens ANTERIORES a este id (use o id da mais antiga recebida para ir voltando).",
2013
+ "query_name": "before"
2014
+ },
2015
+ {
2016
+ "name": "after_id",
2017
+ "type": "integer",
2018
+ "location": "query",
2019
+ "required": false,
2020
+ "query_name": "after",
2021
+ "description": "Traz até 100 mensagens POSTERIORES a este id."
2022
+ },
2023
+ {
2024
+ "name": "around_id",
2025
+ "type": "integer",
2026
+ "location": "query",
2027
+ "required": false,
2028
+ "query_name": "around",
2029
+ "description": "Traz ~50 mensagens ao redor deste id (útil para abrir uma mensagem achada na busca)."
1979
2030
  }
1980
2031
  ],
1981
- "returns": "Objeto com `meta` + `payload`. `payload` = array de mensagens, das mais antigas para as mais novas. `meta` NAO tem contadores: traz `labels` (etiquetas da conversa), `additional_attributes`, `contact`, `assignee`, `agent_last_seen_at` e `assignee_last_seen_at`. Sem parametro vem as ULTIMAS 20 mensagens; para paginar use `before` (20 anteriores ao id), `after` (ate 100 posteriores) ou `around` (~50 ao redor de um id).",
2032
+ "returns": "Objeto com `meta` + `payload`. `payload` = array de mensagens, das mais antigas para as mais novas. `meta` NAO tem contadores: traz `labels` (etiquetas da conversa), `additional_attributes`, `contact`, `assignee`, `agent_last_seen_at` e `assignee_last_seen_at`. Sem parametro vem as ULTIMAS 20 mensagens; para paginar use `before_id` (20 anteriores ao id), `after_id` (ate 100 posteriores) ou `around_id` (~50 ao redor de um id). `page` nao tem efeito.",
1982
2033
  "common_use_cases": [
1983
2034
  "Dashboard: contar/exibir mensagens",
1984
2035
  "Buscar com filtros antes de outra operação",
@@ -2045,7 +2096,7 @@
2045
2096
  "type": "array",
2046
2097
  "location": "body",
2047
2098
  "required": false,
2048
- "description": "Arquivos anexos"
2099
+ "description": "Lista de blob_id devolvidos por lionchat_upload_create (arquivo por link: foto, vídeo, áudio, PDF, documento). Funciona também na conversa de um grupo do WhatsApp (caixa QR Code)"
2049
2100
  },
2050
2101
  {
2051
2102
  "name": "content_attributes",
@@ -2200,7 +2251,7 @@
2200
2251
  "type": "string",
2201
2252
  "location": "query",
2202
2253
  "required": false,
2203
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
2254
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
2204
2255
  },
2205
2256
  {
2206
2257
  "name": "contact_filters",
@@ -2429,7 +2480,7 @@
2429
2480
  "method": "GET",
2430
2481
  "path": "/api/v1/accounts/{account_id}/funnels",
2431
2482
  "title": "Listar Funis (Kanbans)",
2432
- "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa. Lista todos os funis com contagem de itens por etapa (cache 5min). NAO e paginado. ACESSO (2026-06): retorna SO os funis visiveis pro usuario do token (admin, permissao kanban, funil aberto ou participante). Funil nao-visivel da 404 no show.",
2483
+ "description": "FUNIL = KANBAN (pipeline/board) — no LionChat sao a mesma coisa. Lista todos os funis com contagem de itens por etapa (stage_items_count, contada na hora em todo pedido desde 2026-10-23; os dados dos funis ficam lembrados 5 min). NAO e paginado. ACESSO (2026-06): retorna SO os funis visiveis pro usuario do token (admin, permissao kanban, funil aberto ou participante). Funil nao-visivel da 404 no show.",
2433
2484
  "category": "Funis",
2434
2485
  "params": [],
2435
2486
  "returns": "array de funis (cada um com stage_items_count); sem meta/paginacao Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
@@ -2483,7 +2534,7 @@
2483
2534
  "type": "object",
2484
2535
  "location": "body",
2485
2536
  "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; '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. "
2537
+ "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. ORDEM E ACOES MORTAS (22/10/2026): a ordem de automations[] e a ordem de execucao — regras do mesmo acontecimento (ex.: duas em status_change 'won') rodam de cima para baixo; para reordenar, reenvie a lista inteira na ordem nova (a configuracao de cada regra nao muda). NAO grave assign_agent com status_change 'won'/'lost' (a regra roda com o card ja fechado e card fechado nao aceita responsavel: nao faz nada) nem notify_team (so escreve log, nao avisa ninguem). O servidor aceita os dois, mas a regra fica morta e o painel mostra um aviso amarelo nela. "
2487
2538
  },
2488
2539
  {
2489
2540
  "name": "funnel.global_custom_attributes",
@@ -2683,7 +2734,7 @@
2683
2734
  "method": "PATCH",
2684
2735
  "path": "/api/v1/accounts/{account_id}/funnels/{id}",
2685
2736
  "title": "Atualizar Funil (Kanban)",
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.",
2737
+ "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), duration_minutes (22/10/2026: minutos que a tarefa ocupa, inteiro de 1 a 1440; ausente ou null = o tempo do TIPO: Tarefa/Follow-up/Prazo 15, Ligacao/Personalizado 30, Reuniao/Call 60, tipo da conta 30), 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.",
2687
2738
  "category": "Funis",
2688
2739
  "params": [
2689
2740
  {
@@ -2712,7 +2763,7 @@
2712
2763
  "type": "object",
2713
2764
  "location": "body",
2714
2765
  "required": false,
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. "
2766
+ "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 faz a UI descartar a automacao no proximo salvar do usuario (enabled=false e estado valido desde 20/10: a regra fica guardada, desligada); 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), duration_minutes (22/10/2026: minutos que a tarefa ocupa, inteiro de 1 a 1440; ausente ou null = o tempo do TIPO: Tarefa/Follow-up/Prazo 15, Ligacao/Personalizado 30, Reuniao/Call 60, tipo da conta 30), 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. ORDEM E ACOES MORTAS (22/10/2026): a ordem de automations[] e a ordem de execucao — regras do mesmo acontecimento (ex.: duas em status_change 'won') rodam de cima para baixo; para reordenar, reenvie a lista inteira na ordem nova (a configuracao de cada regra nao muda). NAO grave assign_agent com status_change 'won'/'lost' (a regra roda com o card ja fechado e card fechado nao aceita responsavel: nao faz nada) nem notify_team (so escreve log, nao avisa ninguem). O servidor aceita os dois, mas a regra fica morta e o painel mostra um aviso amarelo nela. "
2716
2767
  }
2717
2768
  ],
2718
2769
  "returns": "funil atualizado Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
@@ -3844,7 +3895,7 @@
3844
3895
  "type": "string",
3845
3896
  "location": "query",
3846
3897
  "required": false,
3847
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
3898
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
3848
3899
  },
3849
3900
  {
3850
3901
  "name": "contact_filters",
@@ -4184,7 +4235,7 @@
4184
4235
  "method": "POST",
4185
4236
  "path": "/api/v1/accounts/{account_id}/kanban_items/import_preview",
4186
4237
  "title": "Preview Importação",
4187
- "description": "Pre-visualiza um import de cards (colunas e amostra).",
4238
+ "description": "Pre-visualiza um import de cards: colunas, primeiras linhas, total, valores unicos por coluna (ate 50) e, desde 2026-10-23, attribute_fields = os campos personalizados que PODEM ser importados (card: campos do card da conta, sem nome protegido nem secreto; contact: atributos do contato sem os do sistema nem secretos — vem vazio para quem nao pode importar contatos). Use o key de cada item como destino no attribute_mappings do lionchat_kanban_items_import.",
4188
4239
  "category": "Itens",
4189
4240
  "params": [
4190
4241
  {
@@ -4195,7 +4246,7 @@
4195
4246
  "description": "Arquivo CSV"
4196
4247
  }
4197
4248
  ],
4198
- "returns": "{ columns, sample_values }",
4249
+ "returns": "{ columns, preview_rows, total_rows, unique_values: {coluna: [valores]}, attribute_fields: { card: [{key: 'card:<nome>', name, type, is_list, options}], contact: [{key: 'contact:<chave>', attribute_key, name, type, is_list, options}] } }",
4199
4250
  "common_use_cases": [
4200
4251
  "Cadastro inicial de item Kanban",
4201
4252
  "Automação a partir de evento externo",
@@ -4212,7 +4263,7 @@
4212
4263
  "method": "POST",
4213
4264
  "path": "/api/v1/accounts/{account_id}/kanban_items/import",
4214
4265
  "title": "Importar Items",
4215
- "description": "Importa cards em massa (job async). REGRA DO DDI (18/08): telefone sem codigo do pais e considerado invalido e o card e criado SEM contato e SEM conversa, EM SILENCIO (diferente do import de contatos, que da erro na linha). Oriente a planilha a vir com DDI. PARAMETROS CONFERIDOS (18/09/2026): o servidor le `mappings` (plural) e exige `inbox_id` — o antigo `mapping` era ignorado. Opcionais da API (fora deste conector): default_stage_id, stage_mappings (texto JSON {\"<valor da planilha>\": \"<id da etapa>\"}), auto_create_stages ('true'), agent_mode ('mapping' | 'round_robin'), agent_mappings (texto JSON {\"<valor da planilha>\": <id do agente>}). VIA MCP NAO RODA: exige upload do arquivo — oriente o usuario a importar pela tela do Kanban.",
4266
+ "description": "Importa cards em massa (job async). REGRA DO DDI (18/08): telefone sem codigo do pais e considerado invalido e o card e criado SEM contato e SEM conversa, EM SILENCIO (diferente do import de contatos, que da erro na linha). Oriente a planilha a vir com DDI. PARAMETROS CONFERIDOS (18/09/2026): o servidor le `mappings` (plural) e exige `inbox_id` — o antigo `mapping` era ignorado. Opcionais da API (fora deste conector): default_stage_id, stage_mappings (texto JSON {\"<valor da planilha>\": \"<id da etapa>\"}), auto_create_stages ('true'), agent_mode ('mapping' | 'round_robin'), agent_mappings (texto JSON {\"<valor da planilha>\": <id do agente>}). CAMPOS PERSONALIZADOS (2026-10-23, tambem fora deste conector): attribute_mappings (texto JSON {\"card:<nome do campo do card>\": \"<coluna>\", \"contact:<chave do atributo do contato>\": \"<coluna>\"} — destino -> coluna, a mesma coluna pode ir para o card e para o contato) e value_mappings (texto JSON {\"<destino>\": {\"<valor da planilha>\": \"<opcao da lista>\" | \"\"}}, o de-para de campo de lista; \"\" = nao gravar). Os destinos validos sao os que lionchat_kanban_items_create_3 (previa) devolve em attribute_fields. Formato errado, campo que nao existe/protegido/secreto ou coluna que a planilha nao tem = 422 com a lista; contact: sem a permissao de importar contatos = 403. Card: data DD/MM/AAAA vira AAAA-MM-DD, numero vira texto ('1.500' = 1500), lista aceita varias opcoes por ';'. Contato: vai so para o contato principal do card; contato que ja existe tem o valor SUBSTITUIDO (dispara fluxo 'Atributo do contato muda' e webhook contact_updated); celula vazia nunca apaga. Valor que nao entra aparece em skipped no lionchat_kanban_items_import_status. VIA MCP NAO RODA: exige upload do arquivo — oriente o usuario a importar pela tela do Kanban.",
4216
4267
  "category": "Itens",
4217
4268
  "params": [
4218
4269
  {
@@ -8546,7 +8597,7 @@
8546
8597
  "type": "string",
8547
8598
  "location": "query",
8548
8599
  "required": false,
8549
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8600
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
8550
8601
  },
8551
8602
  {
8552
8603
  "name": "contact_filters",
@@ -8633,7 +8684,7 @@
8633
8684
  "type": "string",
8634
8685
  "location": "query",
8635
8686
  "required": false,
8636
- "description": "Filtros estruturados (mesmo formato de conversations_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8687
+ "description": "Filtros estruturados (mesmo formato de conversations_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
8637
8688
  },
8638
8689
  {
8639
8690
  "name": "date_basis",
@@ -8814,6 +8865,13 @@
8814
8865
  "required": false,
8815
8866
  "description": "Status"
8816
8867
  },
8868
+ {
8869
+ "name": "priority",
8870
+ "type": "string",
8871
+ "location": "query",
8872
+ "required": false,
8873
+ "description": "Prioridade (22/10): urgent | high | medium | low | none. Antes de 22/10 este filtro era ignorado pelo servidor."
8874
+ },
8817
8875
  {
8818
8876
  "name": "user_id",
8819
8877
  "type": "integer",
@@ -8833,7 +8891,7 @@
8833
8891
  "type": "string",
8834
8892
  "location": "query",
8835
8893
  "required": false,
8836
- "description": "Busca"
8894
+ "description": "Busca (22/10): titulo, descricao e nome do responsavel; com 3 letras ou mais, tambem o CLIENTE da tarefa (nome, telefone, e-mail ou identificador, pela ficha da tarefa ou pela conversa dela). Termo que casa mais de 1.000 clientes procura so nos campos da tarefa. Desde 23/10/2026 tambem acha pelo NOME DO CARD da tarefa e, com 3 letras ou mais, por QUEM FEZ (quem criou, o dono antigo da tarefa e o 'Agendado por')."
8837
8895
  },
8838
8896
  {
8839
8897
  "name": "date_start",
@@ -8857,7 +8915,7 @@
8857
8915
  "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."
8858
8916
  }
8859
8917
  ],
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).",
8918
+ "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). Datas de desfecho (23/10/2026): toda tarefa traz `completed_at` (quando foi concluida), `cancelled_at` (quando foi cancelada) e `attendance_marked_at` (quando marcaram Compareceu/Faltou), gravadas pelo servidor na hora da mudanca (nunca aceitas do cliente) e APAGADAS ao reabrir, adiar ou limpar a presenca; tarefa anterior a 23/10 vem com nulo. E `concluida_no_prazo` (true/false/nulo): so no tipo Tarefa, true = concluida ate o horario marcado (scheduled_at).",
8861
8919
  "common_use_cases": [
8862
8920
  "Dashboard: contar/exibir tarefas/agenda",
8863
8921
  "Buscar com filtros antes de outra operação",
@@ -8865,7 +8923,8 @@
8865
8923
  ],
8866
8924
  "related_tools": [
8867
8925
  "lionchat_tasks_list_1",
8868
- "lionchat_tasks_list_2"
8926
+ "lionchat_tasks_list_2",
8927
+ "lionchat_tasks_task_list"
8869
8928
  ]
8870
8929
  },
8871
8930
  {
@@ -9079,7 +9138,7 @@
9079
9138
  "description": "ID da tarefa"
9080
9139
  }
9081
9140
  ],
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).",
9141
+ "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). Datas de desfecho (23/10/2026): toda tarefa traz `completed_at` (quando foi concluida), `cancelled_at` (quando foi cancelada) e `attendance_marked_at` (quando marcaram Compareceu/Faltou), gravadas pelo servidor na hora da mudanca (nunca aceitas do cliente) e APAGADAS ao reabrir, adiar ou limpar a presenca; tarefa anterior a 23/10 vem com nulo. E `concluida_no_prazo` (true/false/nulo): so no tipo Tarefa, true = concluida ate o horario marcado (scheduled_at).",
9083
9142
  "common_use_cases": [
9084
9143
  "Ver dados completos antes de editar",
9085
9144
  "Verificar estado atual antes de uma ação",
@@ -9513,7 +9572,7 @@
9513
9572
  "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."
9514
9573
  }
9515
9574
  ],
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).",
9575
+ "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). Datas de desfecho (23/10/2026): toda tarefa traz `completed_at` (quando foi concluida), `cancelled_at` (quando foi cancelada) e `attendance_marked_at` (quando marcaram Compareceu/Faltou), gravadas pelo servidor na hora da mudanca (nunca aceitas do cliente) e APAGADAS ao reabrir, adiar ou limpar a presenca; tarefa anterior a 23/10 vem com nulo. E `concluida_no_prazo` (true/false/nulo): so no tipo Tarefa, true = concluida ate o horario marcado (scheduled_at).",
9517
9576
  "common_use_cases": [
9518
9577
  "Dashboard: contar/exibir tarefas/agenda",
9519
9578
  "Buscar com filtros antes de outra operação",
@@ -9521,7 +9580,93 @@
9521
9580
  ],
9522
9581
  "related_tools": [
9523
9582
  "lionchat_tasks_list",
9524
- "lionchat_tasks_list_2"
9583
+ "lionchat_tasks_list_2",
9584
+ "lionchat_tasks_task_list"
9585
+ ]
9586
+ },
9587
+ {
9588
+ "id": "lionchat_tasks_task_list",
9589
+ "method": "GET",
9590
+ "path": "/api/v1/accounts/{account_id}/account_tasks/task_list",
9591
+ "title": "Lista de tarefas abertas (aba Tarefas da Agenda)",
9592
+ "description": "Tarefas ABERTAS (pendentes e adiadas, sem 'Compareceu'/'Faltou') em grupos por periodo, no DIA DA CONTA: overdue (antes de hoje, da mais recente para a mais antiga), today, tomorrow, next_7_days e later (depois disso). E a mesma lista da aba 'Tarefas' da Agenda (22/10): a melhor ferramenta para 'o que esta atrasado?' ou 'o que falta fazer?'. Usa a MESMA regra de quem ve o que e os MESMOS filtros do calendario (lionchat_tasks_list). Pagina de 50 por grupo: sem `group` vem a 1a pagina dos cinco; com `group` + `page`, so aquele grupo naquela pagina. Diferente de lionchat_tasks_list_1 (Meu Dia), que nao tem filtros, nao pagina e nao tem o grupo 'later'. Cargo com a Agenda oculta recebe 401. **`selo`:** cada tarefa traz o rotulo que o painel mostra (pending, snoozed, rescheduled). SUBABA 'CONCLUIDAS' (23/10/2026): `group=completed` devolve o que ja teve desfecho — concluida OU marcada 'Compareceu'/'Faltou' (cancelada fica de fora). Nao vem junto dos cinco grupos: so quando pedida. Ordem: a concluida mais recentemente primeiro; as concluidas antes de 23/10 (sem data) vao para o fim. Use-a para 'o que foi feito ontem?' ou 'a fulana concluiu no prazo?'.",
9593
+ "category": "Agenda / Tarefas",
9594
+ "params": [
9595
+ {
9596
+ "name": "group",
9597
+ "type": "string",
9598
+ "location": "query",
9599
+ "required": false,
9600
+ "description": "Pede SO um grupo: overdue | today | tomorrow | next_7_days | later | completed (23/10/2026: a subaba 'Concluidas', concluidas + Compareceu/Faltou, na ordem da conclusao). Ausente ou desconhecido = os cinco grupos das abertas, pagina 1 (completed NUNCA vem junto)."
9601
+ },
9602
+ {
9603
+ "name": "page",
9604
+ "type": "integer",
9605
+ "location": "query",
9606
+ "required": false,
9607
+ "description": "Pagina do grupo pedido em `group` (50 por pagina). So vale junto de `group`; invalida vira 1."
9608
+ },
9609
+ {
9610
+ "name": "q",
9611
+ "type": "string",
9612
+ "location": "query",
9613
+ "required": false,
9614
+ "description": "Busca (22/10): titulo, descricao e nome do responsavel; com 3 letras ou mais, tambem o CLIENTE da tarefa (nome, telefone, e-mail ou identificador, pela ficha da tarefa ou pela conversa dela). Termo que casa mais de 1.000 clientes procura so nos campos da tarefa. Desde 23/10/2026 tambem acha pelo NOME DO CARD da tarefa e, com 3 letras ou mais, por QUEM FEZ (quem criou, o dono antigo da tarefa e o 'Agendado por')."
9615
+ },
9616
+ {
9617
+ "name": "task_type",
9618
+ "type": "string",
9619
+ "location": "query",
9620
+ "required": false,
9621
+ "description": "Tipo da tarefa"
9622
+ },
9623
+ {
9624
+ "name": "status",
9625
+ "type": "string",
9626
+ "location": "query",
9627
+ "required": false,
9628
+ "description": "Situacao dentro das abertas: 0 = pendente, 3 = adiada. Concluida (1) e cancelada (2) nunca aparecem aqui (devolvem grupos vazios). Para ver concluidas, use group=completed."
9629
+ },
9630
+ {
9631
+ "name": "priority",
9632
+ "type": "string",
9633
+ "location": "query",
9634
+ "required": false,
9635
+ "description": "Prioridade (22/10): urgent | high | medium | low | none. Antes de 22/10 este filtro era ignorado pelo servidor."
9636
+ },
9637
+ {
9638
+ "name": "assignee_id",
9639
+ "type": "integer",
9640
+ "location": "query",
9641
+ "required": false,
9642
+ "description": "Tarefas de UMA pessoa. So muda alguma coisa para quem pode ver a agenda da equipe (administrador ou cargo com 'Gerenciar agenda da equipe'); os demais veem sempre as proprias."
9643
+ },
9644
+ {
9645
+ "name": "user_id",
9646
+ "type": "integer",
9647
+ "location": "query",
9648
+ "required": false,
9649
+ "description": "ID de quem criou a tarefa"
9650
+ },
9651
+ {
9652
+ "name": "agenda_id",
9653
+ "type": "integer",
9654
+ "location": "query",
9655
+ "required": false,
9656
+ "description": "Recorta por AGENDA (unidade). SEM este parametro a lista ja vem recortada pelas agendas que o usuario enxerga. Na agenda PRINCIPAL entram tambem os compromissos com agenda nula."
9657
+ }
9658
+ ],
9659
+ "returns": "Objeto: { overdue: [...], today: [...], tomorrow: [...], next_7_days: [...], later: [...], totals: { overdue: N, ... }, page: N, per_page: 50 }. Com `group`, so aquele grupo + totals dele. `totals` e a contagem REAL do grupo (use-a para 'quantas atrasadas?'; a lista traz no maximo 50). Cada tarefa vem no mesmo formato de lionchat_tasks_list (assignees, contact_name, conversation_contact_name, kanban_item_title, selo, tratamento...). Com `group=completed`: { completed: [...], totals: { completed: N }, page, per_page }. Datas de desfecho (23/10/2026): toda tarefa traz `completed_at` (quando foi concluida), `cancelled_at` (quando foi cancelada) e `attendance_marked_at` (quando marcaram Compareceu/Faltou), gravadas pelo servidor na hora da mudanca (nunca aceitas do cliente) e APAGADAS ao reabrir, adiar ou limpar a presenca; tarefa anterior a 23/10 vem com nulo. E `concluida_no_prazo` (true/false/nulo): so no tipo Tarefa, true = concluida ate o horario marcado (scheduled_at).",
9660
+ "common_use_cases": [
9661
+ "Quantas e quais tarefas estao atrasadas (de toda a equipe ou de uma pessoa)",
9662
+ "Lista do que falta fazer hoje, amanha e na semana",
9663
+ "Achar a tarefa de um cliente pelo nome ou telefone"
9664
+ ],
9665
+ "related_tools": [
9666
+ "lionchat_tasks_list",
9667
+ "lionchat_tasks_list_1",
9668
+ "lionchat_tasks_show",
9669
+ "lionchat_tasks_toggle"
9525
9670
  ]
9526
9671
  },
9527
9672
  {
@@ -11154,7 +11299,7 @@
11154
11299
  "method": "POST",
11155
11300
  "path": "/api/v1/accounts/{account_id}/automation_rules",
11156
11301
  "title": "Criar Regra de Automacao",
11157
- "description": "Cria uma regra de automacao. event_name validos: conversation_created, conversation_updated, conversation_resolved, message_created, conversation_opened, webhook, kanban_item_created, kanban_item_stage_changed. conditions: [{attribute_key, filter_operator, query_operator, values[]}]. actions: [{action_name, action_params[]}]. Aceita active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
11302
+ "description": "Cria uma regra de automacao. event_name validos: conversation_created, conversation_updated, conversation_resolved, message_created, conversation_opened, webhook, kanban_item_created, kanban_item_stage_changed. conditions: [{attribute_key, filter_operator, query_operator, values[]}]. actions: [{action_name, action_params[]}]. Aceita active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500). [27/10/2026] conditions NAO aceitam 'current_user' em assignee_id (422): automacao nao tem \"quem esta vendo\" — use o id do agente.",
11158
11303
  "category": "Regras de Automacao",
11159
11304
  "params": [
11160
11305
  {
@@ -11183,7 +11328,7 @@
11183
11328
  "type": "array",
11184
11329
  "location": "body",
11185
11330
  "required": true,
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'."
11331
+ "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'. CONDICAO 'VEIO DE ANUNCIO PAGO' (25/10/2026): attribute_key 'origin_paid', filter_operator equal_to/not_equal_to, values ['paid'] (ou not_paid/unknown/unclassified). Junta clique no anuncio e formulario do anuncio — para 'so lead de anuncio' use esta, nao origin_kind = paid_ad (que esquece o formulario). Vale nos eventos de conversa e mensagem."
11187
11332
  },
11188
11333
  {
11189
11334
  "name": "actions",
@@ -11252,7 +11397,7 @@
11252
11397
  "method": "PUT",
11253
11398
  "path": "/api/v1/accounts/{account_id}/automation_rules/{id}",
11254
11399
  "title": "Atualizar Regra",
11255
- "description": "Atualiza uma regra de automacao (PUT, substituicao completa). Campos: name, event_name, conditions, actions, active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500).",
11400
+ "description": "Atualiza uma regra de automacao (PUT, substituicao completa). Campos: name, event_name, conditions, actions, active, inbox_id. As actions DEVEM ser um array de objetos {action_name, action_params} — item malformado (ex.: texto solto) retorna 422 (novo 22/07; antes estourava 500). [27/10/2026] conditions NAO aceitam 'current_user' em assignee_id (422 quando as conditions mudam): automacao nao tem \"quem esta vendo\" — use o id do agente.",
11256
11401
  "category": "Regras de Automacao",
11257
11402
  "params": [
11258
11403
  {
@@ -11281,7 +11426,7 @@
11281
11426
  "type": "array",
11282
11427
  "location": "body",
11283
11428
  "required": false,
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'."
11429
+ "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'. CONDICAO 'VEIO DE ANUNCIO PAGO' (25/10/2026): attribute_key 'origin_paid', filter_operator equal_to/not_equal_to, values ['paid'] (ou not_paid/unknown/unclassified). Junta clique no anuncio e formulario do anuncio — para 'so lead de anuncio' use esta, nao origin_kind = paid_ad (que esquece o formulario). Vale nos eventos de conversa e mensagem."
11285
11430
  },
11286
11431
  {
11287
11432
  "name": "actions",
@@ -11763,7 +11908,7 @@
11763
11908
  "method": "GET",
11764
11909
  "path": "/api/v1/accounts/{account_id}/custom_filters",
11765
11910
  "title": "Listar Filtros",
11766
- "description": "Lista os filtros salvos do usuario atual (filtro por filter_type, default conversation).",
11911
+ "description": "Lista os filtros salvos por filter_type (padrao conversation). Desde 22/10/2026: filter_type contact (segmentos) lista os segmentos da CONTA inteira (precisa do menu Contatos no cargo), ordenados por nome; conversation (pastas) traz as do usuario atual MAIS as compartilhadas da conta (campo shared, desde 27/10/2026); report continua so os do usuario atual. Em pasta compartilhada criada por OUTRA pessoa, user_id e user_name vem nulos. Cada item traz user_id/user_name (\"criado por\", pode vir nulo) e can_manage (se quem pergunta pode editar/apagar).",
11767
11912
  "category": "Filtros Personalizados",
11768
11913
  "params": [
11769
11914
  {
@@ -11771,7 +11916,7 @@
11771
11916
  "type": "string",
11772
11917
  "location": "query",
11773
11918
  "required": false,
11774
- "description": "conversation ou contact"
11919
+ "description": "conversation (pastas: as suas + as compartilhadas da conta), contact (segmentos, da CONTA) ou report"
11775
11920
  }
11776
11921
  ],
11777
11922
  "returns": "array de filtros (sem meta/payload)",
@@ -11791,15 +11936,36 @@
11791
11936
  "method": "POST",
11792
11937
  "path": "/api/v1/accounts/{account_id}/custom_filters",
11793
11938
  "title": "Criar Filtro",
11794
- "description": "Cria um filtro personalizado. Cria novo filtro personalizado. Obrigatórios: name, filter_type, query. Valida unicidade quando aplicável. Retorna o filtro personalizado criado com ID atribuído.",
11939
+ "description": "Cria um filtro personalizado. Cria novo filtro personalizado. Obrigatórios: name, filter_type, query. Valida unicidade quando aplicável. Retorna o filtro personalizado criado com ID atribuído. Desde 22/10/2026 o segmento (filter_type contact) e da CONTA: criar exige administrador ou cargo com contact_manage, campaign_manage ou automation_manage (sem isso, 401). filter_type aceita o nome ou o numero. Regra vazia ou incompleta = 422. Teto de 1.000 segmentos por conta. PASTA COMPARTILHADA (27/10/2026): pasta de conversa (filter_type conversation) com shared true aparece para TODA a conta; so administrador cria, edita, compartilha ou apaga (sem isso, 401). Cada pessoa ve dentro dela so as conversas que ja pode ver. shared nulo = 422; compartilhada sem nenhuma condicao = 422; segmento e relatorio nao podem ser compartilhados (422). Para mostrar a cada pessoa as conversas DELA use assignee_id com o valor 'current_user' (\"Quem esta vendo\").",
11795
11940
  "category": "Filtros Personalizados",
11796
11941
  "params": [
11797
11942
  {
11798
- "name": "custom_filter",
11943
+ "name": "name",
11944
+ "type": "string",
11945
+ "location": "body",
11946
+ "required": true,
11947
+ "description": "Nome da pasta/segmento"
11948
+ },
11949
+ {
11950
+ "name": "filter_type",
11951
+ "type": "string",
11952
+ "location": "body",
11953
+ "required": true,
11954
+ "description": "'conversation' (pasta de conversas), 'contact' (segmento de contatos) ou 'report' — aceita o nome ou o numero"
11955
+ },
11956
+ {
11957
+ "name": "query",
11799
11958
  "type": "object",
11800
11959
  "location": "body",
11801
11960
  "required": true,
11802
- "description": "Wrapper {name, filter_type, query}. filter_type: 'conversation' ou 'contact'. query = {\"payload\": [{\"attribute_key\": \"status\", \"filter_operator\": \"equal_to\", \"values\": [\"open\"], \"query_operator\": \"and\"}, {\"attribute_key\": \"assignee_id\", \"filter_operator\": \"equal_to\", \"values\": [5], \"query_operator\": null}], \"sort_by\": \"...\"} — payload e LISTA de condicoes (mesmo formato de lionchat_conversations_filter / lionchat_contacts_filter); values e SEMPRE lista; query_operator liga a condicao com a SEGUINTE e a ULTIMA vai null. sort_by e opcional (so pasta de conversa)."
11961
+ "description": "query = {\"payload\": [{\"attribute_key\": \"status\", \"filter_operator\": \"equal_to\", \"values\": [\"open\"], \"query_operator\": \"and\"}, {\"attribute_key\": \"assignee_id\", \"filter_operator\": \"equal_to\", \"values\": [5], \"query_operator\": null}], \"sort_by\": \"...\"} — payload e LISTA de condicoes (mesmo formato de lionchat_conversations_filter / lionchat_contacts_filter); values e SEMPRE lista; query_operator liga a condicao com a SEGUINTE e a ULTIMA vai null. sort_by e opcional (so pasta de conversa)."
11962
+ },
11963
+ {
11964
+ "name": "shared",
11965
+ "type": "boolean",
11966
+ "location": "body",
11967
+ "required": false,
11968
+ "description": "So pasta de conversa e so administrador: true = a pasta aparece para toda a conta. Omitido = pasta pessoal."
11803
11969
  }
11804
11970
  ],
11805
11971
  "returns": "filtro personalizado criado (com novo ID)",
@@ -11820,7 +11986,7 @@
11820
11986
  "method": "GET",
11821
11987
  "path": "/api/v1/accounts/{account_id}/custom_filters/{id}",
11822
11988
  "title": "Detalhe do Filtro",
11823
- "description": "Retorna detalhes. Retorna detalhes completos de UM filtro personalizado específico pelo ID. Inclui campos relacionais quando aplicável.",
11989
+ "description": "Retorna detalhes. Retorna detalhes completos de UM filtro personalizado específico pelo ID. Inclui campos relacionais quando aplicável. Pasta compartilhada (shared true) pode ser lida por qualquer membro da conta.",
11824
11990
  "category": "Filtros Personalizados",
11825
11991
  "params": [
11826
11992
  {
@@ -11848,7 +12014,7 @@
11848
12014
  "method": "PATCH",
11849
12015
  "path": "/api/v1/accounts/{account_id}/custom_filters/{id}",
11850
12016
  "title": "Atualizar Filtro",
11851
- "description": "Atualiza filtro. Atualiza campos do filtro personalizado existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, query.",
12017
+ "description": "Atualiza filtro. Atualiza campos do filtro personalizado existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, query, shared. filter_type e IGNORADO no update (nao da para trocar o tipo). Segmento (contact) so pode ser editado por administrador ou cargo com contact_manage, campaign_manage ou automation_manage — sem isso, 401 (veja can_manage no list/show). PASTA COMPARTILHADA (27/10/2026): so administrador edita (401). So mande shared para MUDAR o compartilhamento: shared false numa compartilhada a transforma em pasta pessoal DE QUEM MANDOU (some para os outros). Em compartilhada, query.sort_by muda a ordem padrao de TODOS. shared nulo = 422; compartilhada sem condicao = 422. Dois administradores editando juntos: vale a ultima gravacao.",
11852
12018
  "category": "Filtros Personalizados",
11853
12019
  "params": [
11854
12020
  {
@@ -11859,11 +12025,25 @@
11859
12025
  "description": "ID do filtro"
11860
12026
  },
11861
12027
  {
11862
- "name": "custom_filter",
12028
+ "name": "name",
12029
+ "type": "string",
12030
+ "location": "body",
12031
+ "required": false,
12032
+ "description": "Novo nome"
12033
+ },
12034
+ {
12035
+ "name": "query",
11863
12036
  "type": "object",
11864
12037
  "location": "body",
11865
- "required": true,
11866
- "description": "Wrapper {name, filter_type, query}. filter_type: 'conversation' ou 'contact'. query = {\"payload\": [{\"attribute_key\": \"status\", \"filter_operator\": \"equal_to\", \"values\": [\"open\"], \"query_operator\": \"and\"}, {\"attribute_key\": \"assignee_id\", \"filter_operator\": \"equal_to\", \"values\": [5], \"query_operator\": null}], \"sort_by\": \"...\"} — payload e LISTA de condicoes (mesmo formato de lionchat_conversations_filter / lionchat_contacts_filter); values e SEMPRE lista; query_operator liga a condicao com a SEGUINTE e a ULTIMA vai null. sort_by e opcional (so pasta de conversa). No update, query SUBSTITUI inteira: mande as condicoes E o sort_by (leia antes com lionchat_custom_filters_show)."
12038
+ "required": false,
12039
+ "description": "query = {\"payload\": [{\"attribute_key\": \"status\", \"filter_operator\": \"equal_to\", \"values\": [\"open\"], \"query_operator\": \"and\"}, {\"attribute_key\": \"assignee_id\", \"filter_operator\": \"equal_to\", \"values\": [5], \"query_operator\": null}], \"sort_by\": \"...\"} — payload e LISTA de condicoes (mesmo formato de lionchat_conversations_filter / lionchat_contacts_filter); values e SEMPRE lista; query_operator liga a condicao com a SEGUINTE e a ULTIMA vai null. sort_by e opcional (so pasta de conversa). No update, query SUBSTITUI inteira: mande as condicoes E o sort_by (leia antes com lionchat_custom_filters_show)."
12040
+ },
12041
+ {
12042
+ "name": "shared",
12043
+ "type": "boolean",
12044
+ "location": "body",
12045
+ "required": false,
12046
+ "description": "So administrador e so pasta de conversa: true compartilha com a conta; false volta a ser pasta pessoal de quem mandou."
11867
12047
  }
11868
12048
  ],
11869
12049
  "returns": "filtro personalizado atualizado",
@@ -11884,7 +12064,7 @@
11884
12064
  "method": "DELETE",
11885
12065
  "path": "/api/v1/accounts/{account_id}/custom_filters/{id}",
11886
12066
  "title": "Deletar Filtro",
11887
- "description": "Remove filtro. Remove filtro personalizado permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
12067
+ "description": "Remove filtro. Remove filtro personalizado permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes. Segmento (contact) so pode ser apagado por administrador ou cargo com contact_manage, campaign_manage ou automation_manage (401). Segmento usado por campanha programada (no publico ou no 'Nao enviar para') NAO e apagado: 422 com message citando a campanha. Pasta compartilhada: so administrador apaga, e ela some para TODA a conta.",
11888
12068
  "category": "Filtros Personalizados",
11889
12069
  "params": [
11890
12070
  {
@@ -12394,7 +12574,7 @@
12394
12574
  "type": "string",
12395
12575
  "location": "query",
12396
12576
  "required": false,
12397
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
12577
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
12398
12578
  },
12399
12579
  {
12400
12580
  "name": "contact_filters",
@@ -12876,7 +13056,7 @@
12876
13056
  "type": "string",
12877
13057
  "location": "query",
12878
13058
  "required": false,
12879
- "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
13059
+ "description": "Filtros estruturados aplicados aos resultados de CONVERSAS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422 assignee_id aceita 'current_user' (quem pergunta)."
12880
13060
  },
12881
13061
  {
12882
13062
  "name": "contact_filters",
@@ -12905,8 +13085,8 @@
12905
13085
  "id": "lionchat_upload_create",
12906
13086
  "method": "POST",
12907
13087
  "path": "/api/v1/accounts/{account_id}/upload",
12908
- "title": "Upload de Arquivo",
12909
- "description": "Upload de arquivo ou busca por URL. Retorna file_url e blob_id. Cria novo upload. Valida unicidade quando aplicável. Retorna o upload criado com ID atribuído.",
13088
+ "title": "Subir Arquivo por Link",
13089
+ "description": "Sobe um arquivo POR LINK (external_url) e devolve file_url e blob_id. Pelo conector o arquivo SEMPRE vai por link — não há envio direto do computador. Aceita foto, vídeo, áudio e documentos (PDF, Word, Excel, CSV, ZIP...); até 23/10/2026 o link só aceitava foto e vídeo. Link que abre uma PÁGINA é recusado ('O link abre uma página, não o arquivo') — ex.: Google Drive .../file/d/<ID>/view; use o download direto https://drive.google.com/uc?export=download&id=<ID> (arquivo com acesso 'qualquer pessoa com o link'). Áudio e documento acima do teto do tipo (lionchat_upload_limits_show) são recusados. Use o blob_id no array attachments de lionchat_conversations_messages_create — funciona também na conversa de um GRUPO do WhatsApp (caixa QR Code). Na dúvida, confira o link antes com lionchat_upload_validate.",
12910
13090
  "category": "Upload",
12911
13091
  "params": [
12912
13092
  {
@@ -12921,16 +13101,20 @@
12921
13101
  "type": "string",
12922
13102
  "location": "body",
12923
13103
  "required": false,
12924
- "description": "URL externa do arquivo"
13104
+ "description": "Link PÚBLICO de download do arquivo (http/https). Link de página de visualização é recusado"
12925
13105
  }
12926
13106
  ],
12927
- "returns": "upload criado (com novo ID)",
13107
+ "returns": "{file_url, blob_id}",
12928
13108
  "common_use_cases": [
12929
- "Cadastro inicial de upload",
12930
- "Automação a partir de evento externo",
12931
- "Importação manual via API"
13109
+ "Mandar PDF, áudio ou documento numa conversa ou grupo do WhatsApp (blob_id em attachments)",
13110
+ "Anexar foto ou vídeo por link numa mensagem",
13111
+ "Enviar todo dia um relatório em PDF num grupo"
12932
13112
  ],
12933
- "related_tools": []
13113
+ "related_tools": [
13114
+ "lionchat_conversations_messages_create",
13115
+ "lionchat_upload_validate",
13116
+ "lionchat_upload_limits_show"
13117
+ ]
12934
13118
  },
12935
13119
  {
12936
13120
  "id": "lionchat_inboxes_public_contacts_create",
@@ -14751,7 +14935,7 @@
14751
14935
  "type": "array",
14752
14936
  "location": "body",
14753
14937
  "required": true,
14754
- "description": "Array de permissoes (array de strings). Valores aceitos (24): conversation_manage, conversation_delete, conversation_unassigned_manage, conversation_participating_manage, conversation_team_manage, conversation_assigned_manage (Ver conversas dos colegas: so as que JA TEM responsavel, nas caixas de que a pessoa e membro; nunca a fila sem dono — 02/10/2026), contact_manage, contact_export_import, report_manage, knowledge_base_manage, kanban_manage, kanban_view, kanban_delete, kanban_export_import, offer_manage, funnel_manage, campaign_manage, automation_manage, marketing_integrations_manage, captain_manage, flowbuilder_manage, lead_form_manage (Formularios publicos, 05/09), signature_manage (Assinatura eletronica, 05/09), agenda_manage (Gerenciar a Agenda). Fora da lista = recusado. Administrador tem tudo sem cargo; agente sem cargo nao tem lead_form_manage nem signature_manage (nao ve Formularios nem Assinaturas no menu). O editor da tela marca junto as que uma inclui: conversation_manage inclui as 4 outras de conversa; conversation_team_manage inclui conversation_participating_manage; kanban_manage inclui kanban_view. Mande a lista ja completa."
14938
+ "description": "Array de permissoes (array de strings). Valores aceitos (25): conversation_manage, conversation_delete, conversation_unassigned_manage, conversation_participating_manage, conversation_team_manage, conversation_assigned_manage (Ver conversas dos colegas: so as que JA TEM responsavel, nas caixas de que a pessoa e membro; nunca a fila sem dono — 02/10/2026), contact_manage, contact_export_import, report_manage, knowledge_base_manage, kanban_manage, kanban_view, kanban_delete, kanban_export_import, offer_manage, funnel_manage, kanban_ai_analyze (Analisar funil com IA: o botao \"Analisar com IA\" do Kanban; tambem precisa do recurso de plano kanban_ai_analysis, 28/10/2026), campaign_manage, automation_manage, marketing_integrations_manage, captain_manage, flowbuilder_manage, lead_form_manage (Formularios publicos, 05/09), signature_manage (Assinatura eletronica, 05/09), agenda_manage (Gerenciar a Agenda). Fora da lista = recusado. Administrador tem tudo sem cargo; agente sem cargo nao tem lead_form_manage nem signature_manage (nao ve Formularios nem Assinaturas no menu). O editor da tela marca junto as que uma inclui: conversation_manage inclui as 4 outras de conversa; conversation_team_manage inclui conversation_participating_manage; kanban_manage inclui kanban_view. Mande a lista ja completa."
14755
14939
  },
14756
14940
  {
14757
14941
  "name": "hidden_menus",
@@ -14836,7 +15020,7 @@
14836
15020
  "type": "array",
14837
15021
  "location": "body",
14838
15022
  "required": false,
14839
- "description": "Permissoes (array de strings). Valores aceitos (24): conversation_manage, conversation_delete, conversation_unassigned_manage, conversation_participating_manage, conversation_team_manage, conversation_assigned_manage (Ver conversas dos colegas: so as que JA TEM responsavel, nas caixas de que a pessoa e membro; nunca a fila sem dono — 02/10/2026), contact_manage, contact_export_import, report_manage, knowledge_base_manage, kanban_manage, kanban_view, kanban_delete, kanban_export_import, offer_manage, funnel_manage, campaign_manage, automation_manage, marketing_integrations_manage, captain_manage, flowbuilder_manage, lead_form_manage (Formularios publicos, 05/09), signature_manage (Assinatura eletronica, 05/09), agenda_manage (Gerenciar a Agenda). Fora da lista = recusado. Administrador tem tudo sem cargo; agente sem cargo nao tem lead_form_manage nem signature_manage (nao ve Formularios nem Assinaturas no menu). O editor da tela marca junto as que uma inclui: conversation_manage inclui as 4 outras de conversa; conversation_team_manage inclui conversation_participating_manage; kanban_manage inclui kanban_view. Mande a lista ja completa."
15023
+ "description": "Permissoes (array de strings). Valores aceitos (25): conversation_manage, conversation_delete, conversation_unassigned_manage, conversation_participating_manage, conversation_team_manage, conversation_assigned_manage (Ver conversas dos colegas: so as que JA TEM responsavel, nas caixas de que a pessoa e membro; nunca a fila sem dono — 02/10/2026), contact_manage, contact_export_import, report_manage, knowledge_base_manage, kanban_manage, kanban_view, kanban_delete, kanban_export_import, offer_manage, funnel_manage, kanban_ai_analyze (Analisar funil com IA: o botao \"Analisar com IA\" do Kanban; tambem precisa do recurso de plano kanban_ai_analysis, 28/10/2026), campaign_manage, automation_manage, marketing_integrations_manage, captain_manage, flowbuilder_manage, lead_form_manage (Formularios publicos, 05/09), signature_manage (Assinatura eletronica, 05/09), agenda_manage (Gerenciar a Agenda). Fora da lista = recusado. Administrador tem tudo sem cargo; agente sem cargo nao tem lead_form_manage nem signature_manage (nao ve Formularios nem Assinaturas no menu). O editor da tela marca junto as que uma inclui: conversation_manage inclui as 4 outras de conversa; conversation_team_manage inclui conversation_participating_manage; kanban_manage inclui kanban_view. Mande a lista ja completa."
14840
15024
  },
14841
15025
  {
14842
15026
  "name": "hidden_menus",
@@ -15715,7 +15899,7 @@
15715
15899
  "method": "POST",
15716
15900
  "path": "/api/v1/accounts/{account_id}/dashboard_apps",
15717
15901
  "title": "Criar Dashboard App",
15718
- "description": "Cria um dashboard app. Body exige wrapper dashboard_app.",
15902
+ "description": "Cria um dashboard app. Body exige wrapper dashboard_app. So administrador (desde 27/10; os outros recebem 401).",
15719
15903
  "category": "Dashboard Apps",
15720
15904
  "params": [
15721
15905
  {
@@ -15793,7 +15977,7 @@
15793
15977
  "method": "PUT",
15794
15978
  "path": "/api/v1/accounts/{account_id}/dashboard_apps/{id}",
15795
15979
  "title": "Atualizar Dashboard App",
15796
- "description": "Atualiza um app do dashboard. Atualiza campos do dashboard app existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, content.",
15980
+ "description": "Atualiza um app do dashboard. Atualiza campos do dashboard app existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: title, content. So administrador (desde 27/10; os outros recebem 401).",
15797
15981
  "category": "Dashboard Apps",
15798
15982
  "params": [
15799
15983
  {
@@ -15850,7 +16034,7 @@
15850
16034
  "method": "DELETE",
15851
16035
  "path": "/api/v1/accounts/{account_id}/dashboard_apps/{id}",
15852
16036
  "title": "Excluir Dashboard App",
15853
- "description": "Remove um app do dashboard. Remove dashboard app permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes.",
16037
+ "description": "Remove um app do dashboard. Remove dashboard app permanentemente. CUIDADO: ação irreversível em muitos casos. Verifique dependências antes. So administrador (desde 27/10; os outros recebem 401).",
15854
16038
  "category": "Dashboard Apps",
15855
16039
  "params": [
15856
16040
  {
@@ -17184,7 +17368,7 @@
17184
17368
  "method": "GET",
17185
17369
  "path": "/api/v1/accounts/{account_id}/google_calendar/connect",
17186
17370
  "title": "Conectar Google Calendar",
17187
- "description": "Inicia o fluxo de conexao com Google Calendar. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar). [07/08] SO ADMINISTRADOR conecta (usuario nao-admin recebe 403) e SO UMA conta Google por conta LionChat — se ja houver uma conectada por outro admin, a nova e recusada; desconecte a atual antes.",
17371
+ "description": "Inicia o fluxo de conexao com Google Calendar. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar). [07/08] SO ADMINISTRADOR conecta (usuario nao-admin recebe 403) e UMA conta Google por AGENDA (desde 13/09; conta com varias agendas pode ter uma conexao por agenda, informe agenda_id) — se a agenda ja tiver a conexao de outro admin, a nova e recusada (409); desconecte a atual antes.",
17188
17372
  "category": "Google Calendar",
17189
17373
  "params": [
17190
17374
  {
@@ -18774,7 +18958,7 @@
18774
18958
  "type": "string",
18775
18959
  "location": "body",
18776
18960
  "required": false,
18777
- "description": "Token de validacao Hotmart (hottok) (dentro de hotmart_webhook)"
18961
+ "description": "Token de validacao Hotmart (hottok) (dentro de hotmart_webhook) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
18778
18962
  },
18779
18963
  {
18780
18964
  "name": "inbox_id",
@@ -19081,7 +19265,7 @@
19081
19265
  "type": "string",
19082
19266
  "location": "body",
19083
19267
  "required": false,
19084
- "description": "Token de validacao Kiwify (dentro de kiwify_webhook)"
19268
+ "description": "Token de validacao Kiwify (dentro de kiwify_webhook) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
19085
19269
  },
19086
19270
  {
19087
19271
  "name": "inbox_id",
@@ -19388,7 +19572,7 @@
19388
19572
  "type": "string",
19389
19573
  "location": "body",
19390
19574
  "required": false,
19391
- "description": "Token de validacao Ticto (dentro de ticto_webhook)"
19575
+ "description": "Token de validacao Ticto (dentro de ticto_webhook) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
19392
19576
  },
19393
19577
  {
19394
19578
  "name": "inbox_id",
@@ -19695,7 +19879,7 @@
19695
19879
  "type": "string",
19696
19880
  "location": "body",
19697
19881
  "required": false,
19698
- "description": "Segredo de validacao Eduzz (dentro de eduzz_webhook)"
19882
+ "description": "Segredo de validacao Eduzz (dentro de eduzz_webhook) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
19699
19883
  },
19700
19884
  {
19701
19885
  "name": "inbox_id",
@@ -20002,7 +20186,7 @@
20002
20186
  "type": "string",
20003
20187
  "location": "body",
20004
20188
  "required": false,
20005
- "description": "Chave de validacao Monetizze (dentro de monetizze_webhook)"
20189
+ "description": "Chave de validacao Monetizze (dentro de monetizze_webhook) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
20006
20190
  },
20007
20191
  {
20008
20192
  "name": "inbox_id",
@@ -21821,7 +22005,7 @@
21821
22005
  "method": "POST",
21822
22006
  "path": "/api/v1/accounts/{account_id}/inbox_members",
21823
22007
  "title": "Definir Membros da Inbox",
21824
- "description": "Define os agentes membros da inbox (substitui a lista). Para adicionar incrementalmente, leia a lista atual e mescle. Use supervisor_ids[] para marcar supervisores (veem tudo, fora da distribuicao automatica); a resposta traz is_supervisor por agente.",
22008
+ "description": "ACRESCENTA agentes como membros da inbox (não substitui a lista nem remove ninguém; para tirar, use inbox_members_destroy). supervisor_ids[] e IGNORADO aqui (todos entram como agentes): para marcar supervisores (veem tudo, fora da distribuicao automatica) use inbox_members_update, que SUBSTITUI a lista inteira. A resposta traz is_supervisor por agente.",
21825
22009
  "category": "Membros de Inbox",
21826
22010
  "params": [
21827
22011
  {
@@ -21843,7 +22027,7 @@
21843
22027
  "type": "array",
21844
22028
  "location": "body",
21845
22029
  "required": false,
21846
- "description": "IDs dos membros que entram como SUPERVISORES da caixa: veem TODAS as conversas/cards dela, mas ficam FORA da distribuicao automatica (round-robin). Quem nao estiver aqui (e estiver em user_ids) vira agente normal. A resposta traz is_supervisor por agente."
22030
+ "description": "Ignorado nesta ferramenta. Supervisores so por inbox_members_update."
21847
22031
  }
21848
22032
  ],
21849
22033
  "returns": "lista de agentes atualizada",
@@ -23068,7 +23252,7 @@
23068
23252
  "method": "POST",
23069
23253
  "path": "/api/v1/accounts/{account_id}/campaigns",
23070
23254
  "title": "Criar Campanha",
23071
- "description": "Cria campanha. O TIPO vem da inbox: WhatsApp oficial (Cloud, exige template em template_params), WhatsApp QR Code/WAHA (texto livre + variações anti-bloqueio), SMS/Twilio, ou Website (ongoing — popup de chat por URL/tempo). One-off exige audience. ENVIO EM MASSA: SEMPRE rode estimate_audience com o MESMO audience+audience_mode antes e CONFIRME com o usuário. 422 se inbox incompatível, audience vazio (one-off) ou ConversationAttribute sem key/value. COMPORTAMENTO NOVO 23/07: as ações pós-envio da campanha (tag/atributo/prioridade/atendente) aplicam SÓ quando a Meta confirma a ENTREGA (delivered/read), nunca no aceite — mensagem que falha ou é barrada por spam NÃO recebe as ações (corrige exclusão furada no disparo seguinte). Efeito visível: a tag/atributo pode levar de segundos a minutos pra aparecer após o disparo. CAMPANHA DE FLUXO (NOVO 28/07/2026): passando `flow_id` a campanha dispara um FLUXO do FlowBuilder para cada pessoa do publico, cadenciado, em vez de mandar uma mensagem — vale nas duas familias de WhatsApp (oficial e QR Code). Nesse modo `message` e ignorado e o ritmo vai em template_params (delay_min/delay_max/daily_cap). Acompanhe com lionchat_campaigns_flow_report e interrompa com lionchat_campaigns_stop_flow.",
23255
+ "description": "Cria campanha. O TIPO vem da inbox: WhatsApp oficial (Cloud, exige template em template_params), WhatsApp QR Code/WAHA (texto livre + variações anti-bloqueio), SMS/Twilio, ou Website (ongoing — popup de chat por URL/tempo). One-off exige audience. ENVIO EM MASSA: SEMPRE rode estimate_audience com o MESMO audience+audience_mode antes e CONFIRME com o usuário. 422 se inbox incompatível ou ConversationAttribute sem key/value. ATENÇÃO: audience vazio NÃO dá 422 — a campanha nasce e não manda para ninguém; confira antes com estimate_audience. COMPORTAMENTO NOVO 23/07: as ações pós-envio da campanha (tag/atributo/prioridade/atendente) aplicam SÓ quando a Meta confirma a ENTREGA (delivered/read), nunca no aceite — mensagem que falha ou é barrada por spam NÃO recebe as ações (corrige exclusão furada no disparo seguinte). Efeito visível: a tag/atributo pode levar de segundos a minutos pra aparecer após o disparo. CAMPANHA DE FLUXO (NOVO 28/07/2026): passando `flow_id` a campanha dispara um FLUXO do FlowBuilder para cada pessoa do publico, cadenciado, em vez de mandar uma mensagem — vale nas duas familias de WhatsApp (oficial e QR Code). Nesse modo `message` e ignorado e o ritmo vai em template_params (delay_min/delay_max/daily_cap). Acompanhe com lionchat_campaigns_flow_report e interrompa com lionchat_campaigns_stop_flow.",
23072
23256
  "category": "Campanhas",
23073
23257
  "params": [
23074
23258
  {
@@ -23097,7 +23281,7 @@
23097
23281
  "type": "array",
23098
23282
  "location": "body",
23099
23283
  "required": false,
23100
- "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; uma secao unica mandada como objeto vira lista de um; texto ou numero no lugar da lista e RECUSADO (422). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 7 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga. OBRIGATORIO em campanha one-off. Use exatamente as MESMAS secoes que voce passou em lionchat_campaigns_estimate_audience — estimar com um tipo e criar com outro entrega um publico diferente do numero que voce mostrou."
23284
+ "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; uma secao unica mandada como objeto vira lista de um; texto ou numero no lugar da lista e RECUSADO (422). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 8 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados); 'Segment' {id} (22/10/2026: segmento de contatos da CONTA — id de lionchat_custom_filters_list com filter_type contact; vale WhatsApp oficial, QR Code e Campanha de Fluxo; SMS recusa com 422; a regra do segmento e lida na HORA do disparo e, se o segmento sumiu ou a regra quebrou, a campanha NAO envia nada e o motivo fica em trigger_rules.audience_error). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga. OBRIGATORIO em campanha one-off. Use exatamente as MESMAS secoes que voce passou em lionchat_campaigns_estimate_audience — estimar com um tipo e criar com outro entrega um publico diferente do numero que voce mostrou."
23101
23285
  },
23102
23286
  {
23103
23287
  "name": "audience_mode",
@@ -23146,7 +23330,7 @@
23146
23330
  "type": "object",
23147
23331
  "location": "body",
23148
23332
  "required": false,
23149
- "description": "Regras da campanha (hash aberto). Carrega: 'audience_mode' ('sum'|'all', combinacao das secoes de publico) e 'exclusion' (array no MESMO formato do audience — publico a negativar/excluir do disparo). Ex.: {\"audience_mode\":\"sum\",\"exclusion\":[{\"type\":\"ContactLabel\",\"id\":12}]}. audience_mode top-level so vale no estimate_audience; ao criar/editar ele PRECISA ir aqui dentro. A `exclusion` usa o MESMO formato e os MESMOS 7 tipos do audience, inclusive o `operator` nas secoes de atributo. A exclusion e LISTA de objetos (objeto unico vira lista de um; texto e recusado com 422)."
23333
+ "description": "Regras da campanha (hash aberto). Carrega: 'audience_mode' ('sum'|'all', combinacao das secoes de publico) e 'exclusion' (array no MESMO formato do audience — publico a negativar/excluir do disparo). Ex.: {\"audience_mode\":\"sum\",\"exclusion\":[{\"type\":\"ContactLabel\",\"id\":12}]}. audience_mode top-level so vale no estimate_audience; ao criar/editar ele PRECISA ir aqui dentro. A `exclusion` usa o MESMO formato e os MESMOS 8 tipos do audience (inclusive 'Segment' {id}), inclusive o `operator` nas secoes de atributo. A exclusion e LISTA de objetos (objeto unico vira lista de um; texto e recusado com 422)."
23150
23334
  },
23151
23335
  {
23152
23336
  "name": "template_params",
@@ -23232,7 +23416,7 @@
23232
23416
  "type": "array",
23233
23417
  "location": "body",
23234
23418
  "required": false,
23235
- "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; uma secao unica mandada como objeto vira lista de um; texto ou numero no lugar da lista e RECUSADO (422). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 7 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga. OBRIGATORIO em campanha one-off. Use exatamente as MESMAS secoes que voce passou em lionchat_campaigns_estimate_audience — estimar com um tipo e criar com outro entrega um publico diferente do numero que voce mostrou. No update a lista SUBSTITUI o publico anterior: mande todas as secoes."
23419
+ "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; uma secao unica mandada como objeto vira lista de um; texto ou numero no lugar da lista e RECUSADO (422). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 8 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados); 'Segment' {id} (22/10/2026: segmento de contatos da CONTA — id de lionchat_custom_filters_list com filter_type contact; vale WhatsApp oficial, QR Code e Campanha de Fluxo; SMS recusa com 422; a regra do segmento e lida na HORA do disparo e, se o segmento sumiu ou a regra quebrou, a campanha NAO envia nada e o motivo fica em trigger_rules.audience_error). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga. OBRIGATORIO em campanha one-off. Use exatamente as MESMAS secoes que voce passou em lionchat_campaigns_estimate_audience — estimar com um tipo e criar com outro entrega um publico diferente do numero que voce mostrou. No update a lista SUBSTITUI o publico anterior: mande todas as secoes."
23236
23420
  },
23237
23421
  {
23238
23422
  "name": "audience_mode",
@@ -23322,7 +23506,7 @@
23322
23506
  "method": "POST",
23323
23507
  "path": "/api/v1/accounts/{account_id}/campaigns/estimate_audience",
23324
23508
  "title": "Estimar Audiência da Campanha",
23325
- "description": "Conta quantos contatos COM TELEFONE atendem aos critérios ANTES de criar a campanha. Usa o MESMO motor do disparo (estimativa = lista real). SEMPRE chame antes de campaigns_create e mostre o número ao usuário. [2026-07-25] audience e exclusion aceitam tanto lista quanto texto JSON de uma lista; qualquer outro formato responde 422 com a mensagem do erro (antes dava erro 500).",
23509
+ "description": "Conta quantos contatos COM TELEFONE atendem aos critérios ANTES de criar a campanha. Usa o MESMO motor do disparo (estimativa = lista real). SEMPRE chame antes de campaigns_create e mostre o número ao usuário. [2026-07-25] audience e exclusion aceitam tanto lista quanto texto JSON de uma lista; qualquer outro formato responde 422 com a mensagem do erro (antes dava erro 500). [2026-10-22] Segmento com problema (apagado, de outra conta, regra vazia ou quebrada) no audience OU na exclusion: responde 200 com estimated_count null e segment_unavailable {segment_id, reason} — avise o usuario e NAO crie a campanha assim (ela nao enviaria nada).",
23326
23510
  "category": "Campanhas",
23327
23511
  "params": [
23328
23512
  {
@@ -23330,7 +23514,7 @@
23330
23514
  "type": "array",
23331
23515
  "location": "body",
23332
23516
  "required": true,
23333
- "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; nunca numero solto nem objeto unico (objeto no lugar da lista nao e lido como publico). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 7 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga."
23517
+ "description": "LISTA de objetos — cada secao e um OBJETO com type: [{\"type\": \"Label\", \"id\": 12}, {\"type\": \"ContactAttribute\", \"key\": \"plano\", \"operator\": \"eq\", \"value\": \"Premium\"}]; nunca numero solto nem objeto unico (objeto no lugar da lista nao e lido como publico). Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Sao 8 tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stages: ['slug_da_etapa'], include_won: bool, include_lost: bool} (SO 1 funil por campanha); 'ConversationAttribute' {key, value, operator}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value, operator}; 'CardAttribute' {key, value, operator} (atributo do card Kanban); 'AgentTeam' {assignee_ids: [], team_ids: [], assignee_mode?, team_mode?} (responsavel atual OU time da conversa; assignee_mode 'none' = conversa SEM responsavel ('Sem atendente'), 'any' = com qualquer responsavel; team_mode 'none'|'any' igual para time; ausente/'specific' = usa os ids. Vale qualquer conversa do contato. Atendente e time SEMPRE somam, mesmo em blocos AgentTeam separados); 'Segment' {id} (22/10/2026: segmento de contatos da CONTA — id de lionchat_custom_filters_list com filter_type contact; vale WhatsApp oficial, QR Code e Campanha de Fluxo; SMS recusa com 422; a regra do segmento e lida na HORA do disparo e, se o segmento sumiu ou a regra quebrou, a campanha NAO envia nada e o motivo fica em trigger_rules.audience_error). OPERADOR (28/07/2026): as tres secoes de atributo (ConversationAttribute, ContactAttribute, CardAttribute) aceitam `operator` com 7 valores: eq (padrao), neq, contains, not_contains, starts_with, present, blank. Em `present`/`blank` NAO se manda `value`; nos outros cinco, secao SEM `value` e DESCARTADA em silencio e o publico muda sem aviso nenhum. Vocabulario PROPRIO da campanha: `equal_to`/`is_present` (dos filtros de conversa) NAO existem aqui e caem em igualdade exata, tambem sem erro. `neq` e `not_contains` INCLUEM de proposito quem nao tem o atributo preenchido. Nos operadores de TEXTO (`contains`, `not_contains`, `starts_with`) maiuscula/minuscula NAO importam; ja `eq`/`neq` comparam EXATO — \"Ativo\" NAO casa com \"ativo\". Nos tres de texto, `%`/`_` digitados valem como texto normal, nunca como curinga."
23334
23518
  },
23335
23519
  {
23336
23520
  "name": "audience_mode",
@@ -23351,7 +23535,7 @@
23351
23535
  "type": "array",
23352
23536
  "location": "body",
23353
23537
  "required": false,
23354
- "description": "LISTA de objetos (mesmo formato do audience, ex.: [{\"type\": \"ContactLabel\", \"id\": 12}]). Publico a EXCLUIR/negativar antes de estimar (mesmo formato do 'audience': lista de secoes por tipo). O contador desconta quem cair na exclusao. Tipos aceitos iguais aos do audience (Label, Funnel, ConversationAttribute, ContactLabel, ContactAttribute, CardAttribute, AgentTeam). As secoes de atributo aceitam o mesmo `operator` do audience (eq, neq, contains, not_contains, starts_with, present, blank). AgentTeam aceita os mesmos assignee_mode/team_mode ('none'|'any') do audience."
23538
+ "description": "LISTA de objetos (mesmo formato do audience, ex.: [{\"type\": \"ContactLabel\", \"id\": 12}]). Publico a EXCLUIR/negativar antes de estimar (mesmo formato do 'audience': lista de secoes por tipo). O contador desconta quem cair na exclusao. Tipos aceitos iguais aos do audience (Label, Funnel, ConversationAttribute, ContactLabel, ContactAttribute, CardAttribute, AgentTeam, Segment). As secoes de atributo aceitam o mesmo `operator` do audience (eq, neq, contains, not_contains, starts_with, present, blank). AgentTeam aceita os mesmos assignee_mode/team_mode ('none'|'any') do audience."
23355
23539
  }
23356
23540
  ],
23357
23541
  "returns": "{ estimated_count: <int>, limit_info: { tier, cap, used_24h, remaining, will_send_now, batches_preview: [{date, count}] } } — NAO existe o campo `count`. `limit_info` so vem preenchido quando se manda `inbox_id` de caixa WhatsApp OFICIAL (Cloud): `cap` = teto de contatos NOVOS por dia que a Meta libera, `used_24h` = quanto ja foi usado nas ultimas 24h, `remaining` = o que sobra hoje, `will_send_now` = quanto sai agora e `batches_preview` = o cronograma dia a dia do restante. Em caixa QR Code/SMS, ou sem inbox_id, `tier`/`cap`/`used_24h`/`remaining` vem NULOS, `batches_preview` vem VAZIO e `will_send_now` e a lista inteira — nulo NAO significa \"sem limite\". Sempre mostre o teto do dia junto com o numero, senao voce promete 5.000 disparos num numero que so fala com 2.000.",
@@ -23573,7 +23757,7 @@
23573
23757
  "type": "array",
23574
23758
  "location": "body",
23575
23759
  "required": false,
23576
- "description": "Seções Label/Funnel (mesmo formato das campanhas) — resolve pros telefones dos contatos"
23760
+ "description": "Seções Label/Funnel (mesmo formato das campanhas) — resolve pros telefones dos contatos Segmento de contatos ({type: 'Segment', id}) e RECUSADO (422), no audience e no exclusion."
23577
23761
  },
23578
23762
  {
23579
23763
  "name": "audio_id",
@@ -27416,7 +27600,7 @@
27416
27600
  "method": "GET",
27417
27601
  "path": "/api/v2/accounts/{account_id}/lead_origin_reports",
27418
27602
  "title": "Relatório de Origem dos Leads",
27419
- "description": "SÓ LEITURA. Agregado de origem dos leads/conversas: de qual plataforma, tipo, campanha, conjunto de anúncios e criativo vieram, com totais e taxa de conversão. Janela padrão: últimos 30 dias. Cruza os atributos origin_* das conversas + leads órfãos (contatos sem conversa); 'won' = cards em estágios de ganho do Kanban; leads únicos deduplicados por telefone. Permite drill-down por níveis (plataforma → tipo → campanha → conjunto → criativo). Filtra por caixa (inbox_id) e por responsável (assignee_id) — em conta com mais de uma loja, SEM inbox_id o relatório soma todas as caixas. campaign/adset aceitam o valor especial \"__none__\" = TODO lead sem nome de campanha/conjunto (diretos, orgânicos e também os de anúncio cujo nome a Meta não deixou ler); para isolar só os de anúncio sem nome, combine com kind=paid_ad.",
27603
+ "description": "SÓ LEITURA. Agregado de origem dos leads/conversas: de qual plataforma, tipo, campanha, conjunto de anúncios e criativo vieram, com totais e taxa de conversão. Janela padrão: últimos 30 dias. Cruza os atributos origin_* das conversas + leads órfãos (contatos sem conversa); 'won' = cards em estágios de ganho do Kanban; leads únicos deduplicados por telefone. Permite drill-down por níveis (plataforma → tipo → campanha → conjunto → criativo). Filtra por caixa (inbox_id) e por responsável (assignee_id) — em conta com mais de uma loja, SEM inbox_id o relatório soma todas as caixas. campaign/adset aceitam o valor especial \"__none__\" = TODO lead sem nome de campanha/conjunto (diretos, orgânicos e também os de anúncio cujo nome a Meta não deixou ler); para isolar só os de anúncio sem nome, combine com kind=paid_ad. 'VEIO DE ANUNCIO PAGO?' (25/10/2026): o filtro `paid` e a quebra `by_paid` juntam o clique no anuncio (kind paid_ad) e o formulario do anuncio (kind lead_form). Para 'quantos leads vieram de anuncio?' use by_paid ou paid=paid — somar so kind=paid_ad esquece os de formulario.",
27420
27604
  "category": "Relatorios",
27421
27605
  "params": [
27422
27606
  {
@@ -27452,7 +27636,14 @@
27452
27636
  "type": "string",
27453
27637
  "location": "query",
27454
27638
  "required": false,
27455
- "description": "Filtra por tipo de origem"
27639
+ "description": "Filtra por tipo de origem Valores: paid_ad (no painel 'Anuncio (clique)'), lead_form ('Anuncio (formulario)'), organic, direct, referral, agendamento, formulario, manual. Para 'veio de anuncio' (clique + formulario) use `paid`."
27640
+ },
27641
+ {
27642
+ "name": "paid",
27643
+ "type": "string",
27644
+ "location": "query",
27645
+ "required": false,
27646
+ "description": "Veio de anuncio pago? (25/10/2026). paid = clique no anuncio OU formulario do anuncio; not_paid = organico, direto, indicacao, pagina de agendamento, formulario do site; unknown = origem cadastrada a mao ou tipo desconhecido (nunca tratado como pago); unclassified = sem origem. Valor fora da lista e ignorado."
27456
27647
  },
27457
27648
  {
27458
27649
  "name": "campaign",
@@ -27490,7 +27681,7 @@
27490
27681
  "description": "Agrupamento do resultado: platform, kind, campaign, adset ou creative"
27491
27682
  }
27492
27683
  ],
27493
- "returns": "{ period, totals: { conversations, classified, unclassified, orphan_leads, unique_leads, won_leads, conversion_rate }, by_platform, by_kind, by_campaign, by_adset, by_creative }",
27684
+ "returns": "{ period, totals: { conversations, classified, unclassified, orphan_leads, unique_leads, won_leads, conversion_rate }, by_platform, by_kind, by_campaign, by_adset, by_creative, by_paid } `by_paid` (25/10/2026): sempre as quatro linhas paid/not_paid/unknown/unclassified, cada uma {value, conversations, won, conversion_rate}, somando o mesmo total do topo.",
27494
27685
  "common_use_cases": [
27495
27686
  "Ver de onde vêm os leads (campanha, anúncio, plataforma)",
27496
27687
  "Medir taxa de conversão por origem",
@@ -28881,7 +29072,7 @@
28881
29072
  "method": "GET",
28882
29073
  "path": "/api/v1/accounts/{account_id}/kanban_items/import_status/{import_id}",
28883
29074
  "title": "Andamento da Importacao",
28884
- "description": "Acompanha a importacao de cards em massa que ja foi enviada. O import_id e o codigo devolvido pela chamada de importacao (lionchat_kanban_items_import) — a importacao roda em segundo plano, entao consulte aqui de tempos em tempos ate o status virar 'completed' ou 'failed'. O registro vive 1 hora: depois disso volta 404 mesmo que a importacao tenha dado certo, entao 404 nao significa fracasso.",
29075
+ "description": "Acompanha a importacao de cards em massa que ja foi enviada. O import_id e o codigo devolvido pela chamada de importacao (lionchat_kanban_items_import) — a importacao roda em segundo plano, entao consulte aqui de tempos em tempos ate o status virar 'completed' ou 'failed'. O registro vive 1 hora: depois disso volta 404 mesmo que a importacao tenha dado certo, entao 404 nao significa fracasso. Quando a importacao ligou campos personalizados (2026-10-23): attributes_applied: true confirma que o servidor aplicou os campos (ausente = servidor antigo, os cards nasceram sem eles), e skipped lista ate 50 valores que NAO entraram ({row, field, message}, motivo no idioma da conta) com o total em skipped_count — o card nasce do mesmo jeito, so aquele valor fica de fora. row e a linha da PLANILHA (cabecalho = 1), tambem em errors.",
28885
29076
  "category": "Itens",
28886
29077
  "params": [
28887
29078
  {
@@ -28899,7 +29090,7 @@
28899
29090
  "description": "Codigo da importacao (UUID) devolvido pela chamada de importacao de cards"
28900
29091
  }
28901
29092
  ],
28902
- "returns": "{ status: 'queued'|'processing'|'completed'|'failed', total, processed, created, contacts_created, contacts_pending_validation, error_count, errors: [...] } — e { error } com 404 se o codigo nao existe ou ja passou de 1 hora",
29093
+ "returns": "{ status: 'queued'|'processing'|'completed'|'failed', total, processed, created, contacts_created, contacts_pending_validation, error_count, errors: [{row, error}], attributes_applied?, skipped_count?, skipped?: [{row, field, message}] } — e { error } com 404 se o codigo nao existe ou ja passou de 1 hora",
28903
29094
  "common_use_cases": [
28904
29095
  "Avisar quando a planilha de cards terminou de subir",
28905
29096
  "Descobrir quantas linhas deram erro e por que",
@@ -28915,7 +29106,7 @@
28915
29106
  "method": "POST",
28916
29107
  "path": "/api/v1/accounts/{account_id}/kanban_items/sales_reconciliation/preview",
28917
29108
  "title": "Conferir planilha de vendas",
28918
- "description": "CONFERE uma planilha de vendas contra os cards de um funil e NAO GRAVA NADA. Devolve, linha a linha, o que aconteceria: completar um card aberto, so atualizar o valor de um card ja ganho, criar card pra quem nao tem, conferir a mao (card marcado como perdido) ou erro da linha. SEMPRE chame isto antes de `lionchat_kanban_sales_reconciliation_apply` e mostre o resumo pra pessoa confirmar. O MCP NAO sobe arquivo: mande as linhas da planilha em `rows` (lista de objetos). Se a pessoa anexar uma planilha na conversa, LEIA o arquivo e monte as linhas voce mesmo. Quem prefere a tela usa Kanban > botao azul + > Importar vendas. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (obrigatorio, valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor) e order_id.",
29109
+ "description": "CONFERE uma planilha de vendas contra os cards de um funil e NAO GRAVA NADA. Devolve, linha a linha, o que aconteceria: completar um card aberto, ja registrada (card ganho igual), venda nova (outro card ganho), criar card pra quem nao tem, conferir a mao (card marcado como perdido) ou erro da linha. Regra por pessoa no funil: card ABERTO (o mais antigo) e completado e marcado ganho com a DATA DA VENDA; sem products, card com 1 produto recebe o valor nesse produto e card com 2 ou mais produtos NAO muda de valor (aviso). Card GANHO nunca e editado: ganho com o MESMO valor e a MESMA data = a mesma venda, nada muda (ja_ganho); senao e uma venda nova e nasce OUTRO card ja ganho (nova_venda, so com criar_sem_card: true). So card perdido = conferir a mao. Ninguem com card = cria (so com criar_sem_card: true). SEMPRE chame isto antes de `lionchat_kanban_sales_reconciliation_apply` e mostre o resumo pra pessoa confirmar. O MCP NAO sobe arquivo: mande as linhas da planilha em `rows` (lista de objetos). Se a pessoa anexar uma planilha na conversa, LEIA o arquivo e monte as linhas voce mesmo. Quem prefere a tela usa Kanban > botao azul + > Importar vendas (o mesmo menu tem 'Baixar modelo de vendas', planilha de exemplo em Excel). Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'; obrigatorio, MENOS quando vier products), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor), order_id, co_participant e products (30/10). products e TEXTO no formato 'Nome:valor; Nome:valor' (ex.: 'Plano Pro:1200; Instalação:300'), ate 20 por linha; o nome e casado com o catalogo de produtos da conta (sem diferenca de maiuscula/acento) e o que nao esta no catalogo entra SO no card, como produto avulso (a conferencia avisa). Com products, os produtos do card sao TROCADOS pelos da planilha e o valor vira a SOMA; se value tambem vier e nao bater, valem os produtos (aviso). Lista ou objeto em products = erro da linha (mande texto).",
28919
29110
  "category": "Itens",
28920
29111
  "params": [
28921
29112
  {
@@ -28944,10 +29135,10 @@
28944
29135
  "type": "array",
28945
29136
  "location": "body",
28946
29137
  "required": true,
28947
- "description": "Linhas da planilha. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (obrigatorio, valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor) e order_id."
29138
+ "description": "Linhas da planilha. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'; obrigatorio, MENOS quando vier products), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor), order_id, co_participant e products (30/10). products e TEXTO no formato 'Nome:valor; Nome:valor' (ex.: 'Plano Pro:1200; Instalação:300'), ate 20 por linha; o nome e casado com o catalogo de produtos da conta (sem diferenca de maiuscula/acento) e o que nao esta no catalogo entra SO no card, como produto avulso (a conferencia avisa). Com products, os produtos do card sao TROCADOS pelos da planilha e o valor vira a SOMA; se value tambem vier e nao bater, valem os produtos (aviso). Lista ou objeto em products = erro da linha (mande texto)."
28948
29139
  }
28949
29140
  ],
28950
- "returns": "{ total, erros, conversoes, conversao_ligada, pos_venda, automacoes_de_ganho, responsavel, contagem: { completa, ja_ganho, cria, conferir, erro }, linhas: [...] } — nada e gravado.",
29141
+ "returns": "{ total, erros, conversoes, conversao_ligada, pos_venda, automacoes_de_ganho, responsavel, contagem: { completa, ja_ganho, nova_venda, cria, conferir, erro }, linhas: [...] } — cada linha traz tipo, valor final e, quando houver, produtos ([{nome, valor, do_catalogo}] = os produtos que o card vai ter) e avisos (produto fora do catalogo, nome repetido no catalogo, diferenca entre value e a soma dos produtos, card com varios produtos que nao muda de valor). Nada e gravado.",
28951
29142
  "common_use_cases": [
28952
29143
  "Conferir a planilha do financeiro antes de aplicar",
28953
29144
  "Saber quantas vendas viram conversao e quantos cards de pos-venda nascem",
@@ -28964,7 +29155,7 @@
28964
29155
  "method": "POST",
28965
29156
  "path": "/api/v1/accounts/{account_id}/kanban_items/sales_reconciliation/apply",
28966
29157
  "title": "Aplicar planilha de vendas",
28967
- "description": "APLICA a planilha de vendas: grava o valor no card e marca o GANHO com a DATA DA VENDA (nao com a data de hoje), pra o relatorio de faturamento contar a venda no mes certo. Card aberto e completado; card ja ganho recebe SO o valor (a data do ganho dele nao muda); card marcado como perdido nao e tocado. Roda em segundo plano — acompanhe com `lionchat_kanban_sales_reconciliation_status`. Rodar a mesma planilha duas vezes nao dobra valor nem cria card repetido. ATENCAO: `criar_sem_card: true` abre uma CONVERSA nova por card criado, e conversa nova aciona o que a conta tiver em 'Conversa criada' (automacao, fluxo, notificacao) — avise a pessoa antes de ligar isso numa planilha grande. O MCP NAO sobe arquivo: mande as linhas da planilha em `rows` (lista de objetos). Se a pessoa anexar uma planilha na conversa, LEIA o arquivo e monte as linhas voce mesmo. Quem prefere a tela usa Kanban > botao azul + > Importar vendas. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (obrigatorio, valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor) e order_id.",
29158
+ "description": "APLICA a planilha de vendas: grava o valor (e os produtos, se vierem) no card e marca o GANHO com a DATA DA VENDA (nao com a data de hoje), pra o relatorio de faturamento contar a venda no mes certo. Regra por pessoa no funil: card ABERTO (o mais antigo) e completado e marcado ganho com a DATA DA VENDA; sem products, card com 1 produto recebe o valor nesse produto e card com 2 ou mais produtos NAO muda de valor (aviso). Card GANHO nunca e editado: ganho com o MESMO valor e a MESMA data = a mesma venda, nada muda (ja_ganho); senao e uma venda nova e nasce OUTRO card ja ganho (nova_venda, so com criar_sem_card: true). So card perdido = conferir a mao. Ninguem com card = cria (so com criar_sem_card: true). A gravacao segue EXATAMENTE a mesma regra da conferencia. Roda em segundo plano — acompanhe com `lionchat_kanban_sales_reconciliation_status`. Rodar a mesma planilha duas vezes nao dobra valor nem cria card repetido (a 2a rodada da 'ja registrada'). ATENCAO: `criar_sem_card: true` abre uma CONVERSA nova por card criado (inclusive na venda nova de quem ja ganhou), e conversa nova aciona o que a conta tiver em 'Conversa criada' (automacao, fluxo, notificacao) — avise a pessoa antes de ligar isso numa planilha grande. O MCP NAO sobe arquivo: mande as linhas da planilha em `rows` (lista de objetos). Se a pessoa anexar uma planilha na conversa, LEIA o arquivo e monte as linhas voce mesmo. Quem prefere a tela usa Kanban > botao azul + > Importar vendas. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'; obrigatorio, MENOS quando vier products), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor), order_id, co_participant e products (30/10). products e TEXTO no formato 'Nome:valor; Nome:valor' (ex.: 'Plano Pro:1200; Instalação:300'), ate 20 por linha; o nome e casado com o catalogo de produtos da conta (sem diferenca de maiuscula/acento) e o que nao esta no catalogo entra SO no card, como produto avulso (a conferencia avisa). Com products, os produtos do card sao TROCADOS pelos da planilha e o valor vira a SOMA; se value tambem vier e nao bater, valem os produtos (aviso). Lista ou objeto em products = erro da linha (mande texto).",
28968
29159
  "category": "Itens",
28969
29160
  "params": [
28970
29161
  {
@@ -28993,7 +29184,7 @@
28993
29184
  "type": "array",
28994
29185
  "location": "body",
28995
29186
  "required": true,
28996
- "description": "Linhas da planilha. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (obrigatorio, valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor) e order_id."
29187
+ "description": "Linhas da planilha. Cada item aceita: phone (obrigatorio, COM codigo do pais, ex.: 5511999887766), value (valor da venda; aceita 1500, '1500,00', 'R$ 1.500,00'; obrigatorio, MENOS quando vier products), sale_date (obrigatorio, data da VENDA; aceita '01/08/2026' ou '2026-08-01'), name, email, agent (nome ou e-mail do vendedor), order_id, co_participant e products (30/10). products e TEXTO no formato 'Nome:valor; Nome:valor' (ex.: 'Plano Pro:1200; Instalação:300'), ate 20 por linha; o nome e casado com o catalogo de produtos da conta (sem diferenca de maiuscula/acento) e o que nao esta no catalogo entra SO no card, como produto avulso (a conferencia avisa). Com products, os produtos do card sao TROCADOS pelos da planilha e o valor vira a SOMA; se value tambem vier e nao bater, valem os produtos (aviso). Lista ou objeto em products = erro da linha (mande texto)."
28997
29188
  },
28998
29189
  {
28999
29190
  "name": "criar_sem_card",
@@ -29044,7 +29235,7 @@
29044
29235
  "description": "Codigo da rodada, devolvido pela aplicacao"
29045
29236
  }
29046
29237
  ],
29047
- "returns": "{ status, total, completados, valor_atualizado, criados, sem_mudanca, pulados, erros } — 'sem_mudanca' e a linha cujo card ja estava com aquele valor",
29238
+ "returns": "{ status, total, completados, criados, sem_mudanca, pulados, erros, co_participantes } — 'sem_mudanca' e a linha ja registrada (card ganho com o mesmo valor e a mesma data); 'criados' inclui a venda nova de quem ja tinha card ganho; 'pulados' e a linha que precisaria criar card com criar_sem_card desligado. Desde 30/10 nao existe mais 'valor_atualizado' (card ganho nunca e editado).",
29048
29239
  "common_use_cases": [
29049
29240
  "Saber se a planilha terminou de ser aplicada",
29050
29241
  "Contar quantos cards foram completados e quantos foram criados"
@@ -29054,6 +29245,310 @@
29054
29245
  "lionchat_kanban_sales_reconciliation_preview"
29055
29246
  ]
29056
29247
  },
29248
+ {
29249
+ "id": "lionchat_kanban_ai_analyses_setup",
29250
+ "method": "GET",
29251
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses/setup",
29252
+ "title": "Preparar análise do funil com IA",
29253
+ "description": "Mostra o que a janela \"Analisar com IA\" do Kanban mostra, SEM criar nada: as etapas do funil com quantos cards abertos e adiados cada uma tem (e se a etapa tem descrição), `selection` (quantos cards entram com as etapas, o filtro e a quantidade pedidos: `limit` = quantos a IA vai ler, padrão 200, até `max_limit` 1.000; `over_limit`; `already_read` = quantos vão ser PULADOS por a IA ter lido nos últimos `read_days` (7) dias sem fala nova do cliente, 1001 = mais de 1.000; `estimated_cost_usd` e `estimated_minutes`), os dias de \"parados\" aceitos (7, 14, 30), os funis de destino que a pessoa vê (com as etapas), as etiquetas com descrição, quantos motivos de ganho/perda a conta tem, `has_openai_key` e `latest_run` (a análise viva do funil: analisando, ou lista pronta/aplicando dentro das 24 h). Chame ANTES de `lionchat_kanban_ai_analyses_create` e mostre ao usuário as etapas, o total de cards, o custo e o tempo estimados e, se `already_read` > 0, que esses cards vão ser pulados (`filters_include_read: true` lê de novo). `total` 0 com `already_read` > 0 = todos já foram lidos. Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29254
+ "category": "Itens",
29255
+ "params": [
29256
+ {
29257
+ "name": "account_id",
29258
+ "type": "integer",
29259
+ "location": "path",
29260
+ "required": true,
29261
+ "description": "ID da conta"
29262
+ },
29263
+ {
29264
+ "name": "funnel_id",
29265
+ "type": "integer",
29266
+ "location": "query",
29267
+ "required": true,
29268
+ "description": "ID do funil"
29269
+ },
29270
+ {
29271
+ "name": "stages",
29272
+ "type": "array",
29273
+ "location": "query",
29274
+ "required": false,
29275
+ "query_name": "stages[]",
29276
+ "description": "Chaves (slugs) das etapas, para calcular o total de cards e o custo. Ex.: [\"novo\", \"proposta\"]"
29277
+ },
29278
+ {
29279
+ "name": "filters_stale_days",
29280
+ "type": "integer",
29281
+ "location": "query",
29282
+ "required": false,
29283
+ "query_name": "filters[stale_days]",
29284
+ "description": "Só os cards parados na etapa há N dias: 7, 14 ou 30"
29285
+ },
29286
+ {
29287
+ "name": "filters_no_reply_days",
29288
+ "type": "integer",
29289
+ "location": "query",
29290
+ "required": false,
29291
+ "query_name": "filters[no_reply_days]",
29292
+ "description": "Só os cards sem resposta do cliente há N dias (1 a 365)"
29293
+ },
29294
+ {
29295
+ "name": "filters_limit",
29296
+ "type": "integer",
29297
+ "location": "query",
29298
+ "required": false,
29299
+ "query_name": "filters[limit]",
29300
+ "description": "Quantos cards a IA vai ler, de 1 a 1.000 (padrão 200); fora disso vale o mais perto. Os parados há mais tempo primeiro"
29301
+ },
29302
+ {
29303
+ "name": "filters_include_read",
29304
+ "type": "boolean",
29305
+ "location": "query",
29306
+ "required": false,
29307
+ "query_name": "filters[include_read]",
29308
+ "description": "true = ler de novo os cards que a IA já leu nos últimos 7 dias (gasta crédito de novo). Sem isso eles são PULADOS, a não ser que o cliente tenha escrito depois da leitura"
29309
+ }
29310
+ ],
29311
+ "returns": "{ funnel: { id, name, description_present }, stages: [{ key, name, description_present, count }], selection: { stages, filters, total, limit, max_limit, over_limit, analyzed, already_read, read_days, exact_total, estimated_cost_usd, estimated_minutes }, stale_days_options, target_funnels: [{ id, name, stages: [{ key, name }] }], labels: [{ id, title, description, description_present }], reasons: { won, lost }, has_openai_key, latest_run }",
29312
+ "common_use_cases": [
29313
+ "Saber quantos cards abertos cada etapa tem antes de analisar",
29314
+ "Mostrar ao usuário o custo estimado da análise",
29315
+ "Descobrir se o funil já tem uma análise rodando ou uma lista pronta",
29316
+ "Saber quantos cards vão ser pulados por já terem sido lidos pela IA"
29317
+ ],
29318
+ "related_tools": [
29319
+ "lionchat_kanban_ai_analyses_create",
29320
+ "lionchat_kanban_ai_analyses_show",
29321
+ "lionchat_kanban_ai_analyses_items",
29322
+ "lionchat_kanban_ai_analyses_apply",
29323
+ "lionchat_kanban_ai_analyses_reanalyze"
29324
+ ]
29325
+ },
29326
+ {
29327
+ "id": "lionchat_kanban_ai_analyses_create",
29328
+ "method": "POST",
29329
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses",
29330
+ "title": "Analisar funil com IA",
29331
+ "description": "Cria a análise do \"Analisar com IA\": a IA (modelo de decisões da OpenAI, com a chave DA CONTA) lê os cards ABERTOS e ADIADOS das etapas escolhidas, com as conversas, e sugere mudar de etapa (também para trás), levar para outro funil, pôr/tirar etiqueta e marcar ganho/perdido. NÃO muda nenhum card: só monta a lista de sugestões. Até `filters.limit` cards somando as etapas (1 a 1.000, padrão 200; os parados há mais tempo primeiro), escolhidos NESTA chamada, PULANDO os que a IA leu nos últimos 7 dias sem fala nova do cliente (`filters.include_read: true` lê de novo e gasta crédito de novo). Roda em segundo plano: depois chame `lionchat_kanban_ai_analyses_show` a cada 5 a 10 segundos até `status = ready`. Uma análise por vez por funil (409 `funnel_busy`) e no máximo duas por conta (`account_busy`); criar uma nova SUBSTITUI a lista anterior do mesmo funil que tiver etapa em comum. Antes de criar, mostre ao usuário o total e o custo estimado do `lionchat_kanban_ai_analyses_setup`. Outras recusas: `no_openai_key`, `no_cards` (também quando todos os cards já foram lidos: mande `include_read: true` para ler de novo), `invalid_stage`, `invalid_options`, `feature_disabled`. Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29332
+ "category": "Itens",
29333
+ "params": [
29334
+ {
29335
+ "name": "account_id",
29336
+ "type": "integer",
29337
+ "location": "path",
29338
+ "required": true,
29339
+ "description": "ID da conta"
29340
+ },
29341
+ {
29342
+ "name": "funnel_id",
29343
+ "type": "integer",
29344
+ "location": "body",
29345
+ "required": true,
29346
+ "description": "ID do funil"
29347
+ },
29348
+ {
29349
+ "name": "stages",
29350
+ "type": "array",
29351
+ "location": "body",
29352
+ "required": true,
29353
+ "description": "Chaves (slugs) das etapas a analisar (uma ou mais). Ex.: [\"novo\", \"proposta\"]"
29354
+ },
29355
+ {
29356
+ "name": "filters",
29357
+ "type": "object",
29358
+ "location": "body",
29359
+ "required": false,
29360
+ "description": "Quais cards: omitir = todos os abertos e adiados; { \"stale_days\": 7 } (7, 14 ou 30) = só os parados na etapa há N dias; { \"no_reply_days\": 10 } (1 a 365) = só os sem resposta do cliente há N dias; { \"limit\": 500 } = quantos cards ler (1 a 1.000, padrão 200); { \"include_read\": true } = ler de novo os já lidos nos últimos 7 dias. `limit` e `include_read` se combinam com os outros"
29361
+ },
29362
+ {
29363
+ "name": "options",
29364
+ "type": "object",
29365
+ "location": "body",
29366
+ "required": true,
29367
+ "description": "O que a IA pode sugerir (pelo menos um): { \"move_stage\": true (mudar de etapa neste funil), \"outcome\": true (ganho/perdido), \"move_funnel\": true + \"target_funnels\": { \"<id do funil>\": \"<chave da etapa de chegada>\" } (só funis ativos que a pessoa vê), \"labels_add\": [títulos das etiquetas que pode PÔR], \"labels_remove\": [títulos das que pode TIRAR] }"
29368
+ }
29369
+ ],
29370
+ "returns": "{ id, funnel_id, stages, status (analyzing|ready|applying|finished|expired|superseded|failed), user_id, options, filters, selected_count, analyzed_count, suggested_count, skipped_count, failed_count, processed_count, input_tokens, llm_calls, cost_usd, error_code, expires_at, created_at, finished_at, apply: { requested, done, pending, returned } } — nasce com status analyzing",
29371
+ "common_use_cases": [
29372
+ "Revisar de uma vez os cards parados de uma ou mais etapas",
29373
+ "Achar leads que já deviam estar em outra etapa ou já são perdidos",
29374
+ "Sugerir etiquetas pela conversa de cada card"
29375
+ ],
29376
+ "related_tools": [
29377
+ "lionchat_kanban_ai_analyses_setup",
29378
+ "lionchat_kanban_ai_analyses_show",
29379
+ "lionchat_kanban_ai_analyses_items",
29380
+ "lionchat_kanban_ai_analyses_apply",
29381
+ "lionchat_kanban_ai_analyses_reanalyze"
29382
+ ]
29383
+ },
29384
+ {
29385
+ "id": "lionchat_kanban_ai_analyses_show",
29386
+ "method": "GET",
29387
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses/{id}",
29388
+ "title": "Andamento da análise com IA",
29389
+ "description": "Andamento de uma análise do \"Analisar com IA\": `status`, quantos cards já foram analisados, quantos têm sugestão, tokens e custo (`cost_usd`) e, depois de aplicar, o progresso em `apply`. Chame a cada 5 a 10 segundos: depois do create até `ready` (ou `failed`), e depois do apply até `finished`. `error_code` de análise que não terminou: `no_openai_key`, `openai_rejected` (a OpenAI recusou a chave da conta), `nothing_analyzed`, `interrupted` (parou no meio; crie outra). A lista vale 24 h (`expires_at`): depois vira `expired`; uma análise nova do funil com etapa em comum a deixa `superseded`. Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29390
+ "category": "Itens",
29391
+ "params": [
29392
+ {
29393
+ "name": "account_id",
29394
+ "type": "integer",
29395
+ "location": "path",
29396
+ "required": true,
29397
+ "description": "ID da conta"
29398
+ },
29399
+ {
29400
+ "name": "id",
29401
+ "type": "integer",
29402
+ "location": "path",
29403
+ "required": true,
29404
+ "description": "ID da análise (o `id` devolvido pelo create)"
29405
+ }
29406
+ ],
29407
+ "returns": "{ id, funnel_id, stages, status (analyzing|ready|applying|finished|expired|superseded|failed), user_id, options, filters, selected_count, analyzed_count, suggested_count, skipped_count, failed_count, processed_count, input_tokens, llm_calls, cost_usd, error_code, expires_at, created_at, finished_at, apply: { requested, done, pending, returned } }",
29408
+ "common_use_cases": [
29409
+ "Esperar a análise ficar pronta",
29410
+ "Acompanhar a aplicação até terminar",
29411
+ "Ver quanto a análise custou"
29412
+ ],
29413
+ "related_tools": [
29414
+ "lionchat_kanban_ai_analyses_setup",
29415
+ "lionchat_kanban_ai_analyses_create",
29416
+ "lionchat_kanban_ai_analyses_items",
29417
+ "lionchat_kanban_ai_analyses_apply",
29418
+ "lionchat_kanban_ai_analyses_reanalyze"
29419
+ ]
29420
+ },
29421
+ {
29422
+ "id": "lionchat_kanban_ai_analyses_items",
29423
+ "method": "GET",
29424
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses/{id}/items",
29425
+ "title": "Sugestões da análise com IA",
29426
+ "description": "A lista de sugestões de uma análise pronta (422 `list_analyzing` antes). Vem uma linha por card QUE TEM sugestão (ou que voltou ou foi aplicado); o resto é contado em `counts` (`no_change` = lidos sem motivo para mudar). Cada sugestão traz `id` (o que vai no apply: `stage`, `funnel`, `outcome`, `label_add:...`, `label_remove:...`), `kind`, `value`, `label`, `force` (`high` = Alta, confiança >= 70%; `medium` = Média, 50 a 70%), `checked` (vem marcada: Alta de etapa, funil e perdido; ganho, Média e etiqueta vêm desmarcadas, com o motivo em `unchecked_reason`) e o que a ação dispara (`hints`: conversão, regras do funil, fluxos). Linha com `locked` (`client_wrote` = o cliente escreveu depois da análise; `card_changed` = o card mudou) NÃO deve ser aplicada: use `lionchat_kanban_ai_analyses_reanalyze`. `return_code` = voltou para a lista: `interrupted`, `card_busy` e `apply_failed` podem ser aplicadas de novo; `agent_no_access` = o responsável não acessa o funil de destino. Mostre as sugestões ao usuário agrupadas por etapa, com a força e o motivo. Com `no_change: true` vem também `no_change_items`: os cards lidos e deixados como estão, cada um com `lines` (`kind` stage, funnel, outcome ou label + `state`: `same` = confirmou o que já está, `doubt` = as duas ordens discordaram, `weak` = abaixo de 50%, `other_funnel`, `not_chosen`, `no_answer`; na etiqueta `add_no` e `remove_keeps`; `confidence` e `probability` em %). `lines: null` = análise antiga, sem detalhes. Use para responder \"por que a IA não mudou nada?\". Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29427
+ "category": "Itens",
29428
+ "params": [
29429
+ {
29430
+ "name": "account_id",
29431
+ "type": "integer",
29432
+ "location": "path",
29433
+ "required": true,
29434
+ "description": "ID da conta"
29435
+ },
29436
+ {
29437
+ "name": "id",
29438
+ "type": "integer",
29439
+ "location": "path",
29440
+ "required": true,
29441
+ "description": "ID da análise (o `id` devolvido pelo create)"
29442
+ },
29443
+ {
29444
+ "name": "no_change",
29445
+ "type": "boolean",
29446
+ "location": "query",
29447
+ "required": false,
29448
+ "description": "true = traz também `no_change_items`: os cards que a IA leu e deixou como estão, com o porquê (a lista \"Ficaram como estão\" da tela). Peça só quando for mostrar essa lista"
29449
+ }
29450
+ ],
29451
+ "returns": "{ id, funnel_id, stages, status (analyzing|ready|applying|finished|expired|superseded|failed), user_id, options, filters, selected_count, analyzed_count, suggested_count, skipped_count, failed_count, processed_count, input_tokens, llm_calls, cost_usd, error_code, expires_at, created_at, finished_at, apply: { requested, done, pending, returned } } + items: [{ id (item_id do apply), kanban_item_id, stage, card: { title, value, current_stage, status, contact_name, conversation_display_id, linked_display_ids, whatsapp_qr }, days_without_reply, suggestions: [...], locked, return_code, requested, requested_actions, done, apply_code, applied_actions }], counts: { analyzed, no_change, with_suggestion, by_analysis_code, ... } + no_change_items (só com no_change=true): [{ id, kanban_item_id, position, title, stage, stage_label, lines: [{ kind, state, value, confidence, other_value, other_confidence, funnel, label, probability, conversation_index, total }] | null }]",
29452
+ "common_use_cases": [
29453
+ "Mostrar ao usuário o que a IA sugeriu",
29454
+ "Saber quais cards voltaram ou travaram",
29455
+ "Conferir o que foi aplicado",
29456
+ "Explicar por que a IA deixou um card como está"
29457
+ ],
29458
+ "related_tools": [
29459
+ "lionchat_kanban_ai_analyses_setup",
29460
+ "lionchat_kanban_ai_analyses_create",
29461
+ "lionchat_kanban_ai_analyses_show",
29462
+ "lionchat_kanban_ai_analyses_apply",
29463
+ "lionchat_kanban_ai_analyses_reanalyze"
29464
+ ]
29465
+ },
29466
+ {
29467
+ "id": "lionchat_kanban_ai_analyses_apply",
29468
+ "method": "POST",
29469
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses/{id}/apply",
29470
+ "title": "Aplicar sugestões da análise com IA",
29471
+ "description": "Aplica as sugestões ESCOLHIDAS pelo usuário de uma lista pronta. NÃO TEM COMO DESFAZER: fica como se uma pessoa tivesse feito à mão, e as automações, os fluxos e as conversões do funil disparam normalmente. ANTES de chamar, confirme com o usuário quais cards e quais ações, quantas mudanças em quantos cards, e diga que não volta; só então reenvie com `confirm: true`. Mande em `items` o `id` de cada linha (de `lionchat_kanban_ai_analyses_items`) com os `id` das sugestões escolhidas daquela linha. Ação que não foi sugerida para o item, linha travada ou já pedida volta em `ignored` com o motivo (`not_found`, `already_requested`, `locked`, `invalid_actions`). Roda em segundo plano: depois chame `lionchat_kanban_ai_analyses_show` até `finished` e `lionchat_kanban_ai_analyses_items` para ver `done`/`apply_code`/`return_code` de cada card. Lista vencida, substituída ou terminada é recusada (`list_expired`, `list_superseded`, `list_finished`). Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29472
+ "category": "Itens",
29473
+ "confirm_required": true,
29474
+ "params": [
29475
+ {
29476
+ "name": "account_id",
29477
+ "type": "integer",
29478
+ "location": "path",
29479
+ "required": true,
29480
+ "description": "ID da conta"
29481
+ },
29482
+ {
29483
+ "name": "id",
29484
+ "type": "integer",
29485
+ "location": "path",
29486
+ "required": true,
29487
+ "description": "ID da análise (o `id` devolvido pelo create)"
29488
+ },
29489
+ {
29490
+ "name": "items",
29491
+ "type": "array",
29492
+ "location": "body",
29493
+ "required": true,
29494
+ "description": "Lista de { \"item_id\": <id da linha>, \"actions\": [\"stage\", \"outcome\", ...] } — os `id` das sugestões daquela linha que o usuário escolheu"
29495
+ }
29496
+ ],
29497
+ "returns": "{ accepted: [item_id, ...], ignored: [{ item_id, reason }], run: { id, funnel_id, stages, status (analyzing|ready|applying|finished|expired|superseded|failed), user_id, options, filters, selected_count, analyzed_count, suggested_count, skipped_count, failed_count, processed_count, input_tokens, llm_calls, cost_usd, error_code, expires_at, created_at, finished_at, apply: { requested, done, pending, returned } } }",
29498
+ "common_use_cases": [
29499
+ "Aplicar as sugestões que o usuário aprovou",
29500
+ "Aplicar só um card da lista"
29501
+ ],
29502
+ "related_tools": [
29503
+ "lionchat_kanban_ai_analyses_setup",
29504
+ "lionchat_kanban_ai_analyses_create",
29505
+ "lionchat_kanban_ai_analyses_show",
29506
+ "lionchat_kanban_ai_analyses_items",
29507
+ "lionchat_kanban_ai_analyses_reanalyze"
29508
+ ]
29509
+ },
29510
+ {
29511
+ "id": "lionchat_kanban_ai_analyses_reanalyze",
29512
+ "method": "POST",
29513
+ "path": "/api/v1/accounts/{account_id}/kanban_ai_analyses/{id}/reanalyze",
29514
+ "title": "Reanalisar um card da análise com IA",
29515
+ "description": "Analisa de novo UM card de uma lista ainda válida — use quando a linha veio travada (`locked`: o cliente escreveu ou o card mudou depois da análise). Custa uma chamada à IA. Um card por vez por lista: com outro sendo reanalisado volta 409 `reanalyze_wait` (espere e tente de novo). Card já pedido ou aplicado = 422 `reanalyze_not_allowed`; 503 `reanalyze_unavailable` = tente em instantes. Responde `{ item_id, status: \"queued\" }`: depois de alguns segundos chame `lionchat_kanban_ai_analyses_items` de novo para ver a sugestão nova. Quem pode: administrador ou cargo com a permissão `kanban_ai_analyze` (\"Analisar funil com IA\"), com o recurso de plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404 `funnel_not_visible`.",
29516
+ "category": "Itens",
29517
+ "params": [
29518
+ {
29519
+ "name": "account_id",
29520
+ "type": "integer",
29521
+ "location": "path",
29522
+ "required": true,
29523
+ "description": "ID da conta"
29524
+ },
29525
+ {
29526
+ "name": "id",
29527
+ "type": "integer",
29528
+ "location": "path",
29529
+ "required": true,
29530
+ "description": "ID da análise (o `id` devolvido pelo create)"
29531
+ },
29532
+ {
29533
+ "name": "item_id",
29534
+ "type": "integer",
29535
+ "location": "body",
29536
+ "required": true,
29537
+ "description": "O `id` da linha (de `lionchat_kanban_ai_analyses_items`), não o id do card"
29538
+ }
29539
+ ],
29540
+ "returns": "{ item_id, status: \"queued\" }",
29541
+ "common_use_cases": [
29542
+ "Atualizar a sugestão de um card em que o cliente escreveu depois da análise"
29543
+ ],
29544
+ "related_tools": [
29545
+ "lionchat_kanban_ai_analyses_setup",
29546
+ "lionchat_kanban_ai_analyses_create",
29547
+ "lionchat_kanban_ai_analyses_show",
29548
+ "lionchat_kanban_ai_analyses_items",
29549
+ "lionchat_kanban_ai_analyses_apply"
29550
+ ]
29551
+ },
29057
29552
  {
29058
29553
  "id": "lionchat_search_kanban_items",
29059
29554
  "method": "GET",
@@ -29684,7 +30179,7 @@
29684
30179
  "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.",
29685
30180
  "category": "Assistentes",
29686
30181
  "params": [],
29687
- "returns": "{ payload: [agente de ligacao], meta: { dial_inboxes: [{id, name}] } }",
30182
+ "returns": "{ payload: [agente de ligacao { id, name, objective, first_message, style, voice_provider, engine, voice_id, elevenlabs_agent_id, max_duration_seconds, captain_assistant_id, captain_assistant_name, sip_ramal, sip_server, sip_port, max_concurrent_calls, new_conversation_inbox_id, has_sip_password }], meta: { dial_inboxes: [{id, name}] } }",
29688
30183
  "common_use_cases": [
29689
30184
  "Ver agentes de ligacao configurados",
29690
30185
  "Descobrir qual caixa pode ligar"
@@ -29712,7 +30207,7 @@
29712
30207
  "description": "ID do agente de ligacao"
29713
30208
  }
29714
30209
  ],
29715
- "returns": "agente de ligacao { id, name, objective, first_message, style, voice_provider, engine, voice_id, elevenlabs_agent_id, max_duration_seconds, captain_assistant_id, captain_assistant_name }",
30210
+ "returns": "agente de ligacao { id, name, objective, first_message, style, voice_provider, engine, voice_id, elevenlabs_agent_id, max_duration_seconds, captain_assistant_id, captain_assistant_name, sip_ramal, sip_server, sip_port, max_concurrent_calls, new_conversation_inbox_id, has_sip_password }",
29716
30211
  "common_use_cases": [
29717
30212
  "Conferir a configuracao antes de editar"
29718
30213
  ],
@@ -29720,7 +30215,8 @@
29720
30215
  "lionchat_captain_call_agents_list",
29721
30216
  "lionchat_captain_call_agents_update",
29722
30217
  "lionchat_captain_call_agents_test_call",
29723
- "lionchat_captain_call_test_phones_list"
30218
+ "lionchat_captain_call_test_phones_list",
30219
+ "lionchat_captain_call_agents_ramal_status"
29724
30220
  ]
29725
30221
  },
29726
30222
  {
@@ -29728,7 +30224,7 @@
29728
30224
  "method": "POST",
29729
30225
  "path": "/api/v1/accounts/{account_id}/captain/call_agents",
29730
30226
  "title": "Criar Agente de Ligacao",
29731
- "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. Campos em body (pode mandar solto ou dentro de call_agent). Durante a ligacao a voz so CONSULTA agenda e REPASSA pedidos; quem executa e o agente de texto de captain_assistant_id.",
30227
+ "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. Campos em body (pode mandar solto ou dentro de call_agent). Durante a ligacao a voz so CONSULTA agenda e REPASSA pedidos; quem executa e o agente de texto de captain_assistant_id. Com ramal VTCall (sip_ramal + sip_server) o agente LIGA POR TELEFONE; sem ramal, a ligacao sai pelo WhatsApp Calling. A senha do ramal nunca entra pelo MCP — so pela tela.",
29732
30228
  "category": "Assistentes",
29733
30229
  "params": [
29734
30230
  {
@@ -29800,6 +30296,41 @@
29800
30296
  "location": "body",
29801
30297
  "required": false,
29802
30298
  "description": "Agente de TEXTO que EXECUTA durante a ligacao o que o cliente pedir (mandar link no WhatsApp, mover card, anotar), com as ferramentas e a configuracao DELE. Sem ele a voz so conversa. Tem de ser desta conta (422 se nao for)."
30299
+ },
30300
+ {
30301
+ "name": "sip_ramal",
30302
+ "type": "string",
30303
+ "location": "body",
30304
+ "required": false,
30305
+ "description": "Numero do ramal VTCall. Com ele preenchido, este agente LIGA POR TELEFONE (nao pelo WhatsApp). Exige sip_server junto. A SENHA do ramal (sip_password) NAO entra pelo MCP — so pela tela do painel."
30306
+ },
30307
+ {
30308
+ "name": "sip_server",
30309
+ "type": "string",
30310
+ "location": "body",
30311
+ "required": false,
30312
+ "description": "Servidor SIP do ramal, no formato <algo>.vtcall.app ou <algo>.vtcall.com.br. Exigido junto com sip_ramal."
30313
+ },
30314
+ {
30315
+ "name": "sip_port",
30316
+ "type": "integer",
30317
+ "location": "body",
30318
+ "required": false,
30319
+ "description": "Porta SIP: 5060, 5061, 5068 ou 5080 (lista fechada). Padrao 5060."
30320
+ },
30321
+ {
30322
+ "name": "max_concurrent_calls",
30323
+ "type": "integer",
30324
+ "location": "body",
30325
+ "required": false,
30326
+ "description": "Teto de ligacoes simultaneas por este ramal, 0 a 50 (padrao 1; 0 = nao liga)."
30327
+ },
30328
+ {
30329
+ "name": "new_conversation_inbox_id",
30330
+ "type": "integer",
30331
+ "location": "body",
30332
+ "required": false,
30333
+ "description": "Caixa de entrada onde nasce a conversa de cada ligacao feita por este ramal. Tem de ser desta conta."
29803
30334
  }
29804
30335
  ],
29805
30336
  "returns": "agente de ligacao criado",
@@ -29811,7 +30342,8 @@
29811
30342
  "lionchat_captain_call_agents_list",
29812
30343
  "lionchat_captain_call_agents_update",
29813
30344
  "lionchat_captain_call_agents_test_call",
29814
- "lionchat_captain_call_test_phones_list"
30345
+ "lionchat_captain_call_test_phones_list",
30346
+ "lionchat_captain_call_agents_ramal_status"
29815
30347
  ]
29816
30348
  },
29817
30349
  {
@@ -29819,7 +30351,7 @@
29819
30351
  "method": "PATCH",
29820
30352
  "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}",
29821
30353
  "title": "Atualizar Agente de Ligacao",
29822
- "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. Edicao parcial.",
30354
+ "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. Edicao parcial. Com ramal VTCall (sip_ramal + sip_server) o agente LIGA POR TELEFONE; sem ramal, a ligacao sai pelo WhatsApp Calling. A senha do ramal nunca entra pelo MCP — so pela tela.",
29823
30355
  "category": "Assistentes",
29824
30356
  "params": [
29825
30357
  {
@@ -29898,6 +30430,41 @@
29898
30430
  "location": "body",
29899
30431
  "required": false,
29900
30432
  "description": "Agente de TEXTO que EXECUTA durante a ligacao o que o cliente pedir (mandar link no WhatsApp, mover card, anotar), com as ferramentas e a configuracao DELE. Sem ele a voz so conversa. Tem de ser desta conta (422 se nao for)."
30433
+ },
30434
+ {
30435
+ "name": "sip_ramal",
30436
+ "type": "string",
30437
+ "location": "body",
30438
+ "required": false,
30439
+ "description": "Numero do ramal VTCall. Com ele preenchido, este agente LIGA POR TELEFONE (nao pelo WhatsApp). Exige sip_server junto. A SENHA do ramal (sip_password) NAO entra pelo MCP — so pela tela do painel."
30440
+ },
30441
+ {
30442
+ "name": "sip_server",
30443
+ "type": "string",
30444
+ "location": "body",
30445
+ "required": false,
30446
+ "description": "Servidor SIP do ramal, no formato <algo>.vtcall.app ou <algo>.vtcall.com.br. Exigido junto com sip_ramal."
30447
+ },
30448
+ {
30449
+ "name": "sip_port",
30450
+ "type": "integer",
30451
+ "location": "body",
30452
+ "required": false,
30453
+ "description": "Porta SIP: 5060, 5061, 5068 ou 5080 (lista fechada). Padrao 5060."
30454
+ },
30455
+ {
30456
+ "name": "max_concurrent_calls",
30457
+ "type": "integer",
30458
+ "location": "body",
30459
+ "required": false,
30460
+ "description": "Teto de ligacoes simultaneas por este ramal, 0 a 50 (padrao 1; 0 = nao liga)."
30461
+ },
30462
+ {
30463
+ "name": "new_conversation_inbox_id",
30464
+ "type": "integer",
30465
+ "location": "body",
30466
+ "required": false,
30467
+ "description": "Caixa de entrada onde nasce a conversa de cada ligacao feita por este ramal. Tem de ser desta conta."
29901
30468
  }
29902
30469
  ],
29903
30470
  "returns": "agente de ligacao atualizado",
@@ -29908,7 +30475,8 @@
29908
30475
  "lionchat_captain_call_agents_list",
29909
30476
  "lionchat_captain_call_agents_update",
29910
30477
  "lionchat_captain_call_agents_test_call",
29911
- "lionchat_captain_call_test_phones_list"
30478
+ "lionchat_captain_call_test_phones_list",
30479
+ "lionchat_captain_call_agents_ramal_status"
29912
30480
  ]
29913
30481
  },
29914
30482
  {
@@ -30040,6 +30608,32 @@
30040
30608
  "lionchat_captain_call_test_phones_list"
30041
30609
  ]
30042
30610
  },
30611
+ {
30612
+ "id": "lionchat_captain_call_agents_ramal_status",
30613
+ "method": "GET",
30614
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}/ramal_status",
30615
+ "title": "Estado do Ramal VTCall",
30616
+ "description": "So para agente de ligacao COM ramal (sip_ramal). Le NO MOTOR o estado do cadastro do ramal: aguardando_teste (registrando), comprovado (o ramal conectou), senha_recusada, aguardando_liberacao ou erro. Agente sem ramal devolve estado nulo. A senha nunca aparece — so has_sip_password.",
30617
+ "category": "Assistentes",
30618
+ "params": [
30619
+ {
30620
+ "name": "id",
30621
+ "type": "integer",
30622
+ "location": "path",
30623
+ "required": true,
30624
+ "description": "ID do agente de ligacao"
30625
+ }
30626
+ ],
30627
+ "returns": "{ estado: null|aguardando_teste|comprovado|senha_recusada|aguardando_liberacao|erro, has_sip_password, message }",
30628
+ "common_use_cases": [
30629
+ "Conferir se o ramal VTCall conectou depois de salvar o agente de ligacao"
30630
+ ],
30631
+ "related_tools": [
30632
+ "lionchat_captain_call_agents_show",
30633
+ "lionchat_captain_call_agents_update",
30634
+ "lionchat_captain_call_agents_test_call"
30635
+ ]
30636
+ },
30043
30637
  {
30044
30638
  "id": "lionchat_captain_call_test_phones_list",
30045
30639
  "method": "GET",
@@ -30217,7 +30811,7 @@
30217
30811
  "method": "POST",
30218
30812
  "path": "/api/v1/accounts/{account_id}/captain/media_assets",
30219
30813
  "title": "Adicionar Mídia à Biblioteca",
30220
- "description": "Cadastra um arquivo na Biblioteca de Mídia do AI Agente. ATENÇÃO: o arquivo em si NÃO sobe por aqui — é obrigatório informar `blob_signed_id`, o identificador de um arquivo JÁ carregado no armazenamento pelo upload direto do painel; sem ele o cadastro é recusado (422, arquivo obrigatório). Na prática, criar mídia pelo conector só funciona quando esse identificador já está em mãos — caso contrário, use a tela Biblioteca de Mídia. O `media_kind` precisa casar com o tipo real do arquivo, e só formatos e tamanhos aceitos pelo WhatsApp passam (imagem JPG/PNG/WEBP até 5MB; vídeo MP4/3GP até 16MB; áudio MP3/AAC/M4A/AMR/OGG até 16MB; documento PDF/DOC/DOCX/XLS/XLSX/PPT/PPTX/TXT até 100MB). Depois de criar, ainda é preciso liberar o ID no assistente (config.media_asset_ids) para a IA poder enviar. Exige Admin ou papel com permissão de gerenciar o AI Agente.",
30814
+ "description": "Cadastra um arquivo na Biblioteca de Mídia do AI Agente. ATENÇÃO: o arquivo em si NÃO sobe por aqui — é obrigatório informar `blob_signed_id`, o identificador de um arquivo JÁ carregado no armazenamento; sem ele o cadastro é recusado (422, arquivo obrigatório). Pelo conector: suba o arquivo por link com `lionchat_upload_create` (`external_url`) e use o `blob_id` devolvido como `blob_signed_id`. O `media_kind` precisa casar com o tipo real do arquivo, e só formatos e tamanhos aceitos pelo WhatsApp passam (imagem JPG/PNG/WEBP até 5MB; vídeo MP4/3GP até 16MB; áudio MP3/AAC/M4A/AMR/OGG até 16MB; documento PDF/DOC/DOCX/XLS/XLSX/PPT/PPTX/TXT até 100MB). Depois de criar, ainda é preciso liberar o ID no assistente (config.media_asset_ids) para a IA poder enviar. Exige Admin ou papel com permissão de gerenciar o AI Agente.",
30221
30815
  "category": "Biblioteca de Midia",
30222
30816
  "params": [
30223
30817
  {
@@ -32447,7 +33041,7 @@
32447
33041
  "method": "GET",
32448
33042
  "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/media_library",
32449
33043
  "title": "Biblioteca de Mídia dos Modelos (caixa oficial)",
32450
- "description": "SÓ LEITURA. Lista os arquivos de mídia de modelo JÁ anexados nesta caixa WhatsApp Cloud (tudo que já subiu por upload_media/upload_header_media), pra reaproveitar como mídia padrão de cabeçalho sem subir de novo — o MCP não faz upload de arquivo, então esta é a ÚNICA forma de obter uma url NOSSA aceita por lionchat_inboxes_whatsapp_templates_header_media. Até 60 itens, mais novos primeiro, sem repetir o mesmo arquivo (dedup por checksum). kind filtra ANTES do teto.",
33044
+ "description": "SÓ LEITURA. Lista os arquivos de mídia de modelo JÁ anexados nesta caixa WhatsApp Cloud (tudo que já subiu por upload_media/upload_header_media), pra reaproveitar como mídia padrão de cabeçalho sem subir de novo — o conector não sobe arquivo direto do computador, então esta é a ÚNICA forma de obter uma url NOSSA aceita por lionchat_inboxes_whatsapp_templates_header_media. Até 60 itens, mais novos primeiro, sem repetir o mesmo arquivo (dedup por checksum). kind filtra ANTES do teto.",
32451
33045
  "category": "Templates WhatsApp",
32452
33046
  "params": [
32453
33047
  {
@@ -33978,7 +34572,7 @@
33978
34572
  "type": "string",
33979
34573
  "location": "body",
33980
34574
  "required": false,
33981
- "description": "Token do webhook da Greenn (valida a assinatura do que chega)"
34575
+ "description": "Token do webhook da Greenn (valida a assinatura do que chega) (27/10) Mandar o valor escondido (•••••••• ou [REDACTED]) mantem a chave gravada — so mande quando for trocar de verdade."
33982
34576
  },
33983
34577
  {
33984
34578
  "name": "active",
@@ -34827,7 +35421,7 @@
34827
35421
  "method": "POST",
34828
35422
  "path": "/api/v1/accounts/{account_id}/upload/validate",
34829
35423
  "title": "Testar uma URL de mídia (sem gravar nada)",
34830
- "description": "SÓ LEITURA na prática: baixa a URL pra validar tipo, tamanho e segurança (SSRF) com a MESMA lista de aceite que o FlowBuilder usa ao enviar mídia por URL — e descarta. Não cria arquivo. Como o MCP não faz upload, é o jeito de conferir se um link de foto/vídeo/áudio/documento vai funcionar num fluxo, campanha ou mensagem ANTES de usar. Sempre 200: valid=true com media_kind/content_type/size_mb/limit_mb, ou valid=false com error_key: 'web_page' (o link é uma página, não o arquivo), 'too_large' (com size_mb/limit_mb), 'unsupported', 'fetch_failed', 'invalid', 'unexpected'.",
35424
+ "description": "SÓ LEITURA na prática: baixa a URL pra validar tipo, tamanho e segurança (SSRF) com a MESMA lista de aceite que o FlowBuilder usa ao enviar mídia por URL — e descarta. Não cria arquivo. Como pelo conector o arquivo só sobe POR LINK (lionchat_upload_create com external_url, mesma lista de aceite), é o jeito de conferir se um link de foto/vídeo/áudio/documento vai funcionar num fluxo, campanha ou mensagem ANTES de usar. Sempre 200: valid=true com media_kind/content_type/size_mb/limit_mb, ou valid=false com error_key: 'web_page' (o link é uma página, não o arquivo), 'too_large' (com size_mb/limit_mb), 'unsupported', 'fetch_failed', 'invalid', 'unexpected'.",
34831
35425
  "category": "Upload",
34832
35426
  "params": [
34833
35427
  {
@@ -35011,7 +35605,7 @@
35011
35605
  "method": "PATCH",
35012
35606
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}",
35013
35607
  "title": "Configurar Integração e-Clínica (mapeamento de eventos e lembretes)",
35014
- "description": "AÇÃO DE ESCRITA, somente administrador. Configura a integração e-Clínica: o MAPEAMENTO evento→automação/fluxo (event_mapping) e os LEMBRETES automáticos (reminder_config). Até 31/08/2026 os dois só existiam na tela — este comando fecha a lacuna.\n\nSUBSTITUIÇÃO TOTAL — LEIA ANTES DE GRAVAR: os dois campos SUBSTITUEM o conteúdo inteiro, NÃO mesclam (o backend faz update! direto no jsonb). Mandar event_mapping com um evento só APAGA todos os outros mapeamentos do cliente; o mesmo vale pra reminder_config. SEMPRE chame lionchat_eclinica_integrations_show ANTES, pegue o objeto atual, altere só o que precisa e devolva o objeto COMPLETO.\n\nevent_mapping: objeto {tipo_do_evento: {automation_id, flow_id}} — pode deixar um dos dois nulo. Tipos aceitos: cliente_novo, cliente_alteracao, agendamento_novo, agendamento_alterado, agendamento_atendido, agendamento_desmarcado, agendamento_transferido, falta, pagamento, cliente_baixa_pagamento, cliente_inclusao_pagamento, controle_laboratorio_novo, controle_laboratorio_alterado, agendamento_aguardando, odontograma_aprovado, cliente_alteracao_pagamento (NOVO 01/09 — a cobrança foi EDITADA: mesmos campos da inclusão e o lembrete de vencimento é MOVIDO, não duplicado; dispara a cada edição, então não sirva para avisar \"nova cobrança\"), procedimento_finalizado (NOVO 31/08 — um procedimento do plano de tratamento foi concluído; dispara UMA VEZ POR PROCEDIMENTO e grava eclinica_procedimento_id/_dente/_valor/_finalizado_em/_profissional no contato, então o fluxo ligado aqui precisa filtrar pelo número do procedimento). odontograma_finalizado (NOVO 01/09 — o plano de tratamento INTEIRO foi concluido; nao confundir com procedimento_finalizado, que e UM item do plano; grava eclinica_odontograma_finalizado_em e nao mexe na data de aprovacao), inclusao_procedimento (NOVO 01/09 — um procedimento foi ACRESCENTADO ao plano, ainda nao executado: serve para aviso de orcamento, NAO e gatilho de orientacao pos-procedimento; grava eclinica_procedimento_incluido_id/_dente/_valor, nunca nos campos do finalizado). Tipo fora da lista = 422; flow_id e automation_id precisam ser da PRÓPRIA conta = 422 senão.\n\nreminder_config: array de {days_before (inteiro >= 0), event_type ('agendamento' padrão | 'controle_laboratorio_novo' | 'cliente_inclusao_pagamento'), flow_id e/ou automation_id (pelo menos um dos dois; com os dois a AUTOMAÇÃO vence), label, dispatch_time (OBRIGATÓRIA — 'HH:MM' fixo ou fórmula Liquid), filter_field/filter_operator/filter_value (opcional; filter_field precisa começar com eclinica_, operadores contains/equal/not_equal)}. Duas linhas com a MESMA régua = 422.\n\nALERTA de regra de negócio: isto muda, na hora e em produção, o que o paciente recebe. E no lembrete por automação as AÇÕES rodam SEM avaliar as CONDIÇÕES da automação. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas.",
35608
+ "description": "AÇÃO DE ESCRITA, somente administrador. Configura a integração e-Clínica: o MAPEAMENTO evento→automação/fluxo (event_mapping) e os LEMBRETES automáticos (reminder_config). Até 31/08/2026 os dois só existiam na tela — este comando fecha a lacuna.\n\nSUBSTITUIÇÃO TOTAL — LEIA ANTES DE GRAVAR: os dois campos SUBSTITUEM o conteúdo inteiro, NÃO mesclam (o backend faz update! direto no jsonb). Mandar event_mapping com um evento só APAGA todos os outros mapeamentos do cliente; o mesmo vale pra reminder_config. SEMPRE chame lionchat_eclinica_integrations_show ANTES, pegue o objeto atual, altere só o que precisa e devolva o objeto COMPLETO.\n\nevent_mapping: objeto {tipo_do_evento: {automation_id, flow_id}} — pode deixar um dos dois nulo. Tipos aceitos: cliente_novo, cliente_alteracao, agendamento_novo, agendamento_alterado, agendamento_atendido, agendamento_desmarcado, agendamento_transferido, falta, pagamento, cliente_baixa_pagamento, cliente_inclusao_pagamento, controle_laboratorio_novo, controle_laboratorio_alterado, agendamento_aguardando, odontograma_aprovado, agendamento_confirmado_link e agendamento_cancelado_link (NOVOS 18/09 — o paciente confirmou ou cancelou pelo link da e-Clinica), cliente_alteracao_pagamento (NOVO 01/09 — a cobrança foi EDITADA: mesmos campos da inclusão e o lembrete de vencimento é MOVIDO, não duplicado; dispara a cada edição, então não sirva para avisar \"nova cobrança\"), procedimento_finalizado (NOVO 31/08 — um procedimento do plano de tratamento foi concluído; dispara UMA VEZ POR PROCEDIMENTO e grava eclinica_procedimento_id/_dente/_valor/_finalizado_em/_profissional no contato, então o fluxo ligado aqui precisa filtrar pelo número do procedimento). odontograma_finalizado (NOVO 01/09 — o plano de tratamento INTEIRO foi concluido; nao confundir com procedimento_finalizado, que e UM item do plano; grava eclinica_odontograma_finalizado_em e nao mexe na data de aprovacao), inclusao_procedimento (NOVO 01/09 — um procedimento foi ACRESCENTADO ao plano, ainda nao executado: serve para aviso de orcamento, NAO e gatilho de orientacao pos-procedimento; grava eclinica_procedimento_incluido_id/_dente/_valor, nunca nos campos do finalizado). Tipo fora da lista = 422; flow_id e automation_id precisam ser da PRÓPRIA conta = 422 senão.\n\nreminder_config: array de {days_before (inteiro >= 0), event_type ('agendamento' padrão | 'controle_laboratorio_novo' | 'cliente_inclusao_pagamento'), flow_id e/ou automation_id (pelo menos um dos dois; com os dois a AUTOMAÇÃO vence), label, dispatch_time (OBRIGATÓRIA — 'HH:MM' fixo ou fórmula Liquid), filter_field/filter_operator/filter_value (opcional; filter_field precisa começar com eclinica_, operadores contains/equal/not_equal)}. Duas linhas com a MESMA régua = 422.\n\nALERTA de regra de negócio: isto muda, na hora e em produção, o que o paciente recebe. E no lembrete por automação as AÇÕES rodam SEM avaliar as CONDIÇÕES da automação. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas.",
35015
35609
  "category": "Integracoes",
35016
35610
  "params": [
35017
35611
  {
@@ -35632,7 +36226,7 @@
35632
36226
  "description": "ID do modelo"
35633
36227
  }
35634
36228
  ],
35635
- "returns": "modelo + envelopes: [{id, title, status, contact_id, contact_name, sent_at, completed_at, expires_at, participants[]}]",
36229
+ "returns": "modelo (roles_layout com required_proofs (so as tres antigas), proof_requests (os itens completos), ai_document_check, communication, signature_methods e public_link {enabled, inbox_id, path}) + envelopes: [{id, title, status, contact_id, contact_name, sent_at, completed_at, expires_at, participants[]}]",
35636
36230
  "common_use_cases": [
35637
36231
  "Ver o texto e as variaveis do modelo antes de editar",
35638
36232
  "Conferir quem ja recebeu este contrato"
@@ -35684,7 +36278,7 @@
35684
36278
  "type": "object",
35685
36279
  "location": "body",
35686
36280
  "required": false,
35687
- "description": "Configuracao do modelo (objeto, MESCLADO no update — mande so o que muda): signers (quantos titulares assinam, 1..), witnesses (testemunhas, 0..), sender_signs (bool: quem envia tambem assina, NO PAINEL), require_id_photo (bool: exige foto do documento na assinatura), validity_days (validade em dias contada do ENVIO; padrao 7; 1..365 — vira {{document.deadline}} no texto). O LEMBRETE NAO E MAIS CAMPO DO MODELO (2026-09-14): o reminder_days e a tarefa diaria das 10h foram REMOVIDOS. Quem lembra e um fluxo do cliente, com o texto e a caixa dele — gatilho signature_delivered (dispara por PESSOA), bloco Esperar em dias e condicao signature_status (person_not_signed + pending, logic and). NUNCA sugerir reminder_days. FORMATO: signers, witnesses e validity_days sao NUMEROS inteiros puros (ex.: {\"signers\": 2, \"witnesses\": 1, \"validity_days\": 7}) — lista ou objeto nesses campos derruba a lista de modelos de contrato da conta; sender_signs e require_id_photo sao true/false."
36281
+ "description": "Configuracao do modelo (objeto, MESCLADO no update — mande so o que muda): signers (quantos titulares assinam, 1..), witnesses (testemunhas, 0..), sender_signs (bool: quem envia tambem assina, NO PAINEL), require_id_photo (bool: exige foto do documento na assinatura), validity_days (validade em dias contada do ENVIO; padrao 7; 1..365 — vira {{document.deadline}} no texto). O LEMBRETE NAO E MAIS CAMPO DO MODELO (2026-09-14): o reminder_days e a tarefa diaria das 10h foram REMOVIDOS. Quem lembra e um fluxo do cliente, com o texto e a caixa dele — gatilho signature_delivered (dispara por PESSOA), bloco Esperar em dias e condicao signature_status (person_not_signed + pending, logic and). NUNCA sugerir reminder_days. FORMATO: signers, witnesses e validity_days sao NUMEROS inteiros puros (ex.: {\"signers\": 2, \"witnesses\": 1, \"validity_days\": 7}) — lista ou objeto nesses campos derruba a lista de modelos de contrato da conta; sender_signs e require_id_photo sao true/false. field_prompts (27/10): como o formulario (jeito collection=form) pergunta cada dado — objeto {variavel: {label, description, placeholder}} (ex.: {\"contact.cpf\": {\"label\": \"Qual e o seu CPF?\", \"description\": \"Igual ao documento\", \"placeholder\": \"000.000.000-00\"}}); texto ate 200 caracteres; pergunta de variavel que o modelo nao usa e descartada; sem pergunta o formulario mostra o nome do campo. required_proofs (28/10): documentos que a pessoa manda antes de assinar — lista com id_document (documento com foto; ela escolhe um dos aceitos, RG, CNH ou CPF — ver accepted_types em proof_requests), selfie_with_document e address_proof (comprovante, foto ou PDF); [] = nenhum; outro valor = 422. Com algum, o contrato so fecha depois de a equipe aprovar (status awaiting_approval). public_link (28/10): link do contrato para divulgar — {enabled: true, inbox_id: <caixa de WhatsApp da conta>} (regenerate: true troca o endereco; o antigo para de funcionar). So para modelo com 1 assinante principal e sem sender_signs (422 com 'public_link' no texto). A leitura devolve {enabled, inbox_id, path} — o endereco e o dominio da instalacao + path (/contrato/<codigo>); salvar sem regenerate mantem o mesmo endereco. communication (29/10): a CAIXA do modelo e as mensagens — {inbox_id (WhatsApp da conta, oficial ou QR Code; vale para TODA mensagem dos contratos do modelo: codigo, link, copia assinada, pedido de documento de novo e o link para divulgar), code_message ({{codigo}}), invite_message, copy_message e proofs_again_message ({{link}}; {{contrato}} poe o nome; {{motivo}} no pedido de documento de novo) para caixa de QR Code; code_template, invite_template, copy_template, proofs_again_template ({name, language} de modelo do WhatsApp APROVADO com UMA variavel no corpo; o do codigo de Autenticacao) para caixa oficial; null tira}; o que nao vem fica o guardado. signature_methods (29/10): como a pessoa pode assinar — [\"drawn\",\"typed\"] (padrao), [\"drawn\"] ou [\"typed\"]; vazio ou outro valor = 422. proof_requests (29/10, substitui required_proofs, que continua aceito so com as tres antigas): lista de documentos pedidos [{key, label, accepts_pdf, attach_to_contract, from_witnesses, accepted_types, description}] — key = id_document | rg | cnh | cpf | selfie_with_document | address_proof | custom_<6 a 12 letras/numeros minusculos> (o criado EXIGE label de 1 a 60; VOCE escolhe a chave e mantem igual nas gravacoes seguintes — o servidor nao cria chave); aceita tambem [\"rg\",\"cnh\"]; maximo 12; DOCUMENTO COM FOTO (30/10): id_document com accepted_types = lista dos ACEITOS entre rg, cnh e cpf (um ou mais; ex.: {\"key\":\"id_document\",\"accepted_types\":[\"rg\",\"cnh\"]} = aceita RG OU CNH, a pessoa manda UM deles e a IA confere se a foto e do tipo que ela ESCOLHEU na pagina; sem a lista = os tres; lista vazia, tipo desconhecido ou accepted_types em outro item = 422); rg, cnh e cpf SOLTOS continuam aceitos mas cada um EXIGE aquele documento (os tres soltos = a pessoa manda os tres) — para \"RG ou CNH\" use sempre id_document com accepted_types; accepts_pdf so no comprovante e nos criados; attach_to_contract = o arquivo entra como paginas no contrato assinado (testemunha recebe a via SEM os anexos); from_witnesses = testemunha tambem manda (padrao: sim nos fixos, nao nos criados); mais de 10 arquivos anexados (itens anexar x pessoas) = 422. ai_document_check (29/10, true/false): a IA da OpenAI DA CONTA confere as fotos e, desde 30/10, os PDFs de ate 5 paginas (so com a chave cadastrada; gasta credito da conta; duvida pede outro arquivo e, da 2a em diante, a pessoa pode manter; falha da IA = arquivo aceito). description (30/10, so nos documentos criados custom_*, opcional, ate 300 caracteres): explica a IA o que o documento e alem do nome (ex.: \"comprovante de inscricao no conselho de classe, com o nome da pessoa\"); quem assina NAO ve; em documento fixo = 422."
35688
36282
  }
35689
36283
  ],
35690
36284
  "returns": "o modelo criado (id, name, kind, body, variables, roles_layout, progress)",
@@ -35746,7 +36340,7 @@
35746
36340
  "type": "object",
35747
36341
  "location": "body",
35748
36342
  "required": false,
35749
- "description": "Configuracao do modelo (objeto, MESCLADO no update — mande so o que muda): signers (quantos titulares assinam, 1..), witnesses (testemunhas, 0..), sender_signs (bool: quem envia tambem assina, NO PAINEL), require_id_photo (bool: exige foto do documento na assinatura), validity_days (validade em dias contada do ENVIO; padrao 7; 1..365 — vira {{document.deadline}} no texto). O LEMBRETE NAO E MAIS CAMPO DO MODELO (2026-09-14): o reminder_days e a tarefa diaria das 10h foram REMOVIDOS. Quem lembra e um fluxo do cliente, com o texto e a caixa dele — gatilho signature_delivered (dispara por PESSOA), bloco Esperar em dias e condicao signature_status (person_not_signed + pending, logic and). NUNCA sugerir reminder_days. FORMATO: signers, witnesses e validity_days sao NUMEROS inteiros puros (ex.: {\"signers\": 2, \"witnesses\": 1, \"validity_days\": 7}) — lista ou objeto nesses campos derruba a lista de modelos de contrato da conta; sender_signs e require_id_photo sao true/false."
36343
+ "description": "Configuracao do modelo (objeto, MESCLADO no update — mande so o que muda): signers (quantos titulares assinam, 1..), witnesses (testemunhas, 0..), sender_signs (bool: quem envia tambem assina, NO PAINEL), require_id_photo (bool: exige foto do documento na assinatura), validity_days (validade em dias contada do ENVIO; padrao 7; 1..365 — vira {{document.deadline}} no texto). O LEMBRETE NAO E MAIS CAMPO DO MODELO (2026-09-14): o reminder_days e a tarefa diaria das 10h foram REMOVIDOS. Quem lembra e um fluxo do cliente, com o texto e a caixa dele — gatilho signature_delivered (dispara por PESSOA), bloco Esperar em dias e condicao signature_status (person_not_signed + pending, logic and). NUNCA sugerir reminder_days. FORMATO: signers, witnesses e validity_days sao NUMEROS inteiros puros (ex.: {\"signers\": 2, \"witnesses\": 1, \"validity_days\": 7}) — lista ou objeto nesses campos derruba a lista de modelos de contrato da conta; sender_signs e require_id_photo sao true/false. field_prompts (27/10): como o formulario (jeito collection=form) pergunta cada dado — objeto {variavel: {label, description, placeholder}} (ex.: {\"contact.cpf\": {\"label\": \"Qual e o seu CPF?\", \"description\": \"Igual ao documento\", \"placeholder\": \"000.000.000-00\"}}); texto ate 200 caracteres; pergunta de variavel que o modelo nao usa e descartada; sem pergunta o formulario mostra o nome do campo. required_proofs (28/10): documentos que a pessoa manda antes de assinar — lista com id_document (documento com foto; ela escolhe um dos aceitos, RG, CNH ou CPF — ver accepted_types em proof_requests), selfie_with_document e address_proof (comprovante, foto ou PDF); [] = nenhum; outro valor = 422. Com algum, o contrato so fecha depois de a equipe aprovar (status awaiting_approval). public_link (28/10): link do contrato para divulgar — {enabled: true, inbox_id: <caixa de WhatsApp da conta>} (regenerate: true troca o endereco; o antigo para de funcionar). So para modelo com 1 assinante principal e sem sender_signs (422 com 'public_link' no texto). A leitura devolve {enabled, inbox_id, path} — o endereco e o dominio da instalacao + path (/contrato/<codigo>); salvar sem regenerate mantem o mesmo endereco. communication (29/10): a CAIXA do modelo e as mensagens — {inbox_id (WhatsApp da conta, oficial ou QR Code; vale para TODA mensagem dos contratos do modelo: codigo, link, copia assinada, pedido de documento de novo e o link para divulgar), code_message ({{codigo}}), invite_message, copy_message e proofs_again_message ({{link}}; {{contrato}} poe o nome; {{motivo}} no pedido de documento de novo) para caixa de QR Code; code_template, invite_template, copy_template, proofs_again_template ({name, language} de modelo do WhatsApp APROVADO com UMA variavel no corpo; o do codigo de Autenticacao) para caixa oficial; null tira}; o que nao vem fica o guardado. signature_methods (29/10): como a pessoa pode assinar — [\"drawn\",\"typed\"] (padrao), [\"drawn\"] ou [\"typed\"]; vazio ou outro valor = 422. proof_requests (29/10, substitui required_proofs, que continua aceito so com as tres antigas): lista de documentos pedidos [{key, label, accepts_pdf, attach_to_contract, from_witnesses, accepted_types, description}] — key = id_document | rg | cnh | cpf | selfie_with_document | address_proof | custom_<6 a 12 letras/numeros minusculos> (o criado EXIGE label de 1 a 60; VOCE escolhe a chave e mantem igual nas gravacoes seguintes — o servidor nao cria chave); aceita tambem [\"rg\",\"cnh\"]; maximo 12; DOCUMENTO COM FOTO (30/10): id_document com accepted_types = lista dos ACEITOS entre rg, cnh e cpf (um ou mais; ex.: {\"key\":\"id_document\",\"accepted_types\":[\"rg\",\"cnh\"]} = aceita RG OU CNH, a pessoa manda UM deles e a IA confere se a foto e do tipo que ela ESCOLHEU na pagina; sem a lista = os tres; lista vazia, tipo desconhecido ou accepted_types em outro item = 422); rg, cnh e cpf SOLTOS continuam aceitos mas cada um EXIGE aquele documento (os tres soltos = a pessoa manda os tres) — para \"RG ou CNH\" use sempre id_document com accepted_types; accepts_pdf so no comprovante e nos criados; attach_to_contract = o arquivo entra como paginas no contrato assinado (testemunha recebe a via SEM os anexos); from_witnesses = testemunha tambem manda (padrao: sim nos fixos, nao nos criados); mais de 10 arquivos anexados (itens anexar x pessoas) = 422. ai_document_check (29/10, true/false): a IA da OpenAI DA CONTA confere as fotos e, desde 30/10, os PDFs de ate 5 paginas (so com a chave cadastrada; gasta credito da conta; duvida pede outro arquivo e, da 2a em diante, a pessoa pode manter; falha da IA = arquivo aceito). description (30/10, so nos documentos criados custom_*, opcional, ate 300 caracteres): explica a IA o que o documento e alem do nome (ex.: \"comprovante de inscricao no conselho de classe, com o nome da pessoa\"); quem assina NAO ve; em documento fixo = 422."
35750
36344
  }
35751
36345
  ],
35752
36346
  "returns": "o modelo atualizado",
@@ -35800,12 +36394,46 @@
35800
36394
  "lionchat_signature_documents_create"
35801
36395
  ]
35802
36396
  },
36397
+ {
36398
+ "id": "lionchat_signature_documents_fill_fields",
36399
+ "method": "GET",
36400
+ "path": "/api/v1/accounts/{account_id}/signature_documents/{id}/fill_fields",
36401
+ "title": "O que o Contrato Pede e a Ficha Tem",
36402
+ "description": "Antes de enviar: cada campo do modelo que se preenche pela ficha (dados cadastrais, endereco, e-mail, atributo personalizado de contato) com o valor que a ficha do contato JA tem e missing=true no que falta. Use para completar no envio com contact_data (jeito ready) ou decidir mandar o formulario (collection=form). blocked = o que falta e NAO se preenche por aqui (ex.: telefone, dados da conta) — com isso o envio pronto volta variaveis_sem_valor; blocked_in_form = o mesmo no jeito formulario (no formulario o nome tambem e perguntado). Sem contact_id ou contato de outra conta = 422 sem_contato.",
36403
+ "category": "Assinatura eletronica",
36404
+ "params": [
36405
+ {
36406
+ "name": "id",
36407
+ "type": "integer",
36408
+ "location": "path",
36409
+ "required": true,
36410
+ "description": "ID do modelo"
36411
+ },
36412
+ {
36413
+ "name": "contact_id",
36414
+ "type": "integer",
36415
+ "location": "query",
36416
+ "required": true,
36417
+ "description": "Ficha do titular"
36418
+ }
36419
+ ],
36420
+ "returns": "{fields: [{variable, label, description, placeholder, type, options[{id,label}], value, missing}], blocked: [nomes], blocked_in_form: [nomes]}",
36421
+ "common_use_cases": [
36422
+ "Saber o que falta na ficha antes de mandar o contrato",
36423
+ "Completar os dados que faltam no proprio envio (contact_data)"
36424
+ ],
36425
+ "related_tools": [
36426
+ "lionchat_signature_envelopes_create",
36427
+ "lionchat_signature_documents_show",
36428
+ "lionchat_contacts_update_cadastral"
36429
+ ]
36430
+ },
35803
36431
  {
35804
36432
  "id": "lionchat_signature_envelopes_list",
35805
36433
  "method": "GET",
35806
36434
  "path": "/api/v1/accounts/{account_id}/signature_envelopes",
35807
36435
  "title": "Listar Contratos Enviados",
35808
- "description": "Lista os CONTRATOS (cada envio a uma pessoa e um contrato, com PDF proprio e linha do tempo), paginada (25 por pagina) com filtro e busca no servidor. Recortes: por modelo (signature_document_id), por contato (contact_id — o que aparece na aba Contratos da ficha) ou por conversa (conversation_id). status aceita os baldes aguardando (draft/sent), visualizado (viewed/partially_signed), assinado (signed_pending_seal/signed), encerrado (refused/cancelled/expired) ou falta_eu (contratos em que o usuario do token e o remetente e ainda nao assinou). Resposta traz meta.counts com a contagem por balde. Por empresa: company_id (contratos de todos os contatos dela).",
36436
+ "description": "Lista os CONTRATOS (cada envio a uma pessoa e um contrato, com PDF proprio e linha do tempo), paginada (25 por pagina) com filtro e busca no servidor. Recortes: por modelo (signature_document_id), por contato (contact_id — o que aparece na aba Contratos da ficha) ou por conversa (conversation_id). status aceita os baldes aguardando (draft/sent/awaiting_data/awaiting_approval — awaiting_data = esperando a pessoa preencher o formulario; awaiting_approval = todos assinaram e a equipe ainda nao aprovou os documentos pedidos), visualizado (viewed/partially_signed), assinado (signed_pending_seal/signed), encerrado (refused/cancelled/expired) ou falta_eu (contratos em que o usuario do token e o remetente e ainda nao assinou). Resposta traz meta.counts com a contagem por balde. Por empresa: company_id (contratos de todos os contatos dela).",
35809
36437
  "category": "Assinatura eletronica",
35810
36438
  "params": [
35811
36439
  {
@@ -35858,7 +36486,7 @@
35858
36486
  "description": "Recorta pelos contatos de uma EMPRESA (aba Contratos da pagina da empresa). Empresa de outra conta = 404."
35859
36487
  }
35860
36488
  ],
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}",
36489
+ "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, required_proofs[]}], meta: {page, per_page, has_more, counts}",
35862
36490
  "common_use_cases": [
35863
36491
  "Ver o status dos contratos de um cliente (assinou? abriu? expirou?)",
35864
36492
  "Relatorio de um modelo: quantos aguardando/assinados, quem falta",
@@ -35875,7 +36503,7 @@
35875
36503
  "method": "GET",
35876
36504
  "path": "/api/v1/accounts/{account_id}/signature_envelopes/{id}",
35877
36505
  "title": "Detalhes do Contrato (linha do tempo)",
35878
- "description": "Um contrato com quem assina e a LINHA DO TEMPO completa (events): created, delivered, sent, opened, code_requested, code_verified, signed (com ip, device, location e panel=true quando foi assinado no painel), all_signed, sealed (documento final gerado, com hash), refused, expired, cancelled, delivery_failed, reminded, resent. E o relatorio de evidencias em dados; os PDFs (original, assinado, evidencias) so saem pela tela/API de download.",
36506
+ "description": "Um contrato com quem assina e a LINHA DO TEMPO completa (events): created, delivered, sent, opened, code_requested, code_verified, signed (com ip, device, location, panel=true quando foi assinado no painel e, desde 28/10, signature_method drawn|typed + typed_name), data_filled (a pessoa preencheu o formulario e o contrato foi gerado), all_signed, sealed (documento final gerado, com hash), refused, expired, cancelled, delivery_failed, reminded, resent; (28/10) proof_sent (a pessoa mandou um documento pedido), awaiting_approval, proofs_approved / proofs_rejected (com o motivo); code_requested/code_verified com method=whatsapp = confirmou mandando a frase pelo WhatsApp em vez do codigo. E o relatorio de evidencias em dados; os PDFs (original, assinado, evidencias) so saem pela tela/API de download.",
35879
36507
  "category": "Assinatura eletronica",
35880
36508
  "params": [
35881
36509
  {
@@ -35886,7 +36514,7 @@
35886
36514
  "description": "ID do contrato"
35887
36515
  }
35888
36516
  ],
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",
36517
+ "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, signature_method, typed_name, method}] + required_proofs[] + original_sha256/sealed_sha256",
35890
36518
  "common_use_cases": [
35891
36519
  "Conferir quando e de onde a pessoa abriu e assinou",
35892
36520
  "Ver por que um contrato nao foi entregue (delivery.failed) ou foi recusado"
@@ -35894,7 +36522,8 @@
35894
36522
  "related_tools": [
35895
36523
  "lionchat_signature_envelopes_list",
35896
36524
  "lionchat_signature_envelopes_resend",
35897
- "lionchat_signature_envelopes_cancel"
36525
+ "lionchat_signature_envelopes_cancel",
36526
+ "lionchat_signature_envelopes_proofs"
35898
36527
  ]
35899
36528
  },
35900
36529
  {
@@ -35902,7 +36531,7 @@
35902
36531
  "method": "POST",
35903
36532
  "path": "/api/v1/accounts/{account_id}/signature_envelopes",
35904
36533
  "title": "Enviar Contrato para Assinar",
35905
- "description": "Cria o contrato DAQUELA pessoa a partir de um modelo e ENTREGA o link (na conversa de WhatsApp da pessoa — uma conversa POR assinante — ou por e-mail). O PDF e gerado com os dados da ficha; variavel do modelo sem valor na ficha = 422 variaveis_sem_valor com a lista do que falta (preencha a ficha e tente de novo). Sem inbox_id e com o contato conversando em MAIS de uma caixa de WhatsApp = 422 escolher_caixa com inboxes[] — repita mandando inbox_id. Ninguem recebeu = 422 entrega_falhou (o contrato fica como rascunho; use resend). Recebeu parcialmente = 201 com delivery_failures[]. Consome 1 vaga do limite mensal (veja signature_envelopes_limits). Modelo com sender_signs cria sozinho o participante do remetente (o usuario do token), que assina NO PAINEL (nao ha ferramenta pra assinar por ele).",
36534
+ "description": "Cria o contrato DAQUELA pessoa a partir de um modelo e ENTREGA o link (na conversa de WhatsApp da pessoa — uma conversa POR assinante — ou por e-mail). O PDF e gerado com os dados da ficha; variavel do modelo sem valor na ficha = 422 variaveis_sem_valor com a lista do que falta (preencha a ficha e tente de novo). Sem inbox_id e com o contato conversando em MAIS de uma caixa de WhatsApp = 422 escolher_caixa com inboxes[] — repita mandando inbox_id. Ninguem recebeu = 422 entrega_falhou (o contrato fica como rascunho; use resend). Recebeu parcialmente = 201 com delivery_failures[]. Consome 1 vaga do limite mensal (veja signature_envelopes_limits). Modelo com sender_signs cria sozinho o participante do remetente (o usuario do token), que assina no painel ou por signature_envelopes_sign_as_sender (so com o desenho feito pela propria pessoa; nunca inventar a assinatura). DOIS JEITOS (27/10): collection='ready' (padrao) = o contrato sai agora com a ficha; o que faltar pode ir em contact_data (grava na ficha E no contrato; erro de um campo = 422 dados_invalidos com field_errors). Para saber antes o que a ficha tem e o que falta: lionchat_signature_documents_fill_fields. collection='form' (exige contact_id) = o titular recebe um formulario em branco, preenche os dados dele (atualiza a ficha) e o contrato nasce com o que ele digitou; o contrato fica awaiting_data ate la e o link e o participants[].public_url do titular. message (ate 1.000 caracteres) vai junto do link nos dois jeitos. Modelo de Word com campo sem escolha no mapeamento = 422 campos_sem_escolha (missing = os rotulos do Word): ajuste o modelo pela tela.",
35906
36535
  "category": "Assinatura eletronica",
35907
36536
  "params": [
35908
36537
  {
@@ -35939,19 +36568,42 @@
35939
36568
  "location": "body",
35940
36569
  "required": true,
35941
36570
  "description": "Quem assina (array). Cada item: {name (obrigatorio), role: signer|witness (titular|testemunha; NAO mande sender — o remetente e criado sozinho quando o modelo tem sender_signs), phone (+55DDDNUMERO, quando delivery_channel=whatsapp), email (quando delivery_channel=email), delivery_channel: whatsapp|email (padrao whatsapp), cpf (opcional; invalido = 422 cpf_invalido), contact_id (ficha da pessoa; recomendado no titular)}. Cada pessoa recebe o proprio link e assina com codigo de uso unico."
36571
+ },
36572
+ {
36573
+ "name": "collection",
36574
+ "type": "string",
36575
+ "location": "body",
36576
+ "required": false,
36577
+ "description": "Jeito de coletar os dados: ready (padrao, contrato pronto com a ficha) | form (a pessoa preenche pelo link; exige contact_id). Outro valor = 422 coleta_invalida"
36578
+ },
36579
+ {
36580
+ "name": "message",
36581
+ "type": "string",
36582
+ "location": "body",
36583
+ "required": false,
36584
+ "description": "Texto proprio que vai junto do link (ate 1.000 caracteres; acima = 422 mensagem_longa)"
36585
+ },
36586
+ {
36587
+ "name": "contact_data",
36588
+ "type": "object",
36589
+ "location": "body",
36590
+ "required": false,
36591
+ "description": "So no jeito ready: o que voce completa da ficha antes de gerar, {variavel: valor} com as variaveis do modelo (ex.: {\"contact.cpf\": \"52998224725\", \"contact.marital_status\": \"casado\"}). Grava na ficha e no contrato; tudo valido ou nada gravado. Telefone nao se preenche por aqui. Formato torto (nao objeto de textos, mais de 50 chaves, valor acima de 4 KB) = 422 contact_data_invalido"
35942
36592
  }
35943
36593
  ],
35944
- "returns": "201: o contrato (status sent) com participants[] (public_url de cada um), events[] e delivery_failures[]; 422: {error, detail, missing, inboxes, envelope}",
36594
+ "returns": "201: o contrato (status sent) com participants[] (public_url de cada um), events[] e delivery_failures[]; 422: {error, detail, missing, inboxes, envelope}; 422 dados_invalidos traz field_errors {variavel: motivo} (invalid_cpf, invalid_option, email_em_uso, campo_desconhecido...); variaveis_sem_valor e campos_sem_escolha trazem missing (chaves) e missing_labels (nomes de gente); 422 anexos_demais = com as pessoas deste envio o contrato passaria de 10 arquivos anexados (documentos marcados 'anexar ao contrato' x pessoas que mandam) — tire pessoas ou desmarque 'anexar' no modelo",
35945
36595
  "common_use_cases": [
35946
36596
  "Mandar o contrato padrao pra um cliente assinar pelo WhatsApp",
35947
36597
  "Mandar com testemunha (participants com role witness e o telefone dela)",
35948
- "Reenviar um contrato que ficou como rascunho por falha de entrega (use resend)"
36598
+ "Reenviar um contrato que ficou como rascunho por falha de entrega (use resend)",
36599
+ "Mandar um formulario para a pessoa preencher os proprios dados (collection=form) e o contrato sair com eles"
35949
36600
  ],
35950
36601
  "related_tools": [
35951
36602
  "lionchat_signature_documents_list",
35952
36603
  "lionchat_signature_envelopes_limits",
35953
36604
  "lionchat_signature_envelopes_show",
35954
- "lionchat_signature_envelopes_resend"
36605
+ "lionchat_signature_envelopes_resend",
36606
+ "lionchat_signature_documents_fill_fields"
35955
36607
  ]
35956
36608
  },
35957
36609
  {
@@ -35984,7 +36636,7 @@
35984
36636
  "method": "POST",
35985
36637
  "path": "/api/v1/accounts/{account_id}/signature_envelopes/{id}/sign_as_sender",
35986
36638
  "title": "Remetente Assina o Contrato pelo Painel",
35987
- "description": "A assinatura do REMETENTE (a pessoa do token), quando o modelo tem 'eu tambem assino' (roles_layout.sender_signs). Nao serve pra assinar no lugar do cliente: titular e testemunha assinam pelo link publico deles. Manda o desenho da assinatura como PNG em base64 com o prefixo data:image/png;base64,... (o mesmo rabisco da tela; remember_drawing guarda pra proxima vez). Recusas 422: nao_e_sua (o usuario do token nao e o remetente deste contrato), ja_assinado, sem_desenho. Quando era a ultima assinatura que faltava, o contrato fecha e o PDF final e gerado em seguida (status signed_pending_seal -> signed). Ache os contratos que esperam a sua assinatura com status=falta_eu em lionchat_signature_envelopes_list.",
36639
+ "description": "A assinatura do REMETENTE (a pessoa do token), quando o modelo tem 'eu tambem assino' (roles_layout.sender_signs). Nao serve pra assinar no lugar do cliente: titular e testemunha assinam pelo link publico deles. Manda o desenho da assinatura como PNG em base64 com o prefixo data:image/png;base64,... (o mesmo rabisco da tela; remember_drawing guarda pra proxima vez). Recusas 422: nao_e_sua (o usuario do token nao e o remetente deste contrato), ja_assinado, sem_desenho. Quando era a ultima assinatura que faltava, o contrato fecha e o PDF final e gerado em seguida (status signed_pending_seal -> signed). Ache os contratos que esperam a sua assinatura com status=falta_eu em lionchat_signature_envelopes_list. JEITO (28/10): signature_method drawn (desenhada) ou typed (o nome digitado numa letra de assinatura) + typed_name — a folha de assinaturas e o relatorio de evidencias dizem 'Assinatura desenhada a mao' ou 'Assinatura digitada: <nome>'. Sem o campo, nao dizem nada. A imagem e sempre o PNG. (29/10) O modelo escolhe os jeitos permitidos (roles_layout.signature_methods): jeito fora da lista = 422 jeito_nao_permitido.",
35988
36640
  "category": "Assinatura eletronica",
35989
36641
  "params": [
35990
36642
  {
@@ -36014,9 +36666,23 @@
36014
36666
  "location": "body",
36015
36667
  "required": false,
36016
36668
  "description": "true = guarda o desenho nas preferencias do usuario pra reaproveitar no proximo contrato"
36669
+ },
36670
+ {
36671
+ "name": "signature_method",
36672
+ "type": "string",
36673
+ "location": "body",
36674
+ "required": false,
36675
+ "description": "drawn (desenhada) | typed (nome digitado numa letra de assinatura). Outro valor = nada gravado"
36676
+ },
36677
+ {
36678
+ "name": "typed_name",
36679
+ "type": "string",
36680
+ "location": "body",
36681
+ "required": false,
36682
+ "description": "So com signature_method=typed: o nome escrito (ate 120 caracteres) que aparece na folha de assinaturas"
36017
36683
  }
36018
36684
  ],
36019
- "returns": "o contrato atualizado com participants[] e events[] (o seu participante vira signed); 422: {error: nao_e_sua | ja_assinado | sem_desenho}",
36685
+ "returns": "o contrato atualizado com participants[] e events[] (o seu participante vira signed); 422: {error: nao_e_sua | ja_assinado | sem_desenho | jeito_nao_permitido}",
36020
36686
  "common_use_cases": [
36021
36687
  "Fechar um contrato em que so falta a assinatura do remetente",
36022
36688
  "Assinar em lote os contratos listados com status=falta_eu"
@@ -36057,7 +36723,7 @@
36057
36723
  "method": "GET",
36058
36724
  "path": "/api/v1/accounts/{account_id}/signature_envelopes/limits",
36059
36725
  "title": "Limite Mensal de Contratos",
36060
- "description": "Quantos contratos a conta ja mandou no mes e o teto do plano ({used, limit, unlimited}). Contrato cancelado/expirado NAO devolve a vaga.",
36726
+ "description": "Quantos contratos a conta ja mandou no mes e o teto do plano ({used, limit, unlimited}). Contrato cancelado/expirado NAO devolve a vaga. (28/10) O contrato que nasce do link do modelo (roles_layout.public_link) so conta depois que a pessoa confirma que e ela; quem abre o link e some nao gasta vaga.",
36061
36727
  "category": "Assinatura eletronica",
36062
36728
  "params": [],
36063
36729
  "returns": "{used, limit, unlimited}",
@@ -36068,6 +36734,118 @@
36068
36734
  "lionchat_signature_envelopes_create"
36069
36735
  ]
36070
36736
  },
36737
+ {
36738
+ "id": "lionchat_signature_envelopes_proofs",
36739
+ "method": "GET",
36740
+ "path": "/api/v1/accounts/{account_id}/signature_envelopes/{id}/proofs",
36741
+ "title": "Documentos de Quem Assina (Contrato)",
36742
+ "description": "Os documentos que o contrato pede (requests: os itens de proof_requests com o nome em label) e, por pessoa que assina pelo link, o que ela mandou (kind id_document/rg/cnh/cpf/selfie_with_document/address_proof/custom_*, label, formato, document_type rg/cnh/cpf, quando) e a revisao da equipe (pending/approved/rejected, motivo, quem, quando). NUNCA devolve o arquivo: documento de identidade e selfie so se olham na tela (botao amarelo \"Ver documentos\" no contrato ou na aba Contratos da ficha). last_proof_event_id = o ultimo documento mandado (use como seen_event_id ao aprovar/reprovar). Administrador ou signature_manage. (29/10) Com a conferencia por IA ligada, cada documento traz ai_check ({veredito: ok|duvida, probabilidade}) e ai_kept (a pessoa manteve a foto apesar da duvida) — e um AVISO para olhar com atencao, nao uma recusa. seal_blocked (lista) = um anexo ao contrato nao entrou no documento final: o contrato fica parado (status signed_pending_seal) e o unico caminho e REPROVAR o documento daquela pessoa (com o motivo) para ela mandar outro; ai ele volta a esperar a aprovacao.",
36743
+ "category": "Assinatura eletronica",
36744
+ "params": [
36745
+ {
36746
+ "name": "id",
36747
+ "type": "integer",
36748
+ "location": "path",
36749
+ "required": true,
36750
+ "description": "ID do contrato"
36751
+ }
36752
+ ],
36753
+ "returns": "{required[], requests: [{key, label, accepts_pdf, attach_to_contract, from_witnesses}], awaiting_approval, seal_blocked: [{participant_id, kind, label}], people: [{participant_id, name, role, signed, proofs: [{kind, label, content_type, document_type, sent_at, ai_check, ai_kept}], review: {status, decision, reason, by, at}, last_proof_event_id}]}",
36754
+ "common_use_cases": [
36755
+ "Saber se o contrato esta esperando a aprovacao dos documentos e de quem",
36756
+ "Ver o motivo de uma reprovacao e se a pessoa ja mandou de novo"
36757
+ ],
36758
+ "related_tools": [
36759
+ "lionchat_signature_envelopes_approve_proofs",
36760
+ "lionchat_signature_envelopes_reject_proofs",
36761
+ "lionchat_signature_envelopes_show"
36762
+ ]
36763
+ },
36764
+ {
36765
+ "id": "lionchat_signature_envelopes_approve_proofs",
36766
+ "method": "POST",
36767
+ "path": "/api/v1/accounts/{account_id}/signature_envelopes/{id}/approve_proofs",
36768
+ "title": "Aprovar Documentos de Quem Assina",
36769
+ "description": "Aprova os documentos de UMA pessoa num contrato que esta awaiting_approval. Com todos aprovados o contrato fecha, o documento final e gerado e cada pessoa recebe a via (MANDA mensagem ao cliente) — confirme com o usuario antes e pergunte se ele ja conferiu os arquivos na tela (eles nao saem por ferramenta). 422: fora_do_momento (contrato nao esta esperando aprovacao), sem_documentos, documentos_mudaram (a pessoa mandou outro depois do que foi visto — leia _proofs de novo). Administrador ou signature_manage.",
36770
+ "category": "Assinatura eletronica",
36771
+ "params": [
36772
+ {
36773
+ "name": "id",
36774
+ "type": "integer",
36775
+ "location": "path",
36776
+ "required": true,
36777
+ "description": "ID do contrato"
36778
+ },
36779
+ {
36780
+ "name": "participant_id",
36781
+ "type": "integer",
36782
+ "location": "body",
36783
+ "required": true,
36784
+ "description": "participant_id da pessoa (de _proofs)"
36785
+ },
36786
+ {
36787
+ "name": "seen_event_id",
36788
+ "type": "integer",
36789
+ "location": "body",
36790
+ "required": false,
36791
+ "description": "last_proof_event_id que foi conferido; se a pessoa mandou outro depois, volta 422 documentos_mudaram"
36792
+ }
36793
+ ],
36794
+ "returns": "o mesmo de _proofs + status do contrato",
36795
+ "common_use_cases": [
36796
+ "A equipe conferiu os documentos na tela e pediu para aprovar"
36797
+ ],
36798
+ "related_tools": [
36799
+ "lionchat_signature_envelopes_proofs",
36800
+ "lionchat_signature_envelopes_reject_proofs"
36801
+ ]
36802
+ },
36803
+ {
36804
+ "id": "lionchat_signature_envelopes_reject_proofs",
36805
+ "method": "POST",
36806
+ "path": "/api/v1/accounts/{account_id}/signature_envelopes/{id}/reject_proofs",
36807
+ "title": "Reprovar Documentos de Quem Assina",
36808
+ "description": "Reprova os documentos de UMA pessoa com o motivo: ela recebe no canal dela (WhatsApp ou e-mail) o pedido de documento novo com o motivo escrito (MANDA mensagem ao cliente — confirme o texto com o usuario antes). Ela troca o que for preciso, toca Enviar e a equipe e avisada de novo. 422: motivo_obrigatorio, fora_do_momento, sem_documentos, documentos_mudaram. Administrador ou signature_manage. (29/10) Tambem e o caminho quando _proofs mostra seal_blocked (anexo que nao entrou no documento final): reprove o documento daquela pessoa e ela manda outro.",
36809
+ "category": "Assinatura eletronica",
36810
+ "params": [
36811
+ {
36812
+ "name": "id",
36813
+ "type": "integer",
36814
+ "location": "path",
36815
+ "required": true,
36816
+ "description": "ID do contrato"
36817
+ },
36818
+ {
36819
+ "name": "participant_id",
36820
+ "type": "integer",
36821
+ "location": "body",
36822
+ "required": true,
36823
+ "description": "participant_id da pessoa (de _proofs)"
36824
+ },
36825
+ {
36826
+ "name": "reason",
36827
+ "type": "string",
36828
+ "location": "body",
36829
+ "required": true,
36830
+ "description": "Motivo que a pessoa vai ler (ex.: \"a foto da CNH ficou desfocada, mande de novo\")"
36831
+ },
36832
+ {
36833
+ "name": "seen_event_id",
36834
+ "type": "integer",
36835
+ "location": "body",
36836
+ "required": false,
36837
+ "description": "last_proof_event_id que foi conferido"
36838
+ }
36839
+ ],
36840
+ "returns": "o mesmo de _proofs + status do contrato",
36841
+ "common_use_cases": [
36842
+ "Documento ilegivel ou do tipo errado: pedir outro a pessoa"
36843
+ ],
36844
+ "related_tools": [
36845
+ "lionchat_signature_envelopes_proofs",
36846
+ "lionchat_signature_envelopes_approve_proofs"
36847
+ ]
36848
+ },
36071
36849
  {
36072
36850
  "id": "lionchat_agendas_list",
36073
36851
  "method": "GET",
@@ -36487,7 +37265,7 @@
36487
37265
  "path": "/api/v1/accounts/{account_id}/agenda_treatments/{id}/marcar_todas",
36488
37266
  "title": "Programa: marcar varias sessoes de uma vez",
36489
37267
  "category": "Agenda / Tarefas",
36490
- "description": "[POST] (15/09) Marca de uma vez as sessoes confirmadas do programa. Body: `sessoes: [{numero, date, slot}]` — o numero da sessao, o dia (YYYY-MM-DD) e o horario (HH:MM). NAO e transacao unica de proposito: cada sessao e uma reserva DE VERDADE (cria a tarefa, dispara confirmacao, lembrete e Google como qualquer agendamento), entao uma falha no meio NAO desfaz as que ja entraram na agenda — a resposta e 200 com `marcadas` e `falhas: [{numero, erro}]`. ATENCAO: com confirmacao ligada no tipo, o cliente recebe UMA mensagem por sessao. Teto de 60 sessoes por chamada. 422 se o programa estiver encerrado/concluido ou sem tipo de agendamento. Sessao que ja tem compromisso vivo volta em `falhas` ('Essa sessao ja foi marcada').",
37268
+ "description": "[POST] (15/09) Marca de uma vez as sessoes confirmadas do programa. Body: `sessoes: [{numero, date, slot}]` — o numero da sessao, o dia (YYYY-MM-DD) e o horario (HH:MM). NAO e transacao unica de proposito: cada sessao e uma reserva DE VERDADE (cria a tarefa, dispara confirmacao, lembrete e Google como qualquer agendamento), entao uma falha no meio NAO desfaz as que ja entraram na agenda — a resposta e 200 com `marcadas` e `falhas: [{numero, erro}]`. Com confirmacao ligada no tipo, o cliente recebe UMA confirmacao por DIA de marcacao do programa (nao uma por sessao); lembretes, gatilho de fluxo e conversoes continuam saindo por sessao. Teto de 60 sessoes por chamada. 422 se o programa estiver encerrado/concluido ou sem tipo de agendamento. Sessao que ja tem compromisso vivo volta em `falhas` ('Essa sessao ja foi marcada').",
36491
37269
  "params": [
36492
37270
  {
36493
37271
  "name": "id",