@lionchat/mcp-server 1.23.0 → 1.24.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
@@ -209,7 +209,7 @@
209
209
  "type": "object",
210
210
  "location": "body",
211
211
  "required": false,
212
- "description": "Atributos customizados"
212
+ "description": "Objeto {chave: valor} (chave = attribute_key de lionchat_custom_attributes_list, modelo contato). Por tipo: texto; numero como numero; data 'AAAA-MM-DD' (data-hora ISO com fuso; hora 'HH:MM'); lista = EXATAMENTE uma das opcoes cadastradas (outro valor aparece como 'Fora da lista'); sim/nao = true/false. NUNCA grave waha_whatsapp_lid, waha_whatsapp_jid nem waha_whatsapp_chat_id (endereco interno de envio do WhatsApp — escrever quebra a entrega). Ex.: {\"cpf\": \"123.456.789-00\", \"data_nascimento\": \"1990-05-17\", \"plano\": \"Premium\"}."
213
213
  },
214
214
  {
215
215
  "name": "avatar_url",
@@ -326,7 +326,7 @@
326
326
  "type": "object",
327
327
  "location": "body",
328
328
  "required": false,
329
- "description": "Atributos"
329
+ "description": "Objeto {chave: valor} (chave = attribute_key de lionchat_custom_attributes_list, modelo contato). Por tipo: texto; numero como numero; data 'AAAA-MM-DD' (data-hora ISO com fuso; hora 'HH:MM'); lista = EXATAMENTE uma das opcoes cadastradas (outro valor aparece como 'Fora da lista'); sim/nao = true/false. NUNCA grave waha_whatsapp_lid, waha_whatsapp_jid nem waha_whatsapp_chat_id (endereco interno de envio do WhatsApp — escrever quebra a entrega). Ex.: {\"cpf\": \"123.456.789-00\", \"data_nascimento\": \"1990-05-17\", \"plano\": \"Premium\"}. O update SOMA: so as chaves enviadas mudam, as demais ficam."
330
330
  },
331
331
  {
332
332
  "name": "avatar",
@@ -1433,7 +1433,7 @@
1433
1433
  "method": "POST",
1434
1434
  "path": "/api/v1/accounts/{account_id}/conversations/filter",
1435
1435
  "title": "Filtrar Conversas",
1436
- "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').\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.",
1436
+ "description": "Filtra conversas com condicoes avancadas (payload de condicoes, mesmas da tela). Ordenacao fixa last_activity_at DESC, 25/pagina.\n\nCHAVES FILTRAVEIS (attribute_key -> operadores): status, chat_type, priority (equal_to/not_equal_to); assignee_id, inbox_id, team_id, campaign_id, captain_assistant_id, labels (equal_to/not_equal_to/is_present/is_not_present); display_id (equal_to/not_equal_to/contains/does_not_contain); created_at, last_activity_at (is_greater_than/is_less_than/days_before — valor de data); browser_language, conversation_language, referer, mail_subject; card_funnel_stage (conversa POR CARD do Kanban — valor 'funnel:<id>' ou 'stage:<id>:<chave_etapa>'); QUALQUER outra chave = atributo personalizado (use custom_attribute_type na condicao: 'conversation_attribute' ou 'contact_attribute'). 'contact_attribute' le a FICHA DO CONTATO da conversa (funciona desde 24/09/2026 — antes era ignorado): e o jeito de achar lead de formulario da Meta por meta_lead_form_name/meta_lead_ad_name/origin_first_*, que so existem no contato. A chave precisa de atributo DE CONTATO cadastrado.\n\nCada condicao: {attribute_key, filter_operator, values[], query_operator:'and'|'or', custom_attribute_type?}. Operador fora da lista da chave = 422 'Operador invalido' (ex: labels NAO aceita 'includes' — use equal_to). [2026-07-25] O operador contains em display_id agora funciona de verdade (busca por trecho do numero da conversa; antes dava erro de banco). NOTA 18/08: data FIXA com is_greater_than/is_less_than corta o dia no FUSO DA CONTA (padrao America/Sao_Paulo), nao mais em UTC — mesmo criterio das datas relativas.",
1437
1437
  "category": "Conversas",
1438
1438
  "params": [
1439
1439
  {
@@ -1593,7 +1593,7 @@
1593
1593
  "method": "POST",
1594
1594
  "path": "/api/v1/accounts/{account_id}/conversations/{id}/custom_attributes",
1595
1595
  "title": "Custom Attributes",
1596
- "description": "Atualiza atributos customizados da conversa. Obrigatorios: id, custom_attributes.",
1596
+ "description": "Atualiza atributos customizados da conversa. Obrigatorios: id, custom_attributes. O custom_attributes enviado SUBSTITUI o conjunto da conversa (menos captain_*): leia antes com lionchat_conversations_show e reenvie tudo — mandar so a chave nova apaga clique do anuncio, gclid e origem.",
1597
1597
  "category": "Conversas",
1598
1598
  "params": [
1599
1599
  {
@@ -1608,7 +1608,7 @@
1608
1608
  "type": "object",
1609
1609
  "location": "body",
1610
1610
  "required": true,
1611
- "description": "Objeto com atributos"
1611
+ "description": "Objeto {chave: valor} dos atributos da CONVERSA. ATENCAO: SUBSTITUI o conjunto inteiro — so os campos internos da IA (captain_*) sobrevivem; tudo que nao vier no envio e APAGADO, inclusive a origem do lead (utm_*, gclid, ctwa_*, origin_*). Leia antes com lionchat_conversations_show e reenvie TODOS os campos com o alterado. Ex.: {\"utm_source\": \"google\", \"motivo_contato\": \"orcamento\"}. Por tipo: data 'AAAA-MM-DD', numero como numero, lista = uma das opcoes cadastradas, sim/nao true/false."
1612
1612
  }
1613
1613
  ],
1614
1614
  "returns": "conversa atualizada",
@@ -2461,21 +2461,21 @@
2461
2461
  "type": "object",
2462
2462
  "location": "body",
2463
2463
  "required": false,
2464
- "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas."
2464
+ "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa, e CADA ETAPA E UM OBJETO com name TEXTO: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas. Etapa como texto, numero ou null derruba a lista de funis e o Kanban da conta."
2465
2465
  },
2466
2466
  {
2467
2467
  "name": "funnel.settings",
2468
2468
  "type": "object",
2469
2469
  "location": "body",
2470
2470
  "required": false,
2471
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; status p/ status_change; vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2471
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id, enabled, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value (id da etapa p/ stage_moved; status p/ status_change; vazio p/ card_created), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (ex.: move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2472
2472
  },
2473
2473
  {
2474
2474
  "name": "funnel.global_custom_attributes",
2475
2475
  "type": "array",
2476
2476
  "location": "body",
2477
2477
  "required": false,
2478
- "description": "Atributos globais"
2478
+ "description": "LISTA de objetos [{name, type, is_list, list_values:[]}]. Ex.: [{\"name\": \"Origem\", \"type\": \"string\", \"is_list\": true, \"list_values\": [\"Google\", \"Meta\"]}]. ATENCAO: este campo do FUNIL nao aparece em tela nenhuma. Os campos da aba Campos do card sao os da CONTA: grave-os com lionchat_kanban_config_update (kanban_config.global_custom_attributes)."
2479
2479
  }
2480
2480
  ],
2481
2481
  "returns": "funil criado (com novo ID)",
@@ -2653,14 +2653,14 @@
2653
2653
  "type": "object",
2654
2654
  "location": "body",
2655
2655
  "required": false,
2656
- "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas."
2656
+ "description": "Etapas do kanban. Objeto com uma chave (slug) por etapa, e CADA ETAPA E UM OBJETO com name TEXTO: {\"novo_lead\": {\"name\": \"Novo Lead\", \"color\": \"#3B82F6\", \"position\": 1, \"description\": \"opcional\"}}. position define a ordem das colunas. Etapa como texto, numero ou null derruba a lista de funis e o Kanban da conta. No update o objeto SUBSTITUI as etapas: etapa que nao vier e REMOVIDA (recusado com 422 STAGE_HAS_ITEMS se tiver cards) — leia com lionchat_funnels_show e reenvie todas."
2657
2657
  },
2658
2658
  {
2659
2659
  "name": "funnel.settings",
2660
2660
  "type": "object",
2661
2661
  "location": "body",
2662
2662
  "required": false,
2663
- "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost' p/ status_change), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2663
+ "description": "Objeto de configuracoes do funil. Chaves: goals[], agents[] e automations[] (automacoes do funil). agents[] = [{id: <id do agente>}] — cada item e um OBJETO com id, nunca numero solto; use lionchat_agents_list para os IDs; o sistema completa sozinho nome, e-mail, cargo e foto de cada agente (e o que as telas mostram). Mande so agentes DESTA conta: id de outra conta fica sem nome e nao da acesso. Cada automacao: {id (formato 'automation_<timestamp_ms>'), enabled: true, trigger_type: 'card_created'|'stage_moved'|'status_change', trigger_value SEMPRE preenchido ('card_created' literal p/ card_created; chave da etapa de destino no hash funnel.stages p/ stage_moved; 'won'|'lost' p/ status_change), action: 'move_to_stage'|'assign_agent'|'create_note'|'update_checklist'|'apply_checklist_template'|'notify_team'|'duplicate_item'|'send_webhook', action_config: {} (move_to_stage->{stage}; assign_agent->{agent_id}; create_note->{note_text}; update_checklist->{checklist_updates:[{checklist_item_id,completed,text}]}; apply_checklist_template->{template_id}; notify_team->{message}; send_webhook->{webhook_url}; duplicate_item->{funnel_id,stage})}. Regras: trigger_value vazio ou enabled=false fazem a UI descartar a automacao no proximo salvar do usuario; stage_moved + move_to_stage nunca executa (anti-loop); notify_team hoje so registra em log (nao notifica ninguem); update_checklist nao aparece na UI (so via API). ATENCAO: gravar settings SUBSTITUI o objeto inteiro — leia o funil (show) e reenvie settings completo (goals+agents+automations). NOVO (2026-07-21): settings.teams[] = [{id: <team_id>}] — vincula TIMES ao funil: membros do time ganham acesso e entram no rodízio, resolvidos AO VIVO (mudou o time, mudou o funil). Lista efetiva = agents[] + membros dos teams[]; vazia = funil aberto a todos. IMPORTANTE: settings é substituído por inteiro — reenvie completo (goals+agents+teams+automations)."
2664
2664
  }
2665
2665
  ],
2666
2666
  "returns": "funil atualizado Inclui resolved_agents: [{id, name, avatar_url, via: 'agent'|'team'}] — quem efetivamente participa do funil (2026-07-21).",
@@ -3176,14 +3176,14 @@
3176
3176
  "type": "array",
3177
3177
  "location": "body",
3178
3178
  "required": false,
3179
- "description": "Array de IDs de agentes"
3179
+ "description": "LISTA de NUMEROS (ids de lionchat_agents_list). Ex.: [5, 12]. O sistema completa nome, e-mail e foto. Objetos {id, ...} sao IGNORADOS em silencio (a lista nao muda)."
3180
3180
  },
3181
3181
  {
3182
3182
  "name": "kanban_item.custom_attributes",
3183
3183
  "type": "object",
3184
3184
  "location": "body",
3185
3185
  "required": false,
3186
- "description": "Atributos customizados"
3186
+ "description": "Coluna propria do card, objeto {chave: valor}. NAO aparece na aba Campos, no filtro do quadro nem na busca — para campo visivel use kanban_item.item_details.custom_attributes (LISTA [{name, type, value}], ver lionchat_kanban_items_update). Enviada, SUBSTITUI o objeto inteiro."
3187
3187
  },
3188
3188
  {
3189
3189
  "name": "kanban_item.timer_started_at",
@@ -3274,21 +3274,21 @@
3274
3274
  "type": "object",
3275
3275
  "location": "body",
3276
3276
  "required": false,
3277
- "description": "Detalhes completos do item"
3277
+ "description": "Objeto com os detalhes do card. MESCLA SO NO 1o NIVEL: cada chave enviada troca a chave inteira no card; as nao enviadas ficam. Lista FECHADA (outras chaves sao descartadas em silencio): title, description, status, reason, win_reason, loss_reason, attributed_to, duplicated_from_id, priority, value (NUMERO; texto de numero como \"1500.5\" e convertido, \"R$ 1.500,00\" e recusado com 422), currency, custom_attributes, offers, closed_offers, closed_offer, deadline_at, scheduling_type, scheduled_at, conversation_id, automations, notes. custom_attributes = campos da aba Campos do card: LISTA [{name, type, value}] onde name+type batem EXATAMENTE com a definicao da CONTA (lionchat_kanban_config_list -> global_custom_attributes). Ex.: [{\"name\": \"Origem do Lead\", \"type\": \"string\", \"value\": \"Google\"}]. A lista e TROCADA inteira: leia o card com lionchat_kanban_items_show e reenvie TODOS os campos. Objeto {chave: valor} no lugar da lista APAGA todos os campos do card. notes e offers tambem sao listas trocadas inteiras. Motivo de ganho/perda: status \"won\"/\"lost\" + win_reason/loss_reason = o id (TEXTO) de um motivo de kanban_config.win_reasons/loss_reasons + reason = o titulo dele. Motivo livre (fora da lista): win_reason/loss_reason nulo e o texto em reason. Ex.: {\"status\": \"lost\", \"loss_reason\": \"perda-preco\", \"reason\": \"Preco alto\"}."
3278
3278
  },
3279
3279
  {
3280
3280
  "name": "kanban_item.assigned_agents",
3281
3281
  "type": "array",
3282
3282
  "location": "body",
3283
3283
  "required": false,
3284
- "description": "Array de IDs de agentes"
3284
+ "description": "LISTA de NUMEROS (ids de lionchat_agents_list). Ex.: [5, 12]. O sistema completa nome, e-mail e foto. Objetos {id, ...} sao IGNORADOS em silencio (a lista nao muda). SUBSTITUI a lista inteira de responsaveis: mande todos que devem ficar."
3285
3285
  },
3286
3286
  {
3287
3287
  "name": "kanban_item.custom_attributes",
3288
3288
  "type": "object",
3289
3289
  "location": "body",
3290
3290
  "required": false,
3291
- "description": "Atributos customizados"
3291
+ "description": "Coluna propria do card, objeto {chave: valor}. NAO aparece na aba Campos, no filtro do quadro nem na busca — para campo visivel use kanban_item.item_details.custom_attributes (LISTA [{name, type, value}], ver lionchat_kanban_items_update). Enviada, SUBSTITUI o objeto inteiro."
3292
3292
  },
3293
3293
  {
3294
3294
  "name": "kanban_item.timer_started_at",
@@ -3984,7 +3984,7 @@
3984
3984
  "method": "POST",
3985
3985
  "path": "/api/v1/accounts/{account_id}/kanban_items/import",
3986
3986
  "title": "Importar Items",
3987
- "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.",
3987
+ "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.",
3988
3988
  "category": "Itens",
3989
3989
  "params": [
3990
3990
  {
@@ -4002,11 +4002,18 @@
4002
4002
  "description": "ID do funil"
4003
4003
  },
4004
4004
  {
4005
- "name": "mapping",
4006
- "type": "object",
4005
+ "name": "inbox_id",
4006
+ "type": "integer",
4007
4007
  "location": "body",
4008
4008
  "required": true,
4009
- "description": "Mapeamento de colunas"
4009
+ "description": "OBRIGATORIO — caixa de entrada (desta conta) onde nascem o contato e a conversa de cada card. Sem ela: 400."
4010
+ },
4011
+ {
4012
+ "name": "mappings",
4013
+ "type": "string",
4014
+ "location": "body",
4015
+ "required": true,
4016
+ "description": "TEXTO JSON (o envio e multipart por causa do arquivo; objeto solto nao e lido) no formato {\"<coluna da planilha>\": \"<destino>\"}. Destinos aceitos: item_details.title, item_details.description, item_details.customer_name, item_details.customer_email, item_details.customer_phone, funnel_stage (nome ou id da etapa) e assigned_agents (so vale junto com agent_mode 'mapping' + agent_mappings). Ex.: '{\"Nome\":\"item_details.title\",\"Telefone\":\"item_details.customer_phone\",\"Etapa\":\"funnel_stage\"}'. Coluna com destino fora da lista e ignorada em silencio."
4010
4017
  }
4011
4018
  ],
4012
4019
  "returns": "status do import (assincrono)",
@@ -4333,14 +4340,14 @@
4333
4340
  "type": "array",
4334
4341
  "location": "body",
4335
4342
  "required": false,
4336
- "description": "Array de strings com diretrizes de resposta"
4343
+ "description": "LISTA de TEXTOS — cada item uma frase: [\"Responda em ate 3 frases\", \"Chame o cliente pelo primeiro nome\"]. Objeto ou lista de objetos NAO serve (o texto chega errado ao prompt)."
4337
4344
  },
4338
4345
  {
4339
4346
  "name": "guardrails",
4340
4347
  "type": "array",
4341
4348
  "location": "body",
4342
4349
  "required": false,
4343
- "description": "Array de strings com guardrails (proibicoes)"
4350
+ "description": "LISTA de TEXTOS (proibicoes) — cada item uma frase: [\"Nunca informe precos\", \"Nao prometa prazo de entrega\"]. Objeto ou lista de objetos NAO serve (o texto chega errado ao prompt)."
4344
4351
  },
4345
4352
  {
4346
4353
  "name": "config.model",
@@ -4558,14 +4565,14 @@
4558
4565
  "type": "array",
4559
4566
  "location": "body",
4560
4567
  "required": false,
4561
- "description": "Array de strings com diretrizes de resposta"
4568
+ "description": "LISTA de TEXTOS — cada item uma frase: [\"Responda em ate 3 frases\", \"Chame o cliente pelo primeiro nome\"]. Objeto ou lista de objetos NAO serve (o texto chega errado ao prompt). No update SUBSTITUI a lista inteira: leia com lionchat_captain_assistants_show e reenvie todas."
4562
4569
  },
4563
4570
  {
4564
4571
  "name": "guardrails",
4565
4572
  "type": "array",
4566
4573
  "location": "body",
4567
4574
  "required": false,
4568
- "description": "Array de strings com guardrails (proibicoes)"
4575
+ "description": "LISTA de TEXTOS (proibicoes) — cada item uma frase: [\"Nunca informe precos\", \"Nao prometa prazo de entrega\"]. Objeto ou lista de objetos NAO serve (o texto chega errado ao prompt). No update SUBSTITUI a lista inteira: leia com lionchat_captain_assistants_show e reenvie todas."
4569
4576
  },
4570
4577
  {
4571
4578
  "name": "config.model",
@@ -4706,6 +4713,20 @@
4706
4713
  "location": "body",
4707
4714
  "required": false,
4708
4715
  "description": "Condicoes para a IA NAO fazer follow-up (ate 3). Array de objetos, ex.: {type, operator, attribute, value, labels:[]}."
4716
+ },
4717
+ {
4718
+ "name": "config.voice_provider",
4719
+ "type": "string",
4720
+ "location": "body",
4721
+ "required": false,
4722
+ "description": "Fornecedor da voz do AUDIO que a IA manda no WhatsApp: 'openai' ou 'elevenlabs'. A ligacao por IA NAO usa mais esta chave — ela mora no agente de ligacao (lionchat_captain_call_agents_update)."
4723
+ },
4724
+ {
4725
+ "name": "config.voice_id",
4726
+ "type": "string",
4727
+ "location": "body",
4728
+ "required": false,
4729
+ "description": "Voz do AUDIO que a IA manda no WhatsApp (catalogo em lionchat_captain_voices_list, sem engine). A voz da LIGACAO mora no agente de ligacao."
4709
4730
  }
4710
4731
  ],
4711
4732
  "returns": "assistente AI atualizado",
@@ -6800,7 +6821,7 @@
6800
6821
  "type": "string",
6801
6822
  "location": "body",
6802
6823
  "required": false,
6803
- "description": "Tipo de autenticacao (none, bearer, basic, etc)"
6824
+ "description": "none | bearer | basic | api_key (formato de auth_config em cada um: ver auth_config)"
6804
6825
  },
6805
6826
  {
6806
6827
  "name": "enabled",
@@ -6814,14 +6835,14 @@
6814
6835
  "type": "object",
6815
6836
  "location": "body",
6816
6837
  "required": false,
6817
- "description": "Configuracao de autenticacao (credenciais conforme auth_type)"
6838
+ "description": "Credenciais conforme auth_type, objeto: bearer {\"token\": \"...\"}; basic {\"username\": \"...\", \"password\": \"...\"}; api_key {\"name\": \"X-Api-Key\", \"key\": \"...\", \"location\": \"header\"} — location PRECISA ser 'header' (sem ele, ou com outro valor, a chave NAO e enviada); none = {}. token/password/key aceitam variavel {{ account.custom_attribute.CHAVE }}."
6818
6839
  },
6819
6840
  {
6820
6841
  "name": "param_schema",
6821
6842
  "type": "array",
6822
6843
  "location": "body",
6823
6844
  "required": false,
6824
- "description": "Array de {name, type, description, required} descrevendo os parametros da tool"
6845
+ "description": "LISTA de objetos, cada item {name, type, description, required}: type = string | integer | number | boolean (outro = 422); description OBRIGATORIA (sem ela = 422 — e o que a IA le para preencher o parametro); required true/false. Ex.: [{\"name\": \"cpf\", \"type\": \"string\", \"description\": \"CPF do cliente, so numeros\", \"required\": true}]."
6825
6846
  }
6826
6847
  ],
6827
6848
  "returns": "assistente AI criado (com novo ID)",
@@ -6927,7 +6948,7 @@
6927
6948
  "type": "string",
6928
6949
  "location": "body",
6929
6950
  "required": false,
6930
- "description": "Tipo de autenticacao (none, bearer, basic, etc)"
6951
+ "description": "none | bearer | basic | api_key (formato de auth_config em cada um: ver auth_config)"
6931
6952
  },
6932
6953
  {
6933
6954
  "name": "enabled",
@@ -6941,14 +6962,14 @@
6941
6962
  "type": "object",
6942
6963
  "location": "body",
6943
6964
  "required": false,
6944
- "description": "Configuracao de autenticacao (credenciais conforme auth_type)"
6965
+ "description": "Credenciais conforme auth_type, objeto: bearer {\"token\": \"...\"}; basic {\"username\": \"...\", \"password\": \"...\"}; api_key {\"name\": \"X-Api-Key\", \"key\": \"...\", \"location\": \"header\"} — location PRECISA ser 'header' (sem ele, ou com outro valor, a chave NAO e enviada); none = {}. token/password/key aceitam variavel {{ account.custom_attribute.CHAVE }}. SUBSTITUI o objeto inteiro: mande tudo de novo."
6945
6966
  },
6946
6967
  {
6947
6968
  "name": "param_schema",
6948
6969
  "type": "array",
6949
6970
  "location": "body",
6950
6971
  "required": false,
6951
- "description": "Array de {name, type, description, required} descrevendo os parametros da tool"
6972
+ "description": "LISTA de objetos, cada item {name, type, description, required}: type = string | integer | number | boolean (outro = 422); description OBRIGATORIA (sem ela = 422 — e o que a IA le para preencher o parametro); required true/false. Ex.: [{\"name\": \"cpf\", \"type\": \"string\", \"description\": \"CPF do cliente, so numeros\", \"required\": true}]. SUBSTITUI a lista inteira."
6952
6973
  }
6953
6974
  ],
6954
6975
  "returns": "assistente AI atualizado",
@@ -7884,7 +7905,7 @@
7884
7905
  "type": "array",
7885
7906
  "location": "body",
7886
7907
  "required": true,
7887
- "description": "Array de {action_name, action_params[]} — 41 nomes aceitos, listados na descrição da tool; formatos iguais aos das automações"
7908
+ "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
7888
7909
  }
7889
7910
  ],
7890
7911
  "returns": "macro criado (com novo ID)",
@@ -7946,7 +7967,7 @@
7946
7967
  "type": "array",
7947
7968
  "location": "body",
7948
7969
  "required": false,
7949
- "description": "Array de {action_name, action_params[]} — 41 nomes aceitos, listados na descrição da tool; formatos iguais aos das automações"
7970
+ "description": "LISTA de objetos {action_name, action_params} — 41 nomes aceitos, listados na descricao da tool; formatos iguais aos das automacoes. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao'). No update a lista SUBSTITUI a anterior: mande TODAS as acoes."
7950
7971
  },
7951
7972
  {
7952
7973
  "name": "visibility",
@@ -9730,7 +9751,7 @@
9730
9751
  "method": "POST",
9731
9752
  "path": "/api/v1/accounts/{account_id}/flows",
9732
9753
  "title": "Criar Flow",
9733
- "description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. conversation_mode: 'individual' (default) | 'group'. Sticky note (type 'note'): data usa title+body+color(yellow|teal|blue|violet|pink|orange|slate)+width+height — NUNCA 'content'. ORGANIZAÇÃO: preencha tags ao criar (reutilizando as tags já existentes nos flows da conta — veja flows_list) pra manter a lista organizada. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference. TIPO DE FLUXO (17/09/2026): o parametro flow_type aceita 'conversation' (padrao) ou 'action' (Fluxo de Acoes). O de ACOES nao fica ligado a caixa nenhuma, roda em QUALQUER conversa de QUALQUER caixa e SO executa acoes — NAO pode ter os blocos send_message, wait_response nem update_group (a validacao recusa o save inteiro), nao aceita inbox_ids e ignora conversation_mode. Use pra regra que vale na empresa toda e nao depende da caixa (ex.: etiqueta 'urgente' -> atribui equipe de suporte). Se precisa FALAR com a pessoa, o tipo e 'conversation'. Pra ferramenta da IA continue usando lionchat_flow_tools_create.",
9754
+ "description": "Cria um flow (FlowBuilder) na conta. Requer Admin. flow_data segue formato Vue Flow {nodes:[], edges:[]}. NODE SCHEMA — start: {label, items:[...]} — os GATILHOS moram em data.items (NUNCA data.triggers), cada item um OBJETO {key, config}. Ex.: {key:'message_received', config:{keywords:['oi','orcamento'], match_type:'contains'}}. config.keywords e LISTA de textos (texto solto quebra o despacho de TODA mensagem da caixa); listas de id vao como LISTA DE TEXTOS — team_ids:['3'], agent_ids:['70'], funnel_ids:['31'] (numero puro [3] nunca casa); label_names:['vip']. nodes e edges sao LISTAS de objetos; exit_conditions (irmao de nodes, no flow_data) e LISTA de {type, value}. send_message: {label, messageItems:[{id, type:'text', content}]} handles: success/no_response/error. wait_response: {label, waitTime, waitUnit:'minutes'|'seconds', validation:'any'|'options'|'regex', acceptedOptions:['1','2'] (se options), regexPattern (se regex), invalidMessage, maxRetries:3, saveTo:'variable'|'contact_name'|'contact_email'|'contact_phone'|'contact_attr'|'conversation_attr'|'', saveVariable, saveAttrKey} — quando validation='options' os handles ficam 'option_{val}' + 'timeout'; senão 'success' + 'timeout' — NUNCA precisa de condition node depois. condition: {label, conditions:[{id, label, field, operator, value}]} handles = 'cond_0','cond_1',... (INDICE no array, NAO o id) + 'default'. action: {label, items:[{key, config:{...}}]} keys comuns assign_team({team_id}), assign_agent({agent_id}), add_label({labels:['slug',...]}), remove_label({labels}), change_status({status}), change_priority({priority}), mute_conversation({}), add_private_note({content}), create_kanban_item({funnel_id, funnel_stage,...}), move_kanban_stage({funnel_id, funnel_stage}), deactivate_flow({}), assign_captain({assistant_id}). api: {label, method, url, headers:[{key,value}], body, apiResponseVar}. set_variable: {label, variables:[{name, value}]}. wait: {label, waitTime, waitUnit}. EDGE SCHEMA: {id, source, target, sourceHandle (opcional, OBRIGATORIO casar com handle exposto pelo node source), type:'deletable', animated:true}. ERROS COMUNS QUE DEVEM SER EVITADOS: (1) action usa items[].config NAO items[].params; (2) send_message usa messageItems NAO items; (3) wait_response com validation='options' NAO precisa de condition node — use sourceHandle='option_X' diretamente; (4) sourceHandle inventado tipo 'c1','c2' nao funciona — sempre usar o handle real; (5) inbox_ids precisa vir aninhado em {flow:{inbox_ids:[]}} no PUT bruto, mas no MCP basta inbox_ids no nivel raiz. Cria novo flow. Obrigatórios: name, channel_type. Valida unicidade quando aplicável. Retorna o flow criado com ID atribuído. POSITIONING (CRITICO): cada node DEVE ter position:{x,y}. Sem isso, todos empilham no canvas no (0,0). Regra basica de layout: start em {x:50,y:300}, espaco horizontal +320 entre nodes sequenciais, ramificacoes em +/-150 vertical. ANTES DE GERAR JSON consulte o resource lionchat://docs/flowbuilder-design-guide (schema completo de cada tipo de node, handles expostos, erros comuns, checklist) e lionchat://docs/flowbuilder-patterns (10 templates prontos pra adaptar). BRAINSTORMING: se faltou info critica (canal, gatilho, conteudo), use o prompt create_flow_brainstorm como banco de perguntas sugeridas — pergunte SO o que falta, sem checklist forcado. APOS GERAR: rode o checklist da secao 6 do design guide antes de submeter (1 node start, todo node com id unico + position + data, todo edge com sourceHandle valido). NUNCA invente sourceHandle (no condition use cond_0/cond_1/default, no wait_response options use option_X, no AI intent use intent_<opcao>). IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. conversation_mode: 'individual' (default) | 'group'. Sticky note (type 'note'): data usa title+body+color(yellow|teal|blue|violet|pink|orange|slate)+width+height — NUNCA 'content'. ORGANIZAÇÃO: preencha tags ao criar (reutilizando as tags já existentes nos flows da conta — veja flows_list) pra manter a lista organizada. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference. TIPO DE FLUXO (17/09/2026): o parametro flow_type aceita 'conversation' (padrao) ou 'action' (Fluxo de Acoes). O de ACOES nao fica ligado a caixa nenhuma, roda em QUALQUER conversa de QUALQUER caixa e SO executa acoes — NAO pode ter os blocos send_message, wait_response nem update_group (a validacao recusa o save inteiro), nao aceita inbox_ids e ignora conversation_mode. Use pra regra que vale na empresa toda e nao depende da caixa (ex.: etiqueta 'urgente' -> atribui equipe de suporte). Se precisa FALAR com a pessoa, o tipo e 'conversation'. Pra ferramenta da IA continue usando lionchat_flow_tools_create.",
9734
9755
  "category": "Flows",
9735
9756
  "params": [
9736
9757
  {
@@ -9773,7 +9794,7 @@
9773
9794
  "type": "object",
9774
9795
  "location": "body",
9775
9796
  "required": false,
9776
- "description": "Estrutura {nodes:[], edges:[]} em formato Vue Flow. CONSULTE A DESCRICAO DO TOOL para schema completo dos nodes (start, send_message, wait_response, condition, action, api, set_variable, wait). Cada node tem campo 'data' com formato especifico por tipo. Edges precisam ter sourceHandle correto (ex: 'option_1', 'success', 'timeout', 'no_response')."
9797
+ "description": "Objeto {nodes:[...], edges:[...], exit_conditions:[...]} em formato Vue Flow — nodes e edges sao LISTAS de objetos. Bloco Inicio: data.items = [{key, config}] (ex.: {\"key\": \"message_received\", \"config\": {\"keywords\": [\"oi\"], \"match_type\": \"contains\"}}); keywords e team_ids/agent_ids/funnel_ids sao LISTAS (ids como texto: [\"3\"]). exit_conditions = LISTA de {type, value}. Cada node tem 'data' com formato proprio (ver descricao da ferramenta e lionchat_flows_schema_reference). Edges precisam de sourceHandle real (ex: 'option_1', 'success', 'timeout', 'no_response')."
9777
9798
  },
9778
9799
  {
9779
9800
  "name": "tags",
@@ -9832,7 +9853,7 @@
9832
9853
  "method": "PUT",
9833
9854
  "path": "/api/v1/accounts/{account_id}/flows/{id}",
9834
9855
  "title": "Atualizar Flow",
9835
- "description": "Atualiza nome, descricao, caixas de entrada ou dados dos blocos. Mesmo schema de flow_data do tool lionchat_flows_create — consulte a descricao daquele tool para o schema completo dos nodes (start, send_message, wait_response, condition, action, api, set_variable) e dos edges. RECAP RAPIDO: action items[].config (nao params); send_message messageItems (nao items); wait_response validation='options' gera handles 'option_X' (dispensa condition node); edges sourceHandle DEVE casar com handle real do node source. Atualiza campos do flow existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, description, inbox_ids, flow_data. IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference.",
9856
+ "description": "Atualiza nome, descricao, caixas de entrada ou dados dos blocos. Mesmo schema de flow_data do tool lionchat_flows_create — consulte a descricao daquele tool para o schema completo dos nodes (start, send_message, wait_response, condition, action, api, set_variable) e dos edges. RECAP RAPIDO: start: {label, items:[...]} — os GATILHOS moram em data.items (NUNCA data.triggers), cada item um OBJETO {key, config}. Ex.: {key:'message_received', config:{keywords:['oi','orcamento'], match_type:'contains'}}. config.keywords e LISTA de textos (texto solto quebra o despacho de TODA mensagem da caixa); listas de id vao como LISTA DE TEXTOS — team_ids:['3'], agent_ids:['70'], funnel_ids:['31'] (numero puro [3] nunca casa); label_names:['vip']. nodes e edges sao LISTAS de objetos; exit_conditions (irmao de nodes, no flow_data) e LISTA de {type, value}. flow_data enviado SUBSTITUI o desenho inteiro (nodes + edges + exit_conditions): leia com lionchat_flows_show e reenvie COMPLETO. action items[].config (nao params); send_message messageItems (nao items); wait_response validation='options' gera handles 'option_X' (dispensa condition node); edges sourceHandle DEVE casar com handle real do node source. Atualiza campos do flow existente. Suporta atualização parcial (PATCH) — só campos enviados são alterados. Campos suportados: name, description, inbox_ids, flow_data. IMPORTANTE: chame lionchat_flows_schema_reference antes pra ver o schema COMPLETO e atualizado (nodes end/ai/note, etiqueta conversa vs contato, webhook embutido, timeout, anti-loop). Pra ferramentas da IA (ai_tool) use lionchat_flow_tools_create. STICKY NOTE: o texto da nota (type note) vai em data.title + data.body — content/label/text deixam a nota EM BRANCO na tela; nunca crie nota sem body. LAYOUT: espace os nodes (colunas a >=320px no x, ramos a >=180px no y; notas AO LADO/ACIMA do trecho, nunca sobre nodes ou linhas). REGRAS 18/08: acao start_flow com flow_id do PROPRIO flow e aceita no save mas IGNORADA EM SILENCIO na execucao (o fluxo para ali) — aponte sempre pra OUTRO flow. Condicoes: preencha operator E field juntos (tabela dos pares no resource flowbuilder-patterns), senao a regra roda certa e aparece errada na tela do cliente. NOVIDADES 01/09/2026 no schema (lionchat_flows_schema_reference): acao send_conversion (Meta/Google Ads/GA4 de dentro do fluxo) e condicao por origem/campanha (attr_config de conversa com origin_kind=paid_ad etc.). NOVIDADES 02/09/2026: (1) send_conversion ganhou event_names — UM evento por destino ({meta, google_ads, ga4}); event_name virou reserva (grave os dois); Google Ads so aceita nome do conversion_action_map. (2) preset 'Origem do lead' (attrScope 'lead_origin', attr_key origin_platform; valores: plataforma ou 'custom:<slug>'). (3) REGRA DE VALOR na condicao de atributo: equal/not_equal/contains/not_contains gravam em values:[...] (LISTA) com value:'' — value solo abre VAZIO na tela do cliente. Ver lionchat_flows_schema_reference.",
9836
9857
  "category": "Flows",
9837
9858
  "params": [
9838
9859
  {
@@ -9868,7 +9889,7 @@
9868
9889
  "type": "object",
9869
9890
  "location": "body",
9870
9891
  "required": false,
9871
- "description": "Estrutura {nodes:[], edges:[]} em formato Vue Flow. Ver descricao do tool lionchat_flows_create para schema dos nodes."
9892
+ "description": "Objeto {nodes:[...], edges:[...], exit_conditions:[...]} em formato Vue Flow — nodes e edges sao LISTAS de objetos. Bloco Inicio: data.items = [{key, config}] (ex.: {\"key\": \"message_received\", \"config\": {\"keywords\": [\"oi\"], \"match_type\": \"contains\"}}); keywords e team_ids/agent_ids/funnel_ids sao LISTAS (ids como texto: [\"3\"]). exit_conditions = LISTA de {type, value}. Cada node tem 'data' com formato proprio (ver descricao da ferramenta e lionchat_flows_schema_reference). Edges precisam de sourceHandle real (ex: 'option_1', 'success', 'timeout', 'no_response'). SUBSTITUI o desenho inteiro: leia com lionchat_flows_show e reenvie nodes + edges + exit_conditions completos."
9872
9893
  },
9873
9894
  {
9874
9895
  "name": "tags",
@@ -10046,7 +10067,7 @@
10046
10067
  "type": "array",
10047
10068
  "location": "body",
10048
10069
  "required": false,
10049
- "description": "Janelas de disponibilidade"
10070
+ "description": "LISTA de janelas, cada item um OBJETO {day_of_week, start_time, end_time}: day_of_week inteiro 0..6 (0 = domingo, 1 = segunda ... 6 = sabado); start_time/end_time 'HH:MM' 24h, inicio multiplo de 5 min e antes do fim; varios blocos no mesmo dia pode, sem sobrepor. Ex.: [{\"day_of_week\": 1, \"start_time\": \"09:00\", \"end_time\": \"12:00\"}, {\"day_of_week\": 1, \"start_time\": \"14:00\", \"end_time\": \"18:00\"}]. Para EDITAR ou REMOVER uma janela existente mande o id dela (e _destroy: true para remover) — item sem id CRIA outra."
10050
10071
  },
10051
10072
  {
10052
10073
  "name": "slug",
@@ -10598,7 +10619,7 @@
10598
10619
  "type": "array",
10599
10620
  "location": "body",
10600
10621
  "required": true,
10601
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'."
10622
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. [{action_name, action_params[]}] Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
10602
10623
  },
10603
10624
  {
10604
10625
  "name": "active",
@@ -10696,7 +10717,7 @@
10696
10717
  "type": "array",
10697
10718
  "location": "body",
10698
10719
  "required": false,
10699
- "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'."
10720
+ "description": "CADA item de actions DEVE ser um OBJETO {action_name (string), action_params (array)} — NUNCA um texto/string solto. Ex.: [{\"action_name\":\"send_message\",\"action_params\":[\"Oi\"]}]. Acoes Actions novas (2026-07-21): 'update_contact_attribute' e 'update_conversation_attribute' — action_params: [{attribute_key, value}], value aceita texto fixo OU variável Liquid (ex. {{contact.phone_number}}); grava atributo personalizado com MERGE (não apaga os demais) e passa pelo porteiro de data. 'pending_conversation' (2026-07-20, sem params) — deixa a conversa PENDENTE (handoff; mensagem nova do cliente NÃO reabre). ATENCAO — 'send_whatsapp_template': action_params: [{name, id, language, category, processed_params}]. 'name' e OBRIGATORIO e e o nome EXATO do modelo aprovado na Meta (o envio acontece por ele); 'language' precisa bater com o idioma aprovado (padrao pt_BR); processed_params: {\"body\": {\"1\": \"{{contact.first_name}}\"}}. NUNCA use template_name/template_id/template_category/template_language — esse e o formato dos nos do FlowBuilder e aqui e IGNORADO: a regra salva com sucesso, aparece na tela e NAO ENVIA NADA, sem erro nem log (incidente real conta 39 em 02/08/2026: 14h sem enviar, 9 leads perdidos). Confira o modelo antes com lionchat_inboxes_whatsapp_templates_list. So funciona em caixa WhatsApp API Oficial (Cloud). REGRA GERAL: action_params e SEMPRE um array (o backend le params[0]) e seu CONTEUDO nao e validado pela API. Se nao souber o formato de uma acao, leia uma regra existente com lionchat_automation_rules_show e copie — nunca invente nome de chave. Formato de TODAS as acoes no resource 'conversation-flows'. MAIS USADOS (action_params e SEMPRE lista): send_message [\"texto\"]; add_private_note [\"texto\"]; add_label/remove_label [\"nome-da-etiqueta\"]; assign_agent [70] ([\"nil\"] desatribui); assign_team [3]; change_status [\"resolved\"|\"open\"|\"pending\"|\"snoozed\"]; change_priority [\"high\"]; send_canned_response [12]; update_conversation_attribute [{\"attribute_key\": \"chave\", \"value\": \"texto\"}]; create_kanban_item [{\"funnel_id\": 31, \"funnel_stage\": \"prospeccao\"}]; move_kanban_item_to_stage [{\"funnel_id\": 31, \"funnel_stage\": \"qualificacao\"}]. Tabela completa no resource conversation-flows ('Acoes de automacao')."
10700
10721
  }
10701
10722
  ],
10702
10723
  "returns": "regra de automação atualizado",
@@ -11207,7 +11228,7 @@
11207
11228
  "type": "object",
11208
11229
  "location": "body",
11209
11230
  "required": true,
11210
- "description": "Wrapper com { name, filter_type (conversation ou contact), query }"
11231
+ "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)."
11211
11232
  }
11212
11233
  ],
11213
11234
  "returns": "filtro personalizado criado (com novo ID)",
@@ -11271,7 +11292,7 @@
11271
11292
  "type": "object",
11272
11293
  "location": "body",
11273
11294
  "required": true,
11274
- "description": "Wrapper com { name, filter_type, query }"
11295
+ "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)."
11275
11296
  }
11276
11297
  ],
11277
11298
  "returns": "filtro personalizado atualizado",
@@ -12173,7 +12194,7 @@
12173
12194
  "type": "object",
12174
12195
  "location": "body",
12175
12196
  "required": false,
12176
- "description": "Atributos"
12197
+ "description": "Objeto {chave: valor} (chave = attribute_key de lionchat_custom_attributes_list, modelo contato). Por tipo: texto; numero como numero; data 'AAAA-MM-DD' (data-hora ISO com fuso; hora 'HH:MM'); lista = EXATAMENTE uma das opcoes cadastradas (outro valor aparece como 'Fora da lista'); sim/nao = true/false. NUNCA grave waha_whatsapp_lid, waha_whatsapp_jid nem waha_whatsapp_chat_id (endereco interno de envio do WhatsApp — escrever quebra a entrega). Ex.: {\"cpf\": \"123.456.789-00\", \"data_nascimento\": \"1990-05-17\", \"plano\": \"Premium\"}. So vale se o contato for NOVO: se ja existir contato com o mesmo identifier/e-mail/telefone, os atributos NAO sao gravados."
12177
12198
  }
12178
12199
  ],
12179
12200
  "returns": "contato criado (com novo ID)",
@@ -15764,7 +15785,7 @@
15764
15785
  "type": "array",
15765
15786
  "location": "body",
15766
15787
  "required": true,
15767
- "description": "Componentes do template"
15788
+ "description": "LISTA de componentes no formato da Meta, cada item um OBJETO com type: HEADER {type, format: TEXT|IMAGE|VIDEO|DOCUMENT, text, example}; BODY {type, text, example: {body_text: [[...]]}} (obrigatorio); FOOTER {type, text}; BUTTONS {type, buttons: [{type: QUICK_REPLY|URL|PHONE_NUMBER, text, url, phone_number, example}]}. Ex.: [{\"type\": \"BODY\", \"text\": \"Ola {{1}}, seu pedido saiu.\", \"example\": {\"body_text\": [[\"Maria\"]]}}]. Variavel {{N}} no corpo exige example. Exemplos completos no resource best-practices (templates)."
15768
15789
  },
15769
15790
  {
15770
15791
  "name": "variable_mapping",
@@ -15868,7 +15889,7 @@
15868
15889
  "method": "POST",
15869
15890
  "path": "/api/v1/accounts/{account_id}/inboxes/{inbox_id}/whatsapp_templates/{id}",
15870
15891
  "title": "Atualizar Template WhatsApp",
15871
- "description": "Atualiza um template de WhatsApp. SOMENTE Channel::Whatsapp Cloud.",
15892
+ "description": "Atualiza um template de WhatsApp. SOMENTE Channel::Whatsapp Cloud. REENVIA o modelo a Meta (status volta para revisao). Para mudar SO o variable_mapping de um modelo aprovado, use lionchat_inboxes_whatsapp_templates_update.",
15872
15893
  "category": "Templates WhatsApp",
15873
15894
  "params": [
15874
15895
  {
@@ -15890,7 +15911,7 @@
15890
15911
  "type": "array",
15891
15912
  "location": "body",
15892
15913
  "required": false,
15893
- "description": "Componentes atualizados"
15914
+ "description": "LISTA de componentes no formato da Meta, cada item um OBJETO com type: HEADER {type, format: TEXT|IMAGE|VIDEO|DOCUMENT, text, example}; BODY {type, text, example: {body_text: [[...]]}} (obrigatorio); FOOTER {type, text}; BUTTONS {type, buttons: [{type: QUICK_REPLY|URL|PHONE_NUMBER, text, url, phone_number, example}]}. Ex.: [{\"type\": \"BODY\", \"text\": \"Ola {{1}}, seu pedido saiu.\", \"example\": {\"body_text\": [[\"Maria\"]]}}]. Variavel {{N}} no corpo exige example. Exemplos completos no resource best-practices (templates). ATENCAO: esta ferramenta REENVIA o modelo a Meta — o status volta para revisao. Para mudar SO o apontamento das variaveis use lionchat_inboxes_whatsapp_templates_update (nao passa pela Meta)."
15894
15915
  },
15895
15916
  {
15896
15917
  "name": "variable_mapping",
@@ -17064,14 +17085,14 @@
17064
17085
  "type": "object",
17065
17086
  "location": "body",
17066
17087
  "required": false,
17067
- "description": "Mapeamento de campos do payload para campos internos (dentro de custom_webhook_integration). Suporta caminhos com indice de array (messages.0.content) — mapeamento POSICIONAL; limites: profundidade 5, 10 itens/array, 500 chaves"
17088
+ "description": "Mapeamento de campos do payload para campos internos (dentro de custom_webhook_integration). Suporta caminhos com indice de array (messages.0.content) — mapeamento POSICIONAL; limites: profundidade 5, 10 itens/array, 500 chaves FORMATO: {\"<caminho no payload>\": \"<destino>\"} — caminho com ponto (cliente.telefone, messages.0.content); destino SEMPRE texto: contact_name, contact_email, contact_phone, contact_company, contact_city, contact_attr_<chave>, conversation_attr_<chave>, cadastral_<campo> (ex.: cadastral_cpf), social_<rede>. Dois caminhos pro mesmo destino sao concatenados; destino fora da lista e ignorado. Ex.: {\"cliente.nome\": \"contact_name\", \"cliente.telefone\": \"contact_phone\"}."
17068
17089
  },
17069
17090
  {
17070
17091
  "name": "event_automation_mapping",
17071
17092
  "type": "object",
17072
17093
  "location": "body",
17073
17094
  "required": false,
17074
- "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17095
+ "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<valor do campo de evento (event_field) no payload>\": {\"automation_id\": 12, \"flow_id\": null}}, ou {\"__all__\": {...}} para qualquer evento (o __all__ vence os demais). Cada valor e um OBJETO."
17075
17096
  },
17076
17097
  {
17077
17098
  "name": "sample_payload",
@@ -17176,14 +17197,14 @@
17176
17197
  "type": "object",
17177
17198
  "location": "body",
17178
17199
  "required": false,
17179
- "description": "Mapeamento de campos do payload para campos internos (dentro de custom_webhook_integration)"
17200
+ "description": "Mapeamento de campos do payload para campos internos (dentro de custom_webhook_integration) FORMATO: {\"<caminho no payload>\": \"<destino>\"} — caminho com ponto (cliente.telefone, messages.0.content); destino SEMPRE texto: contact_name, contact_email, contact_phone, contact_company, contact_city, contact_attr_<chave>, conversation_attr_<chave>, cadastral_<campo> (ex.: cadastral_cpf), social_<rede>. Dois caminhos pro mesmo destino sao concatenados; destino fora da lista e ignorado. Ex.: {\"cliente.nome\": \"contact_name\", \"cliente.telefone\": \"contact_phone\"}. SUBSTITUI o mapa inteiro."
17180
17201
  },
17181
17202
  {
17182
17203
  "name": "event_automation_mapping",
17183
17204
  "type": "object",
17184
17205
  "location": "body",
17185
17206
  "required": false,
17186
- "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17207
+ "description": "Mapeamento de evento para automacao a disparar (dentro de custom_webhook_integration). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<valor do campo de evento (event_field) no payload>\": {\"automation_id\": 12, \"flow_id\": null}}, ou {\"__all__\": {...}} para qualquer evento (o __all__ vence os demais). Cada valor e um OBJETO. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie tudo."
17187
17208
  },
17188
17209
  {
17189
17210
  "name": "sample_payload",
@@ -17378,7 +17399,7 @@
17378
17399
  "type": "object",
17379
17400
  "location": "body",
17380
17401
  "required": false,
17381
- "description": "Mapeamento de evento para automacao (dentro de guru_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17402
+ "description": "Mapeamento de evento para automacao (dentro de guru_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"approved\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Guru (maiuscula/minuscula tanto faz): transacao: approved, waiting_payment, abandoned, refused, canceled, expired, refunded, chargeback, pix_generated, boleto_printed, in_analysis, recovery, trial; assinatura: active, trial, past_due, unpaid, canceled, expired; ingresso: invited, confirmed, checked_in, canceled. Ids de automacao/fluxo de outra conta = 400."
17382
17403
  }
17383
17404
  ],
17384
17405
  "returns": "webhook criado (com novo ID)",
@@ -17483,7 +17504,7 @@
17483
17504
  "type": "object",
17484
17505
  "location": "body",
17485
17506
  "required": false,
17486
- "description": "Mapeamento de evento para automacao (dentro de guru_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17507
+ "description": "Mapeamento de evento para automacao (dentro de guru_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"approved\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Guru (maiuscula/minuscula tanto faz): transacao: approved, waiting_payment, abandoned, refused, canceled, expired, refunded, chargeback, pix_generated, boleto_printed, in_analysis, recovery, trial; assinatura: active, trial, past_due, unpaid, canceled, expired; ingresso: invited, confirmed, checked_in, canceled. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
17487
17508
  }
17488
17509
  ],
17489
17510
  "returns": "webhook atualizado",
@@ -17692,7 +17713,7 @@
17692
17713
  "type": "object",
17693
17714
  "location": "body",
17694
17715
  "required": false,
17695
- "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17716
+ "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"PURCHASE_APPROVED\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Hotmart (maiuscula/minuscula tanto faz): PURCHASE_APPROVED, PURCHASE_COMPLETE, PURCHASE_BILLET_PRINTED, PURCHASE_CANCELED, PURCHASE_REFUNDED, PURCHASE_CHARGEBACK, PURCHASE_EXPIRED, PURCHASE_DELAYED, PURCHASE_PROTEST, SUBSCRIPTION_CANCELLATION, SWITCH_PLAN, UPDATE_SUBSCRIPTION_CHARGE_DATE, CLUB_FIRST_ACCESS, CLUB_MODULE_COMPLETED, PURCHASE_OUT_OF_SHOPPING_CART. Ids de automacao/fluxo de outra conta = 400."
17696
17717
  }
17697
17718
  ],
17698
17719
  "returns": "webhook criado (com novo ID)",
@@ -17790,7 +17811,7 @@
17790
17811
  "type": "object",
17791
17812
  "location": "body",
17792
17813
  "required": false,
17793
- "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
17814
+ "description": "Mapeamento de evento para automacao (dentro de hotmart_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"PURCHASE_APPROVED\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Hotmart (maiuscula/minuscula tanto faz): PURCHASE_APPROVED, PURCHASE_COMPLETE, PURCHASE_BILLET_PRINTED, PURCHASE_CANCELED, PURCHASE_REFUNDED, PURCHASE_CHARGEBACK, PURCHASE_EXPIRED, PURCHASE_DELAYED, PURCHASE_PROTEST, SUBSCRIPTION_CANCELLATION, SWITCH_PLAN, UPDATE_SUBSCRIPTION_CHARGE_DATE, CLUB_FIRST_ACCESS, CLUB_MODULE_COMPLETED, PURCHASE_OUT_OF_SHOPPING_CART. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
17794
17815
  }
17795
17816
  ],
17796
17817
  "returns": "webhook atualizado",
@@ -17999,7 +18020,7 @@
17999
18020
  "type": "object",
18000
18021
  "location": "body",
18001
18022
  "required": false,
18002
- "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18023
+ "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"compra_aprovada\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Kiwify (maiuscula/minuscula tanto faz): compra_aprovada, compra_recusada, compra_reembolsada, chargeback, boleto_gerado, pix_gerado, carrinho_abandonado, subscription_renewed, subscription_canceled, subscription_late. Ids de automacao/fluxo de outra conta = 400."
18003
18024
  }
18004
18025
  ],
18005
18026
  "returns": "webhook criado (com novo ID)",
@@ -18097,7 +18118,7 @@
18097
18118
  "type": "object",
18098
18119
  "location": "body",
18099
18120
  "required": false,
18100
- "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18121
+ "description": "Mapeamento de evento para automacao (dentro de kiwify_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"compra_aprovada\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Kiwify (maiuscula/minuscula tanto faz): compra_aprovada, compra_recusada, compra_reembolsada, chargeback, boleto_gerado, pix_gerado, carrinho_abandonado, subscription_renewed, subscription_canceled, subscription_late. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
18101
18122
  }
18102
18123
  ],
18103
18124
  "returns": "webhook atualizado",
@@ -18306,7 +18327,7 @@
18306
18327
  "type": "object",
18307
18328
  "location": "body",
18308
18329
  "required": false,
18309
- "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18330
+ "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"authorized\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Ticto (maiuscula/minuscula tanto faz): authorized, refused, refunded, chargeback, claimed, close, waiting_payment, bank_slip_created, bank_slip_delayed, pix_created, pix_expired, abandoned_cart, trial, trial_started, trial_ended, subscription_canceled, subscription_delayed, all_charges_paid, card_exchanged, extended, uncanceled. Ids de automacao/fluxo de outra conta = 400."
18310
18331
  }
18311
18332
  ],
18312
18333
  "returns": "webhook criado (com novo ID)",
@@ -18404,7 +18425,7 @@
18404
18425
  "type": "object",
18405
18426
  "location": "body",
18406
18427
  "required": false,
18407
- "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18428
+ "description": "Mapeamento de evento para automacao (dentro de ticto_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"authorized\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Ticto (maiuscula/minuscula tanto faz): authorized, refused, refunded, chargeback, claimed, close, waiting_payment, bank_slip_created, bank_slip_delayed, pix_created, pix_expired, abandoned_cart, trial, trial_started, trial_ended, subscription_canceled, subscription_delayed, all_charges_paid, card_exchanged, extended, uncanceled. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
18408
18429
  }
18409
18430
  ],
18410
18431
  "returns": "webhook atualizado",
@@ -18613,7 +18634,7 @@
18613
18634
  "type": "object",
18614
18635
  "location": "body",
18615
18636
  "required": false,
18616
- "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18637
+ "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"myeduzz.invoice_paid\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Eduzz (maiuscula/minuscula tanto faz): myeduzz.invoice_paid, myeduzz.invoice_canceled, myeduzz.invoice_refunded, myeduzz.invoice_waiting_refund, myeduzz.invoice_refused, myeduzz.invoice_expired, myeduzz.invoice_overdue, myeduzz.invoice_opened, myeduzz.invoice_waiting_payment, myeduzz.invoice_scheduled, sun.cart_abandonment, myeduzz.contract_created, myeduzz.contract_updated, myeduzz.contract_card_attempted. Ids de automacao/fluxo de outra conta = 400."
18617
18638
  }
18618
18639
  ],
18619
18640
  "returns": "webhook criado (com novo ID)",
@@ -18711,7 +18732,7 @@
18711
18732
  "type": "object",
18712
18733
  "location": "body",
18713
18734
  "required": false,
18714
- "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18735
+ "description": "Mapeamento de evento para automacao (dentro de eduzz_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"myeduzz.invoice_paid\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Eduzz (maiuscula/minuscula tanto faz): myeduzz.invoice_paid, myeduzz.invoice_canceled, myeduzz.invoice_refunded, myeduzz.invoice_waiting_refund, myeduzz.invoice_refused, myeduzz.invoice_expired, myeduzz.invoice_overdue, myeduzz.invoice_opened, myeduzz.invoice_waiting_payment, myeduzz.invoice_scheduled, sun.cart_abandonment, myeduzz.contract_created, myeduzz.contract_updated, myeduzz.contract_card_attempted. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
18715
18736
  }
18716
18737
  ],
18717
18738
  "returns": "webhook atualizado",
@@ -18920,7 +18941,7 @@
18920
18941
  "type": "object",
18921
18942
  "location": "body",
18922
18943
  "required": false,
18923
- "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
18944
+ "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"2\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Monetizze (maiuscula/minuscula tanto faz): codigo do evento como TEXTO — '1' aguardando pagamento, '2' compra aprovada, '3' cancelada, '4' reembolsada, '5' bloqueada, '6' completa, '7' carrinho abandonado, '101' assinatura ativa, '102' inadimplente, '103' cancelada, '104' aguardando pagamento. Ids de automacao/fluxo de outra conta = 400."
18924
18945
  }
18925
18946
  ],
18926
18947
  "returns": "webhook criado (com novo ID)",
@@ -19018,7 +19039,7 @@
19018
19039
  "type": "object",
19019
19040
  "location": "body",
19020
19041
  "required": false,
19021
- "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal."
19042
+ "description": "Mapeamento de evento para automacao (dentro de monetizze_webhook). ATENCAO (26/08/2026): conversation_attribute_keys foi REMOVIDA do produto — o backend ignora a chave se gravada. Atributo de conversa mapeado existe so no Meta Lead e no mapeamento de campos (field_mapping) do Webhook Universal. FORMATO: {\"<evento>\": {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO; first_purchase_only e booleano de verdade (true/false, texto 'true' nao vale) e pula renovacoes. Ex.: {\"2\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": true}}. Eventos do Monetizze (maiuscula/minuscula tanto faz): codigo do evento como TEXTO — '1' aguardando pagamento, '2' compra aprovada, '3' cancelada, '4' reembolsada, '5' bloqueada, '6' completa, '7' carrinho abandonado, '101' assinatura ativa, '102' inadimplente, '103' cancelada, '104' aguardando pagamento. Ids de automacao/fluxo de outra conta = 400. SUBSTITUI o mapa inteiro: leia com a ferramenta show e reenvie todos os eventos."
19022
19043
  }
19023
19044
  ],
19024
19045
  "returns": "webhook atualizado",
@@ -19318,14 +19339,14 @@
19318
19339
  "type": "object",
19319
19340
  "location": "body",
19320
19341
  "required": false,
19321
- "description": "Mapeamento de campos (singular), dentro de form. Destino tambem pode ser conversation_attr_<chave> (2026-08-21): o atributo vai pra CONVERSA que a automacao/fluxo mapeado abrir pro lead (sem automacao/fluxo nao nasce conversa e o valor e descartado). Chaves reservadas (imported_from, type, in_reply_to...) sao recusadas; valor convertido pelo TIPO do atributo."
19342
+ "description": "Mapeamento de campos (singular), dentro de form. Destino tambem pode ser conversation_attr_<chave> (2026-08-21): o atributo vai pra CONVERSA que a automacao/fluxo mapeado abrir pro lead (sem automacao/fluxo nao nasce conversa e o valor e descartado). Chaves reservadas (imported_from, type, in_reply_to...) sao recusadas; valor convertido pelo TIPO do atributo. FORMATO: {\"<campo do lead>\": \"<destino>\"}, destino SEMPRE texto: contact_name, contact_email, contact_phone, contact_company, contact_city, contact_attr_<chave>, conversation_attr_<chave>, cadastral_<campo> (ex.: cadastral_cpf), social_<rede>. Ex.: {\"full_name\": \"contact_name\", \"phone_number\": \"contact_phone\", \"cidade\": \"contact_attr_cidade\"}. Destino fora da lista e ignorado. SUBSTITUI o mapa inteiro: leia com lionchat_meta_lead_show e reenvie tudo."
19322
19343
  },
19323
19344
  {
19324
19345
  "name": "event_automation_mapping",
19325
19346
  "type": "object",
19326
19347
  "location": "body",
19327
19348
  "required": false,
19328
- "description": "Mapeamento de automacao de eventos, dentro de form"
19349
+ "description": "Objeto com UMA chave fixa \"__all__\" (vale para todo lead do formulario), dentro de form: {\"__all__\": {\"automation_id\": 12, \"flow_id\": null}} — ou flow_id no lugar. O valor e um OBJETO: numero solto ({\"__all__\": 12}) NAO dispara nada. Ids precisam ser desta conta. SUBSTITUI o objeto inteiro."
19329
19350
  }
19330
19351
  ],
19331
19352
  "returns": "integração Meta Lead atualizado",
@@ -19493,21 +19514,21 @@
19493
19514
  "type": "array",
19494
19515
  "location": "body",
19495
19516
  "required": false,
19496
- "description": "Motivos de ganho do funil. Formato: [{id, title}]"
19517
+ "description": "Motivos de ganho (valem para TODOS os funis da conta). Formato: [{\"id\": \"ganho-indicacao\", \"title\": \"Indicacao\"}]. O id e TEXTO estavel (ex.: \"ganho-indicacao\"), nunca numero — numero e convertido para texto, mas mande texto. A lista SUBSTITUI a atual: leia antes com lionchat_kanban_config_list e reenvie os MESMOS id dos motivos que ja existem (trocar o id tira o nome dos cards ja marcados com ele). Recusado com 422: lista de textos soltos ([\"Preco\"]), motivo sem id, motivo sem title, id repetido. O servidor nao inventa id. [] limpa a lista."
19497
19518
  },
19498
19519
  {
19499
19520
  "name": "kanban_config.loss_reasons",
19500
19521
  "type": "array",
19501
19522
  "location": "body",
19502
19523
  "required": false,
19503
- "description": "Motivos de perda do funil. Formato: [{id, title}]"
19524
+ "description": "Motivos de perda (valem para TODOS os funis da conta). Formato: [{\"id\": \"perda-preco\", \"title\": \"Preco alto\"}]. O id e TEXTO estavel (ex.: \"perda-preco\"), nunca numero — numero e convertido para texto, mas mande texto. A lista SUBSTITUI a atual: leia antes com lionchat_kanban_config_list e reenvie os MESMOS id dos motivos que ja existem (trocar o id tira o nome dos cards ja marcados com ele). Recusado com 422: lista de textos soltos ([\"Preco\"]), motivo sem id, motivo sem title, id repetido. O servidor nao inventa id. [] limpa a lista."
19504
19525
  },
19505
19526
  {
19506
19527
  "name": "kanban_config.global_custom_attributes",
19507
19528
  "type": "array",
19508
19529
  "location": "body",
19509
19530
  "required": false,
19510
- "description": "Atributos personalizados globais dos cards. Formato: [{name, type, is_list, list_values:[]}]"
19531
+ "description": "LISTA de objetos [{name, type, is_list, list_values:[]}] — sao OS campos da aba Campos de todo card. Tipos que a tela cria: string (texto), number, date, boolean; is_list true + list_values = opcoes. Ex.: [{\"name\": \"Origem do Lead\", \"type\": \"string\", \"is_list\": true, \"list_values\": [\"Google\", \"Meta\"]}]. O valor de cada card mora em item_details.custom_attributes e casa por name+type."
19511
19532
  },
19512
19533
  {
19513
19534
  "name": "kanban_config.config",
@@ -19577,21 +19598,21 @@
19577
19598
  "type": "array",
19578
19599
  "location": "body",
19579
19600
  "required": false,
19580
- "description": "Motivos de ganho do funil. Formato: [{id, title}]"
19601
+ "description": "Motivos de ganho (valem para TODOS os funis da conta). Formato: [{\"id\": \"ganho-indicacao\", \"title\": \"Indicacao\"}]. O id e TEXTO estavel (ex.: \"ganho-indicacao\"), nunca numero — numero e convertido para texto, mas mande texto. A lista SUBSTITUI a atual: leia antes com lionchat_kanban_config_list e reenvie os MESMOS id dos motivos que ja existem (trocar o id tira o nome dos cards ja marcados com ele). Recusado com 422: lista de textos soltos ([\"Preco\"]), motivo sem id, motivo sem title, id repetido. O servidor nao inventa id. [] limpa a lista."
19581
19602
  },
19582
19603
  {
19583
19604
  "name": "kanban_config.loss_reasons",
19584
19605
  "type": "array",
19585
19606
  "location": "body",
19586
19607
  "required": false,
19587
- "description": "Motivos de perda do funil. Formato: [{id, title}]"
19608
+ "description": "Motivos de perda (valem para TODOS os funis da conta). Formato: [{\"id\": \"perda-preco\", \"title\": \"Preco alto\"}]. O id e TEXTO estavel (ex.: \"perda-preco\"), nunca numero — numero e convertido para texto, mas mande texto. A lista SUBSTITUI a atual: leia antes com lionchat_kanban_config_list e reenvie os MESMOS id dos motivos que ja existem (trocar o id tira o nome dos cards ja marcados com ele). Recusado com 422: lista de textos soltos ([\"Preco\"]), motivo sem id, motivo sem title, id repetido. O servidor nao inventa id. [] limpa a lista."
19588
19609
  },
19589
19610
  {
19590
19611
  "name": "kanban_config.global_custom_attributes",
19591
19612
  "type": "array",
19592
19613
  "location": "body",
19593
19614
  "required": false,
19594
- "description": "Atributos personalizados globais dos cards. Formato: [{name, type, is_list, list_values:[]}]"
19615
+ "description": "LISTA de objetos [{name, type, is_list, list_values:[]}] — sao OS campos da aba Campos de todo card. Tipos que a tela cria: string (texto), number, date, boolean; is_list true + list_values = opcoes. Ex.: [{\"name\": \"Origem do Lead\", \"type\": \"string\", \"is_list\": true, \"list_values\": [\"Google\", \"Meta\"]}]. O valor de cada card mora em item_details.custom_attributes e casa por name+type. SUBSTITUI a lista inteira: leia com lionchat_kanban_config_list e reenvie todos os campos (campo removido some da aba de todos os cards)."
19595
19616
  },
19596
19617
  {
19597
19618
  "name": "kanban_config.config",
@@ -21899,7 +21920,7 @@
21899
21920
  "type": "array",
21900
21921
  "location": "body",
21901
21922
  "required": false,
21902
- "description": "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: []} (responsavel atual OU time da conversa). 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."
21923
+ "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."
21903
21924
  },
21904
21925
  {
21905
21926
  "name": "audience_mode",
@@ -21948,7 +21969,7 @@
21948
21969
  "type": "object",
21949
21970
  "location": "body",
21950
21971
  "required": false,
21951
- "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."
21972
+ "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)."
21952
21973
  },
21953
21974
  {
21954
21975
  "name": "template_params",
@@ -22034,7 +22055,7 @@
22034
22055
  "type": "array",
22035
22056
  "location": "body",
22036
22057
  "required": false,
22037
- "description": "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: []} (responsavel atual OU time da conversa). 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."
22058
+ "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."
22038
22059
  },
22039
22060
  {
22040
22061
  "name": "audience_mode",
@@ -22132,7 +22153,7 @@
22132
22153
  "type": "array",
22133
22154
  "location": "body",
22134
22155
  "required": true,
22135
- "description": "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: []} (responsavel atual OU time da conversa). 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."
22156
+ "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."
22136
22157
  },
22137
22158
  {
22138
22159
  "name": "audience_mode",
@@ -22153,7 +22174,7 @@
22153
22174
  "type": "array",
22154
22175
  "location": "body",
22155
22176
  "required": false,
22156
- "description": "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)."
22177
+ "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."
22157
22178
  }
22158
22179
  ],
22159
22180
  "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.",
@@ -24388,7 +24409,7 @@
24388
24409
  "type": "object",
24389
24410
  "location": "body",
24390
24411
  "required": false,
24391
- "description": "Mapa { evento: conversion_action_id }"
24412
+ "description": "Mapa {<evento>: '<recurso COMPLETO da acao de conversao>'}. O VALOR e o recurso inteiro, nunca so o numero: 'customers/<customer_id sem hifen>/conversionActions/<id da acao>'. Ex.: {\"Lead\": \"customers/1234567890/conversionActions/987654321\", \"Purchase\": \"customers/1234567890/conversionActions/987654322\"}. Pegue o valor pronto no campo resource_name de lionchat_google_ads_integrations_list_conversion_actions. O valor vai CRU pro Google: numero solto e recusado la, e 10 recusas travam a integracao por 1h. Eventos da tela: Lead, Purchase, Contact, CompleteRegistration, Subscribe, Schedule (a acao send_conversion do fluxo so aceita nome que esteja neste mapa). O update SUBSTITUI o mapa inteiro: leia antes com lionchat_google_ads_integrations_show e reenvie TODOS os eventos."
24392
24413
  }
24393
24414
  ],
24394
24415
  "returns": "{ id, ... }",
@@ -24525,7 +24546,7 @@
24525
24546
  "type": "object",
24526
24547
  "location": "body",
24527
24548
  "required": false,
24528
- "description": "Mapa de eventos personalizados"
24549
+ "description": "Mapa {<evento>: {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO so com essas 3 chaves (outra chave ou valor que nao seja objeto = 422). Ex.: {\"pagamento_confirmado\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": false}}. Eventos: cobranca_criada, vencimento_7d, vencimento_3d, vencimento_1d, vencimento_hoje, vencido, vencido_3d, vencido_7d, vencido_15d, vencido_30d, pagamento_confirmado, pagamento_parcial, cancelado, renegociado. ACHADO 18/09 (lendo o codigo, nao conferido no banco): o disparo compara o mapa com o STATUS da parcela, e nao com o nome do evento — o mapeamento pode nao acionar nada; confira em lionchat_conta_azul_integrations_events antes de prometer ao cliente."
24529
24550
  }
24530
24551
  ],
24531
24552
  "returns": "{ id, status: 'pending' } (201)",
@@ -24563,7 +24584,7 @@
24563
24584
  "type": "object",
24564
24585
  "location": "body",
24565
24586
  "required": false,
24566
- "description": "Novo mapa de eventos"
24587
+ "description": "Mapa {<evento>: {automation_id, flow_id, first_purchase_only}} — cada valor e um OBJETO so com essas 3 chaves (outra chave ou valor que nao seja objeto = 422). Ex.: {\"pagamento_confirmado\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": false}}. Eventos: cobranca_criada, vencimento_7d, vencimento_3d, vencimento_1d, vencimento_hoje, vencido, vencido_3d, vencido_7d, vencido_15d, vencido_30d, pagamento_confirmado, pagamento_parcial, cancelado, renegociado. ACHADO 18/09 (lendo o codigo, nao conferido no banco): o disparo compara o mapa com o STATUS da parcela, e nao com o nome do evento — o mapeamento pode nao acionar nada; confira em lionchat_conta_azul_integrations_events antes de prometer ao cliente. O update SUBSTITUI o mapa inteiro: leia com lionchat_conta_azul_integrations_show e reenvie tudo."
24567
24588
  }
24568
24589
  ],
24569
24590
  "returns": "{ id, ... }",
@@ -24784,14 +24805,14 @@
24784
24805
  "type": "array",
24785
24806
  "location": "body",
24786
24807
  "required": false,
24787
- "description": "Categorias: receivables, payables, sales, purchase_orders, contracts, clients, fiscal"
24808
+ "description": "LISTA de textos. Valores aceitos (em portugues): recebimentos, pagamentos, vendas, os, contratos, clientes, fiscais. Ex.: [\"recebimentos\", \"vendas\"]. Outro valor (ex.: receivables, sales) = 422."
24788
24809
  },
24789
24810
  {
24790
24811
  "name": "event_mapping",
24791
24812
  "type": "object",
24792
24813
  "location": "body",
24793
24814
  "required": false,
24794
- "description": "Mapa de eventos"
24815
+ "description": "Mapa AGRUPADO POR CATEGORIA: {<categoria>: {<evento>: {automation_id, flow_id, first_purchase_only}}}. Ex.: {\"recebimentos\": {\"pagamento_confirmado\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": false}}}. Cada valor e um OBJETO so com essas 3 chaves (outra chave, categoria fora da lista ou valor que nao seja objeto = 422). Eventos por categoria — recebimentos: cobranca_criada, boleto_gerado, pix_gerado, vencimento_3d, vencimento_1d, pagamento_confirmado, cobranca_vencida, cobranca_cancelada; pagamentos: despesa_criada, despesa_paga, despesa_vencida, despesa_cancelada; vendas: pedido_criado, pedido_faturado, pedido_cancelado, pedido_etapa_alterada; os: os_criada, os_faturada, os_concluida, os_cancelada; contratos: contrato_criado, contrato_faturado, contrato_cancelado; clientes: cliente_cadastrado, fornecedor_cadastrado; fiscais: nfe_autorizada, nfe_cancelada, nfse_emitida, nfse_cancelada. ACHADO 18/09 (lendo o codigo, em conserto): o disparo procura o mapa pelo STATUS do titulo, e nao por categoria+evento — hoje este mapeamento pode nao acionar nada; confira em lionchat_omie_integrations_events antes de prometer o disparo ao cliente."
24795
24816
  }
24796
24817
  ],
24797
24818
  "returns": "{ id, status } (201)",
@@ -24843,14 +24864,14 @@
24843
24864
  "type": "array",
24844
24865
  "location": "body",
24845
24866
  "required": false,
24846
- "description": "Novas categorias"
24867
+ "description": "LISTA de textos. Valores aceitos (em portugues): recebimentos, pagamentos, vendas, os, contratos, clientes, fiscais. Ex.: [\"recebimentos\", \"vendas\"]. Outro valor (ex.: receivables, sales) = 422. SUBSTITUI a lista inteira — para ligar/desligar UMA categoria use lionchat_omie_integrations_toggle_category."
24847
24868
  },
24848
24869
  {
24849
24870
  "name": "event_mapping",
24850
24871
  "type": "object",
24851
24872
  "location": "body",
24852
24873
  "required": false,
24853
- "description": "Novo mapa"
24874
+ "description": "Mapa AGRUPADO POR CATEGORIA: {<categoria>: {<evento>: {automation_id, flow_id, first_purchase_only}}}. Ex.: {\"recebimentos\": {\"pagamento_confirmado\": {\"automation_id\": 12, \"flow_id\": null, \"first_purchase_only\": false}}}. Cada valor e um OBJETO so com essas 3 chaves (outra chave, categoria fora da lista ou valor que nao seja objeto = 422). Eventos por categoria — recebimentos: cobranca_criada, boleto_gerado, pix_gerado, vencimento_3d, vencimento_1d, pagamento_confirmado, cobranca_vencida, cobranca_cancelada; pagamentos: despesa_criada, despesa_paga, despesa_vencida, despesa_cancelada; vendas: pedido_criado, pedido_faturado, pedido_cancelado, pedido_etapa_alterada; os: os_criada, os_faturada, os_concluida, os_cancelada; contratos: contrato_criado, contrato_faturado, contrato_cancelado; clientes: cliente_cadastrado, fornecedor_cadastrado; fiscais: nfe_autorizada, nfe_cancelada, nfse_emitida, nfse_cancelada. ACHADO 18/09 (lendo o codigo, em conserto): o disparo procura o mapa pelo STATUS do titulo, e nao por categoria+evento — hoje este mapeamento pode nao acionar nada; confira em lionchat_omie_integrations_events antes de prometer o disparo ao cliente. O update SUBSTITUI o mapa inteiro: leia com lionchat_omie_integrations_show e reenvie tudo."
24854
24875
  }
24855
24876
  ],
24856
24877
  "returns": "{ id, ... }",
@@ -24945,7 +24966,7 @@
24945
24966
  "type": "string",
24946
24967
  "location": "body",
24947
24968
  "required": true,
24948
- "description": "receivables | payables | sales | purchase_orders | contracts | clients | fiscal"
24969
+ "description": "recebimentos | pagamentos | vendas | os | contratos | clientes | fiscais (em portugues; outro valor = 422)"
24949
24970
  },
24950
24971
  {
24951
24972
  "name": "enabled",
@@ -25602,7 +25623,7 @@
25602
25623
  "type": "object",
25603
25624
  "location": "body",
25604
25625
  "required": false,
25605
- "description": "Novas settings"
25626
+ "description": "Objeto de configuracao do app. ATENCAO: SUBSTITUI o objeto inteiro — mandar so api_key APAGA fallback_api_keys e as demais chaves. Leia antes com lionchat_integrations_hooks_show e reenvie tudo. OpenAI: {\"api_key\": \"sk-...\", \"fallback_api_keys\": [\"sk-...\"]} (chaves revalidadas ao trocar)."
25606
25627
  },
25607
25628
  {
25608
25629
  "name": "status",
@@ -25646,7 +25667,7 @@
25646
25667
  "method": "GET",
25647
25668
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations",
25648
25669
  "title": "Listar Integração e-Clínica",
25649
- "description": "Lista a integração e-Clínica da conta (no máximo 1 por conta) com id, status e configurações. Use PRIMEIRO para descobrir o {id} exigido pelas ferramentas de histórico de lembretes. Eventos mapeáveis incluem (23/07) os novos cliente_inclusao_pagamento ('Inclusão de cobrança' — cobrança/carnê criado, ainda não pago; grava eclinica_ultima_cobranca_valor/vencimento/descricao no contato) e controle_laboratorio_novo ('Controle de laboratório' — grava eclinica_laboratorio_data_prevista/data_moldagem/data_entrega/situacao). O mapeamento evento→flow É EDITÁVEL via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI o mapeamento inteiro: leia aqui primeiro e devolva completo). [2026-07-25] Cada linha de reminder_config traz agora event_type ('agendamento' padrao, 'controle_laboratorio_novo' para lembrete de laboratorio/medicacao, 'cliente_inclusao_pagamento' para lembrete de vencimento de cobranca), dispatch_time (hora do disparo, OBRIGATORIA: 'HH:MM' fixo ou formula Liquid com variavel de conta/contato) e o filtro opcional filter_field/filter_operator/filter_value. Os lembretes SAO editaveis via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI a lista inteira: leia aqui primeiro e devolva completa). Cada unidade em units[] traz tambem settings {} (18/08). O atributo eclinica_cor (cor da agenda, hex com #) virou campo fresco dos lembretes: filtravel por filter_field e disponivel como variavel {{cor}}. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao, e paciente com duas consultas no dia recebe DOIS lembretes (o caminho por fluxo descarta o segundo) — avise o cliente antes de trocar fluxo por automacao.",
25670
+ "description": "Lista a integração e-Clínica da conta (no máximo 1 por conta) com id, status e configurações. Use PRIMEIRO para descobrir o {id} exigido pelas ferramentas de histórico de lembretes. Eventos mapeáveis incluem (23/07) os novos cliente_inclusao_pagamento ('Inclusão de cobrança' — cobrança/carnê criado, ainda não pago; grava eclinica_ultima_cobranca_valor/vencimento/descricao no contato) e controle_laboratorio_novo ('Controle de laboratório' — grava eclinica_laboratorio_data_prevista/data_moldagem/data_entrega/situacao). O mapeamento evento→flow É EDITÁVEL via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI o mapeamento inteiro: leia aqui primeiro e devolva completo). [2026-07-25] Cada linha de reminder_config traz agora event_type ('agendamento' padrao, 'controle_laboratorio_novo' para lembrete de laboratorio/medicacao, 'cliente_inclusao_pagamento' para lembrete de vencimento de cobranca), dispatch_time (hora do disparo, OBRIGATORIA: 'HH:MM' fixo ou formula Liquid com variavel de conta/contato) e o filtro opcional filter_field/filter_operator/filter_value. Os lembretes SAO editaveis via MCP desde 31/08/2026 — use lionchat_eclinica_integrations_update (ele SUBSTITUI a lista inteira: leia aqui primeiro e devolva completa). Cada unidade em units[] traz tambem settings {} (18/08). O atributo eclinica_cor (cor da agenda, hex com #) virou campo fresco dos lembretes: filtravel por filter_field e disponivel como variavel {{cor}}. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao.",
25650
25671
  "category": "Integracoes",
25651
25672
  "params": [],
25652
25673
  "returns": "200 {payload: {eclinica_integrations: [...]}}",
@@ -26095,7 +26116,7 @@
26095
26116
  "method": "PATCH",
26096
26117
  "path": "/api/v1/accounts/{account_id}/inboxes/{id}",
26097
26118
  "title": "Atualizar Caixa de Entrada",
26098
- "description": "Atualiza configurações da caixa (nome, saudação, atribuição automática, atributos extras). MUDANÇA DE CONFIG — confirme com o usuário antes. additional_attributes.mark_as_seen (bool, default true, SÓ WhatsApp oficial, 2026-06-11): envia o visto/check azul quando o agente abre a conversa — desligar em coexistência app+API. ATENÇÃO: enviar additional_attributes substitui o objeto; para WAHA prefira não mexer nesse campo (config sensível). Email (sincronizacao de mao dupla, admin, via objeto channel): two_way_sync_enabled, sync_sent, sync_deletions, sync_read, delete_strategy. CAIXA OFICIAL CRIADA A MAO (26/08): channel.provider_config aceita phone_number_id, business_account_id e api_key — mas o objeto SUBSTITUI o salvo: SEMPRE mande o provider_config INTEIRO (leia o atual antes e reenvie tudo com o campo alterado), senao webhook_verify_token e a marca source sao APAGADOS em silencio e a caixa para de receber. Os 3 campos sao validados JUNTOS na Meta a cada gravacao (422 'Invalid Credentials' = algum dos tres errado ou chave vencida). O telefone da caixa e somente leitura.",
26119
+ "description": "Atualiza configurações da caixa (nome, saudação, atribuição automática, atributos extras). MUDANÇA DE CONFIG — confirme com o usuário antes. channel.additional_attributes.mark_as_seen (bool, default true, WhatsApp oficial, 2026-06-11): envia o visto/check azul quando o agente abre a conversa — desligar em coexistência app+API. channel.additional_attributes SOMA no 1o nivel nas caixas de WhatsApp/Instagram/Facebook/TikTok (troca inteiro so na caixa de API); no QR Code mande SO as chaves da tela (accept_*, reject_calls, reject_calls_message, mark_as_seen) com true/false de verdade — o resto e interno do sistema. Email (sincronizacao de mao dupla, admin, via objeto channel): two_way_sync_enabled, sync_sent, sync_deletions, sync_read, delete_strategy. CAIXA OFICIAL CRIADA A MAO (26/08): channel.provider_config aceita phone_number_id, business_account_id e api_key — mas o objeto SUBSTITUI o salvo: SEMPRE mande o provider_config INTEIRO (leia o atual antes e reenvie tudo com o campo alterado), senao webhook_verify_token e a marca source sao APAGADOS em silencio e a caixa para de receber. Os 3 campos sao validados JUNTOS na Meta a cada gravacao (422 'Invalid Credentials' = algum dos tres errado ou chave vencida). O telefone da caixa e somente leitura.",
26099
26120
  "category": "Caixas de Entrada",
26100
26121
  "params": [
26101
26122
  {
@@ -26141,11 +26162,11 @@
26141
26162
  "description": "Bloco de configuracao da Distribuicao Automatica da propria caixa (29/07/2026): { assign_offline_agents (bool — distribuir tambem para quem esta offline), fair_distribution_limit (int — quantas conversas o robo entrega a cada atendente por janela), fair_distribution_window (int — tamanho da janela em SEGUNDOS) }. ATENCAO: o envio SUBSTITUI o bloco INTEIRO — reenvie as chaves que ja existem, senao elas somem. Chave fora dessas 3 e DESCARTADA em silencio (responde 200 e nada muda). Aqui `fair_distribution_limit: 0` E aceito e significa SEM FREIO (na Politica de Atribuicao o 0 e recusado). So vale quando a caixa NAO tem politica vinculada — com politica, este bloco e ignorado e a secao some da tela da caixa."
26142
26163
  },
26143
26164
  {
26144
- "name": "additional_attributes",
26165
+ "name": "channel.additional_attributes",
26145
26166
  "type": "object",
26146
26167
  "location": "body",
26147
26168
  "required": false,
26148
- "description": "Atributos extras (ex: { mark_as_seen: false } no WhatsApp oficial)"
26169
+ "description": "Atributos extras do CANAL — vai DENTRO de channel (o nome antigo additional_attributes, fora de channel, era descartado pelo servidor). Nas caixas WhatsApp (QR Code e oficial), Instagram, Facebook e TikTok a gravacao SOMA no 1o nivel: so as chaves enviadas mudam. Na caixa de API o objeto e TROCADO inteiro. QR Code: so estas chaves sao da tela — accept_status, accept_groups, accept_channels, accept_broadcast, reject_calls, mark_as_seen (true/false de verdade, nunca \"false\" em texto) e reject_calls_message (texto); o resto (sessao, importacao, proxy, migracao, coex) e interno do sistema e NAO deve ser mandado. WhatsApp oficial: mark_as_seen (bool). Ex.: {\"accept_groups\": true, \"reject_calls\": false}."
26149
26170
  },
26150
26171
  {
26151
26172
  "name": "out_of_office_enabled",
@@ -27286,10 +27307,10 @@
27286
27307
  },
27287
27308
  {
27288
27309
  "name": "reassignments",
27289
- "type": "object",
27310
+ "type": "array",
27290
27311
  "location": "body",
27291
27312
  "required": false,
27292
- "description": "Destino dos cards por funil pra cada agente removido (shape da prévia)"
27313
+ "description": "LISTA de objetos — cada item e um OBJETO {agent_id, funnel_id, target_agent_id}, um por (agente removido x funil). Ex.: [{\"agent_id\": 12, \"funnel_id\": 31, \"target_agent_id\": 5}]. Monte a partir de lionchat_team_members_kanban_reassignment_preview: para cada agente e cada funil da previa, escolha target_agent_id entre os eligible_targets. Funil com has_target=false dispensa item (os cards ficam sem dono). Destino ausente ou fora dos eligible_targets = 422 'reassignment_failed' e NADA e aplicado. Objeto unico no lugar da lista nao funciona."
27293
27314
  }
27294
27315
  ],
27295
27316
  "returns": "200 com o time atualizado | 422 { error: 'reassignment_failed', reason } (atômico — nada muda)",
@@ -27649,6 +27670,150 @@
27649
27670
  "lionchat_kanban_items_list"
27650
27671
  ]
27651
27672
  },
27673
+ {
27674
+ "id": "lionchat_kanban_sales_reconciliation_preview",
27675
+ "method": "POST",
27676
+ "path": "/api/v1/accounts/{account_id}/kanban_items/sales_reconciliation/preview",
27677
+ "title": "Conferir planilha de vendas",
27678
+ "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.",
27679
+ "category": "Itens",
27680
+ "params": [
27681
+ {
27682
+ "name": "account_id",
27683
+ "type": "integer",
27684
+ "location": "path",
27685
+ "required": true,
27686
+ "description": "ID da conta"
27687
+ },
27688
+ {
27689
+ "name": "funnel_id",
27690
+ "type": "integer",
27691
+ "location": "body",
27692
+ "required": true,
27693
+ "description": "ID do funil onde os cards vivem"
27694
+ },
27695
+ {
27696
+ "name": "inbox_id",
27697
+ "type": "integer",
27698
+ "location": "body",
27699
+ "required": true,
27700
+ "description": "Caixa de entrada usada pra criar contato e conversa de quem ainda nao tem card"
27701
+ },
27702
+ {
27703
+ "name": "rows",
27704
+ "type": "array",
27705
+ "location": "body",
27706
+ "required": true,
27707
+ "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."
27708
+ }
27709
+ ],
27710
+ "returns": "{ total, erros, conversoes, conversao_ligada, pos_venda, automacoes_de_ganho, responsavel, contagem: { completa, ja_ganho, cria, conferir, erro }, linhas: [...] } — nada e gravado.",
27711
+ "common_use_cases": [
27712
+ "Conferir a planilha do financeiro antes de aplicar",
27713
+ "Saber quantas vendas viram conversao e quantos cards de pos-venda nascem",
27714
+ "Achar as linhas com telefone sem codigo do pais"
27715
+ ],
27716
+ "related_tools": [
27717
+ "lionchat_kanban_sales_reconciliation_apply",
27718
+ "lionchat_kanban_sales_reconciliation_status",
27719
+ "lionchat_funnels_list"
27720
+ ]
27721
+ },
27722
+ {
27723
+ "id": "lionchat_kanban_sales_reconciliation_apply",
27724
+ "method": "POST",
27725
+ "path": "/api/v1/accounts/{account_id}/kanban_items/sales_reconciliation/apply",
27726
+ "title": "Aplicar planilha de vendas",
27727
+ "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.",
27728
+ "category": "Itens",
27729
+ "params": [
27730
+ {
27731
+ "name": "account_id",
27732
+ "type": "integer",
27733
+ "location": "path",
27734
+ "required": true,
27735
+ "description": "ID da conta"
27736
+ },
27737
+ {
27738
+ "name": "funnel_id",
27739
+ "type": "integer",
27740
+ "location": "body",
27741
+ "required": true,
27742
+ "description": "ID do funil onde os cards vivem"
27743
+ },
27744
+ {
27745
+ "name": "inbox_id",
27746
+ "type": "integer",
27747
+ "location": "body",
27748
+ "required": true,
27749
+ "description": "Caixa de entrada usada pra criar contato e conversa de quem ainda nao tem card"
27750
+ },
27751
+ {
27752
+ "name": "rows",
27753
+ "type": "array",
27754
+ "location": "body",
27755
+ "required": true,
27756
+ "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."
27757
+ },
27758
+ {
27759
+ "name": "criar_sem_card",
27760
+ "type": "boolean",
27761
+ "location": "body",
27762
+ "required": false,
27763
+ "description": "Cria card (ja ganho) pra quem nao tem nenhum no funil. Padrao: false"
27764
+ },
27765
+ {
27766
+ "name": "stage",
27767
+ "type": "string",
27768
+ "location": "body",
27769
+ "required": false,
27770
+ "description": "Etapa onde o card novo nasce. Padrao: a primeira etapa do funil"
27771
+ }
27772
+ ],
27773
+ "returns": "{ run_id, status: 'queued', total } — o trabalho roda em segundo plano",
27774
+ "common_use_cases": [
27775
+ "Fechar o mes com a planilha do financeiro",
27776
+ "Corrigir cards que o vendedor esqueceu de marcar como ganho",
27777
+ "Trazer o valor real da venda pro relatorio"
27778
+ ],
27779
+ "related_tools": [
27780
+ "lionchat_kanban_sales_reconciliation_preview",
27781
+ "lionchat_kanban_sales_reconciliation_status"
27782
+ ]
27783
+ },
27784
+ {
27785
+ "id": "lionchat_kanban_sales_reconciliation_status",
27786
+ "method": "GET",
27787
+ "path": "/api/v1/accounts/{account_id}/kanban_items/sales_reconciliation/status/{run_id}",
27788
+ "title": "Andamento da planilha de vendas",
27789
+ "description": "Acompanha a aplicacao de uma planilha de vendas ja enviada. O run_id vem de `lionchat_kanban_sales_reconciliation_apply`. Consulte de tempos em tempos ate o status virar 'completed' ou 'failed'. O registro vive 7 dias.",
27790
+ "category": "Itens",
27791
+ "params": [
27792
+ {
27793
+ "name": "account_id",
27794
+ "type": "integer",
27795
+ "location": "path",
27796
+ "required": true,
27797
+ "description": "ID da conta"
27798
+ },
27799
+ {
27800
+ "name": "run_id",
27801
+ "type": "string",
27802
+ "location": "path",
27803
+ "required": true,
27804
+ "description": "Codigo da rodada, devolvido pela aplicacao"
27805
+ }
27806
+ ],
27807
+ "returns": "{ status, total, completados, valor_atualizado, criados, sem_mudanca, pulados, erros } — 'sem_mudanca' e a linha cujo card ja estava com aquele valor",
27808
+ "common_use_cases": [
27809
+ "Saber se a planilha terminou de ser aplicada",
27810
+ "Contar quantos cards foram completados e quantos foram criados"
27811
+ ],
27812
+ "related_tools": [
27813
+ "lionchat_kanban_sales_reconciliation_apply",
27814
+ "lionchat_kanban_sales_reconciliation_preview"
27815
+ ]
27816
+ },
27652
27817
  {
27653
27818
  "id": "lionchat_search_kanban_items",
27654
27819
  "method": "GET",
@@ -28257,6 +28422,450 @@
28257
28422
  "lionchat_captain_liquid_variables_list"
28258
28423
  ]
28259
28424
  },
28425
+ {
28426
+ "id": "lionchat_captain_call_agents_list",
28427
+ "method": "GET",
28428
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents",
28429
+ "title": "Listar Agentes de Ligacao",
28430
+ "description": "Agente de LIGACAO (area \"Agentes de ligacao\", separada dos agentes de texto desde 24/09/2026). Nao ocupa vaga de IA do plano. Exige Admin ou cargo com captain_manage. Devolve tambem meta.dial_inboxes: as caixas que podem fazer ligacao (LionCalls ligada).",
28431
+ "category": "Assistentes",
28432
+ "params": [],
28433
+ "returns": "{ payload: [agente de ligacao], meta: { dial_inboxes: [{id, name}] } }",
28434
+ "common_use_cases": [
28435
+ "Ver agentes de ligacao configurados",
28436
+ "Descobrir qual caixa pode ligar"
28437
+ ],
28438
+ "related_tools": [
28439
+ "lionchat_captain_call_agents_list",
28440
+ "lionchat_captain_call_agents_update",
28441
+ "lionchat_captain_call_agents_test_call",
28442
+ "lionchat_captain_call_test_phones_list"
28443
+ ]
28444
+ },
28445
+ {
28446
+ "id": "lionchat_captain_call_agents_show",
28447
+ "method": "GET",
28448
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}",
28449
+ "title": "Ver Agente de Ligacao",
28450
+ "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.",
28451
+ "category": "Assistentes",
28452
+ "params": [
28453
+ {
28454
+ "name": "id",
28455
+ "type": "integer",
28456
+ "location": "path",
28457
+ "required": true,
28458
+ "description": "ID do agente de ligacao"
28459
+ }
28460
+ ],
28461
+ "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 }",
28462
+ "common_use_cases": [
28463
+ "Conferir a configuracao antes de editar"
28464
+ ],
28465
+ "related_tools": [
28466
+ "lionchat_captain_call_agents_list",
28467
+ "lionchat_captain_call_agents_update",
28468
+ "lionchat_captain_call_agents_test_call",
28469
+ "lionchat_captain_call_test_phones_list"
28470
+ ]
28471
+ },
28472
+ {
28473
+ "id": "lionchat_captain_call_agents_create",
28474
+ "method": "POST",
28475
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents",
28476
+ "title": "Criar Agente de Ligacao",
28477
+ "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.",
28478
+ "category": "Assistentes",
28479
+ "params": [
28480
+ {
28481
+ "name": "name",
28482
+ "type": "string",
28483
+ "location": "body",
28484
+ "required": false,
28485
+ "description": "Nome do agente de ligacao (ex.: \"Pesquisa de satisfacao\"). Obrigatorio na criacao. Ate 120 caracteres."
28486
+ },
28487
+ {
28488
+ "name": "objective",
28489
+ "type": "string",
28490
+ "location": "body",
28491
+ "required": false,
28492
+ "description": "Objetivo e roteiro da ligacao: o que ela deve conversar. Ate 4000 caracteres."
28493
+ },
28494
+ {
28495
+ "name": "first_message",
28496
+ "type": "string",
28497
+ "location": "body",
28498
+ "required": false,
28499
+ "description": "Primeira frase quando atendem (ex.: \"Oi, tudo bem? Aqui e a Ana...\"). Ate 400 caracteres."
28500
+ },
28501
+ {
28502
+ "name": "style",
28503
+ "type": "string",
28504
+ "location": "body",
28505
+ "required": false,
28506
+ "description": "Jeito de falar ao telefone (tom, ritmo, sotaque). Ate 1200 caracteres."
28507
+ },
28508
+ {
28509
+ "name": "voice_provider",
28510
+ "type": "string",
28511
+ "location": "body",
28512
+ "required": false,
28513
+ "description": "Fornecedor da voz: 'openai' (padrao) ou 'elevenlabs'. E PROPRIO do agente de ligacao — nao mexe na voz do audio da IA no WhatsApp."
28514
+ },
28515
+ {
28516
+ "name": "engine",
28517
+ "type": "string",
28518
+ "location": "body",
28519
+ "required": false,
28520
+ "description": "So na OpenAI: 'gptlive' (padrao; a voz fala enquanto consulta, e o UNICO motor com consultas de agenda e pedidos ao agente de texto) ou 'realtime' (so conversa)."
28521
+ },
28522
+ {
28523
+ "name": "voice_id",
28524
+ "type": "string",
28525
+ "location": "body",
28526
+ "required": false,
28527
+ "description": "Voz. Catalogo em lionchat_captain_voices_list (engine=gptlive para o GPT-Live: aceita alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin, cedar; voz fora disso cai na marin)."
28528
+ },
28529
+ {
28530
+ "name": "elevenlabs_agent_id",
28531
+ "type": "string",
28532
+ "location": "body",
28533
+ "required": false,
28534
+ "description": "Obrigatorio quando voice_provider=elevenlabs: id do agente criado na ElevenLabs."
28535
+ },
28536
+ {
28537
+ "name": "max_duration_seconds",
28538
+ "type": "integer",
28539
+ "location": "body",
28540
+ "required": false,
28541
+ "description": "Duracao maxima da ligacao, 30 a 600 segundos (padrao 180)."
28542
+ },
28543
+ {
28544
+ "name": "captain_assistant_id",
28545
+ "type": "integer",
28546
+ "location": "body",
28547
+ "required": false,
28548
+ "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)."
28549
+ }
28550
+ ],
28551
+ "returns": "agente de ligacao criado",
28552
+ "common_use_cases": [
28553
+ "Criar uma ligacao de pesquisa",
28554
+ "Criar confirmacao de consulta por voz"
28555
+ ],
28556
+ "related_tools": [
28557
+ "lionchat_captain_call_agents_list",
28558
+ "lionchat_captain_call_agents_update",
28559
+ "lionchat_captain_call_agents_test_call",
28560
+ "lionchat_captain_call_test_phones_list"
28561
+ ]
28562
+ },
28563
+ {
28564
+ "id": "lionchat_captain_call_agents_update",
28565
+ "method": "PATCH",
28566
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}",
28567
+ "title": "Atualizar Agente de Ligacao",
28568
+ "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.",
28569
+ "category": "Assistentes",
28570
+ "params": [
28571
+ {
28572
+ "name": "id",
28573
+ "type": "integer",
28574
+ "location": "path",
28575
+ "required": true,
28576
+ "description": "ID do agente de ligacao"
28577
+ },
28578
+ {
28579
+ "name": "name",
28580
+ "type": "string",
28581
+ "location": "body",
28582
+ "required": false,
28583
+ "description": "Nome do agente de ligacao (ex.: \"Pesquisa de satisfacao\"). Obrigatorio na criacao. Ate 120 caracteres."
28584
+ },
28585
+ {
28586
+ "name": "objective",
28587
+ "type": "string",
28588
+ "location": "body",
28589
+ "required": false,
28590
+ "description": "Objetivo e roteiro da ligacao: o que ela deve conversar. Ate 4000 caracteres."
28591
+ },
28592
+ {
28593
+ "name": "first_message",
28594
+ "type": "string",
28595
+ "location": "body",
28596
+ "required": false,
28597
+ "description": "Primeira frase quando atendem (ex.: \"Oi, tudo bem? Aqui e a Ana...\"). Ate 400 caracteres."
28598
+ },
28599
+ {
28600
+ "name": "style",
28601
+ "type": "string",
28602
+ "location": "body",
28603
+ "required": false,
28604
+ "description": "Jeito de falar ao telefone (tom, ritmo, sotaque). Ate 1200 caracteres."
28605
+ },
28606
+ {
28607
+ "name": "voice_provider",
28608
+ "type": "string",
28609
+ "location": "body",
28610
+ "required": false,
28611
+ "description": "Fornecedor da voz: 'openai' (padrao) ou 'elevenlabs'. E PROPRIO do agente de ligacao — nao mexe na voz do audio da IA no WhatsApp."
28612
+ },
28613
+ {
28614
+ "name": "engine",
28615
+ "type": "string",
28616
+ "location": "body",
28617
+ "required": false,
28618
+ "description": "So na OpenAI: 'gptlive' (padrao; a voz fala enquanto consulta, e o UNICO motor com consultas de agenda e pedidos ao agente de texto) ou 'realtime' (so conversa)."
28619
+ },
28620
+ {
28621
+ "name": "voice_id",
28622
+ "type": "string",
28623
+ "location": "body",
28624
+ "required": false,
28625
+ "description": "Voz. Catalogo em lionchat_captain_voices_list (engine=gptlive para o GPT-Live: aceita alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin, cedar; voz fora disso cai na marin)."
28626
+ },
28627
+ {
28628
+ "name": "elevenlabs_agent_id",
28629
+ "type": "string",
28630
+ "location": "body",
28631
+ "required": false,
28632
+ "description": "Obrigatorio quando voice_provider=elevenlabs: id do agente criado na ElevenLabs."
28633
+ },
28634
+ {
28635
+ "name": "max_duration_seconds",
28636
+ "type": "integer",
28637
+ "location": "body",
28638
+ "required": false,
28639
+ "description": "Duracao maxima da ligacao, 30 a 600 segundos (padrao 180)."
28640
+ },
28641
+ {
28642
+ "name": "captain_assistant_id",
28643
+ "type": "integer",
28644
+ "location": "body",
28645
+ "required": false,
28646
+ "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)."
28647
+ }
28648
+ ],
28649
+ "returns": "agente de ligacao atualizado",
28650
+ "common_use_cases": [
28651
+ "Trocar roteiro, voz ou o agente de texto que executa"
28652
+ ],
28653
+ "related_tools": [
28654
+ "lionchat_captain_call_agents_list",
28655
+ "lionchat_captain_call_agents_update",
28656
+ "lionchat_captain_call_agents_test_call",
28657
+ "lionchat_captain_call_test_phones_list"
28658
+ ]
28659
+ },
28660
+ {
28661
+ "id": "lionchat_captain_call_agents_destroy",
28662
+ "method": "DELETE",
28663
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}",
28664
+ "title": "Excluir Agente de Ligacao",
28665
+ "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.",
28666
+ "category": "Assistentes",
28667
+ "params": [
28668
+ {
28669
+ "name": "id",
28670
+ "type": "integer",
28671
+ "location": "path",
28672
+ "required": true,
28673
+ "description": "ID do agente de ligacao"
28674
+ }
28675
+ ],
28676
+ "returns": "204 sem corpo",
28677
+ "common_use_cases": [
28678
+ "Remover agente de ligacao que nao e mais usado"
28679
+ ],
28680
+ "related_tools": [
28681
+ "lionchat_captain_call_agents_list",
28682
+ "lionchat_captain_call_agents_update",
28683
+ "lionchat_captain_call_agents_test_call",
28684
+ "lionchat_captain_call_test_phones_list"
28685
+ ]
28686
+ },
28687
+ {
28688
+ "id": "lionchat_captain_call_agents_duplicate",
28689
+ "method": "POST",
28690
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}/duplicate",
28691
+ "title": "Duplicar Agente de Ligacao",
28692
+ "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. Cria uma copia com \"(cópia)\" no nome.",
28693
+ "category": "Assistentes",
28694
+ "params": [
28695
+ {
28696
+ "name": "id",
28697
+ "type": "integer",
28698
+ "location": "path",
28699
+ "required": true,
28700
+ "description": "ID do agente de ligacao"
28701
+ }
28702
+ ],
28703
+ "returns": "a copia criada",
28704
+ "common_use_cases": [
28705
+ "Criar variacao de um agente de ligacao"
28706
+ ],
28707
+ "related_tools": [
28708
+ "lionchat_captain_call_agents_list",
28709
+ "lionchat_captain_call_agents_update",
28710
+ "lionchat_captain_call_agents_test_call",
28711
+ "lionchat_captain_call_test_phones_list"
28712
+ ]
28713
+ },
28714
+ {
28715
+ "id": "lionchat_captain_call_agents_test_call",
28716
+ "method": "POST",
28717
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}/test_call",
28718
+ "title": "Ligar de Teste",
28719
+ "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. LIGA DE VERDADE para um numero de teste CADASTRADO (lionchat_captain_call_test_phones_list) — o telefone nunca vai no corpo, so o id do numero. Cria contato e conversa reais, pode disparar automacoes de \"conversa criada\" e fica gravada. Limite: 10 por hora na conta. Exige a Ligacao com IA liberada na conta e a linha da caixa conectada; recusa volta 422 com o motivo em message.",
28720
+ "category": "Assistentes",
28721
+ "params": [
28722
+ {
28723
+ "name": "id",
28724
+ "type": "integer",
28725
+ "location": "path",
28726
+ "required": true,
28727
+ "description": "ID do agente de ligacao"
28728
+ },
28729
+ {
28730
+ "name": "test_phone_id",
28731
+ "type": "integer",
28732
+ "location": "body",
28733
+ "required": true,
28734
+ "description": "ID do numero de teste cadastrado"
28735
+ },
28736
+ {
28737
+ "name": "inbox_id",
28738
+ "type": "integer",
28739
+ "location": "body",
28740
+ "required": true,
28741
+ "description": "Caixa que faz a ligacao (uma de meta.dial_inboxes)"
28742
+ }
28743
+ ],
28744
+ "returns": "{ call_id, call_log_id } — acompanhar com lionchat_captain_call_agents_test_call_status",
28745
+ "common_use_cases": [
28746
+ "Testar o agente de ligacao no proprio celular"
28747
+ ],
28748
+ "related_tools": [
28749
+ "lionchat_captain_call_agents_list",
28750
+ "lionchat_captain_call_agents_update",
28751
+ "lionchat_captain_call_agents_test_call",
28752
+ "lionchat_captain_call_test_phones_list"
28753
+ ]
28754
+ },
28755
+ {
28756
+ "id": "lionchat_captain_call_agents_test_call_status",
28757
+ "method": "GET",
28758
+ "path": "/api/v1/accounts/{account_id}/captain/call_agents/{id}/test_call_status",
28759
+ "title": "Andamento da Ligacao de Teste",
28760
+ "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.",
28761
+ "category": "Assistentes",
28762
+ "params": [
28763
+ {
28764
+ "name": "id",
28765
+ "type": "integer",
28766
+ "location": "path",
28767
+ "required": true,
28768
+ "description": "ID do agente de ligacao"
28769
+ },
28770
+ {
28771
+ "name": "call_log_id",
28772
+ "type": "integer",
28773
+ "location": "query",
28774
+ "required": true,
28775
+ "description": "call_log_id devolvido por lionchat_captain_call_agents_test_call"
28776
+ }
28777
+ ],
28778
+ "returns": "{ status: initiated|ringing|active|answered|no_answer|failed|canceled, conversation_display_id, duration_seconds, finished }",
28779
+ "common_use_cases": [
28780
+ "Saber se a ligacao de teste foi atendida e em qual conversa ficou"
28781
+ ],
28782
+ "related_tools": [
28783
+ "lionchat_captain_call_agents_list",
28784
+ "lionchat_captain_call_agents_update",
28785
+ "lionchat_captain_call_agents_test_call",
28786
+ "lionchat_captain_call_test_phones_list"
28787
+ ]
28788
+ },
28789
+ {
28790
+ "id": "lionchat_captain_call_test_phones_list",
28791
+ "method": "GET",
28792
+ "path": "/api/v1/accounts/{account_id}/captain/call_test_phones",
28793
+ "title": "Listar Numeros de Teste de Ligacao",
28794
+ "description": "Numeros autorizados a receber \"Ligar de teste\" dos agentes de ligacao. Exige Admin ou captain_manage.",
28795
+ "category": "Assistentes",
28796
+ "params": [],
28797
+ "returns": "{ payload: [{id, phone, label}] }",
28798
+ "common_use_cases": [
28799
+ "Ver para quem a ligacao de teste pode ligar"
28800
+ ],
28801
+ "related_tools": [
28802
+ "lionchat_captain_call_agents_list",
28803
+ "lionchat_captain_call_agents_update",
28804
+ "lionchat_captain_call_agents_test_call",
28805
+ "lionchat_captain_call_test_phones_list"
28806
+ ]
28807
+ },
28808
+ {
28809
+ "id": "lionchat_captain_call_test_phones_create",
28810
+ "method": "POST",
28811
+ "path": "/api/v1/accounts/{account_id}/captain/call_test_phones",
28812
+ "title": "Cadastrar Numero de Teste de Ligacao",
28813
+ "description": "Autoriza um numero a receber ligacao de teste. Telefone com DDI (10 a 15 digitos); repetido na conta volta 422.",
28814
+ "category": "Assistentes",
28815
+ "params": [
28816
+ {
28817
+ "name": "phone",
28818
+ "type": "string",
28819
+ "location": "body",
28820
+ "required": true,
28821
+ "description": "Telefone com DDI, ex. +5511999998888"
28822
+ },
28823
+ {
28824
+ "name": "label",
28825
+ "type": "string",
28826
+ "location": "body",
28827
+ "required": false,
28828
+ "description": "Nome de quem atende (ate 80 caracteres)"
28829
+ }
28830
+ ],
28831
+ "returns": "numero cadastrado { id, phone, label }",
28832
+ "common_use_cases": [
28833
+ "Cadastrar o proprio celular para testar"
28834
+ ],
28835
+ "related_tools": [
28836
+ "lionchat_captain_call_agents_list",
28837
+ "lionchat_captain_call_agents_update",
28838
+ "lionchat_captain_call_agents_test_call",
28839
+ "lionchat_captain_call_test_phones_list"
28840
+ ]
28841
+ },
28842
+ {
28843
+ "id": "lionchat_captain_call_test_phones_destroy",
28844
+ "method": "DELETE",
28845
+ "path": "/api/v1/accounts/{account_id}/captain/call_test_phones/{id}",
28846
+ "title": "Remover Numero de Teste de Ligacao",
28847
+ "description": "Remove um numero de teste.",
28848
+ "category": "Assistentes",
28849
+ "params": [
28850
+ {
28851
+ "name": "id",
28852
+ "type": "integer",
28853
+ "location": "path",
28854
+ "required": true,
28855
+ "description": "ID do numero de teste"
28856
+ }
28857
+ ],
28858
+ "returns": "204 sem corpo",
28859
+ "common_use_cases": [
28860
+ "Tirar um numero da lista de teste"
28861
+ ],
28862
+ "related_tools": [
28863
+ "lionchat_captain_call_agents_list",
28864
+ "lionchat_captain_call_agents_update",
28865
+ "lionchat_captain_call_agents_test_call",
28866
+ "lionchat_captain_call_test_phones_list"
28867
+ ]
28868
+ },
28260
28869
  {
28261
28870
  "id": "lionchat_captain_liquid_variables_list",
28262
28871
  "method": "GET",
@@ -30544,6 +31153,13 @@
30544
31153
  "location": "query",
30545
31154
  "required": false,
30546
31155
  "description": "openai (padrão) | elevenlabs"
31156
+ },
31157
+ {
31158
+ "name": "engine",
31159
+ "type": "string",
31160
+ "location": "query",
31161
+ "required": false,
31162
+ "description": "Motor da ligacao: 'gptlive' devolve o catalogo do GPT-Live (inclui marin e cedar; NAO inclui fable/nova/onyx, que ele recusa). Sem este parametro devolve a lista do audio de texto. So vale com provider=openai."
30547
31163
  }
30548
31164
  ],
30549
31165
  "returns": "{voices: [{id, name, category, available, ...}], configured: bool, error: null|string, cloning_allowed?}",
@@ -32563,7 +33179,7 @@
32563
33179
  "method": "GET",
32564
33180
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}",
32565
33181
  "title": "Detalhes da Integração e-Clínica",
32566
- "description": "SÓ LEITURA, somente administrador. A integração e-Clínica da conta (1 por conta; o id precisa ser o dela — 404 caso contrário) com status, saúde, mapeamento de eventos, lembretes, webhook_url e as UNIDADES (filiais) com status/token-por-variável/webhook próprio. Mesmo conteúdo de lionchat_eclinica_integrations_list, que já resolve o id. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao, e paciente com duas consultas no dia recebe DOIS lembretes (o caminho por fluxo descarta o segundo) — avise o cliente antes de trocar fluxo por automacao.",
33182
+ "description": "SÓ LEITURA, somente administrador. A integração e-Clínica da conta (1 por conta; o id precisa ser o dela — 404 caso contrário) com status, saúde, mapeamento de eventos, lembretes, webhook_url e as UNIDADES (filiais) com status/token-por-variável/webhook próprio. Mesmo conteúdo de lionchat_eclinica_integrations_list, que já resolve o id. LEMBRETE POR AUTOMACAO (25/08): cada entrada de reminder_config aceita `automation_id` alem do `flow_id` — pelo menos um dos dois (422 sem nenhum); com os DOIS preenchidos a AUTOMACAO vence no disparo. A automacao precisa ser da propria conta (422 senao). ALERTA de regra de negocio ao configurar: o caminho por automacao RODA AS ACOES SEM AVALIAR AS CONDICOES da automacao. Desde 17/09/2026 os DOIS caminhos (fluxo e automacao) mandam um aviso POR CONSULTA: paciente com duas consultas no dia (ou dois pacientes no mesmo celular) recebe um aviso para cada uma, ~10 min um do outro (fila por contato). Quem quer so um por dia monta no FLUXO (condicao num atributo com {{data_consulta}}); na automacao nao da, porque as condicoes dela nao sao avaliadas — avise o cliente antes de trocar fluxo por automacao.",
32567
33183
  "category": "Integracoes",
32568
33184
  "params": [
32569
33185
  {
@@ -32587,7 +33203,7 @@
32587
33203
  "method": "PATCH",
32588
33204
  "path": "/api/v1/accounts/{account_id}/eclinica_integrations/{id}",
32589
33205
  "title": "Configurar Integração e-Clínica (mapeamento de eventos e lembretes)",
32590
- "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 — paciente com duas consultas no dia recebe DOIS lembretes (o caminho por fluxo descarta o segundo).",
33206
+ "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.",
32591
33207
  "category": "Integracoes",
32592
33208
  "params": [
32593
33209
  {
@@ -33245,7 +33861,7 @@
33245
33861
  "type": "object",
33246
33862
  "location": "body",
33247
33863
  "required": false,
33248
- "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."
33864
+ "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."
33249
33865
  }
33250
33866
  ],
33251
33867
  "returns": "o modelo criado (id, name, kind, body, variables, roles_layout, progress)",
@@ -33307,7 +33923,7 @@
33307
33923
  "type": "object",
33308
33924
  "location": "body",
33309
33925
  "required": false,
33310
- "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."
33926
+ "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."
33311
33927
  }
33312
33928
  ],
33313
33929
  "returns": "o modelo atualizado",