@lionchat/mcp-server 1.9.0 → 1.10.1

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
@@ -1207,7 +1207,7 @@
1207
1207
  "description": "So conversas atualizadas nos ultimos N segundos (ex.: 3600 = ultima hora). Util para polling de atividade recente."
1208
1208
  }
1209
1209
  ],
1210
- "returns": "meta (contadores globais) + payload (array de conversas)",
1210
+ "returns": "Objeto com envelope DUPLO: { data: { meta: {...}, payload: [conversas] } }. A lista fica em data.payload (NAO em payload direto). O meta traz exatamente: mine_count, assigned_count, unassigned_count, all_count, groups_count. Cada conversa vem com um array extra `kanban_items` (cards do Kanban visiveis pro usuario). Paginacao real: 25/pagina.",
1211
1211
  "common_use_cases": [
1212
1212
  "Dashboard: contar/exibir conversas",
1213
1213
  "Buscar com filtros antes de outra operação",
@@ -1359,7 +1359,7 @@
1359
1359
  "method": "PATCH",
1360
1360
  "path": "/api/v1/accounts/{account_id}/conversations/{id}",
1361
1361
  "title": "Atualizar Conversa",
1362
- "description": "Atualiza a conversa. So aceita priority e captain_assistant_id (NAO altera status nem custom_attributes).",
1362
+ "description": "Atualiza a conversa. So aceita priority, captain_assistant_id e captain_reply_now (NAO altera status nem custom_attributes).",
1363
1363
  "category": "Conversas",
1364
1364
  "params": [
1365
1365
  {
@@ -1382,6 +1382,13 @@
1382
1382
  "location": "body",
1383
1383
  "required": false,
1384
1384
  "description": "ID do AI Agente (enviar null para desativar)"
1385
+ },
1386
+ {
1387
+ "name": "captain_reply_now",
1388
+ "type": "boolean",
1389
+ "location": "body",
1390
+ "required": false,
1391
+ "description": "Interruptor \"Responder na hora\" ao ATIVAR a IA nesta conversa. Ausente (padrao) ou true = a IA responde em ~2 segundos. false = a IA fica ativa mas so fala quando o cliente escrever. NAO tem nada a ver com o acompanhamento automatico (follow-up): desde 29/07/2026 os dois sao INDEPENDENTES — com o interruptor desligado o follow-up e armado do mesmo jeito. So tem efeito no PATCH que ATIVA a IA (captain_assistant_id passando de vazio para um id)."
1385
1392
  }
1386
1393
  ],
1387
1394
  "returns": "conversa atualizado",
@@ -1956,7 +1963,7 @@
1956
1963
  "description": "Mensagens antes deste ID"
1957
1964
  }
1958
1965
  ],
1959
- "returns": "meta (contadores globais) + payload (array de mensagens)",
1966
+ "returns": "Objeto com `meta` + `payload`. `payload` = array de mensagens, das mais antigas para as mais novas. `meta` NAO tem contadores: traz `labels` (etiquetas da conversa), `additional_attributes`, `contact`, `assignee`, `agent_last_seen_at` e `assignee_last_seen_at`. Sem parametro vem as ULTIMAS 20 mensagens; para paginar use `before` (20 anteriores ao id), `after` (ate 100 posteriores) ou `around` (~50 ao redor de um id).",
1960
1967
  "common_use_cases": [
1961
1968
  "Dashboard: contar/exibir mensagens",
1962
1969
  "Buscar com filtros antes de outra operação",
@@ -3737,7 +3744,7 @@
3737
3744
  "description": "Valor máx"
3738
3745
  }
3739
3746
  ],
3740
- "returns": "meta (contadores globais) + payload (array de itens Kanban)",
3747
+ "returns": "NAO devolve JSON. Devolve um ARQUIVO CSV pra download (text/csv, anexo `kanban_items_<funil>_<data>.csv`), com cabecalho e uma linha por card: id, titulo, descricao, status, prioridade, valor, etapa (nome amigavel), funil, agentes, cliente, email, telefone, criado em, atualizado em, prazo, id da conversa, conversas vinculadas e ofertas. Nao ha `meta` nem `payload` — o corpo e o CSV cru. `funnel_id` e OBRIGATORIO (sem ele volta 400 `{error}`). Filtros opcionais: priorities, value_min, value_max, agent_id, date_start/date_end, scheduled_date_start/scheduled_date_end. So exporta cards das caixas que o usuario pode ver.",
3741
3748
  "common_use_cases": [
3742
3749
  "Dashboard: contar/exibir itens Kanban",
3743
3750
  "Buscar com filtros antes de outra operação",
@@ -4102,7 +4109,7 @@
4102
4109
  "method": "POST",
4103
4110
  "path": "/api/v1/accounts/{account_id}/captain/assistants",
4104
4111
  "title": "Criar Assistente IA",
4105
- "description": "Cria um assistente de IA. Obrigatorios: name, description. Exige Admin; sujeito ao limite do plano (403 se atingir).\n\nCONFIG (2026-06): config faz MERGE PARCIAL no update. Chaves novas: follow_up_steps (ate 3 etapas [{after_minutes>=5, prompt}], soma<=1440min), disabled_tools, offer_ids, media_asset_ids, booking_event_type_ids, activation_label, min/max_response_time. instructions ate 20.000 chars.",
4112
+ "description": "Cria um assistente de IA. Obrigatorios: name, description. Exige Admin; sujeito ao limite do plano (403 se atingir).\n\nCONFIG (2026-06): config faz MERGE PARCIAL no update. Chaves novas: follow_up_steps (ate 3 etapas [{after_minutes>=5, prompt}], soma<=1380min (23h)), disabled_tools, offer_ids, media_asset_ids, booking_event_type_ids, activation_label, min/max_response_time. instructions ate 20.000 chars.",
4106
4113
  "category": "Assistentes",
4107
4114
  "params": [
4108
4115
  {
@@ -4138,7 +4145,7 @@
4138
4145
  "type": "string",
4139
4146
  "location": "body",
4140
4147
  "required": false,
4141
- "description": "Modelo LLM (gpt-4o-mini, gpt-4o, etc). Default: openai_model da conta ou LlmConstants::DEFAULT_MODEL"
4148
+ "description": "Modelo LLM do assistente. O campo NAO E VALIDADO: qualquer texto e aceito e gravado, e o erro so aparece depois, em producao. NUNCA use a familia gpt-5.6 (gpt-5.6-luna / gpt-5.6-terra / gpt-5.6-sol): ela recusa function tools, e como a IA usa ferramenta em TODA resposta, 100% das chamadas falham e o Agente fica MUDO em silencio (removida da plataforma em 29/07). Valores validos hoje — os mesmos 16 da tela: gpt-4.1-nano, gpt-4o-mini, gpt-4.1-mini, gpt-5.4-nano, gpt-5.4-mini, gpt-4o, gpt-4.1, gpt-5-mini, gpt-5.4, o3-mini, o4-mini, gpt-5, gpt-5.2, gpt-5.5, o1, o3. Default: openai_model da conta ou LlmConstants::DEFAULT_MODEL."
4142
4149
  },
4143
4150
  {
4144
4151
  "name": "config.instructions",
@@ -4215,7 +4222,7 @@
4215
4222
  "type": "integer",
4216
4223
  "location": "body",
4217
4224
  "required": false,
4218
- "description": "Tempo em minutos pra disparar follow-up"
4225
+ "description": "Tempo em minutos pra disparar o follow-up (LEGADO — so vale quando config.follow_up_steps esta vazio). Entre 5 e 1380 min (23h). ATENCAO: quando o valor e recusado, a mensagem de erro do servidor ainda diz \"must be between 5 and 1440 minutes\" POR ENGANO — o teto que vale e 1380. Nao fique em tentativa e erro: use 1380."
4219
4226
  },
4220
4227
  {
4221
4228
  "name": "config.follow_up_prompt",
@@ -4229,7 +4236,7 @@
4229
4236
  "type": "array",
4230
4237
  "location": "body",
4231
4238
  "required": false,
4232
- "description": "Cadencia de follow-up: ate 3 etapas [{after_minutes, prompt}]. E ESTE o campo que a tela mostra em 'Instrucoes para a IA neste follow-up' e o que manda de verdade — tem precedencia sobre follow_up_time/follow_up_prompt. Cada after_minutes >= 5 (conta a partir da mensagem anterior) e a soma nao passa de 1440 min (24h). Ex.: [{\"after_minutes\":30,\"prompt\":\"Pergunte se ainda tem interesse\"}]. Aceita array ou string JSON."
4239
+ "description": "Cadencia de follow-up: ate 3 etapas [{after_minutes, prompt}]. E ESTE o campo que a tela mostra em \"Instrucoes para a IA neste follow-up\" e o que manda de verdade — tem precedencia sobre follow_up_time/follow_up_prompt. Cada after_minutes >= 5 (conta a partir da mensagem anterior) e a SOMA nao passa de 1380 min (23h), NAO 1440. [29/07] O teto e 23h porque a janela de 24h do WhatsApp conta da MENSAGEM DO CLIENTE, e a cadencia so comeca depois da resposta da IA: somar 1440 e salvo pela tela antiga mas o envio cai fora da janela e some. Somar mais de 1380 e RECUSADO no salvamento — nao e defeito. Ex.: [{\"after_minutes\":30,\"prompt\":\"Pergunte se ainda tem interesse\"}]. Aceita array ou string JSON."
4233
4240
  },
4234
4241
  {
4235
4242
  "name": "config.disabled_tools",
@@ -4320,7 +4327,7 @@
4320
4327
  "method": "PATCH",
4321
4328
  "path": "/api/v1/accounts/{account_id}/captain/assistants/{id}",
4322
4329
  "title": "Atualizar Assistente IA",
4323
- "description": "Atualiza um assistente de IA. Exige Admin. Para pausar use paused:true (top-level).\n\nCONFIG (2026-06): config faz MERGE PARCIAL no update. Chaves novas: follow_up_steps (ate 3 etapas [{after_minutes>=5, prompt}], soma<=1440min), disabled_tools, offer_ids, media_asset_ids, booking_event_type_ids, activation_label, min/max_response_time. instructions ate 20.000 chars.",
4330
+ "description": "Atualiza um assistente de IA. Exige Admin. Para pausar use paused:true (top-level).\n\nCONFIG (2026-06): config faz MERGE PARCIAL no update. Chaves novas: follow_up_steps (ate 3 etapas [{after_minutes>=5, prompt}], soma<=1380min (23h)), disabled_tools, offer_ids, media_asset_ids, booking_event_type_ids, activation_label, min/max_response_time. instructions ate 20.000 chars.",
4324
4331
  "category": "Assistentes",
4325
4332
  "params": [
4326
4333
  {
@@ -4363,7 +4370,7 @@
4363
4370
  "type": "string",
4364
4371
  "location": "body",
4365
4372
  "required": false,
4366
- "description": "Modelo LLM (gpt-4o-mini, gpt-4o, etc)"
4373
+ "description": "Modelo LLM do assistente. O campo NAO E VALIDADO: qualquer texto e aceito e gravado, e o erro so aparece depois, em producao. NUNCA use a familia gpt-5.6 (gpt-5.6-luna / gpt-5.6-terra / gpt-5.6-sol): ela recusa function tools, e como a IA usa ferramenta em TODA resposta, 100% das chamadas falham e o Agente fica MUDO em silencio (removida da plataforma em 29/07). Valores validos hoje — os mesmos 16 da tela: gpt-4.1-nano, gpt-4o-mini, gpt-4.1-mini, gpt-5.4-nano, gpt-5.4-mini, gpt-4o, gpt-4.1, gpt-5-mini, gpt-5.4, o3-mini, o4-mini, gpt-5, gpt-5.2, gpt-5.5, o1, o3. Default: openai_model da conta ou LlmConstants::DEFAULT_MODEL."
4367
4374
  },
4368
4375
  {
4369
4376
  "name": "config.instructions",
@@ -4440,7 +4447,7 @@
4440
4447
  "type": "integer",
4441
4448
  "location": "body",
4442
4449
  "required": false,
4443
- "description": "Tempo em minutos pra disparar follow-up"
4450
+ "description": "Tempo em minutos pra disparar o follow-up (LEGADO — so vale quando config.follow_up_steps esta vazio). Entre 5 e 1380 min (23h). ATENCAO: quando o valor e recusado, a mensagem de erro do servidor ainda diz \"must be between 5 and 1440 minutes\" POR ENGANO — o teto que vale e 1380. Nao fique em tentativa e erro: use 1380."
4444
4451
  },
4445
4452
  {
4446
4453
  "name": "config.follow_up_prompt",
@@ -4454,7 +4461,7 @@
4454
4461
  "type": "array",
4455
4462
  "location": "body",
4456
4463
  "required": false,
4457
- "description": "Cadencia de follow-up: ate 3 etapas [{after_minutes, prompt}]. E ESTE o campo que a tela mostra em 'Instrucoes para a IA neste follow-up' e o que manda de verdade — tem precedencia sobre follow_up_time/follow_up_prompt. Cada after_minutes >= 5 (conta a partir da mensagem anterior) e a soma nao passa de 1440 min (24h). Ex.: [{\"after_minutes\":30,\"prompt\":\"Pergunte se ainda tem interesse\"}]. Aceita array ou string JSON."
4464
+ "description": "Cadencia de follow-up: ate 3 etapas [{after_minutes, prompt}]. E ESTE o campo que a tela mostra em \"Instrucoes para a IA neste follow-up\" e o que manda de verdade — tem precedencia sobre follow_up_time/follow_up_prompt. Cada after_minutes >= 5 (conta a partir da mensagem anterior) e a SOMA nao passa de 1380 min (23h), NAO 1440. [29/07] O teto e 23h porque a janela de 24h do WhatsApp conta da MENSAGEM DO CLIENTE, e a cadencia so comeca depois da resposta da IA: somar 1440 e salvo pela tela antiga mas o envio cai fora da janela e some. Somar mais de 1380 e RECUSADO no salvamento — nao e defeito. Ex.: [{\"after_minutes\":30,\"prompt\":\"Pergunte se ainda tem interesse\"}]. Aceita array ou string JSON."
4458
4465
  },
4459
4466
  {
4460
4467
  "name": "config.disabled_tools",
@@ -4909,7 +4916,7 @@
4909
4916
  "description": "ID do item"
4910
4917
  }
4911
4918
  ],
4912
- "returns": "meta (contadores globais) + payload (array de cards Kanban)",
4919
+ "returns": "{ item_id, attachments: [ { id, url, filename, content_type, byte_size, created_at } ], attachments_count }. NAO tem meta nem payload — a lista de anexos vem na chave attachments. Sem paginacao: devolve todos os anexos do card.",
4913
4920
  "common_use_cases": [
4914
4921
  "Dashboard: contar/exibir cards Kanban",
4915
4922
  "Buscar com filtros antes de outra operação",
@@ -5069,7 +5076,7 @@
5069
5076
  "description": "Lista automacoes configuradas no Kanban. Lista cards Kanban paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de card Kanban).",
5070
5077
  "category": "Kanban V2",
5071
5078
  "params": [],
5072
- "returns": "meta (contadores globais) + payload (array de cards Kanban)",
5079
+ "returns": "LISTA PURA (array no topo, SEM embrulho meta/payload) — a resposta JA E a lista. E a lista de AUTOMACOES do Kanban (nao de cards). Cada item: id, name, description, active, trigger (objeto), conditions (array), actions (array), account_id, created_at, updated_at. Lista vazia = [].",
5073
5080
  "common_use_cases": [
5074
5081
  "Dashboard: contar/exibir cards Kanban",
5075
5082
  "Buscar com filtros antes de outra operação",
@@ -5228,7 +5235,7 @@
5228
5235
  "method": "GET",
5229
5236
  "path": "/api/v2/accounts/{account_id}/summary_reports/agent",
5230
5237
  "title": "Relatorio por Agente",
5231
- "description": "Relatório por agente — lista métricas (conversas atendidas, tempos médios, CSAT) por cada agente da conta no período. ⚠️ Tempos em SEGUNDOS. [2026-07-24] Aceita inbox_id (opcional) pra ver o desempenho dos agentes DENTRO de uma caixa.",
5238
+ "description": "Relatorio por agente — uma linha por agente da conta com conversas, resolvidas e tempos medios no periodo. ⚠️ Tempos em SEGUNDOS e podem vir NULOS (sem evento no periodo). NAO traz o nome do agente (cruze o `id` com lionchat_agents_list) e NAO traz nenhuma metrica de satisfacao — para CSAT use lionchat_csat_metrics. [2026-07-24] Aceita inbox_id (opcional) pra ver o desempenho dos agentes DENTRO de uma caixa.",
5232
5239
  "category": "Relatorios",
5233
5240
  "params": [
5234
5241
  {
@@ -5250,7 +5257,7 @@
5250
5257
  "type": "boolean",
5251
5258
  "location": "query",
5252
5259
  "required": false,
5253
- "description": "Considerar apenas horario comercial"
5260
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5254
5261
  },
5255
5262
  {
5256
5263
  "name": "inbox_id",
@@ -5260,7 +5267,7 @@
5260
5267
  "description": "Opcional (2026-07-24): so as conversas daquela caixa entram no calculo por agente. Exclusivo deste relatorio (os resumos de time/caixa/etiqueta/canal NAO aceitam)."
5261
5268
  }
5262
5269
  ],
5263
- "returns": "Array por agente de { id, name, conversations_count, avg_first_response_time (seg), avg_reply_time (seg), avg_resolution_time (seg), resolved_count, csat_score_average }",
5270
+ "returns": "Array por agente de { id (user_id), conversations_count, resolved_conversations_count, avg_first_response_time (seg), avg_reply_time (seg), avg_resolution_time (seg) }. NAO existem os campos `name`, `resolved_count` nem `csat_score_average` — pedir satisfacao por aqui devolve vazio e NAO significa que a conta nao tem pesquisa. [29/07] Pode vir uma linha com `id: null` = conversas SEM ATENDENTE; nao e um agente e nao entra em ranking.",
5264
5271
  "common_use_cases": [
5265
5272
  "Ranking de produtividade por agente",
5266
5273
  "Identificar top performers e gargalos",
@@ -5277,7 +5284,7 @@
5277
5284
  "method": "GET",
5278
5285
  "path": "/api/v2/accounts/{account_id}/summary_reports/team",
5279
5286
  "title": "Relatorio por Time",
5280
- "description": "Resumo de metricas por TIME (period). Aceita business_hours.",
5287
+ "description": "Resumo de metricas por TIME no periodo. Aceita business_hours. ⚠️ Tempos em SEGUNDOS e podem vir NULOS. NAO traz o nome do time (cruze o `id` com lionchat_teams_list) e NAO traz satisfacao — para CSAT use lionchat_csat_metrics.",
5281
5288
  "category": "Relatorios",
5282
5289
  "params": [
5283
5290
  {
@@ -5299,10 +5306,10 @@
5299
5306
  "type": "boolean",
5300
5307
  "location": "query",
5301
5308
  "required": false,
5302
- "description": "true = medias consideram so o horario de atendimento configurado"
5309
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5303
5310
  }
5304
5311
  ],
5305
- "returns": "array por time { id, name, conversations_count, avg_resolution_time (seg), avg_first_response_time (seg), avg_reply_time (seg), resolved_count } (sem paginacao/meta)",
5312
+ "returns": "Array por time de { id, conversations_count, resolved_conversations_count, avg_first_response_time (seg), avg_reply_time (seg), avg_resolution_time (seg) } (sem paginacao/meta). NAO existem os campos `name`, `resolved_count` nem `csat_score_average` — pedir satisfacao por aqui devolve vazio e NAO significa que a conta nao tem pesquisa.",
5306
5313
  "common_use_cases": [
5307
5314
  "Dashboard: contar/exibir relatórios",
5308
5315
  "Buscar com filtros antes de outra operação",
@@ -5341,7 +5348,7 @@
5341
5348
  "type": "boolean",
5342
5349
  "location": "query",
5343
5350
  "required": false,
5344
- "description": "true = medias consideram so o horario de atendimento configurado"
5351
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5345
5352
  }
5346
5353
  ],
5347
5354
  "returns": "array por inbox (mesma estrutura do resumo); sem meta",
@@ -5383,7 +5390,7 @@
5383
5390
  "type": "boolean",
5384
5391
  "location": "query",
5385
5392
  "required": false,
5386
- "description": "true = medias consideram so o horario de atendimento configurado"
5393
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5387
5394
  }
5388
5395
  ],
5389
5396
  "returns": "array por label; sem meta",
@@ -5403,7 +5410,7 @@
5403
5410
  "method": "GET",
5404
5411
  "path": "/api/v2/accounts/{account_id}/summary_reports/channel",
5405
5412
  "title": "Relatorio por Canal",
5406
- "description": "Resumo de metricas por CANAL (period). Range max 6 meses. Aceita business_hours.",
5413
+ "description": "Distribuicao de conversas por CANAL no periodo. Range maximo de 6 meses. [29/07] A resposta e um OBJETO indexado pelo tipo de canal (nao um array), e passou a incluir a chave `Channel::None` = conversas de caixa EXCLUIDA (a caixa some, a conversa fica). Ignorar essa chave subconta o total: medido em producao, a conta 60 perdia 76% e a conta 40 perdia 38%. Some TODAS as chaves do objeto ao dar o total.",
5407
5414
  "category": "Relatorios",
5408
5415
  "params": [
5409
5416
  {
@@ -5425,10 +5432,10 @@
5425
5432
  "type": "boolean",
5426
5433
  "location": "query",
5427
5434
  "required": false,
5428
- "description": "true = medias consideram so o horario de atendimento configurado"
5435
+ "description": "SEM EFEITO neste relatorio — ele so CONTA conversas por status, nao calcula nenhum tempo. Mandar true nao muda nada na resposta."
5429
5436
  }
5430
5437
  ],
5431
- "returns": "array por canal; sem meta",
5438
+ "returns": "OBJETO { \"<tipo de canal>\": { open, resolved, pending, snoozed, muted, total } }, uma chave por tipo (ex.: \"Channel::Whatsapp\", \"Channel::Waha\", \"Channel::Instagram\") mais \"Channel::None\" = conversas cuja caixa foi excluida. `total` ja soma os 5 status daquele canal, inclusive `muted` (silenciadas). Sem meta e sem paginacao.",
5432
5439
  "common_use_cases": [
5433
5440
  "Dashboard: contar/exibir relatórios",
5434
5441
  "Buscar com filtros antes de outra operação",
@@ -5495,7 +5502,7 @@
5495
5502
  "type": "boolean",
5496
5503
  "location": "query",
5497
5504
  "required": false,
5498
- "description": "Filtrar por horario comercial"
5505
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5499
5506
  },
5500
5507
  {
5501
5508
  "name": "timezone_offset",
@@ -5522,7 +5529,7 @@
5522
5529
  "method": "GET",
5523
5530
  "path": "/api/v2/accounts/{account_id}/reports/summary",
5524
5531
  "title": "Resumo Geral",
5525
- "description": "Retorna resumo geral de métricas da conta no período. Inclui contagens (conversas, mensagens, resoluções) e tempos médios (1ª resposta, resolução). Compara automaticamente com período anterior via campo `previous`. ⚠️ Tempos sempre em SEGUNDOS.",
5532
+ "description": "Retorna resumo geral de metricas da conta no periodo. Inclui contagens (conversas, mensagens, resolucoes) e tempos (1a resposta, resolucao, resposta) em MEDIA e em MEDIANA. Compara automaticamente com o periodo anterior via campo `previous`. ⚠️ Tempos sempre em SEGUNDOS. [29/07] A TELA mostra a MEDIANA nos dois cartoes de tempo, porque a media e distorcida pela IDADE de conversa antiga respondida no periodo — medido na conta 38: media de 164,6 HORAS contra mediana de 1,1 HORA. Ao responder \"quanto tempo levamos pra responder?\", use median_* e diga que e a mediana; so cite a media se pedirem.",
5526
5533
  "category": "Relatorios",
5527
5534
  "params": [
5528
5535
  {
@@ -5558,7 +5565,7 @@
5558
5565
  "type": "boolean",
5559
5566
  "location": "query",
5560
5567
  "required": false,
5561
- "description": "Filtrar por horario comercial"
5568
+ "description": "true = as MEDIAS contam so o expediente — e so o das caixas que TEM horario de atendimento configurado (working_hours_enabled). [29/07] Nenhuma caixa configurada = os tempos voltam NULOS (travessao na tela), NAO zero. Evento gravado ANTES de 29/07 guarda 0 fabricado e puxa a media pra baixo; periodo que atravessa 29/07 mistura os dois e NAO e confiavel. NAO ligue por padrao: sem expediente configurado a resposta vira \"tempo medio de primeira resposta: 0 segundos\"."
5562
5569
  },
5563
5570
  {
5564
5571
  "name": "timezone_offset",
@@ -5568,7 +5575,7 @@
5568
5575
  "description": "Deslocamento de fuso em horas (ex: -3). NAO altera os totais do summary — so afeta agrupamento em endpoints de serie temporal."
5569
5576
  }
5570
5577
  ],
5571
- "returns": "{ conversations_count, incoming_messages_count, outgoing_messages_count, resolutions_count, avg_first_response_time (seg), avg_resolution_time (seg), previous: {...mesma estrutura...} }",
5578
+ "returns": "{ conversations_count, incoming_messages_count, outgoing_messages_count, resolutions_count, avg_first_response_time (seg), avg_resolution_time (seg), median_first_response_time (seg), median_resolution_time (seg), reply_time (seg — tempo medio de resposta), previous: {...mesma estrutura...} }",
5572
5579
  "common_use_cases": [
5573
5580
  "Pergunta \"como tá o desempenho da semana?\"",
5574
5581
  "Resumo executivo pra dashboard",
@@ -5617,7 +5624,7 @@
5617
5624
  "type": "boolean",
5618
5625
  "location": "query",
5619
5626
  "required": false,
5620
- "description": "Filtrar por horario comercial"
5627
+ "description": "SEM EFEITO neste relatorio — ele so CONTA conversas por status, nao calcula nenhum tempo. Mandar true nao muda nada na resposta."
5621
5628
  },
5622
5629
  {
5623
5630
  "name": "timezone_offset",
@@ -5877,7 +5884,7 @@
5877
5884
  "method": "GET",
5878
5885
  "path": "/api/v2/accounts/{account_id}/live_reports/conversation_metrics",
5879
5886
  "title": "Metricas em Tempo Real",
5880
- "description": "Metricas ao vivo de conversas (conversation_metrics). Filtro opcional team_id. [2026-07-24] Aceita tambem inbox_id e assignee_id (opcionais) — e o mesmo recorte da tela Visao Geral. Combinaveis com team_id.",
5887
+ "description": "Metricas AO VIVO de conversas (conversation_metrics). Filtros opcionais: team_id, inbox_id, assignee_id (combinaveis) — e o mesmo recorte da tela Visao Geral. [29/07] A FILA REAL de quem ainda espera e `open + pending + snoozed`, nunca so `open`: na conta 19 o cartao mostrava 105 abertas havendo 3.883 conversas sem resolucao (3.777 pendentes + 1 adiada), e o gestor lia que estava tranquilo com a fila cheia. Sempre some as tres ao responder \"quantas estao esperando agora?\".",
5881
5888
  "category": "Relatorios",
5882
5889
  "params": [
5883
5890
  {
@@ -5902,7 +5909,7 @@
5902
5909
  "description": "Opcional (2026-07-24): recorta as metricas por UM atendente responsavel."
5903
5910
  }
5904
5911
  ],
5905
- "returns": "{ open, unattended, unassigned, pending }",
5912
+ "returns": "{ open, unattended, unassigned, pending, snoozed } — `snoozed` (adiadas) entrou em 29/07. Fila real = open + pending + snoozed. `unattended`/`unassigned` sao subconjuntos de `open`, nao somam com ele.",
5906
5913
  "common_use_cases": [
5907
5914
  "Dashboard: contar/exibir relatórios",
5908
5915
  "Buscar com filtros antes de outra operação",
@@ -6026,7 +6033,7 @@
6026
6033
  "description": "Lista as ferramentas do assistente (duplicata de tools).",
6027
6034
  "category": "Assistentes",
6028
6035
  "params": [],
6029
- "returns": "meta (contadores globais) + payload (array de assistentes AI)",
6036
+ "returns": "Lista pura (array no topo, sem embrulho meta/payload): cada item e uma FERRAMENTA do assistente com id, title, description, icon, custom, kind ('native' | 'custom' | 'flow'), enabled e binding (so quando a ferramenta aceita parametro fixado). Nao sao assistentes. Sem paginacao. Aceita ?assistant_id (marca enabled/disabled) e ?include_flows=true (soma as flow tools) — include_flows SO tem efeito quando assistant_id tambem e enviado; sozinho ele e ignorado em silencio e a lista volta sem nenhuma flow tool.",
6030
6037
  "common_use_cases": [
6031
6038
  "Dashboard: contar/exibir assistentes AI",
6032
6039
  "Buscar com filtros antes de outra operação",
@@ -6061,7 +6068,7 @@
6061
6068
  "description": "Filtra cenarios ativos/inativos (true/false)"
6062
6069
  }
6063
6070
  ],
6064
- "returns": "meta (contadores globais) + payload (array de assistentes AI)",
6071
+ "returns": "Objeto com `payload` + `meta`. `payload` = array de CENARIOS do assistente (id, title, description, instruction, tools, tool_bindings, enabled, assistant_id, account_id, datas e um resumo do assistente) — NAO e lista de assistentes. `meta` traz `total_count` e `page`, sendo que `page` vem sempre 1 (esta lista nao pagina). Por padrao devolve so os cenarios ativos; use `enabled=all` para incluir os desativados, ou `enabled=false` so os desativados.",
6065
6072
  "common_use_cases": [
6066
6073
  "Dashboard: contar/exibir assistentes AI",
6067
6074
  "Buscar com filtros antes de outra operação",
@@ -6554,7 +6561,7 @@
6554
6561
  "description": "Filtra as threads do Copiloto pela conversa (conversation_display_id)."
6555
6562
  }
6556
6563
  ],
6557
- "returns": "meta (contadores globais) + payload (array de assistentes AI)",
6564
+ "returns": "`{ payload: [...] }` — sem meta. E a lista de THREADS DO COPILOTO (conversas do usuario com o Copiloto), NAO de assistentes de IA. Cada item traz id, title, created_at (unix), account_id, `user` (dados do usuario dono da thread) e `assistant` (dados do assistente usado). Lista so as threads do usuario logado, mais recentes primeiro, 5 por pagina (parametro `page`). Com `conversation_id` filtra as threads daquela conversa. Nao ha contador total na resposta.",
6558
6565
  "common_use_cases": [
6559
6566
  "Dashboard: contar/exibir assistentes AI",
6560
6567
  "Buscar com filtros antes de outra operação",
@@ -6624,7 +6631,7 @@
6624
6631
  "description": "ID da thread"
6625
6632
  }
6626
6633
  ],
6627
- "returns": "meta (contadores globais) + payload (array de assistentes AI)",
6634
+ "returns": "Objeto `{ payload: [...] }` — SEM meta e SEM contadores. O array em `payload` traz as MENSAGENS da thread do Copilot (nao assistentes), em ordem cronologica crescente (mais antigas primeiro), ate 1000 por pagina. Cada mensagem tem id, message (objeto com o conteudo; em proposta de acao vem `action` com tool/args/status), message_type (user/assistant/assistant_thinking), created_at (timestamp UNIX em segundos), account_id e copilot_thread (dados da thread). ATENCAO: esta ferramenta NAO tem parametro de pagina — se vierem 1000 itens, a resposta esta truncada e NAO ha como pedir a proxima pagina por aqui (mandar `page` e ignorado em silencio e devolve a mesma primeira pagina).",
6628
6635
  "common_use_cases": [
6629
6636
  "Dashboard: contar/exibir assistentes AI",
6630
6637
  "Buscar com filtros antes de outra operação",
@@ -6686,7 +6693,7 @@
6686
6693
  "description": "Lista ferramentas personalizadas do Captain. Lista assistentes AI paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de assistente AI).",
6687
6694
  "category": "Assistentes",
6688
6695
  "params": [],
6689
- "returns": "meta (contadores globais) + payload (array de assistentes AI)",
6696
+ "returns": "{ payload: [ ...ferramentas personalizadas do AI Agente ], meta: { total_count, page } }. O embrulho existe, mas nao ha paginacao real: page vem sempre 1 e total_count e a contagem da propria lista devolvida. Retorna SOMENTE as ferramentas habilitadas (enabled) — as desligadas nunca aparecem. Cada ferramenta traz id, slug, title, description, endpoint_url, http_method, request_template, response_template, auth_type, auth_config, param_schema (array de {name, type, description, required}), enabled, account_id, created_at e updated_at (timestamps Unix).",
6690
6697
  "common_use_cases": [
6691
6698
  "Dashboard: contar/exibir assistentes AI",
6692
6699
  "Buscar com filtros antes de outra operação",
@@ -7332,7 +7339,7 @@
7332
7339
  "description": "Lista todas as inboxes da conta. Lista inboxes/caixas de entrada paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de inbox/caixa de entrada).",
7333
7340
  "category": "Caixas de Entrada",
7334
7341
  "params": [],
7335
- "returns": "meta (contadores globais) + payload (array de inboxes/caixas de entrada)",
7342
+ "returns": "{ payload: [ ...caixas ] } — SO payload, SEM meta e SEM paginacao: vem todas as caixas que o usuario enxerga, ordenadas por nome. Campos da distribuicao automatica presentes em CADA caixa (todo tipo de canal, sem trava): has_assignment_policy (booleano) diz QUAL dos dois caminhos esta ativo naquela caixa — true = a caixa segue uma POLITICA de atribuicao (os numeros do freio estao na politica, nao aqui) e, nesse caso, o auto_assignment_config da propria caixa e IGNORADO (a secao 'Distribuicao Automatica' inclusive some da tela da caixa); false = vale a distribuicao simples da propria caixa, ligada/desligada por enable_auto_assignment e configurada em auto_assignment_config { assign_offline_agents, fair_distribution_limit, fair_distribution_window }. Significado: fair_distribution_limit = quantas conversas o robo entrega a CADA atendente dentro da janela (a vaga volta quando a conversa deixa de estar aberta); fair_distribution_window = tamanho da janela em SEGUNDOS (600 = 10 minutos); assign_offline_agents = entrega tambem para quem nao esta com o painel aberto. Para ver os numeros de uma caixa com has_assignment_policy = true, chame lionchat_inboxes_assignment_policies_list (politica vinculada aquela caixa). OBRIGATORIO: leia o valor da conta antes de responder — NUNCA recite o padrao de fabrica (10 a cada 600 segundos) como se fosse o numero do cliente; o padrao so vale quando NAO ha politica e a caixa nao escolheu numero (e nesse caso, caixa com assign_offline_agents ligado e sem numero escolhido fica SEM freio). Atencao ao ZERO: na CAIXA, fair_distribution_limit = 0 significa 'sem freio' de proposito (o freio so liga com limite maior que zero) — logo a caixa fica sem teto tanto com o campo vazio + offline ligado quanto com 0 escrito. Na POLITICA o 0 nao e aceito (cadastro exige maior que zero), entao caixa com politica vinculada SEMPRE tem freio.",
7336
7343
  "common_use_cases": [
7337
7344
  "Dashboard: contar/exibir inboxes/caixas de entrada",
7338
7345
  "Buscar com filtros antes de outra operação",
@@ -7358,7 +7365,7 @@
7358
7365
  "description": "ID da inbox"
7359
7366
  }
7360
7367
  ],
7361
- "returns": "inbox/caixa de entrada (objeto completo com associações)",
7368
+ "returns": "Objeto PURO da caixa (sem envelope meta/payload), com os mesmos campos da listagem. Campos da distribuicao automatica: has_assignment_policy (booleano) diz QUAL dos dois caminhos esta ativo nesta caixa — true = a caixa segue uma POLITICA de atribuicao (os numeros do freio estao na politica, nao aqui) e o auto_assignment_config desta caixa e IGNORADO (a secao 'Distribuicao Automatica' some da tela da caixa; o valor antigo continua gravado e so volta a valer se a politica for desvinculada); false = vale a distribuicao simples da propria caixa, ligada/desligada por enable_auto_assignment e configurada em auto_assignment_config { assign_offline_agents, fair_distribution_limit, fair_distribution_window }. Significado: fair_distribution_limit = quantas conversas o robo entrega a CADA atendente dentro da janela (a vaga volta quando a conversa deixa de estar aberta); fair_distribution_window = tamanho da janela em SEGUNDOS (600 = 10 minutos); assign_offline_agents = entrega tambem para quem nao esta com o painel aberto. Com has_assignment_policy = true, busque os numeros com lionchat_inboxes_assignment_policies_list. OBRIGATORIO: leia o valor da conta antes de responder — NUNCA recite o padrao de fabrica (10 a cada 600 segundos) como se fosse o numero do cliente; o padrao so vale quando NAO ha politica e a caixa nao escolheu numero (e caixa com assign_offline_agents ligado e sem numero escolhido fica SEM freio). Atencao ao ZERO: na CAIXA, fair_distribution_limit = 0 significa 'sem freio' de proposito (o freio so liga com limite maior que zero) — logo a caixa fica sem teto tanto com o campo vazio + offline ligado quanto com 0 escrito. Na POLITICA o 0 nao e aceito (cadastro exige maior que zero), entao caixa com politica vinculada SEMPRE tem freio.",
7362
7369
  "common_use_cases": [
7363
7370
  "Ver dados completos antes de editar",
7364
7371
  "Verificar estado atual antes de uma ação",
@@ -7950,7 +7957,7 @@
7950
7957
  "type": "integer",
7951
7958
  "location": "query",
7952
7959
  "required": false,
7953
- "description": "Offset de paginacao"
7960
+ "description": "Filtra QUEM ENVIOU a mensagem — NAO e offset de paginacao (para paginar use `page`). Formato FIXO: \"contact:<id>\" ou \"agent:<id>\"; qualquer outro texto e ignorado em silencio. Vale SO para os resultados de MENSAGEM e SO com a \"Busca avancada\" ligada na conta."
7954
7961
  },
7955
7962
  {
7956
7963
  "name": "inbox_id",
@@ -7964,14 +7971,14 @@
7964
7971
  "type": "string",
7965
7972
  "location": "query",
7966
7973
  "required": false,
7967
- "description": "Data inicial (ISO 8601)"
7974
+ "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
7968
7975
  },
7969
7976
  {
7970
7977
  "name": "until",
7971
7978
  "type": "string",
7972
7979
  "location": "query",
7973
7980
  "required": false,
7974
- "description": "Data final (ISO 8601)"
7981
+ "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
7975
7982
  },
7976
7983
  {
7977
7984
  "name": "page",
@@ -8002,7 +8009,7 @@
8002
8009
  "description": "Filtros estruturados aplicados aos resultados de CARDS. JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8003
8010
  }
8004
8011
  ],
8005
- "returns": "Resultado por tipo: conversations, contacts, messages, articles e kanban_items (cards do Kanban). Cada mensagem inclui previous_message/next_message (contexto vizinho).",
8012
+ "returns": "{ payload: { conversations, contacts, messages, articles, kanban_items } } — sem meta. [29/07] Cada conversa vem com `status` e `labels` (etiquetas da conversa) e cada contato vem com `labels` (etiquetas do contato), entao NAO e preciso uma chamada extra por resultado so pra saber a etiqueta. Cada mensagem inclui previous_message/next_message (contexto vizinho) e NAO traz labels.",
8006
8013
  "common_use_cases": [
8007
8014
  "Localizar resultado de busca pelo nome",
8008
8015
  "Buscar pelo email/telefone parcial",
@@ -8030,28 +8037,28 @@
8030
8037
  "type": "integer",
8031
8038
  "location": "query",
8032
8039
  "required": false,
8033
- "description": "Offset de paginacao"
8040
+ "description": "SEM EFEITO nesta rota. O filtro de remetente so existe na busca de MENSAGENS (lionchat_search_list_2). Para paginar conversas use `page`."
8034
8041
  },
8035
8042
  {
8036
8043
  "name": "inbox_id",
8037
8044
  "type": "integer",
8038
8045
  "location": "query",
8039
8046
  "required": false,
8040
- "description": "Filtrar por inbox"
8047
+ "description": "SEM EFEITO nesta rota — e ignorado em SILENCIO. A busca de conversas ja e limitada as caixas a que o usuario tem acesso, mas este parametro nao recorta nada: pedir \"conversas da caixa Comercial\" por aqui devolve TODAS e a resposta parece filtrada. Para filtrar por caixa use lionchat_conversations_filter (inbox_id) ou passe inbox_id dentro de `conversation_filters`."
8041
8048
  },
8042
8049
  {
8043
8050
  "name": "since",
8044
8051
  "type": "string",
8045
8052
  "location": "query",
8046
8053
  "required": false,
8047
- "description": "Data inicial (ISO 8601)"
8054
+ "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8048
8055
  },
8049
8056
  {
8050
8057
  "name": "until",
8051
8058
  "type": "string",
8052
8059
  "location": "query",
8053
8060
  "required": false,
8054
- "description": "Data final (ISO 8601)"
8061
+ "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8055
8062
  },
8056
8063
  {
8057
8064
  "name": "page",
@@ -8068,7 +8075,7 @@
8068
8075
  "description": "Filtros estruturados (mesmo formato de conversations_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8069
8076
  }
8070
8077
  ],
8071
- "returns": "meta (contadores globais) + payload (array de resultados de busca)",
8078
+ "returns": "{ payload: { conversations: [...] } } — sem meta. [29/07] Cada conversa traz `labels` (etiquetas da conversa) e `status`, alem de contato, caixa, responsavel e ultima mensagem — nao e preciso outra chamada so pra saber a etiqueta.",
8072
8079
  "common_use_cases": [
8073
8080
  "Dashboard: contar/exibir resultados de busca",
8074
8081
  "Buscar com filtros antes de outra operação",
@@ -8094,6 +8101,20 @@
8094
8101
  "required": true,
8095
8102
  "description": "Termo"
8096
8103
  },
8104
+ {
8105
+ "name": "since",
8106
+ "type": "string",
8107
+ "location": "query",
8108
+ "required": false,
8109
+ "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8110
+ },
8111
+ {
8112
+ "name": "until",
8113
+ "type": "string",
8114
+ "location": "query",
8115
+ "required": false,
8116
+ "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente. Filtra pela ULTIMA ATIVIDADE do contato (last_activity_at)."
8117
+ },
8097
8118
  {
8098
8119
  "name": "page",
8099
8120
  "type": "integer",
@@ -8109,7 +8130,7 @@
8109
8130
  "description": "Filtros estruturados (mesmo formato de contacts_filter). JSON-string de condicoes no formato do endpoint /filter correspondente (ex: [{\"attribute_key\":\"status\",\"filter_operator\":\"equal_to\",\"values\":[\"open\"]}]). Cap 10 condicoes; payload invalido = 422"
8110
8131
  }
8111
8132
  ],
8112
- "returns": "meta (contadores globais) + payload (array de resultados de busca)",
8133
+ "returns": "{ payload: { contacts: [...] } } — sem meta e sem total; 15 contatos por pagina, use `page` para as proximas, ordenados por atividade mais recente (last_activity_at desc). [29/07] Cada contato traz id, name, email, phone_number, identifier, `labels` (nomes das etiquetas do contato), `thumbnail` (foto), `last_activity_at` (unix) e `additional_attributes` — e dentro dele que ficam os dados cadastrais (`cadastral`: CPF/CNPJ/RG/endereco) e os atributos personalizados.",
8113
8134
  "common_use_cases": [
8114
8135
  "Dashboard: contar/exibir resultados de busca",
8115
8136
  "Buscar com filtros antes de outra operação",
@@ -8140,7 +8161,7 @@
8140
8161
  "type": "integer",
8141
8162
  "location": "query",
8142
8163
  "required": false,
8143
- "description": "Offset de paginacao"
8164
+ "description": "Filtra QUEM ENVIOU a mensagem — NAO e offset de paginacao (para paginar use `page`). Formato FIXO: \"contact:<id>\" ou \"agent:<id>\"; qualquer outro texto e ignorado em silencio. Vale SO para os resultados de MENSAGEM e SO com a \"Busca avancada\" ligada na conta."
8144
8165
  },
8145
8166
  {
8146
8167
  "name": "inbox_id",
@@ -8154,14 +8175,14 @@
8154
8175
  "type": "string",
8155
8176
  "location": "query",
8156
8177
  "required": false,
8157
- "description": "Data inicial (ISO 8601)"
8178
+ "description": "Inicio do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para tras."
8158
8179
  },
8159
8180
  {
8160
8181
  "name": "until",
8161
8182
  "type": "string",
8162
8183
  "location": "query",
8163
8184
  "required": false,
8164
- "description": "Data final (ISO 8601)"
8185
+ "description": "Fim do periodo — timestamp UNIX em SEGUNDOS (ex: 1782864000). NAO use ISO 8601 nem data por extenso: o servidor faz .to_i e \"2026-07-01\" vira 2026 (= 1970), devolvendo lista VAZIA sem nenhum erro. Depende da \"Busca avancada\" ligada na conta (nasce DESLIGADA — sem ela o filtro e ignorado em silencio). Cortado em SILENCIO a 90 dias para frente."
8165
8186
  },
8166
8187
  {
8167
8188
  "name": "page",
@@ -8171,7 +8192,7 @@
8171
8192
  "description": "Página"
8172
8193
  }
8173
8194
  ],
8174
- "returns": "meta (contadores globais) + payload (array de resultados de busca)",
8195
+ "returns": "{ payload: { messages: [...] } } — sem meta e sem total. 15 mensagens por pagina, das MAIS RECENTES para as mais antigas; para ver o resto use `page` (a resposta NAO informa quantas paginas existem, entao vindo 15 itens assuma que pode haver mais). Cada mensagem traz contact_name, contact_thumbnail, conversation_status e previous_message/next_message (as vizinhas da MESMA conversa, ou null). O resultado de MENSAGEM nao traz `labels` — as etiquetas so vem nos cards de conversa e de contato.",
8175
8196
  "common_use_cases": [
8176
8197
  "Dashboard: contar/exibir resultados de busca",
8177
8198
  "Buscar com filtros antes de outra operação",
@@ -8254,7 +8275,7 @@
8254
8275
  "description": "Data fim"
8255
8276
  }
8256
8277
  ],
8257
- "returns": "meta (contadores globais) + payload (array de tarefas/agenda)",
8278
+ "returns": "LISTA PURA (array no topo, SEM embrulho meta/payload) — a resposta JA E a lista de tarefas da agenda. Cada tarefa traz todos os campos da tarefa (id, title, description, task_type, status, scheduled_at, completed, recurrence_*), mais assignees [{id, name, agenda_color}], assignee_ids, conversation_display_id, conversation_contact_name, contact_name/contact_phone/contact_email, meeting_url, calendar_color, is_readonly, is_private, guest_emails, attendee_rsvp e booking_id. Lista vazia = []. Com filtro de data (date_start/date_end) devolve TUDO do periodo sem paginar (teto de 10.000). Sem filtro de data, pagina por `page`/`per_page` — mas a resposta NAO traz numero de paginas nem total: pagina cheia sugere que ha mais.",
8258
8279
  "common_use_cases": [
8259
8280
  "Dashboard: contar/exibir tarefas/agenda",
8260
8281
  "Buscar com filtros antes de outra operação",
@@ -8734,7 +8755,7 @@
8734
8755
  "description": "Retorna tarefas agrupadas: atrasadas, hoje, amanhã, próximos 7 dias. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de tarefa/agenda).",
8735
8756
  "category": "Agenda / Tarefas",
8736
8757
  "params": [],
8737
- "returns": "meta (contadores globais) + payload (array de tarefas/agenda)",
8758
+ "returns": "Objeto com QUATRO listas separadas, sem meta e sem payload: { overdue: [...], today: [...], tomorrow: [...], next_7_days: [...] }. Traz APENAS tarefas em aberto (status pendente ou adiada — concluida/cancelada nao aparece) e nao ocultas, ja filtradas pela permissao de quem chama (administrador ve todas; agente ve so as que criou ou em que e responsavel). Agrupamento pela data agendada: overdue = antes de hoje 00:00 (ordenado da mais recente para a mais antiga), today = hoje, tomorrow = amanha, next_7_days = ate 7 dias a frente. Cada item e a tarefa completa (serializacao do modelo AccountTask, ja com assignees/assignee_ids, completed, dados de recorrencia, conversation_display_id, nome/telefone/email do contato, meeting_url e links de booking). Sem paginacao (teto de 10 mil por grupo).",
8738
8759
  "common_use_cases": [
8739
8760
  "Dashboard: contar/exibir tarefas/agenda",
8740
8761
  "Buscar com filtros antes de outra operação",
@@ -8753,7 +8774,7 @@
8753
8774
  "description": "Retorna contagem para badge de tarefas pendentes. Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de tarefa/agenda).",
8754
8775
  "category": "Agenda / Tarefas",
8755
8776
  "params": [],
8756
- "returns": "meta (contadores globais) + payload (array de tarefas/agenda)",
8777
+ "returns": "Objeto simples, NAO e lista: { overdue_count, today_count }. `today_count` = quantas tarefas pendentes ou adiadas estao marcadas para HOJE. `overdue_count` vem SEMPRE 0 — de proposito, o contador do badge nao inclui atrasadas. Para ver as tarefas em si, use a listagem de tarefas.",
8757
8778
  "common_use_cases": [
8758
8779
  "Dashboard: contar/exibir tarefas/agenda",
8759
8780
  "Buscar com filtros antes de outra operação",
@@ -8794,7 +8815,7 @@
8794
8815
  "description": "Página"
8795
8816
  }
8796
8817
  ],
8797
- "returns": "meta (contadores globais) + payload (array de tarefas/agenda)",
8818
+ "returns": "Lista pura (array), sem embrulho: a resposta E o array de tarefas do card, juntando as tarefas de TODAS as conversas vinculadas a ele. Cada tarefa traz os campos do registro mais `assignees` (id, nome, cor na agenda), `assignee_ids`, `completed`, dados de recorrencia (recurrence_type/count/group_id), `conversation_display_id`, `conversation_contact_name` e dados do contato (contact_name, contact_phone, contact_email). Paginada: 10 por pagina por padrao (parametros `page` e `per_page`, teto 100) e o total NAO vem no corpo. Filtro opcional `scope`: active (pendentes+adiadas) ou done (concluidas+canceladas).",
8798
8819
  "common_use_cases": [
8799
8820
  "Dashboard: contar/exibir tarefas/agenda",
8800
8821
  "Buscar com filtros antes de outra operação",
@@ -8811,7 +8832,7 @@
8811
8832
  "method": "GET",
8812
8833
  "path": "/api/v1/accounts/{account_id}/kanban_items/{id}/next_task",
8813
8834
  "title": "Próxima Tarefa do Card",
8814
- "description": "Retorna a próxima tarefa pendente/adiada do card (por scheduled_at). Lista tarefas/agenda paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de tarefa/agenda).",
8835
+ "description": "Retorna a PROXIMA tarefa pendente ou adiada do card (a de menor scheduled_at), considerando a conversa principal e as vinculadas. Devolve UM OBJETO de tarefa — nao ha meta/payload nem paginacao — e `{}` (objeto vazio) quando nao ha nenhuma. Nao procure um array: procurar array aqui faz voce responder \"esse card nao tem proxima tarefa\" quando tem. ATENCAO: esta rota NAO filtra por privacidade de tarefa — pode devolver tarefa de OUTRO atendente, ao contrario do campo `next_task` que vem dentro do proprio card (esse so mostra tarefa de quem esta consultando).",
8815
8836
  "category": "Agenda / Tarefas",
8816
8837
  "params": [
8817
8838
  {
@@ -8822,7 +8843,7 @@
8822
8843
  "description": "ID do card Kanban"
8823
8844
  }
8824
8845
  ],
8825
- "returns": "meta (contadores globais) + payload (array de tarefas/agenda)",
8846
+ "returns": "A tarefa (objeto unico, mesmo formato de uma tarefa da agenda) ou `{}` quando nao ha nenhuma pendente/adiada. Sem meta, sem payload e sem paginacao.",
8826
8847
  "common_use_cases": [
8827
8848
  "Dashboard: contar/exibir tarefas/agenda",
8828
8849
  "Buscar com filtros antes de outra operação",
@@ -8864,7 +8885,7 @@
8864
8885
  "description": "Página"
8865
8886
  }
8866
8887
  ],
8867
- "returns": "meta (contadores globais) + payload (array de mensagens agendadas)",
8888
+ "returns": "Array PURO de mensagens agendadas — a resposta E a lista, sem meta e sem payload. Cada item traz os campos da mensagem agendada + conversation_display_id e conversation_contact_name. Ordenado por scheduled_at crescente, 10 por pagina (param page); a resposta NAO informa total nem numero de paginas.",
8868
8889
  "common_use_cases": [
8869
8890
  "Dashboard: contar/exibir mensagens agendadas",
8870
8891
  "Buscar com filtros antes de outra operação",
@@ -8892,7 +8913,7 @@
8892
8913
  "description": "Display ID"
8893
8914
  }
8894
8915
  ],
8895
- "returns": "meta (contadores globais) + payload (array de mensagens agendadas)",
8916
+ "returns": "Objeto com UMA chave: { payload: [ mensagens agendadas da conversa ] }. NAO existe meta. Cada item: id, message (texto), title, scheduled_at (timestamp Unix), created_at (Unix), status, inbox_id, conversation_id, is_recurrent, period, recurrence_count, recurrence_sent, template_params e blocks (com URLs dos arquivos). Sem paginacao — todas as agendadas da conversa, de qualquer status. Conversa inexistente devolve 404 com {error}.",
8896
8917
  "common_use_cases": [
8897
8918
  "Dashboard: contar/exibir mensagens agendadas",
8898
8919
  "Buscar com filtros antes de outra operação",
@@ -9455,7 +9476,7 @@
9455
9476
  "description": "Filtra os flows vinculados a essa caixa de entrada."
9456
9477
  }
9457
9478
  ],
9458
- "returns": "meta (contadores globais) + payload (array de flows)",
9479
+ "returns": "Objeto { data: [flows] } — a lista fica em data, sem meta e sem payload. Sem paginacao nenhuma (o controller so filtra por inbox_id / with_webhook_trigger / with_campaign_trigger). Cada flow traz o flow_data inteiro, entao a resposta pode ser MUITO grande em conta com muitos fluxos.",
9459
9480
  "common_use_cases": [
9460
9481
  "Dashboard: contar/exibir flows",
9461
9482
  "Buscar com filtros antes de outra operação",
@@ -9710,7 +9731,7 @@
9710
9731
  "description": "ID do agente ou \"all\""
9711
9732
  }
9712
9733
  ],
9713
- "returns": "meta (contadores globais) + payload (array de tipos de evento)",
9734
+ "returns": "Lista pura: a resposta E o array, sem embrulho de meta/payload. Cada item e um tipo de evento de agendamento com os campos do registro mais `booking_availabilities`, `follow_up_schedules`, `public_url`, `agent_profile_url`, `account_booking_slug` e os dados do agente dono (`agent_name`, `agent_color`, `agent_avatar_url`). Traz ativos E inativos, ordenados do mais novo pro mais antigo, sem paginacao. Filtro opcional `user_id` (ou `user_id=all` para todos os agentes visiveis).",
9714
9735
  "common_use_cases": [
9715
9736
  "Dashboard: contar/exibir tipos de evento",
9716
9737
  "Buscar com filtros antes de outra operação",
@@ -10024,7 +10045,7 @@
10024
10045
  "description": "Lista todas as regras de automacao da conta. Lista regras de automação paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de regra de automação).",
10025
10046
  "category": "Regras de Automacao",
10026
10047
  "params": [],
10027
- "returns": "meta (contadores globais) + payload (array de regras de automação)",
10048
+ "returns": "`{ payload: [...] }` — sem meta. Array com todas as regras de automacao da conta (sem paginacao e sem contador). Cada regra traz id, account_id, name, description, event_name, `conditions`, `actions`, `active`, `inbox_id` (caixa de envio, usado nas automacoes de webhook), `action_types` (subtipos do evento conversation_updated; vazio = todos), `created_on` (unix) e `files` (so quando a regra tem anexo).",
10028
10049
  "common_use_cases": [
10029
10050
  "Dashboard: contar/exibir regras de automação",
10030
10051
  "Buscar com filtros antes de outra operação",
@@ -10070,14 +10091,14 @@
10070
10091
  "type": "array",
10071
10092
  "location": "body",
10072
10093
  "required": true,
10073
- "description": "[{attribute_key, filter_operator, query_operator, values[]}]"
10094
+ "description": "[{attribute_key, filter_operator, query_operator, values[]}] REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10074
10095
  },
10075
10096
  {
10076
10097
  "name": "actions",
10077
10098
  "type": "array",
10078
10099
  "location": "body",
10079
10100
  "required": true,
10080
- "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)."
10101
+ "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'."
10081
10102
  },
10082
10103
  {
10083
10104
  "name": "active",
@@ -10168,14 +10189,14 @@
10168
10189
  "type": "array",
10169
10190
  "location": "body",
10170
10191
  "required": false,
10171
- "description": "Condicoes"
10192
+ "description": "Condicoes REGRA DO CONECTOR (query_operator) — LEIA ANTES DE GRAVAR: o conector liga a condicao com a SEGUINTE, logo a ULTIMA condicao TEM que ter query_operator: null (condicao UNICA tambem = null). Nas demais: 'AND' ou 'OR'. A API valida o VALOR do conector mas NAO a POSICAO — conector na ultima condicao SALVA COM SUCESSO, aparece certo na tela e a regra NUNCA dispara. Incidente real: 8 regras criadas pelo conector de IA entre 26 e 30/07/2026 em 3 contas, todas com conector na ultima condicao, todas nasceram mortas (732 erros/hora medidos em producao 03/08; a conta 62 ficou com as 6 regras de etiquetagem automatica paradas). attribute_key precisa ser campo padrao OU atributo personalizado que EXISTA na conta (senao a regra inteira falha na validacao: 'Automation conditions <chave> not supported') — conferir antes com lionchat_custom_attributes_list; atributo personalizado exige tambem custom_attribute_type ('conversation_attribute' ou 'contact_attribute'). filter_operator: equal_to, not_equal_to, contains, does_not_contain, is_present, is_not_present, is_greater_than, is_less_than, starts_with, days_before, days_ago, last_days, today, yesterday — cada campo aceita so um subconjunto. Na duvida, leia uma regra que ja funciona com lionchat_automation_rules_show e copie o formato. Detalhe no resource 'conversation-flows'."
10172
10193
  },
10173
10194
  {
10174
10195
  "name": "actions",
10175
10196
  "type": "array",
10176
10197
  "location": "body",
10177
10198
  "required": false,
10178
- "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)."
10199
+ "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'."
10179
10200
  }
10180
10201
  ],
10181
10202
  "returns": "regra de automação atualizado",
@@ -10503,7 +10524,7 @@
10503
10524
  "method": "POST",
10504
10525
  "path": "/api/v1/accounts/{account_id}/bulk_actions",
10505
10526
  "title": "Acoes em Massa",
10506
- "description": "Executa acoes em massa em conversas. Cria novo operação em massa. Obrigatórios: type, ids. Valida unicidade quando aplicável. Retorna o operação em massa criado com ID atribuído.",
10527
+ "description": "Executa acao em massa em CONVERSAS ou CONTATOS (roda em segundo plano: responde 200 e aplica depois). Obrigatorios: type e ids. ATENCAO ao `type`: escreva no SINGULAR com inicial maiuscula (Conversation / Contact) — o PLURAL e RECUSADO com 422. Teto de 300 ids por chamada. Esta e a acao de CONVERSAS e CONTATOS; card do Kanban tem ferramentas proprias (lionchat_kanban_bulk_create / _create_1 / _create_2).",
10507
10528
  "category": "Operacoes em Massa",
10508
10529
  "params": [
10509
10530
  {
@@ -10511,24 +10532,66 @@
10511
10532
  "type": "string",
10512
10533
  "location": "body",
10513
10534
  "required": true,
10514
- "description": "Tipo: conversations"
10535
+ "description": "Objeto alvo: `Conversation` ou `Contact` — escreva assim, no SINGULAR e com inicial maiuscula (o servidor tambem aceita minusculo singular: \"conversation\"/\"contact\"). PLURAL (\"conversations\"/\"contacts\") e RECUSADO com 422 e faz TODA acao em massa falhar."
10515
10536
  },
10516
10537
  {
10517
10538
  "name": "ids",
10518
10539
  "type": "array",
10519
10540
  "location": "body",
10520
10541
  "required": true,
10521
- "description": "Array de IDs"
10542
+ "description": "Array de IDs do objeto escolhido em `type` (display_id das conversas / id dos contatos). Maximo 300 por chamada — acima disso responde 422 (code \"bulk_ids_limit_exceeded\"). Unica excecao: contatos com select_all=true, que nao tem teto."
10522
10543
  },
10523
10544
  {
10524
10545
  "name": "fields",
10525
10546
  "type": "object",
10526
10547
  "location": "body",
10527
10548
  "required": false,
10528
- "description": "Campos a alterar"
10549
+ "description": "SO para type=Conversation. Campos aceitos (lista FECHADA — chave fora dela e descartada em silencio): status, assignee_id, team_id, inbox_id e captain_assistant_id. Ex.: { \"assignee_id\": 6 }. `captain_assistant_id: 0` DESLIGA a IA e marca a conversa como desligada na mao (o robo nao religa depois). ATENCAO: ativar a IA em LOTE NAO arma o acompanhamento automatico nem faz a IA responder na hora — diferente de ativar conversa a conversa por lionchat_conversations_update."
10550
+ },
10551
+ {
10552
+ "name": "labels",
10553
+ "type": "object",
10554
+ "location": "body",
10555
+ "required": false,
10556
+ "description": "Etiquetas a aplicar/remover: { \"add\": [\"vip\"], \"remove\": [\"frio\"] }. Vale para type=Conversation (add e remove) e para type=Contact (so `add`). Sem este campo, \"coloca a etiqueta X em 40 conversas\" responde 200 e NAO FAZ NADA."
10557
+ },
10558
+ {
10559
+ "name": "snoozed_until",
10560
+ "type": "string",
10561
+ "location": "body",
10562
+ "required": false,
10563
+ "description": "SO para type=Conversation: adia as conversas ate esta data/hora."
10564
+ },
10565
+ {
10566
+ "name": "action_name",
10567
+ "type": "string",
10568
+ "location": "body",
10569
+ "required": false,
10570
+ "description": "SO para type=Contact: \"delete\" apaga os contatos em massa (destrutivo — exige permissao de exclusao e confirmacao do usuario). Sem action_name, a acao de contato e aplicar as etiquetas de `labels.add`."
10571
+ },
10572
+ {
10573
+ "name": "select_all",
10574
+ "type": "boolean",
10575
+ "location": "body",
10576
+ "required": false,
10577
+ "description": "SO para type=Contact: aplica a acao a TODOS os contatos do filtro, em lotes no fundo, SEM o teto de 300 ids. Com select_all=true nao se manda `ids` — manda-se `query` (filtro) ou `labels_filter` (etiqueta); sem nenhum dos dois, atinge TODOS os contatos da conta. Combinado com action_name=delete e a operacao mais destrutiva da plataforma: confirme com o usuario antes."
10578
+ },
10579
+ {
10580
+ "name": "query",
10581
+ "type": "array",
10582
+ "location": "body",
10583
+ "required": false,
10584
+ "description": "SO com type=Contact + select_all=true: condicoes de filtro no MESMO formato de lionchat_contacts_filter ([{attribute_key, filter_operator, query_operator, custom_attribute_type, values: []}]). Define quais contatos entram na acao."
10585
+ },
10586
+ {
10587
+ "name": "labels_filter",
10588
+ "type": "array",
10589
+ "location": "body",
10590
+ "required": false,
10591
+ "description": "SO com type=Contact + select_all=true: nomes de etiqueta (\"marcado com\") que definem o conjunto alvo, no lugar de `query`."
10529
10592
  }
10530
10593
  ],
10531
- "returns": "operação em massa criado (com novo ID)",
10594
+ "returns": "200 SEM CORPO — nao ha ID de operacao para acompanhar. A acao e enfileirada e aplicada em segundo plano, entao 200 significa \"aceito\", nao \"feito\". 422 quando o `type` nao e Conversation/Contact ou quando `ids` passa de 300.",
10532
10595
  "common_use_cases": [
10533
10596
  "Cadastro inicial de operação em massa",
10534
10597
  "Automação a partir de evento externo",
@@ -10720,7 +10783,7 @@
10720
10783
  "description": "Ordenação (asc/desc)"
10721
10784
  }
10722
10785
  ],
10723
- "returns": "meta (contadores globais) + payload (array de notificações)",
10786
+ "returns": "{ data: { meta: { unread_count, count, current_page }, payload: [ ...notificacoes ] } }. ATENCAO: meta e payload ficam DENTRO de data — o caminho e resposta.data.payload, nunca resposta.payload. 15 por pagina.",
10724
10787
  "common_use_cases": [
10725
10788
  "Dashboard: contar/exibir notificações",
10726
10789
  "Buscar com filtros antes de outra operação",
@@ -10940,7 +11003,7 @@
10940
11003
  "description": "Busca por texto"
10941
11004
  }
10942
11005
  ],
10943
- "returns": "meta (contadores globais) + payload (array de anúncios)",
11006
+ "returns": "ATENCAO: o embrulho fica DENTRO de `data` — { data: { meta: { current_page, total_count }, payload: [ anuncios ] } }. Procure em resposta.data.payload, NAO em resposta.payload. Cada anuncio: id, title, body, category (informative|important|urgent), audience, sent_at, read_at (nulo se o usuario ainda nao leu), created_at. Pagina de 5 em 5; `meta.total_count` e o total geral.",
10944
11007
  "common_use_cases": [
10945
11008
  "Dashboard: contar/exibir anúncios",
10946
11009
  "Buscar com filtros antes de outra operação",
@@ -11212,7 +11275,7 @@
11212
11275
  "description": "Lista todas as ofertas da conta, incluindo descrição, planos de preço e links. Lista ofertas paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de oferta).",
11213
11276
  "category": "Ofertas",
11214
11277
  "params": [],
11215
- "returns": "meta (contadores globais) + payload (array de ofertas)",
11278
+ "returns": "Lista pura: a resposta E o array de ofertas, sem embrulho de meta/payload. Cada oferta traz id, title, description, value, currency, type, prices (array), links (array), image_url, created_at e updated_at. Sem paginacao e sem contador.",
11216
11279
  "common_use_cases": [
11217
11280
  "Dashboard: contar/exibir ofertas",
11218
11281
  "Buscar com filtros antes de outra operação",
@@ -11669,7 +11732,7 @@
11669
11732
  "description": "ID do contato"
11670
11733
  }
11671
11734
  ],
11672
- "returns": "meta (contadores globais) + payload (array de conversas)",
11735
+ "returns": "Lista pura (array), sem embrulho: a resposta E o array de conversas daquele contato no widget/caixa publica. Cada conversa traz id (display_id), uuid, inbox_id, status, contact_last_seen_at e agent_last_seen_at (unix), o objeto `contact` e `messages` com o historico de mensagens da conversa embutido. Sem paginacao e sem contador. Endpoint publico (identificadores de caixa e de contato na URL, sem token de conta). Resposta pode ser pesada: cada conversa vem com as mensagens dentro.",
11673
11736
  "common_use_cases": [
11674
11737
  "Dashboard: contar/exibir conversas",
11675
11738
  "Buscar com filtros antes de outra operação",
@@ -11886,7 +11949,7 @@
11886
11949
  "description": ""
11887
11950
  }
11888
11951
  ],
11889
- "returns": "meta (contadores globais) + payload (array de mensagens)",
11952
+ "returns": "Lista PURA (a resposta E o array, sem embrulho: nao ha meta nem payload) e sem contadores. Traz as ULTIMAS 20 mensagens da conversa, em ordem cronologica crescente; para pegar as anteriores use o parametro `before` com o id da mensagem mais antiga recebida. Mensagens internas (notas privadas) sao excluidas. Cada mensagem tem id, content, message_type, content_type, content_attributes, created_at (unix), conversation_id (display_id), attachments (quando houver) e sender. Devolve `[]` se a conversa nao for encontrada. Nao existe per_page aqui: o teto e 20 fixo.",
11890
11953
  "common_use_cases": [
11891
11954
  "Dashboard: contar/exibir mensagens",
11892
11955
  "Buscar com filtros antes de outra operação",
@@ -12467,7 +12530,14 @@
12467
12530
  "type": "string",
12468
12531
  "location": "query",
12469
12532
  "required": false,
12470
- "description": "completed, failed, busy, no_answer"
12533
+ "description": "Situacao da ligacao. Valores REAIS (unicos aceitos pelo modelo): initiated, ringing, active, answered, no_answer, failed, canceled. NAO existem \"completed\" nem \"busy\" — filtrar por eles devolve lista VAZIA pra sempre, sem erro. Ligacao atendida = `answered`."
12534
+ },
12535
+ {
12536
+ "name": "provider",
12537
+ "type": "string",
12538
+ "location": "query",
12539
+ "required": false,
12540
+ "description": "Filtrar pelo sistema de ligacao: zenvia, wavoip, lioncalls ou vtcall. ATENCAO: o campo `provider` NAO volta na resposta — nem usando o filtro da pra rotular cada linha do historico. Para saber de qual sistema veio cada ligacao, faca uma chamada por provider e junte os resultados."
12471
12541
  },
12472
12542
  {
12473
12543
  "name": "agent_id",
@@ -12519,7 +12589,7 @@
12519
12589
  "description": "Itens por página"
12520
12590
  }
12521
12591
  ],
12522
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
12592
+ "returns": "{ data: [ ...ligacoes ], meta: { total, page, per } }. A lista vem em data (NAO em payload). Cada ligacao traz id, protocol, status, duration_seconds, contact_phone, recording_url, custom_name, favorited, transcript_status/text, ai_summary, ai_score, called_at, direction, display_name, alem de contact {id,name,phone_number} e user {id,name}.",
12523
12593
  "common_use_cases": [
12524
12594
  "Dashboard: contar/exibir chamadas VoIP",
12525
12595
  "Buscar com filtros antes de outra operação",
@@ -12742,7 +12812,7 @@
12742
12812
  "description": "Lista agentes com tipos de evento ativos agrupados. Sem autenticação. Lista endpoints públicos paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de endpoint público).",
12743
12813
  "category": "Publica",
12744
12814
  "params": [],
12745
- "returns": "meta (contadores globais) + payload (array de endpoints públicos)",
12815
+ "returns": "Objeto unico (NAO e lista, nao tem meta/payload): { account: { name }, agents: [ { name, avatar_url, slug, event_types: [ { slug, title, description, duration_minutes } ] } ] }. E o diretorio publico da equipe de agendamento. ARMADILHA: este endpoint SO aceita o SLUG publico da conta — chamado com o id numerico da conta ele SEMPRE responde 404 { error: 'Account not found' }. Endpoint publico, sem autenticacao.",
12746
12816
  "common_use_cases": [
12747
12817
  "Dashboard: contar/exibir endpoints públicos",
12748
12818
  "Buscar com filtros antes de outra operação",
@@ -12937,7 +13007,7 @@
12937
13007
  "description": "Lista as variáveis globais da conta. **Requer perfil Administrador.**. Lista variáveis de conta paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de variável de conta).",
12938
13008
  "category": "Variaveis da Conta",
12939
13009
  "params": [],
12940
- "returns": "meta (contadores globais) + payload (array de variáveis de conta)",
13010
+ "returns": "Objeto com DUAS chaves paralelas, sem meta e sem payload: { definitions: [definicoes das variaveis], values: { chave_da_variavel: valor } }. Para variavel secreta o valor nao vem — em values aparece { has_value: true/false }. Para saber o valor de uma variavel e preciso cruzar definitions[].attribute_key com a chave em values. Sem paginacao. Exige perfil Administrador.",
12941
13011
  "common_use_cases": [
12942
13012
  "Dashboard: contar/exibir variáveis de conta",
12943
13013
  "Buscar com filtros antes de outra operação",
@@ -13092,7 +13162,7 @@
13092
13162
  "description": "Lista documentos indexados para uso pelos assistentes IA. Lista documentos KB paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de documento KB).",
13093
13163
  "category": "Base de Conhecimento",
13094
13164
  "params": [],
13095
- "returns": "meta (contadores globais) + payload (array de documentos KB)",
13165
+ "returns": "Objeto com `payload` + `meta`. `payload` = array de documentos da base de conhecimento (id, name, content, content_preview, summary, content_type, status, error_message, description, external_link, display_url, file_size, pages_crawled, is_manual, datas e o assistente dono). `meta` traz `total_count` (total de documentos antes de paginar) e `page` (pagina atual). Pagina de 25 em 25 pelo parametro `page`; filtro opcional `assistant_id`.",
13096
13166
  "common_use_cases": [
13097
13167
  "Dashboard: contar/exibir documentos KB",
13098
13168
  "Buscar com filtros antes de outra operação",
@@ -13279,7 +13349,7 @@
13279
13349
  "description": "Lista todos os roles personalizados da conta. Lista papéis personalizados paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de papel personalizado).",
13280
13350
  "category": "Roles Personalizados",
13281
13351
  "params": [],
13282
- "returns": "meta (contadores globais) + payload (array de papéis personalizados)",
13352
+ "returns": "Lista pura (array), sem embrulho: a resposta E o array de papeis personalizados da conta. Cada papel traz id, name, description, `permissions` (lista de permissoes) e created_at/updated_at. Sem paginacao e sem contador. Recurso Enterprise — em instalacao sem Enterprise a rota nao responde.",
13283
13353
  "common_use_cases": [
13284
13354
  "Dashboard: contar/exibir papéis personalizados",
13285
13355
  "Buscar com filtros antes de outra operação",
@@ -13448,7 +13518,7 @@
13448
13518
  "description": "Lista todas as politicas de capacidade de agentes. Lista políticas de capacidade paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de política de capacidade).",
13449
13519
  "category": "Politicas de Capacidade",
13450
13520
  "params": [],
13451
- "returns": "meta (contadores globais) + payload (array de políticas de capacidade)",
13521
+ "returns": "Lista PURA (a resposta E o array, sem embrulho: nao ha meta nem payload) e sem paginacao — vem todas as politicas de capacidade da conta de uma vez. Cada politica traz id, name, description, exclusion_rules (exclude_older_than_hours e excluded_labels), account_id, created_at, updated_at, assigned_agent_count (quantos agentes usam a politica) e inbox_capacity_limits (array de {id, inbox_id, conversation_limit}). Devolve `[]` quando nao ha nenhuma. Recurso ENTERPRISE — em instalacao/plano sem enterprise a rota nao responde a lista.",
13452
13522
  "common_use_cases": [
13453
13523
  "Dashboard: contar/exibir políticas de capacidade",
13454
13524
  "Buscar com filtros antes de outra operação",
@@ -14150,7 +14220,7 @@
14150
14220
  "description": "Lista solicitacoes de acesso de suporte. Lista acessos de suporte paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de acesso de suporte).",
14151
14221
  "category": "Acesso de Suporte",
14152
14222
  "params": [],
14153
- "returns": "meta (contadores globais) + payload (array de acessos de suporte)",
14223
+ "returns": "Array PURO de acessos de suporte — a resposta E a lista, sem meta e sem payload. Ordenado por created_at decrescente e SEM paginacao (traz todos). Cada item inclui valid_access? e os objetos granted_by, support_agent e revoked_by (id, name, email).",
14154
14224
  "common_use_cases": [
14155
14225
  "Dashboard: contar/exibir acessos de suporte",
14156
14226
  "Buscar com filtros antes de outra operação",
@@ -14442,7 +14512,7 @@
14442
14512
  "description": "ID da inbox"
14443
14513
  }
14444
14514
  ],
14445
- "returns": "meta (contadores globais) + payload (array de grupos WhatsApp)",
14515
+ "returns": "Objeto { data: [grupos] } — a lista fica em data, sem meta e sem payload. Os grupos vem crus da API do WhatsApp (WAHA), no formato dela (id, subject, etc.), nao no formato do LionChat. Sem paginacao — devolve todos os grupos do aparelho. Erro da API do WAHA volta como JSON amigavel, nao como 500.",
14446
14516
  "common_use_cases": [
14447
14517
  "Dashboard: contar/exibir grupos WhatsApp",
14448
14518
  "Buscar com filtros antes de outra operação",
@@ -15016,7 +15086,7 @@
15016
15086
  "description": "Buscar por nome do template"
15017
15087
  }
15018
15088
  ],
15019
- "returns": "meta (contadores globais) + payload (array de templates WhatsApp)",
15089
+ "returns": "Objeto `{ data: [...], meta: { total, limit } }` — a chave da lista e `data`, NAO `payload`. `data` = os templates guardados no cache da caixa, ja com os filtros aplicados (category, status, language, search). `meta.total` = quantidade TOTAL de templates em cache, ANTES do filtro (entao pode ser maior que o tamanho de `data`); `meta.limit` = 250 (teto da Meta). So funciona em caixa WhatsApp Cloud (oficial).",
15020
15090
  "common_use_cases": [
15021
15091
  "Dashboard: contar/exibir templates WhatsApp",
15022
15092
  "Buscar com filtros antes de outra operação",
@@ -15420,7 +15490,7 @@
15420
15490
  "description": "Verifica o status da conexao com Google Calendar. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15421
15491
  "category": "Google Calendar",
15422
15492
  "params": [],
15423
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15493
+ "returns": "Um OBJETO unico com o estado da conexao Google Agenda do usuario logado — nao e lista. Conectado: `{connected: true, state, calendar_id, calendar_name, sync_enabled, sync_disabled_reason, sync_error_code, sync_error, last_synced_at, token_expires_at, readonly_calendars, agenda_public}`. Desconectado: `{connected: false, state: 'disconnected', agenda_public}`. O campo `state` vale 'healthy', 'needs_calendar_selection', 'reactivatable', 'needs_reconnect' ou 'disconnected'. E por USUARIO, nao por conta. Nao existe array nenhum aqui: procurar payload/lista sempre da vazio. A lista de agendas disponiveis e outro endpoint (/google_calendar/calendars).",
15424
15494
  "common_use_cases": [
15425
15495
  "Dashboard: contar/exibir configs Google Calendar",
15426
15496
  "Buscar com filtros antes de outra operação",
@@ -15448,7 +15518,7 @@
15448
15518
  "description": "Pra onde voltar apos o OAuth (ex: 'agenda'); fora da whitelist = padrao"
15449
15519
  }
15450
15520
  ],
15451
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15521
+ "returns": "NAO e listagem: e um objeto unico `{ auth_url: \"https://accounts.google.com/...\" }` com o link de autorizacao do Google que o usuario precisa abrir para conectar a agenda. Nao ha meta, payload, array nem paginacao. Se as credenciais do Google nao estiverem configuradas na instalacao, responde 412 com `{ error: \"Credenciais do Google Calendar nao configuradas...\" }`. Para saber se a conexao ja existe use o endpoint de status, nao este. A conexao e POR USUARIO.",
15452
15522
  "common_use_cases": [
15453
15523
  "Dashboard: contar/exibir configs Google Calendar",
15454
15524
  "Buscar com filtros antes de outra operação",
@@ -15488,7 +15558,7 @@
15488
15558
  "description": "Lista calendarios disponiveis na conta Google. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15489
15559
  "category": "Google Calendar",
15490
15560
  "params": [],
15491
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15561
+ "returns": "{ calendars: [ { id, summary, primary, background_color } ] } — sem meta e sem payload. Sao os calendarios da conta Google conectada do usuario logado, buscados ao vivo na API do Google; sem paginacao. Se o usuario logado nao tiver conexao Google nesta conta, responde 404 com { error: 'Nao conectado ao Google Calendar' }. Se a chamada ao Google falhar (token expirado/revogado, erro da API), responde 422 com { error }.",
15492
15562
  "common_use_cases": [
15493
15563
  "Dashboard: contar/exibir configs Google Calendar",
15494
15564
  "Buscar com filtros antes de outra operação",
@@ -15631,7 +15701,7 @@
15631
15701
  "description": "Lista agentes que possuem agenda visivel. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15632
15702
  "category": "Google Calendar",
15633
15703
  "params": [],
15634
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15704
+ "returns": "Objeto unico (NAO tem meta/payload): { agents: [ { id, name, agenda_color } ] }. E a lista de agentes cujas agendas o usuario atual pode VER (admin ve todos; nao-admin ve so quem marcou agenda publica). Nao devolve config de Google Calendar. agenda_color cai no padrao '#3B82F6' quando o agente nao escolheu cor. Sem paginacao.",
15635
15705
  "common_use_cases": [
15636
15706
  "Dashboard: contar/exibir configs Google Calendar",
15637
15707
  "Buscar com filtros antes de outra operação",
@@ -15651,7 +15721,7 @@
15651
15721
  "description": "Lista calendarios compartilhados entre agentes. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15652
15722
  "category": "Google Calendar",
15653
15723
  "params": [],
15654
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15724
+ "returns": "Objeto { calendars: [...] } — a lista fica em calendars, sem meta e sem payload. Cada item traz google_calendar_id, name, color, assigned_user_id e assigned_user_name. Sem paginacao. Exclui o calendario pessoal (primary). Se o admin nao estiver conectado ao Google Calendar, devolve 404 com { error: 'Nao conectado ao Google Calendar' }.",
15655
15725
  "common_use_cases": [
15656
15726
  "Dashboard: contar/exibir configs Google Calendar",
15657
15727
  "Buscar com filtros antes de outra operação",
@@ -15699,7 +15769,7 @@
15699
15769
  "description": "Verifica status dos calendarios compartilhados. Lista configs Google Calendar paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config Google Calendar).",
15700
15770
  "category": "Google Calendar",
15701
15771
  "params": [],
15702
- "returns": "meta (contadores globais) + payload (array de configs Google Calendar)",
15772
+ "returns": "Objeto simples, NAO e lista: { has_shared_calendar, calendar_name, owner_name, personal_calendar_readonly }. Diz se o usuario atual recebeu uma agenda compartilhada de outro agente. Quando nao ha, vem `has_shared_calendar: false` com `calendar_name` e `owner_name` nulos e `personal_calendar_readonly: false`.",
15703
15773
  "common_use_cases": [
15704
15774
  "Dashboard: contar/exibir configs Google Calendar",
15705
15775
  "Buscar com filtros antes de outra operação",
@@ -15719,7 +15789,7 @@
15719
15789
  "description": "Lista todas as politicas de atribuicao de conversas. Lista políticas de atribuição paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de política de atribuição).",
15720
15790
  "category": "Politicas de Atribuicao",
15721
15791
  "params": [],
15722
- "returns": "meta (contadores globais) + payload (array de políticas de atribuição)",
15792
+ "returns": "Array PURO de politicas (json.array!) — NAO tem meta, NAO tem payload e NAO tem paginacao: vem TODAS as politicas da conta de uma vez. Cada item traz { id, name, description, assignment_order, conversation_priority, fair_distribution_limit, fair_distribution_window, enabled, assign_offline_agents, assigned_inbox_count, created_at, updated_at }. O que cada campo da distribuicao significa: fair_distribution_limit = quantas conversas o robo entrega a CADA atendente dentro da janela (freio de rajada; a vaga volta assim que a conversa deixa de estar aberta); fair_distribution_window = tamanho dessa janela em SEGUNDOS (600 = 10 minutos); assign_offline_agents = quando true, o robo tambem entrega para quem nao esta com o painel aberto; enabled = quando false, as caixas ligadas nesta politica nao recebem distribuicao automatica; assignment_order = round_robin (rodizio) ou balanced (por carga de trabalho, so no build Enterprise); conversation_priority = earliest_created (atende primeiro a conversa criada ha mais tempo) ou longest_waiting (a que esta esperando ha mais tempo); assigned_inbox_count = quantas caixas usam esta politica. OBRIGATORIO: leia estes valores da conta antes de responder qualquer pergunta sobre ritmo/limite de distribuicao — NUNCA recite o padrao de fabrica (10 a cada 600 segundos) como se fosse o numero do cliente; conta que mudou o valor faz o padrao virar mentira.",
15723
15793
  "common_use_cases": [
15724
15794
  "Dashboard: contar/exibir políticas de atribuição",
15725
15795
  "Buscar com filtros antes de outra operação",
@@ -15767,6 +15837,13 @@
15767
15837
  "required": false,
15768
15838
  "description": "Prioridade das conversas: earliest_created ou longest_waiting"
15769
15839
  },
15840
+ {
15841
+ "name": "assign_offline_agents",
15842
+ "type": "boolean",
15843
+ "location": "body",
15844
+ "required": false,
15845
+ "description": "Distribuir tambem para atendentes OFFLINE (ausentes/fora do horario). Nasce DESLIGADO (29/07/2026). Quando a caixa tem esta politica vinculada, e a POLITICA que manda: o mesmo ajuste feito direto na caixa (auto_assignment_config) passa a ser ignorado e a secao de distribuicao SOME da tela da caixa."
15846
+ },
15770
15847
  {
15771
15848
  "name": "fair_distribution_limit",
15772
15849
  "type": "integer",
@@ -15818,7 +15895,7 @@
15818
15895
  "description": "ID da politica"
15819
15896
  }
15820
15897
  ],
15821
- "returns": "política de atribuição (objeto completo com associações)",
15898
+ "returns": "Objeto PURO da politica (sem envelope meta/payload e sem associacoes aninhadas): { id, name, description, assignment_order, conversation_priority, fair_distribution_limit, fair_distribution_window, enabled, assign_offline_agents, assigned_inbox_count, created_at, updated_at }. O que cada campo da distribuicao significa: fair_distribution_limit = quantas conversas o robo entrega a CADA atendente dentro da janela (freio de rajada; a vaga volta assim que a conversa deixa de estar aberta); fair_distribution_window = tamanho dessa janela em SEGUNDOS (600 = 10 minutos); assign_offline_agents = quando true, entrega tambem para quem nao esta com o painel aberto; enabled = quando false, as caixas ligadas nesta politica nao recebem distribuicao automatica; assignment_order = round_robin (rodizio) ou balanced (por carga, so no build Enterprise); conversation_priority = earliest_created ou longest_waiting; assigned_inbox_count = quantas caixas usam esta politica. IMPORTANTE: em toda caixa vinculada a esta politica, os numeros que valem sao os DAQUI — o auto_assignment_config da propria caixa e IGNORADO enquanto houver politica vinculada. OBRIGATORIO: leia estes valores da conta antes de responder — NUNCA recite o padrao de fabrica (10 a cada 600 segundos) como se fosse o numero do cliente.",
15822
15899
  "common_use_cases": [
15823
15900
  "Ver dados completos antes de editar",
15824
15901
  "Verificar estado atual antes de uma ação",
@@ -15835,7 +15912,7 @@
15835
15912
  "method": "PUT",
15836
15913
  "path": "/api/v1/accounts/{account_id}/assignment_policies/{id}",
15837
15914
  "title": "Atualizar Politica de Atribuicao",
15838
- "description": "Atualiza uma politica de atribuicao. Suporta atualização parcial — só campos enviados são alterados. Campos suportados: name, description, assignment_order, conversation_priority, fair_distribution_limit, fair_distribution_window, enabled.",
15915
+ "description": "Atualiza uma politica de atribuicao. Suporta atualizacao parcial — so campos enviados sao alterados. Campos suportados: name, description, assignment_order, conversation_priority, assign_offline_agents, fair_distribution_limit, fair_distribution_window, enabled.",
15839
15916
  "category": "Politicas de Atribuicao",
15840
15917
  "params": [
15841
15918
  {
@@ -15873,6 +15950,13 @@
15873
15950
  "required": false,
15874
15951
  "description": "Prioridade das conversas: earliest_created ou longest_waiting"
15875
15952
  },
15953
+ {
15954
+ "name": "assign_offline_agents",
15955
+ "type": "boolean",
15956
+ "location": "body",
15957
+ "required": false,
15958
+ "description": "Distribuir tambem para atendentes OFFLINE (ausentes/fora do horario). Nasce DESLIGADO (29/07/2026). Quando a caixa tem esta politica vinculada, e a POLITICA que manda: o mesmo ajuste feito direto na caixa (auto_assignment_config) passa a ser ignorado e a secao de distribuicao SOME da tela da caixa."
15959
+ },
15876
15960
  {
15877
15961
  "name": "fair_distribution_limit",
15878
15962
  "type": "integer",
@@ -15952,7 +16036,7 @@
15952
16036
  "description": "ID da politica"
15953
16037
  }
15954
16038
  ],
15955
- "returns": "meta (contadores globais) + payload (array de políticas de atribuição)",
16039
+ "returns": "Objeto `{ inboxes: [...] }` — a chave e `inboxes`, NAO `payload`, e nao ha meta nem paginacao. O array traz as caixas de entrada vinculadas a essa politica de atribuicao, no formato completo de caixa (id, name, channel_type, e demais campos da caixa). Devolve `{ \"inboxes\": [] }` quando nenhuma caixa usa a politica.",
15956
16040
  "common_use_cases": [
15957
16041
  "Dashboard: contar/exibir políticas de atribuição",
15958
16042
  "Buscar com filtros antes de outra operação",
@@ -16130,7 +16214,7 @@
16130
16214
  "description": "Lista todos os webhooks configurados. Lista webhooks paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de webhook).",
16131
16215
  "category": "Webhooks",
16132
16216
  "params": [],
16133
- "returns": "meta (contadores globais) + payload (array de webhooks)",
16217
+ "returns": "{ payload: { webhooks: [ ...webhooks ] } } — SEM meta. A lista fica em payload.webhooks (payload e objeto, nao array). Traz todos os webhooks da conta, sem paginacao. Cada webhook tem id, name, url, account_id, subscriptions (lista de eventos assinados), secret e o estado do disjuntor de falhas: failure_count, blocked_until (data ISO — preenchida = webhook EM PAUSA), last_failure_at, last_success_at e last_failure_reason. Se o webhook estiver amarrado a uma caixa, vem tambem o bloco inbox { id, name }; webhook de conta inteira nao traz esse bloco.",
16134
16218
  "common_use_cases": [
16135
16219
  "Dashboard: contar/exibir webhooks",
16136
16220
  "Buscar com filtros antes de outra operação",
@@ -19620,7 +19704,7 @@
19620
19704
  "description": "Retorna configuracoes de notificacao do usuario. Lista configs de notificação paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de config de notificação).",
19621
19705
  "category": "Config de Notificacao",
19622
19706
  "params": [],
19623
- "returns": "meta (contadores globais) + payload (array de configs de notificação)",
19707
+ "returns": "Um objeto unico (NAO e lista): id, user_id, account_id, all_email_flags, selected_email_flags, all_push_flags, selected_push_flags e task_reminder_minutes. Sao as preferencias de notificacao do usuario logado nesta conta. Nao ha paginacao nem lista nenhuma.",
19624
19708
  "common_use_cases": [
19625
19709
  "Dashboard: contar/exibir configs de notificação",
19626
19710
  "Buscar com filtros antes de outra operação",
@@ -19700,7 +19784,7 @@
19700
19784
  "description": "Lista prompts salvos do Copilot. Lista prompts copilot paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de prompt copilot).",
19701
19785
  "category": "Prompts Salvos",
19702
19786
  "params": [],
19703
- "returns": "meta (contadores globais) + payload (array de prompts copilot)",
19787
+ "returns": "Lista pura: a resposta E o array de prompts salvos do Copilot, sem embrulho de meta/payload. Cada item: id, account_id, created_by_id, title, prompt, position, created_at, updated_at. Ordenado por `position`; sem paginacao. Qualquer agente pode ler; so admin cria, edita ou exclui.",
19704
19788
  "common_use_cases": [
19705
19789
  "Dashboard: contar/exibir prompts copilot",
19706
19790
  "Buscar com filtros antes de outra operação",
@@ -19841,7 +19925,7 @@
19841
19925
  "description": "Retorna configuracoes do VoIP. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
19842
19926
  "category": "Chamadas",
19843
19927
  "params": [],
19844
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
19928
+ "returns": "Um OBJETO unico com a configuracao de voz (Zenvia) da conta — NAO e lista de ligacoes. Sem configuracao: `{configured: false, has_parent_token}`. Com configuracao: `{configured: true, active, bina_number, default_bina_id, gravar_audio, transcription_provider, auto_transcribe, transcription_language, has_zenvia_token, has_transcription_key, has_parent_token, setup_mode, zenvia_account_id, zenvia_login}`. Segredos nao sao devolvidos — so os indicadores has_zenvia_token / has_transcription_key dizem se estao preenchidos. Historico de ligacoes fica em /voip/calls.",
19845
19929
  "common_use_cases": [
19846
19930
  "Dashboard: contar/exibir chamadas VoIP",
19847
19931
  "Buscar com filtros antes de outra operação",
@@ -19916,7 +20000,7 @@
19916
20000
  "description": "Lista numeros disponiveis para identificacao de chamada. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
19917
20001
  "category": "Chamadas",
19918
20002
  "params": [],
19919
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
20003
+ "returns": "Repassa CRUA a resposta da operadora Zenvia (GET /bina/relatorio) — nao ha meta, payload nem paginacao nossa. O formato e `{ sucesso: true, dados: { relatorio: [ { id, numero_telefone, ... } ] } }`: os numeros ficam em `dados.relatorio`. O conteudo sao NUMEROS DE IDENTIFICACAO DE CHAMADA (binas), nao chamadas VoIP. Se a conta nao tiver VoIP configurado (sem token Zenvia), a chamada falha com erro de servidor. Em resposta nao-JSON da operadora, vem `{ status, body }`.",
19920
20004
  "common_use_cases": [
19921
20005
  "Dashboard: contar/exibir chamadas VoIP",
19922
20006
  "Buscar com filtros antes de outra operação",
@@ -19936,7 +20020,7 @@
19936
20020
  "description": "Retorna o saldo disponivel no provedor VoIP. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
19937
20021
  "category": "Chamadas",
19938
20022
  "params": [],
19939
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
20023
+ "returns": "Objeto unico com a resposta crua do provedor Zenvia (endpoint /saldo) — NAO e lista de ligacoes e nao tem meta nem payload. O valor do saldo vem em dados.saldo (o painel le exatamente `data.dados.saldo`).",
19940
20024
  "common_use_cases": [
19941
20025
  "Dashboard: contar/exibir chamadas VoIP",
19942
20026
  "Buscar com filtros antes de outra operação",
@@ -19956,7 +20040,7 @@
19956
20040
  "description": "Retorna URL para recarga de creditos VoIP. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
19957
20041
  "category": "Chamadas",
19958
20042
  "params": [],
19959
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
20043
+ "returns": "NAO devolve chamadas. Este endpoint repassa cru a resposta da Zenvia para a URL de recarga de credito: um OBJETO (ex.: { sucesso, url, ... }, chaves conforme a Zenvia), sem meta/payload. Em falha de parse vem { status, body }.",
19960
20044
  "common_use_cases": [
19961
20045
  "Dashboard: contar/exibir chamadas VoIP",
19962
20046
  "Buscar com filtros antes de outra operação",
@@ -19976,7 +20060,7 @@
19976
20060
  "description": "Retorna historico de recargas. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
19977
20061
  "category": "Chamadas",
19978
20062
  "params": [],
19979
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
20063
+ "returns": "Repasse direto da resposta da Zenvia (/minha-conta/relatorio-recarga): objeto no formato dela, tipicamente com o campo 'sucesso' mais os dados da recarga. Nao tem meta, nao tem payload e nao sao chamadas VoIP — e o historico de RECARGAS de credito. Se a Zenvia devolver algo que nao e JSON, vem { status, body }.",
19980
20064
  "common_use_cases": [
19981
20065
  "Dashboard: contar/exibir chamadas VoIP",
19982
20066
  "Buscar com filtros antes de outra operação",
@@ -20036,7 +20120,7 @@
20036
20120
  "description": "Retorna configuracao do ramal do agente. Lista chamadas VoIP paginados (per_page padrão 25, máximo 100). Retorna meta (contadores) + payload (array de chamada VoIP).",
20037
20121
  "category": "Chamadas",
20038
20122
  "params": [],
20039
- "returns": "meta (contadores globais) + payload (array de chamadas VoIP)",
20123
+ "returns": "Objeto simples do RAMAL do usuario atual — NAO e lista de ligacoes. Sem ramal configurado: { configured: false }. Com ramal: { configured: true, ramal_number, webphone_url, status }. Para historico de ligacoes use a listagem de chamadas VoIP.",
20040
20124
  "common_use_cases": [
20041
20125
  "Dashboard: contar/exibir chamadas VoIP",
20042
20126
  "Buscar com filtros antes de outra operação",
@@ -20485,7 +20569,7 @@
20485
20569
  "type": "boolean",
20486
20570
  "location": "body",
20487
20571
  "required": false,
20488
- "description": "Define se o agente fica offline automaticamente por inatividade"
20572
+ "description": "Privilegio \"Permanecer disponivel\". PADRAO true = o agente cai pra offline sozinho quando fecha o painel (comportamento normal). false = ele conta como DISPONIVEL 24h mesmo com o painel fechado — em conta que so distribui pra quem esta online, de madrugada ele vira o UNICO elegivel e leva TODOS os leads. Desde 30/07/2026 so ADMINISTRADOR concede (a rota de autoatendimento do proprio perfil passou a recusar), e o privilegio foi ZERADO para todo atendente comum na mesma data. Esta ferramenta e o caminho do admin e continua funcionando — mas nunca desligue sem o cliente pedir explicitamente."
20489
20573
  },
20490
20574
  {
20491
20575
  "name": "custom_role_id",
@@ -20587,7 +20671,7 @@
20587
20671
  "type": "boolean",
20588
20672
  "location": "body",
20589
20673
  "required": false,
20590
- "description": "Define se o agente fica offline automaticamente por inatividade"
20674
+ "description": "Privilegio \"Permanecer disponivel\". PADRAO true = o agente cai pra offline sozinho quando fecha o painel (comportamento normal). false = ele conta como DISPONIVEL 24h mesmo com o painel fechado — em conta que so distribui pra quem esta online, de madrugada ele vira o UNICO elegivel e leva TODOS os leads. Desde 30/07/2026 so ADMINISTRADOR concede (a rota de autoatendimento do proprio perfil passou a recusar), e o privilegio foi ZERADO para todo atendente comum na mesma data. Esta ferramenta e o caminho do admin e continua funcionando — mas nunca desligue sem o cliente pedir explicitamente."
20591
20675
  },
20592
20676
  {
20593
20677
  "name": "custom_role_id",
@@ -20687,7 +20771,7 @@
20687
20771
  "description": "Incluir atributos do sistema (default false)"
20688
20772
  }
20689
20773
  ],
20690
- "returns": "meta (contadores globais) + payload (array de atributos personalizados)",
20774
+ "returns": "Lista pura (array), sem embrulho: a resposta E o array de definicoes de atributos personalizados. Cada definicao traz id, attribute_display_name, attribute_display_type, attribute_description, attribute_key, regex_pattern, regex_cue, attribute_values, attribute_model, attribute_timezone, default_value, `system` e created_at/updated_at. O `attribute_model` tem TRES valores: contact_attribute (contato), conversation_attribute (conversa) e account_attribute (variaveis da conta) — sem filtro a lista mistura os tres, entao passe `attribute_model` pra separar. Por padrao os atributos do sistema (Meta/Guru/UTM/agendamento) ficam FORA — passe include_system=true pra inclui-los. Sem paginacao e sem contador.",
20691
20775
  "common_use_cases": [
20692
20776
  "Dashboard: contar/exibir atributos personalizados",
20693
20777
  "Buscar com filtros antes de outra operação",
@@ -20990,7 +21074,7 @@
20990
21074
  "description": "Filtrar por nota"
20991
21075
  }
20992
21076
  ],
20993
- "returns": "meta (contadores globais) + payload (array de respostas CSAT)",
21077
+ "returns": "Lista PURA (a resposta E o array, sem embrulho: nao ha meta nem payload) — 25 respostas por pagina, use `page` para as proximas; NAO vem total nenhum na resposta (para totais e distribuicao de notas use a ferramenta de metricas de CSAT). So aparecem pesquisas RESPONDIDAS. Cada item traz id, rating, feedback_message, csat_review_notes, review_notes_updated_at/by, account_id, message_id, conversation_id (display_id), contact (objeto do contato), assigned_agent (objeto do agente) e created_at (unix). Devolve `[]` quando nao ha respostas no filtro. Atencao: agente nao-admin so ve o proprio CSAT — o filtro user_ids e ignorado para ele.",
20994
21078
  "common_use_cases": [
20995
21079
  "Dashboard: contar/exibir respostas CSAT",
20996
21080
  "Buscar com filtros antes de outra operação",
@@ -21141,7 +21225,7 @@
21141
21225
  "type": "array",
21142
21226
  "location": "body",
21143
21227
  "required": false,
21144
- "description": "Critérios de público — array de seções combináveis: { type: 'Label', id } | { type: 'Funnel', id, stages: ['slug_etapa'], include_won: bool, include_lost: bool } | { type: 'ConversationAttribute', key, value } (atributo personalizado da conversa, ex: origem_do_lead=instagram). OBRIGATÓRIO em one-off"
21228
+ "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."
21145
21229
  },
21146
21230
  {
21147
21231
  "name": "audience_mode",
@@ -21190,7 +21274,7 @@
21190
21274
  "type": "object",
21191
21275
  "location": "body",
21192
21276
  "required": false,
21193
- "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."
21277
+ "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."
21194
21278
  },
21195
21279
  {
21196
21280
  "name": "template_params",
@@ -21204,7 +21288,7 @@
21204
21288
  "type": "integer",
21205
21289
  "location": "body",
21206
21290
  "required": false,
21207
- "description": "CAMPANHA DE FLUXO (28/07/2026): id do flow que sera disparado para cada pessoa do publico, em vez de mandar uma mensagem. Quando presente, `message` NAO e usado (quem manda texto sao os blocos do flow) e o ritmo vai em template_params (delay_min/delay_max/daily_cap). O flow PRECISA: estar ativo, ser do tipo conversa, ter o gatilho 'campaign_trigger' ligado no bloco start E estar vinculado a MESMA inbox da campanha — senao 422 explicando qual regra falhou. Em caixa WhatsApp OFICIAL o 1o bloco de mensagem do flow tem que ser um template aprovado (senao 422). Use lionchat_flows_list com with_campaign_trigger=true&inbox_id=N para achar os flows elegiveis ANTES de criar."
21291
+ "description": "CAMPANHA DE FLUXO (28/07/2026): id do flow que sera disparado para cada pessoa do publico, em vez de mandar uma mensagem. Quando presente, `message` NAO e usado (quem manda texto sao os blocos do flow) e o ritmo vai em template_params (delay_min/delay_max/daily_cap). O flow PRECISA: estar ativo, ser do tipo conversa, ter o gatilho 'campaign_trigger' ligado no bloco start E estar vinculado a MESMA inbox da campanha — senao 422 explicando qual regra falhou. Em caixa WhatsApp OFICIAL o PRIMEIRO bloco de mensagem de CADA CAMINHO do flow tem que comecar por um modelo aprovado — com sorteio ou condicao no inicio, TODAS as variacoes contam, nao so a primeira (senao 422, e o erro nomeia ate 5 blocos culpados). Use lionchat_flows_list com with_campaign_trigger=true&inbox_id=N para achar os flows elegiveis ANTES de criar."
21208
21292
  }
21209
21293
  ],
21210
21294
  "returns": "{ campaign: {...} } (201)",
@@ -21276,7 +21360,7 @@
21276
21360
  "type": "array",
21277
21361
  "location": "body",
21278
21362
  "required": false,
21279
- "description": "Critérios de público — array de seções combináveis: { type: 'Label', id } | { type: 'Funnel', id, stages: ['slug_etapa'], include_won: bool, include_lost: bool } | { type: 'ConversationAttribute', key, value } (atributo personalizado da conversa, ex: origem_do_lead=instagram)"
21363
+ "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."
21280
21364
  },
21281
21365
  {
21282
21366
  "name": "audience_mode",
@@ -21304,7 +21388,7 @@
21304
21388
  "type": "integer",
21305
21389
  "location": "body",
21306
21390
  "required": false,
21307
- "description": "CAMPANHA DE FLUXO (28/07/2026): id do flow que sera disparado para cada pessoa do publico, em vez de mandar uma mensagem. Quando presente, `message` NAO e usado (quem manda texto sao os blocos do flow) e o ritmo vai em template_params (delay_min/delay_max/daily_cap). O flow PRECISA: estar ativo, ser do tipo conversa, ter o gatilho 'campaign_trigger' ligado no bloco start E estar vinculado a MESMA inbox da campanha — senao 422 explicando qual regra falhou. Em caixa WhatsApp OFICIAL o 1o bloco de mensagem do flow tem que ser um template aprovado (senao 422). Use lionchat_flows_list com with_campaign_trigger=true&inbox_id=N para achar os flows elegiveis ANTES de criar."
21391
+ "description": "CAMPANHA DE FLUXO (28/07/2026): id do flow que sera disparado para cada pessoa do publico, em vez de mandar uma mensagem. Quando presente, `message` NAO e usado (quem manda texto sao os blocos do flow) e o ritmo vai em template_params (delay_min/delay_max/daily_cap). O flow PRECISA: estar ativo, ser do tipo conversa, ter o gatilho 'campaign_trigger' ligado no bloco start E estar vinculado a MESMA inbox da campanha — senao 422 explicando qual regra falhou. Em caixa WhatsApp OFICIAL o PRIMEIRO bloco de mensagem de CADA CAMINHO do flow tem que comecar por um modelo aprovado — com sorteio ou condicao no inicio, TODAS as variacoes contam, nao so a primeira (senao 422, e o erro nomeia ate 5 blocos culpados). Use lionchat_flows_list com with_campaign_trigger=true&inbox_id=N para achar os flows elegiveis ANTES de criar."
21308
21392
  }
21309
21393
  ],
21310
21394
  "returns": "{ campaign: {...} }",
@@ -21374,7 +21458,7 @@
21374
21458
  "type": "array",
21375
21459
  "location": "body",
21376
21460
  "required": true,
21377
- "description": "Lista de secoes do publico-alvo (uniao/intersecao conforme audience_mode). Cada secao: {type, ...}. Tipos: 'Label' {id} (etiqueta de CONVERSA); 'Funnel' {id, stage_id?} (etapa de funil Kanban); 'ConversationAttribute' {key, value}; 'ContactLabel' {id} (etiqueta de CONTATO); 'ContactAttribute' {key, value}; 'CardAttribute' {key, value} (atributo do card Kanban); 'AgentTeam' {assignee_ids:[], team_ids:[]} (responsavel atual OU time da conversa)."
21461
+ "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."
21378
21462
  },
21379
21463
  {
21380
21464
  "name": "audience_mode",
@@ -21383,15 +21467,22 @@
21383
21467
  "required": false,
21384
21468
  "description": "Como combinar as secoes: 'sum' (uniao — quem estiver em QUALQUER secao, padrao) | 'all' (intersecao — quem estiver em TODAS as secoes preenchidas). No estimate vai top-level; ao CRIAR a campanha o modo vai dentro de trigger_rules.audience_mode."
21385
21469
  },
21470
+ {
21471
+ "name": "inbox_id",
21472
+ "type": "integer",
21473
+ "location": "body",
21474
+ "required": false,
21475
+ "description": "Caixa que vai disparar. Sem ele o `limit_info` volta todo NULO e o teto diario da Meta NAO aparece — o silencio parece \"nao ha limite\". Mande SEMPRE o mesmo inbox_id que sera usado na campanha. So caixa WhatsApp OFICIAL (Cloud) tem teto; QR Code/SMS devolvem nulo mesmo com o id."
21476
+ },
21386
21477
  {
21387
21478
  "name": "exclusion",
21388
21479
  "type": "array",
21389
21480
  "location": "body",
21390
21481
  "required": false,
21391
- "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)."
21482
+ "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)."
21392
21483
  }
21393
21484
  ],
21394
- "returns": "{ count: <int> }",
21485
+ "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.",
21395
21486
  "common_use_cases": [
21396
21487
  "Validar público antes do disparo",
21397
21488
  "Comparar união vs interseção dos critérios"
@@ -21429,7 +21520,7 @@
21429
21520
  "method": "GET",
21430
21521
  "path": "/api/v1/accounts/{account_id}/campaigns/{id}/flow_report",
21431
21522
  "title": "Andamento da Campanha de Fluxo",
21432
- "description": "Andamento da agenda de uma CAMPANHA DE FLUXO (campanha criada com flow_id). Retorna scheduled (total agendado), fired (ja disparados), pending (ainda na fila), skipped (pulados), cancelled, failed, skips (quebra por MOTIVO do pulo) e ends_at (previsao de termino). Motivos possiveis em skips[].reason: sessao_ja_ativa (a pessoa ja estava nesse mesmo flow — evita receber em dobro), contato_sem_telefone, template_necessario (caixa oficial exige template aprovado no 1o bloco), caixa_desvinculada, gatilho_removido, flow_inativo, flow_removido, conversa_falhou, sessao_duplicada, erro_interno. Quando a campanha termina os numeros ficam CONGELADOS (a agenda e limpa em 30 dias). 422 se a campanha nao for de fluxo.",
21523
+ "description": "Andamento da agenda de uma CAMPANHA DE FLUXO (campanha criada com flow_id). Retorna scheduled (total agendado), fired (ja disparados), pending (ainda na fila), skipped (pulados), cancelled, failed, skips (quebra por MOTIVO do pulo) e ends_at (previsao de termino). Motivos possiveis em skips[].reason: sessao_ja_ativa (a pessoa ja estava nesse mesmo flow — evita receber em dobro), contato_sem_telefone, template_necessario (caixa oficial: algum CAMINHO do flow abre sem modelo aprovado no primeiro bloco de mensagem daquele caminho — com sorteio/condicao no inicio, todas as variacoes contam), caixa_desvinculada, gatilho_removido, flow_inativo, flow_removido, conversa_falhou, sessao_duplicada, erro_interno. Quando a campanha termina os numeros ficam CONGELADOS (a agenda e limpa em 30 dias). 422 se a campanha nao for de fluxo.",
21433
21524
  "category": "Campanhas",
21434
21525
  "params": [
21435
21526
  {
@@ -25183,6 +25274,13 @@
25183
25274
  "required": false,
25184
25275
  "description": "Atribuição automática"
25185
25276
  },
25277
+ {
25278
+ "name": "auto_assignment_config",
25279
+ "type": "object",
25280
+ "location": "body",
25281
+ "required": false,
25282
+ "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."
25283
+ },
25186
25284
  {
25187
25285
  "name": "additional_attributes",
25188
25286
  "type": "object",
@@ -25810,10 +25908,10 @@
25810
25908
  "params": [
25811
25909
  {
25812
25910
  "name": "file",
25813
- "type": "string",
25911
+ "type": "file",
25814
25912
  "location": "body",
25815
25913
  "required": true,
25816
- "description": "Arquivo CSV (mesmo formato do import_csv)"
25914
+ "description": "Arquivo CSV (multipart, mesmo formato do import_csv). E um ARQUIVO de verdade, nao o texto da planilha colado — mandar o conteudo como texto derruba o servidor com erro 500."
25817
25915
  },
25818
25916
  {
25819
25917
  "name": "mappings",