# API do Atomiks — guia para IA

Tudo que a interface faz também existe como operação de API. Lista completa com entrada, saída, exemplo e erros: [referência completa](https://app.atomiks.com.br/llms-full.txt) (gerada do código). OpenAPI ao vivo: `GET https://app.atomiks.com.br/api/v1/openapi.json`.

**Para agentes:** `https://app.atomiks.com.br/llms.txt` é o índice (cada operação com link), `https://app.atomiks.com.br/llms-full.txt` traz guia e todas as operações em um arquivo, e qualquer página de `https://app.atomiks.com.br/docs` existe em Markdown (acrescente `.md` à URL ou envie `Accept: text/markdown`). Exemplos: `https://app.atomiks.com.br/docs/index.md`, `https://app.atomiks.com.br/docs/crm.md`, `https://app.atomiks.com.br/docs/operacoes/inbox.send.md`. Tudo é público, sem login, e sai do código das operações.

## Chave de API

1. Entre no Atomiks como administrador da conta.
2. Configurações → Chaves de API → criar, escolher os escopos.
3. Copie a chave (`atk_...`). Ela aparece uma única vez.

Cada chave pertence a **uma conta**: só enxerga e altera dados dela. Para outra conta, outra chave. Operações de chave (`api_keys.*`) e de cadastro só funcionam pela interface.

| Escopo | Permite |
|---|---|
| `account:read` / `account:write` | ler / alterar dados da conta |
| `team:read` / `team:write` | ver / gerenciar membros e convites; perfil do membro (`members.profile_wallet`, `members.profile_service`, `members.profile_agenda`, `members.profile_builds`, `members.profile_facts`; só administrador) |
| `activity:read` | ler o log de atividade e a auditoria da conta (`audit_hub.list`, só administrador) |
| `channels:read` | listar os números de WhatsApp conectados (e `channel_connections.list`/`get`/`members`/`diagnostics`/`templates_list`/`profile_get`/`test_status`, com qualidade, limite e verificação da Meta; `refresh` relê na Meta; templates, perfil comercial, nome de exibição, foto, histórico do WhatsApp Web e mensagem de teste em `channels:write`) e, com o módulo de plano `messages.email-inbox`, ver as caixas de e-mail (`email_inbox.list`, `email_inbox.get`, `email_inbox.preview`; `email_inbox.members`, só administrador, diz quem tem acesso a cada caixa) |
| `channels:write` | conectar e desconectar números (só pela interface, ver abaixo) e, como administrador, chamar qualquer rota do provedor num número por QR (`channels.evolution_call`, `channels.waha_call`); caixas de e-mail por IMAP/SMTP (`email_inbox.*`: testar credenciais, conectar, trocar a senha, ajustar remetente e assinatura, importar histórico, ler agora, desconectar; exigem administrador e o módulo de plano `messages.email-inbox`, que não vem em nenhum plano por padrão: sem ele a resposta é `forbidden`; as senhas são cifradas com `TOKEN_ENC_KEY` e nunca voltam, sem a chave o cadastro responde `credencial_ausente`; só servidores públicos de e-mail, rede interna dá `host_not_allowed`; dependem de uma migration, sem ela a escrita responde `migration_pendente`) |
| `conversions:read` / `conversions:write` | ver / alterar as conversões enviadas à Meta (`capi.*`) |
| `contacts:read` | listar contatos e ver a origem de cada um (`contacts.list`, `contacts.get`) |
| `ads:read` | ver anúncios, quantas pessoas trouxeram e a conexão da conta de anúncios (`ads.*`, `meta.connection_get`, `meta.ad_accounts_list`), a árvore de campanhas (`ads_manager.tree`) e exportar leads e vendas atribuídos a anúncios, sem dado pessoal (`attribution.export`, usado pelo RealMetrics) |
| `ads:write` | pedir nova leitura dos dados da Meta (`ads_manager.sync`). O Atomiks não altera campanhas: a conexão com a Meta é só leitura |
| `messages:read` | ler conversas, mensagens e modelos do atendimento (`inbox.conversations_list`, `inbox.conversation_get`, `inbox.messages_list`, `inbox.mark_read`, `inbox.templates_list`, `inbox.templates_sync`) e baixar mídia (`GET /api/v1/media/:id`) |
| `messages:send` | enviar mensagens (`inbox.send`; numa conversa de e-mail sai pelo SMTP da caixa) e subir arquivos para envio (`POST /api/v1/uploads`); `email_inbox.send` envia um e-mail novo, com assunto, pela caixa conectada |
| `messages:send` (atendimento) | também cobre assumir, devolver, atribuir, resolver e reabrir (`inbox.attendance`), notas internas (`inbox.note_*`) e mensagens agendadas (`inbox.schedule`, `inbox.scheduled_cancel`) |
| `crm:read` / `crm:write` | ver / alterar o CRM: funis, oportunidades, vendas, tarefas, produtos, campos, etiquetas, listas, agenda (`crm.*`), atendentes, tipos de atendente e comissão por pipeline (`attendants.*`, `attendant_types.*`, `pipelines.attendant_*`), times de distribuição (`teams.*`) agendas, ajustes de agendamento e horários livres (`scheduling.*`), playbooks e o simulador do copiloto (`playbooks.*`, exceto o playbook da conversa, que usa `messages:read`/`messages:send`), cadências de follow-up (`cadences.*`), os campos customizados de contatos e oportunidades (`custom_fields.*`), o quadro de oportunidades com filtros, regras de etapa, ações em massa, gaveta e configurações do pipeline (`pipelines.*`), as vendas com receita, transações, comprador, rastreio/UTM, vendas de plataformas externas e exportar CSV (`sales.*`), o histórico global de atividades dos contatos (`activities.*`: lista com filtros e total, opções dos filtros, estatísticas, exportar CSV como tarefa do worker com `export`/`export_get`, que depende de uma migration e sem ela responde `migration_pendente`, e o Registro de mensagens com `message_leads`/`message_thread`/`message_detail`; o que o membro vê segue a visibilidade de contatos) e objetos personalizados (`custom_objects.*`: objetos, campos com grupo, único, uso e quem preencheu, ligações, registros, vínculos, notas, visões, acesso, filtros por campos do outro lado da ligação (`relation_filter_fields`), foto de campo (`image_upload`) e exportar/importar registros em CSV/TSV como tarefas assíncronas do worker: `records_export`, `records_import` (recebe o `uploadId` de `records_import_upload_url`, com `columnMappings`, `matchFieldId`, `conflictStrategy` e `responsibleAttendantId`), `records_bulk_update`/`records_bulk_delete` (acima de 200 registros devolvem `{mode:'async', jobId}`), `record_job_get`/`record_jobs_list` e o mapeamento por IA `records_import_ai_mapping`/`records_import_ai_column` (sem `ANTHROPIC_API_KEY` devolvem `aiFailed` e o mapeamento é por nome da coluna); exigem o módulo de plano `crm.custom-objects`, que não vem em nenhum plano por padrão: sem ele a resposta é `forbidden`; configurar objetos, campos e ligações exige membro administrador, mexer nos registros não), as agentes de IA e chaves de provedor (`ai_agents.*`, `ai_credentials.*`; a chave é cifrada com `TOKEN_ENC_KEY`, nunca volta e só os 4 últimos dígitos aparecem; sem `TOKEN_ENC_KEY` o cadastro responde `credencial_ausente`), conexões do Google Calendar/Meet e Drive por atendente (`connections.*`; conectar usa o OAuth do Google e exige `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET` no servidor, senão `credencial_ausente`), avaliação de reunião (`meetings.coaching_*`: zonas-alvo e pesos da nota por conta e a sugestão pelas reuniões; salvar exige membro administrador; dependem de uma migration, sem ela a leitura devolve os padrões e a escrita responde `migration_pendente`). Parte exige membro administrador (ver exemplo de CRM) |
| `automations:read` / `automations:write` | ver / alterar automações de comentário e Direct (`automations.*`), flows (`flows.*`, `flow_runs.*`) e integrações (`integrations.*`; alterar integração exige administrador) |
| `messages:manage` | só administradores: respostas rápidas e configurações do atendimento (`inbox.quick_replies_*`, `inbox.settings_*`) |
| `admin:read` / `admin:write` | só super-admin: contas e planos |

Só pela interface (`sessionOnly`, a chave recebe `forbidden`): `channels.signup_start`, `channels.signup_complete`, `channels.disconnect`, `channels.evolution_connect`, `channels.evolution_qr`, `channels.evolution_cancel`, `meta.ad_account_select`, `meta.disconnect`.

Operações de área (`contacts.*`, `ads.*`) respondem `forbidden` quando o plano da conta não inclui a área ou quando o membro dono da chave não tem permissão nela. Toda chamada por chave, leituras também, aparece no log de atividade.

Operações com escopo `-` (ex.: `me.get`) funcionam com qualquer chave.

## Integrações nativas: tudo que o provedor faz

Regra do produto, vale para toda conexão direta com o Atomiks (integração nativa: Evolution no número por QR, Meta, Instagram e as que vierem): **todas** as rotas do provedor ficam disponíveis pela API, pelo MCP e pela CLI, sem exceção de recurso, e o que o atendimento usa no dia a dia também tem tela. Rota nova do provedor entra no catálogo do Atomiks. A única coisa que não sai é o que quebraria o canal ou vazaria credencial; para isso há uma operação do Atomiks com o mesmo efeito.

Número por QR: dois servidores, dois catálogos. Cada número usa um deles (o `channels.list` mostra qual); a chamada ao catálogo do outro responde `invalid_input` apontando a operação certa.

Número por QR no servidor novo (WAHA 2026.10.1):

- `channels.waha_endpoints` lista as rotas por sessão: sessão, envio, conversas, grupos, canais, status, etiquetas, contatos, presença, mídia, eventos e privacidade.
- `channels.waha_call` chama qualquer uma no número da conta: `{channelId, method, path, params?, query?, body?}`, com `path` (ex. `api/:session/groups`) e corpo como na documentação do WAHA. O Atomiks põe a sessão (no caminho e no campo `session` do corpo/query) e usa a chave da sessão, nunca a global; mandar `session` de outro número dá `invalid_input`. Só administrador.
- Não chamadas direto, com o substituto: apagar, parar ou sair da sessão (use `channels.disconnect`), alterar a sessão (`channels.evolution_settings_update`), listar sessões (`channels.list`), e as rotas de chaves, servidor e apps (geridos pelo Atomiks).

Número por QR no servidor anterior (Evolution API 2.3.7):

- `channels.evolution_endpoints` lista as rotas: instância, envio, conversas, grupos, etiquetas, perfil, privacidade, proxy, eventos, chatbots (Typebot, OpenAI, Dify, Flowise, n8n, EvoAI, EvolutionBot), Chatwoot e S3.
- `channels.evolution_call` chama qualquer uma no número da conta: `{channelId, method, path, params?, query?, body?}`, com `path` e corpo como na documentação da Evolution. O Atomiks põe a instância e o token dela; a chave global da Evolution nunca é usada nem exposta. Só administrador. Envio por `message/send*` fica gravado na conversa do atendimento, como mensagem do celular.
- No atendimento: `inbox.group_participants` (quem está no grupo, telefone, papel; bloco "Participantes" no painel da conversa de grupo) e `inbox.group_participants_update` (adicionar, remover, promover, rebaixar).
- Não chamadas direto, com o substituto: `instance/logout` e `instance/delete` (use `channels.disconnect`), `webhook/set` (é o caminho das mensagens; o Atomiks o mantém, leitura em `webhook/find`), `baileys/getAuthState` (chaves da sessão do WhatsApp) e `chatwoot/webhook` (rota de volta do Chatwoot). `instance/create` exige a chave global: é `channels.evolution_connect`.

```bash
curl -X POST "$APP_URL/api/v1/channels.evolution_call" -H "Authorization: Bearer $ATOMIKS_API_KEY" -H "Content-Type: application/json" \
  -d '{"channelId":"<id>","method":"GET","path":"group/participants","query":{"groupJid":"120363000000000000@g.us"}}'
```

## Chamar a API

```bash
curl -X POST "$APP_URL/api/v1/members.list" \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" -H "Content-Type: application/json" -d '{}'
```

Sucesso: `{"data": ...}`. Erro: `{"error": {"code", "message", "requestId"}}`, com `code` em `unauthorized`, `forbidden`, `account_pending`, `scope_missing`, `invalid_input`, `not_found`, `limit_reached`, `internal`, `migration_pendente` (503: recurso que depende de uma migration ainda não aplicada) e `credencial_ausente` (503: falta a chave de um provedor no servidor, como ANTHROPIC_API_KEY em `playbooks.simulate`). Ao pedir suporte, informe o `requestId` (também no cabeçalho `x-request-id`).

## MCP

Servidor MCP remoto (Streamable HTTP, sem sessão) em `https://app.atomiks.com.br/api/mcp`, com `Authorization: Bearer <chave>`. Cada operação que a chave pode chamar vira uma ferramenta; nome = id com `.` trocado por `_` (`members.list` → `members_list`). Erros voltam como erro de ferramenta, com `code` e `requestId`.

```bash
claude mcp add --transport http atomiks https://app.atomiks.com.br/api/mcp --header "Authorization: Bearer <chave>"
```

Local: `https://app.atomiks.com.br` = `http://localhost:3010`.

## CLI

Node puro, sem build. Variáveis: `ATOMIKS_URL` (padrão `http://localhost:3010`) e `ATOMIKS_API_KEY`.

```bash
export ATOMIKS_API_KEY=atk_...
node cli/atomiks.mjs ops                                  # lista operações
node cli/atomiks.mjs me.get
node cli/atomiks.mjs members.list --json '{}'
node cli/atomiks.mjs members.invite --file convite.json   # entrada de um arquivo
```

(`pnpm link --global` instala o comando `atomiks`.) Em erro: código de saída 1, `error.code`, mensagem e `requestId` no stderr.

## Exemplo: conversões para a Meta pela CLI/MCP

Chave com `conversions:read` (ver) e `conversions:write` (alterar). Só o que a conta tem permissão de fazer na interface.

CLI:

```bash
node cli/atomiks.mjs capi.settings_get --json '{}'
node cli/atomiks.mjs capi.settings_update --json '{"enabled":true,"purchaseOnSale":true,"testEventCode":"TEST12345"}'
node cli/atomiks.mjs capi.stage_event_set --json '{"stageId":"<id da etapa>","eventName":"QualifiedLead"}'   # "eventName": null remove
node cli/atomiks.mjs capi.deliveries_list --json '{"status":"failed"}'
node cli/atomiks.mjs capi.delivery_retry --json '{"id":"<id da entrega>"}'
```

MCP: as mesmas operações como ferramentas `capi_settings_get`, `capi_settings_update`, `capi_stage_event_set`, `capi_deliveries_list` e `capi_delivery_retry`.

`capi.settings_update` aceita `enabled`, `purchaseOnSale`, `leadOnCtwa`, `pageId` (só dígitos) e `testEventCode`. O evento por etapa só vale em etapa aberta e entre os eventos aceitos pela Meta. Quando um card entra na etapa, a entrega entra na fila e o worker envia. `deliveries_list` filtra por `status` (`pending`, `sending`, `sent`, `failed`, `skipped`) e pagina por `nextCursor`; `delivery_retry` só reenvia entrega `failed` ou `skipped`. Números conectados por QR code não enviam conversões.

## Números por QR code (Evolution)

Conectar por QR code (`channels.evolution_connect`, `channels.evolution_qr` e `channels.evolution_cancel`) é só pela interface: o QR precisa ser lido na tela, então a chave de API recebe `forbidden`. Depois de conectado, o número aparece em `channels.list` com `connectionType` `qr`, e as conversas dele funcionam pelas mesmas operações do atendimento (`inbox.*`), sem janela de 24 h nem modelos. O servidor precisa de `EVOLUTION_API_URL` e `EVOLUTION_API_KEY` (ver `docs/deploy.md`); sem eles a conexão responde que o QR code não está configurado.

## Grupos (Marketing)

Módulo `marketing`, escopos `marketing:read` (leitura) e `marketing:write` (escrita). Visão geral, tabelas e estado em produção em `docs/grupos/README.md`. Enquanto as migrations 20261027000005 a 000008 não forem aplicadas em produção, as operações novas respondem `migration_pendente` ou leem vazio.

Campanhas e número
- `groups.campaigns_list`, `groups.campaign_get`: listar e ver campanhas de grupos.
- `groups.campaign_create`, `groups.campaign_update`: criar e alterar campanha (capacidade, rotação, cookie, reserva, endereço de reserva); `status: "ended"` encerra.
- `groups.number_connect`: conecta o número dedicado a Grupos. É só pela interface (QR ou código de pareamento), a chave de API recebe `forbidden`.
- `groups.number_status`, `groups.number_disconnect`: estado, QR e saúde do número; desconectar.
- `groups.campaign_number_attach`, `groups.campaign_number_detach`: vincular e desvincular número da campanha.

Grupos, pastas e jobs
- `groups.groups_list`: grupos da campanha, paginados, com busca e filtros no servidor.
- `groups.groups_update_bulk`, `groups.groups_remove_bulk`, `groups.groups_reorder`: captação, pasta e link em lote; tirar da rotação; reordenar.
- `groups.whatsapp_groups`, `groups.groups_import`: listar os grupos do número no WhatsApp e importar para a campanha.
- `groups.groups_create_preview`, `groups.groups_create`: estimar e enfileirar a criação de grupos em lote.
- `groups.access_check`: conferir se o número participa, é admin e o convite vale.
- `groups.folders_list`, `groups.folder_create`, `groups.folder_rename`, `groups.folder_delete`: pastas da campanha.
- `groups.jobs_list`, `groups.job_get`, `groups.job_cancel`: jobs de importar, criar e conferir; cancelar.

Captação e link público
- `groups.links_list`, `groups.link_create`, `groups.link_update`, `groups.link_delete`: link principal e links extras com rotação própria.
- `groups.rotation_now`, `groups.rotation_simulate`: próximo grupo da rotação e simulação de cliques (nada é gravado).
- `groups.click_stats`: cliques e entradas por período, dispositivo, origem, UTM e grupo.

Mensagens, envio e agenda
- `groups.messages_list`, `groups.message_get`, `groups.message_create`, `groups.message_update`, `groups.message_delete`, `groups.message_preview`: biblioteca de mensagens (texto, link, mídia, enquete, contato; variação `{a|b|c}`).
- `groups.welcome_settings`: lê ou grava as boas-vindas automáticas (liga, janela, horário).
- `groups.send_now`: enfileira o envio para todos, pasta, link ou grupos escolhidos, com `speed` `slow`, `normal` ou `fast`.
- `groups.sends_list`, `groups.send_items`: disparos e os itens de cada um.
- `groups.send_retry_failed`, `groups.send_delete`, `groups.send_edit`: reenviar falhas; apagar para todos (até 48 h) e editar texto (até 15 min) de disparo parado.
- `groups.schedules_list`, `groups.schedule_create`, `groups.schedule_update`, `groups.schedule_pause`, `groups.schedule_resume`, `groups.schedule_cancel`: agendamentos únicos e recorrentes no fuso da campanha.

Monitoramento
- `groups.alerts_list`, `groups.alert_resolve`: alertas da campanha (`no_seat`, `number_disconnected`, `invite_invalid`, `near_full`, `suspected_ban`).
- `groups.membership_stats`, `groups.member_events_list`: entradas, saídas e saldo; eventos recentes (participante mascarado).
- `groups.campaign_health`, `groups.campaigns_health`: nota de 0 a 100, nível e próxima ação.
- `groups.governor_status`, `groups.governor_clear_ban`: saúde e limites do número; limpar a suspeita de banimento.

Rotas fora do registro de operações (mesma chave de API, escopo `marketing:write`, perfil administrador)
- `POST /api/v1/grupos-media`: envia o arquivo de uma mensagem de mídia (formulário com o campo `file`, até 16 MB; imagem JPEG/PNG, vídeo MP4, áudio, PDF, TXT, Office). Responde 201 com `{data: {storagePath, mime, mediaKind, fileName, size}}`; passe `storagePath` em `media` de `groups.message_create`.
- `GET /api/v1/grupos-export?campaignId=<uuid>&kind=members|groups|clicks&purpose=<finalidade>`: baixa CSV (UTF-8) em streaming. `purpose` é obrigatório (5 a 200 caracteres) e fica registrado na atividade da conta com `kind` e quantidade de linhas. `from` e `to` (ISO 8601 com fuso) filtram `members` e `clicks`.
- `GET /g/<código>`: link público de captação, sem login nem chave. Escolhe o grupo pela rotação, grava o cookie `atk_gv` quando a campanha usa cookie e abre o WhatsApp no convite; sem vaga, vai ao endereço de reserva. `HEAD` e robôs de prévia recebem página neutra, sem gastar vaga. Precisa da migration 000006.

Regra: número de atendimento nunca entra em Grupos. O de Grupos é desconectado se o telefone coincidir com um de atendimento da conta.

## Exemplo: de qual anúncio veio esse contato

Chave com `contacts:read` (e `ads:read` para a lista de anúncios).

CLI:

```bash
node cli/atomiks.mjs contacts.list --json '{"origin":"ad","limit":20}'   # só quem veio de anúncio
node cli/atomiks.mjs contacts.get --json '{"id":"<id do contato>"}'      # origem completa
node cli/atomiks.mjs ads.list --json '{}'                                # anúncios e quantas pessoas trouxeram
```

MCP: as mesmas chamadas como ferramentas `contacts_list` (`{"origin":"ad"}`), `contacts_get` (`{"id":"..."}`) e `ads_list`.

Onde ficam os dados:

- `contacts.list`: `origin.kind` (`ad` ou `organic`), `origin.adName`, `origin.campaignName`, `origin.headline`.
- `contacts.get`: `origin.ad` traz `name` (anúncio), `adsetName` (conjunto), `campaignName` (campanha), `permalinkUrl` (link do anúncio) e `previewLink`. `origin.referral` traz o que veio na própria mensagem (título, texto, imagem, `sourceUrl`).

`lookupStatus` diz se os nomes são confiáveis:

| Valor | Significa |
|---|---|
| `ok` | a Meta respondeu: nomes e links completos |
| `pending` | consulta ainda não feita (o worker faz em segundos); nomes vazios |
| `not_matched` | o anúncio não pertence à conta de anúncios conectada; nomes vazios |
| `error` | a consulta falhou (veja `lookupError`) |

Com qualquer valor diferente de `ok`, use só o que veio na mensagem (`headline`, imagem, `sourceUrl`).

## Exemplo: exportar leads e vendas atribuídos (RealMetrics)

Chave com `ads:read`. O RealMetrics usa esta operação para somar no ROAS de cada anúncio os leads de WhatsApp e as vendas do atendimento. Nenhum dado pessoal sai.

```bash
node cli/atomiks.mjs attribution.export --json '{"kind":"leads","from":"2026-10-01","to":"2026-10-07"}'
node cli/atomiks.mjs attribution.export --json '{"kind":"sales","from":"2026-10-01","to":"2026-10-07","cursor":"<nextCursor anterior>"}'
```

MCP: ferramenta `attribution_export`. `from` e `to` são `AAAA-MM-DD` no fuso da conta de anúncios (até 93 dias). Lead: um por contato cuja primeira indicação de anúncio caiu na janela (`contactId`, `firstAt`, `adId`, `ctwaClid`, `sourceType`). Venda: `saleId`, `contactId`, `soldAt`, `valueCents`, `cancelledAt` (canceladas vêm preenchidas) e `adId` da primeira indicação. Página com menos itens que `limit` não significa fim: o fim é `nextCursor` nulo. Contrato completo: `docs/2026-10-25-atomiks-realmetrics-integracao.md`.

Pausar, ativar e mudar orçamento ficam no Gerenciador de Anúncios da Meta ou no RealMetrics: a tela Campanhas do Atomiks tem os links "Abrir na Meta" e "Abrir no RealMetrics" em cada linha.

## Exemplo: quanto custou cada conversa real

Chave com `ads:read`.

CLI:

```bash
node cli/atomiks.mjs ads_manager.tree --json '{"from":"2026-10-01","to":"2026-10-07"}'
```

MCP: ferramenta `ads_manager_tree`, com `from` e `to` (`AAAA-MM-DD`, até 93 dias).

Cada campanha, conjunto e anúncio traz `spend`, `impressions`, `clicks` e duas contagens de conversa: `conversationsMeta` (iniciadas segundo a Meta) e `conversationsReal` (contatos cuja primeira indicação é do anúncio, no dia do fuso da conta). `costPerConversationReal` = `spend` / `conversationsReal`, e é `null` sem conversa real. `totals` soma a conta. Se `lastSyncedAt` estiver velho, `ads_manager.sync` pede nova atualização (o worker faz no próximo ciclo).

## Exemplo: responder um lead pela CLI/MCP

Chave com `messages:read` e `messages:send`. A chave só vê os números a que o membro dono dela tem acesso.

CLI:

```bash
node cli/atomiks.mjs inbox.conversations_list --json '{}'                                   # conversas, mais recentes primeiro
node cli/atomiks.mjs inbox.messages_list --json '{"conversationId":"<id da conversa>"}'     # histórico
node cli/atomiks.mjs inbox.send --json '{"conversationId":"<id da conversa>","clientRequestId":"<uuid novo>","text":"Olá!"}'
```

MCP: ferramentas `inbox_conversations_list`, `inbox_messages_list` e `inbox_send`, com a mesma entrada.

`clientRequestId` (UUID gerado por você) torna o envio idempotente: repetir o mesmo valor devolve a mensagem original e não reenvia. Se a Meta não confirmar, a resposta vem com `uncertain: true` e a mensagem fica `unknown`; nada é reenviado sozinho, confira antes de tentar de novo. Fora da janela de 24 h (`windowExpiresAt` da conversa) só vale modelo aprovado.

## Exemplo: assumir e resolver uma conversa pela CLI/MCP

Chave com `messages:send` (e `messages:read` para conferir). A chave age como o membro dono dela: com "só livres e as próprias" ligado, ela só assume conversa sem atendente.

CLI:

```bash
node cli/atomiks.mjs inbox.attendance --json '{"conversationId":"<id da conversa>","action":"claim"}'     # assumir
node cli/atomiks.mjs inbox.attendance --json '{"conversationId":"<id da conversa>","action":"resolve"}'   # resolver
```

MCP: ferramenta `inbox_attendance`. `action` aceita `claim`, `leave` (devolver à fila), `assign` e `transfer` (com `userId`; só administrador), `resolve`, `reopen` e `set_priority`. Se duas pessoas assumem ao mesmo tempo, só a primeira vale e a outra recebe erro. Resolver com mensagens agendadas pendentes pede `"scheduled":"cancel"` ou `"keep"`. A resposta traz a conversa atualizada.

## Exemplo: deixar uma nota interna

```bash
node cli/atomiks.mjs inbox.note_create --json '{"conversationId":"<id da conversa>","body":"Cliente pediu retorno amanhã."}'
```

MCP: `inbox_note_create`. A nota aparece só para a equipe e nunca é enviada ao WhatsApp. Editar e remover: `inbox.note_update` e `inbox.note_delete`; listar: `inbox.notes_list` (`messages:read`).

## Exemplo: agendar uma mensagem

```bash
node cli/atomiks.mjs inbox.schedule --json '{"conversationId":"<id da conversa>","scheduledAt":"2026-10-30T13:00:00-03:00","timezone":"America/Sao_Paulo","contents":[{"kind":"text","text":"Bom dia! Passando para lembrar do nosso combinado."}]}'
node cli/atomiks.mjs inbox.scheduled_list --json '{"conversationId":"<id da conversa>"}'
```

MCP: `inbox_schedule`, `inbox_scheduled_list` e `inbox_scheduled_cancel`. O horário precisa estar no futuro. O worker envia no horário (checa a cada tick de 5 s); `status` passa por `scheduled`, `sending` e termina em `sent` ou `failed` (veja `error`). Arquivos entram como `{"kind":"upload","uploadId":"..."}`.

## Exemplo: filtrar a fila

```bash
node cli/atomiks.mjs inbox.conversations_list --json '{"tab":"queue"}'                                 # abertas sem atendente
node cli/atomiks.mjs inbox.conversations_list --json '{"tab":"mine","unreadByMe":true}'                 # minhas, com algo que não li
node cli/atomiks.mjs inbox.conversations_list --json '{"statusIn":["open"],"priorityIn":["high","urgent"],"awaitingReply":true,"q":"#000123"}'
```

MCP: `inbox_conversations_list`. Os filtros se combinam com E. Cada item traz `unreadByMe`, `assignee`, `ticket`, `priority` e `windowState`.

## Exemplo: enviar um modelo fora da janela

```bash
node cli/atomiks.mjs inbox.templates_list --json '{"channelId":"<id do número>"}'
node cli/atomiks.mjs inbox.send --json '{"conversationId":"<id da conversa>","clientRequestId":"<uuid novo>","templateId":"<id do modelo>","params":{"1":"Maria"}}'
```

MCP: `inbox_templates_list` e `inbox_send`. `templates_list` devolve, por modelo, os campos a preencher (`slots`), `sendable` e `reason`. Modelos com mídia no cabeçalho ou botão com parâmetro vêm com `sendable: false`. `params` leva um valor por campo listado em `slots`. Informe exatamente um entre `text`, `uploadId` e `templateId`.

## Exemplo: subir um arquivo e enviar

O upload é HTTP com corpo `multipart/form-data`, não uma operação (o MCP não consegue enviar binário; use `curl` ou HTTP direto e depois chame `inbox_send` pelo MCP). Chave com `messages:send`.

```bash
curl -X POST "$APP_URL/api/v1/uploads" \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -F kind=document -F file=@proposta.pdf
# {"data":{"uploadId":"...","kind":"document","mimeType":"application/pdf","filename":"proposta.pdf","sizeBytes":12345}}

node cli/atomiks.mjs inbox.send --json '{"conversationId":"<id da conversa>","clientRequestId":"<uuid novo>","uploadId":"<uploadId>","caption":"Segue a proposta"}'
```

`kind` e limites: `image` (JPEG, PNG; 5 MB), `video` (MP4, 3GPP; 16 MB), `audio` (AAC, MP4, MP3, AMR, OGG; 16 MB), `voice` (WebM, OGG, MP4; 16 MB; o servidor converte para OGG/Opus e chega como mensagem de voz), `document` (PDF, TXT, DOC, XLS, PPT e versões X; 16 MB). Arquivo fora do tipo ou grande demais volta como `invalid_input` (HTTP 400, ou 413 se passar do limite). Upload não usado em 24 h é apagado.

Para ler uma mídia recebida: `GET /api/v1/media/<id da mídia>` (o `id` vem em `media.id` da mensagem; `?download=1` força baixar) com `messages:read`. Responde 302 para um link assinado de 60 s (siga o redirecionamento: `curl -L`). Erros: 404 (não existe ou o membro não vê o número), 409 (ainda não chegou), 410 (expirada pela retenção).

## Exemplo: vendas e CRM pela CLI/MCP

```bash
node cli/atomiks.mjs crm.pipelines_list --json '{}'                                          # funis
node cli/atomiks.mjs crm.board --json '{"pipelineId":"<id do funil>"}'                       # quadro com etapas e oportunidades
node cli/atomiks.mjs crm.opportunity_create --json '{"contactId":"<id do contato>"}'         # abre oportunidade
node cli/atomiks.mjs crm.opportunity_move --json '{"id":"<id da oportunidade>","stageId":"<id da etapa>"}'
node cli/atomiks.mjs crm.sale_create --json '{"contactId":"<id do contato>","valueCents":9700}'
node cli/atomiks.mjs crm.task_create --json '{"contactId":"<id do contato>","title":"Ligar para fechar","kind":"call"}'
```

MCP: `crm_board`, `crm_opportunity_move`, `crm_sale_create`, `crm_task_create` etc., com a mesma entrada. Leituras usam `crm:read`; criar, mover e cancelar usam `crm:write`. Funis, etapas, produtos, regras de venda, campos personalizados, etiquetas, listas e disponibilidade exigem membro **administrador** além do escopo; oportunidades, vendas, tarefas e etiquetas de contato servem a qualquer membro. Valores em centavos. Mover para a etapa configurada dispara o evento de conversão (veja a seção de conversões).

## Exemplo: criar e publicar um flow

Um flow é um grafo de nós (gatilho, esperas, condições, mensagens, HTTP etc.) versionado. Editar mexe no rascunho; só `flows.publish` põe a versão no ar.

```bash
node cli/atomiks.mjs flows.catalog --json '{}'                                  # eventos e tipos de nó disponíveis
node cli/atomiks.mjs flows.create --json '{"name":"Boas-vindas"}'              # cria com rascunho vazio
node cli/atomiks.mjs flows.save_draft --file rascunho.json                      # grava o grafo (id + graph)
node cli/atomiks.mjs flows.test_run --json '{"id":"<id do flow>","contactId":"<id do contato>"}'   # simula com um contato
node cli/atomiks.mjs flows.publish --json '{"id":"<id do flow>"}'
node cli/atomiks.mjs flows.pause --json '{"id":"<id do flow>"}'                # pausa; flows.resume volta
```

Outras: `flows.list`, `flows.get`, `flows.rename`, `flows.versions`, `flows.restore_version`, `flows.duplicate`, `flows.archive`, `flows.export` / `flows.import` (JSON do grafo) e `flows.stats`. Leitura usa `automations:read`; o resto, `automations:write`. Todas valem para qualquer membro e existem como ferramentas MCP (`flows_publish` etc.).

## Exemplo: acompanhar execuções de flows

```bash
node cli/atomiks.mjs flow_runs.list --json '{"status":"failed","limit":50}'     # execuções com falha
node cli/atomiks.mjs flow_runs.get --json '{"id":"<id da execução>"}'           # passos e erro de cada nó
node cli/atomiks.mjs flow_runs.retry_step --json '{"id":"<id da execução>","nodeId":"n1"}'
node cli/atomiks.mjs flow_runs.cancel --json '{"id":"<id da execução>"}'
```

MCP: `flow_runs_list`, `flow_runs_get`, `flow_runs_retry_step`, `flow_runs_cancel`. Listar e ler: `automations:read`; refazer passo e cancelar: `automations:write`.

## Exemplo: conectar Hotmart, Kiwify ou webhook

```bash
node cli/atomiks.mjs integrations.catalog --json '{}'                           # conectores e modelos prontos
node cli/atomiks.mjs integrations.create --json '{"connector":"hotmart","name":"Hotmart","secret":"<hottok>"}'
node cli/atomiks.mjs integrations.events --json '{"integrationId":"<id>"}'      # eventos recebidos
node cli/atomiks.mjs integrations.reprocess --json '{"id":"<id do evento>"}'   # reprocessa um evento
node cli/atomiks.mjs integrations.deliveries --json '{"integrationId":"<id>"}'  # entregas dos webhooks de saída
```

Resposta de `integrations.create` traz a URL de entrada (`/api/integrations/<publicKey>`) para colar na plataforma. A rota é pública e confere o segredo: token errado volta 401, evento repetido não duplica. Criar, alterar, pausar (`integrations.set_status`), excluir, girar segredo (`integrations.rotate_secret`), reprocessar e testar (`integrations.test`) exigem membro **administrador** e `automations:write`; ler (`list`, `get`, `events`, `get_event`, `deliveries`, `products`) usa `automations:read`.

## Exemplo: automações de comentário e Direct

```bash
node cli/atomiks.mjs automations.list --json '{}'
node cli/atomiks.mjs automations.create --file automacao.json
node cli/atomiks.mjs automations.set_enabled --json '{"id":"<id>","enabled":false}'
node cli/atomiks.mjs automations.runs --json '{"id":"<id>"}'                    # histórico de disparos
node cli/atomiks.mjs automations.test --json '{"id":"<id>"}'
```

`automacao.json`:

```json
{"channelId":"<id do canal>","name":"Quero o guia","trigger":"comment","mediaIds":[],"keywords":["quero"],"matchMode":"contains","publicReplies":["Te mandei no Direct!"],"dmText":"Oi {nome}, aqui está o guia.","oncePerUser":true,"enabled":true}
```

MCP: `automations_create`, `automations_set_enabled`, `automations_runs` etc. Ler (`list`, `get`, `runs`, `media`, `test`): `automations:read`; criar, alterar, ligar/desligar e excluir: `automations:write`.

## Regenerar a referência

`pnpm docs:api` reescreve `docs/api/reference.md` a partir das operações (usa o Vite já instalado para carregar o TypeScript; sem tsx). Rode depois de mudar qualquer operação.


---

# Referência de todas as operações

# me.get

Dados do usuário e suas contas. Retorna o usuário autenticado, as contas de que participa (papel, plano, permissões) e a conta atual.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/me.get` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `me_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `me.get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/me.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs me.get --json '{}'
```

MCP: ferramenta `me_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/me.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# auth.signup

Cadastro de nova conta. Só com convite da lista de espera (`invite` = token do link recebido por e-mail, válido para o mesmo e-mail e de uso único). Cria usuário, perfil e uma conta no plano gratuito (bloqueada até liberação) com o novo usuário como administrador. Sem `company`, a conta recebe o nome do usuário.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/auth.signup` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `auth.signup`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `company` | string | não |  |
| `phone` | string | não |  |
| `email` | string | sim |  |
| `password` | string | sim |  |
| `invite` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/auth.signup \
  -H "Content-Type: application/json" \
  -d '{"name":"Maria Souza","company":"Clínica Souza","phone":"+5511999990000","email":"maria@exemplo.com","password":"minha-senha-123","invite":"token-do-convite"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/auth.signup.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# auth.password_request

Pede e-mail de redefinição de senha. Envia link e código de 6 dígitos para redefinir a senha. Responde sempre `{ok: true}`, exista o e-mail ou não, e com limites por e-mail e por IP.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/auth.password_request` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `auth.password_request`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `email` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/auth.password_request \
  -H "Content-Type: application/json" \
  -d '{"email":"maria@exemplo.com"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/auth.password_request.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# auth.password_reset

Define nova senha com link ou código. Aceita `{token, password}` (token do link recebido por e-mail) ou `{email, code, password}` (código de 6 dígitos do mesmo e-mail). Encerra as outras sessões e avisa por e-mail. O código tem limite de 5 tentativas por e-mail e 10 por IP por hora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/auth.password_reset` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `auth.password_reset`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/auth.password_reset \
  -H "Content-Type: application/json" \
  -d '{"token":"token-do-link-recebido-por-email","password":"minha-senha-nova-123"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/auth.password_reset.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# waitlist.join

Entra na lista de espera. Guarda o e-mail (e o pedido feito à Atom) na lista de espera. Repetir o e-mail não duplica nem falha; `request` só é atualizado se vier um texto novo. Responde sempre `{ok: true}`, sem revelar se o e-mail já estava na lista. Limite de 10 por hora por IP.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/waitlist.join` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `waitlist.join`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `email` | string | sim |  |
| `request` | string | não |  |
| `source` | string | não | padrão "lp" |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/waitlist.join \
  -H "Content-Type: application/json" \
  -d '{"email":"maria@exemplo.com","request":"Quero organizar o atendimento da clínica","source":"lp"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/waitlist.join.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# auth.signup_invite_get

Confere um convite de cadastro. Devolve o e-mail do convite se o token existe, não expirou e ainda não foi usado; senão responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/auth.signup_invite_get` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `auth.signup_invite_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `token` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/auth.signup_invite_get \
  -H "Content-Type: application/json" \
  -d '{"token":"token-do-convite"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/auth.signup_invite_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.waitlist.list

Lista a lista de espera. Até 200 e-mails da lista de espera, mais recentes primeiro. `q` filtra por trecho do e-mail; `status` pelo estado do convite.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.waitlist.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_waitlist_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.waitlist.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `status` | "aguardando" \| "convidado" \| "expirado" \| "cadastrado" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.waitlist.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"aguardando"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.waitlist.list --json '{"status":"aguardando"}'
```

MCP: ferramenta `admin_waitlist_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.waitlist.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.waitlist.invite

Convida um e-mail para o cadastro. Gera um convite de uso único, válido por 14 dias, para quem está na lista de espera (ou para um e-mail novo, que entra com origem `admin`) e envia por e-mail. Convidar de novo substitui o convite anterior. Devolve também o link, para a equipe copiar se o e-mail não chegar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.waitlist.invite` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `admin_waitlist_invite`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.waitlist.invite`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `email` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.waitlist.invite \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"maria@exemplo.com"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.waitlist.invite --json '{"email":"maria@exemplo.com"}'
```

MCP: ferramenta `admin_waitlist_invite` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.waitlist.invite.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.staff.list

Lista a equipe do painel. Pessoas com acesso ao painel admin: nome, e-mail, papel (owner, admin, support ou viewer), se têm 2FA ativo, último acesso e data de entrada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.staff.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_staff_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.staff.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.staff.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs admin.staff.list --json '{}'
```

MCP: ferramenta `admin_staff_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.staff.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.staff.add

Adiciona pessoa à equipe. Dá um papel de equipe a um e-mail. Se a pessoa já tem usuário, só define o papel; se não, cria o usuário e envia o link para definir a senha. Só o dono concede o papel owner.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.staff.add` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.staff.add`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `email` | string | sim |  |
| `role` | "owner" \| "admin" \| "support" \| "viewer" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.staff.add \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"ana@exemplo.com","role":"support"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.staff.add.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.staff.set_role

Muda o papel de alguém da equipe. Troca o papel de uma pessoa da equipe. Só o dono mexe em donos; ninguém altera o próprio papel; o último dono não pode ser rebaixado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.staff.set_role` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.staff.set_role`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |
| `role` | "owner" \| "admin" \| "support" \| "viewer" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.staff.set_role \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000","role":"admin"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.staff.set_role.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.staff.remove

Remove alguém da equipe. Tira o acesso de equipe de uma pessoa (o usuário continua existindo). Só o dono remove donos; ninguém se remove; o último dono não pode ser removido.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.staff.remove` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.staff.remove`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.staff.remove \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.staff.remove.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.overview.get

Visão geral do painel. Números do sistema para a equipe: contas por status, funil e novas por dia no período (7, 30 ou 90 dias), contas por plano, inativas há 14 dias, ativas sem canal e perto do limite do plano (80%), membros, canais parados (regra webhookHealth), custo de IA por dia, taxa de erro e p95 de duração das chamadas nas últimas 24 h e a fila de atenção: contas pendentes a apagar em até 3 dias, canais parados por conta e erros de log das últimas 24 h agrupados por mensagem. Blocos de IA, requisições e erros vêm null se a tabela ainda não existe. Contas de teste (dono @test.atomiks.dev) ficam fora de todos os números, salvo includeTest. Nunca retorna conteúdo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.overview.get` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_overview_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.overview.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `days` | 7 \| 30 \| 90 | não | padrão 30 |
| `includeTest` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.overview.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"days":30,"includeTest":false}'
```

CLI:

```bash
node cli/atomiks.mjs admin.overview.get --json '{"days":30,"includeTest":false}'
```

MCP: ferramenta `admin_overview_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.overview.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.accounts.get

Detalhe de uma conta (gestão). Dono, plano, datas, membros com e-mail e último acesso, canais com último webhook, contagens de contatos e conversas e as últimas ações da equipe sobre a conta (null se o registro ainda não existe). Nunca retorna conteúdo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.accounts.get` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_accounts_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.accounts.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.accounts.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accountId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.accounts.get --json '{"accountId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `admin_accounts_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.accounts.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.accounts.extend_purge

Adia a exclusão de uma conta pendente. Soma `days` (padrão 7) ao prazo em que a conta pendente (plano gratuito nunca ativado) será apagada e devolve o novo prazo. Conta ativa ou bloqueada dá invalid_input.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.accounts.extend_purge` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `admin_accounts_extend_purge`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.accounts.extend_purge`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | sim |  |
| `days` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.accounts.extend_purge \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accountId":"00000000-0000-0000-0000-000000000000","days":7}'
```

CLI:

```bash
node cli/atomiks.mjs admin.accounts.extend_purge --json '{"accountId":"00000000-0000-0000-0000-000000000000","days":7}'
```

MCP: ferramenta `admin_accounts_extend_purge` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.accounts.extend_purge.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.list

Lista membros e convites pendentes. Retorna os membros da conta atual (com papel e permissões) e os convites ainda válidos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs members.list --json '{}'
```

MCP: ferramenta `members_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.invite

Convida alguém por link. Cria um convite válido por 7 dias, envia o link por e-mail e devolve o link (para copiar se o e-mail não chegar). Conta membros mais convites pendentes contra o limite de usuários do plano.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.invite` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `members_invite`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.invite`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `email` | string (email) | sim |  |
| `role` | "admin" \| "user" | sim |  |
| `permissions` | object | não | padrão {"modules":"*","screens":"*","channels":"*"} |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.invite \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"secretaria@clinica.com","role":"user","permissions":{"modules":["messages"],"screens":"*","channels":"*"}}'
```

CLI:

```bash
node cli/atomiks.mjs members.invite --json '{"email":"secretaria@clinica.com","role":"user","permissions":{"modules":["messages"],"screens":"*","channels":"*"}}'
```

MCP: ferramenta `members_invite` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.invite.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.update

Altera papel ou permissões de um membro. Não permite rebaixar o último administrador da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `members_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string | sim |  |
| `role` | "admin" \| "user" | não |  |
| `permissions` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000","role":"user"}'
```

CLI:

```bash
node cli/atomiks.mjs members.update --json '{"userId":"00000000-0000-0000-0000-000000000000","role":"user"}'
```

MCP: ferramenta `members_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.remove

Remove um membro da conta. Não remove o dono. Revoga as chaves de API do membro nesta conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.remove` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `members_remove`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.remove`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.remove \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs members.remove --json '{"userId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `members_remove` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.remove.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# invites.revoke

Revoga um convite pendente. O link deixa de funcionar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/invites.revoke` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `invites_revoke`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `invites.revoke`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `inviteId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/invites.revoke \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"inviteId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs invites.revoke --json '{"inviteId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `invites_revoke` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/invites.revoke.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# invites.accept

Aceita um convite. O e-mail da sessão precisa ser o do convite. Não cria conta nova: entra na conta que convidou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/invites.accept` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `invites.accept`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `token` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/invites.accept \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"token":"token-do-link"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/invites.accept.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# invites.signup

Cria usuário a partir de um convite. Valida o convite, cria o usuário com o e-mail do convite (sem criar conta) e já o coloca na conta que convidou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/invites.signup` (corpo JSON)
- Quem pode chamar: pública (sem chave nem sessão)
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (pública, sem chave)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `invites.signup`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `token` | string | sim |  |
| `name` | string | sim |  |
| `password` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/invites.signup \
  -H "Content-Type: application/json" \
  -d '{"token":"token-do-link","name":"Maria","password":"uma-senha-forte"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/invites.signup.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# api_keys.list

Listar chaves de API da conta. Lista as chaves de API da conta atual (prefixo, escopos, último uso e revogação). A chave completa nunca é devolvida aqui.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/api_keys.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `api_keys.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/api_keys.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/api_keys.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# api_keys.create

Criar chave de API. Cria uma chave de API com escopos. A chave completa (`key`) aparece só nesta resposta; guarde-a. Escopos `admin:*` só para super-admin.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/api_keys.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `api_keys.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `scopes` | "account:read" \| "account:write" \| "team:read" \| "team:write" \| "activity:read" \| "admin:read" \| "admin:write" \| "channels:read" \| "channels:write" \| "contacts:read" \| "ads:read" \| "ads:write" \| "messages:read" \| "messages:send" \| "messages:manage" \| "crm:read" \| "crm:write" \| "conversions:read" \| "conversions:write" \| "automations:read" \| "automations:write" \| "marketing:read" \| "marketing:write"[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/api_keys.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Integração","scopes":["team:read"]}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/api_keys.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# api_keys.update

Editar chave de API. Troca o nome e os escopos de uma chave ativa da conta atual. Vale na próxima requisição da chave; o segredo não muda. Uma chave não passa de comum para administração (nem o contrário): crie outra.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/api_keys.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `api_keys.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |
| `name` | string | sim |  |
| `scopes` | "account:read" \| "account:write" \| "team:read" \| "team:write" \| "activity:read" \| "admin:read" \| "admin:write" \| "channels:read" \| "channels:write" \| "contacts:read" \| "ads:read" \| "ads:write" \| "messages:read" \| "messages:send" \| "messages:manage" \| "crm:read" \| "crm:write" \| "conversions:read" \| "conversions:write" \| "automations:read" \| "automations:write" \| "marketing:read" \| "marketing:write"[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/api_keys.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Integração","scopes":["team:read","messages:read"]}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/api_keys.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# api_keys.revoke

Revogar chave de API. Revoga uma chave de API da conta atual; ela deixa de funcionar na hora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/api_keys.revoke` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `api_keys.revoke`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/api_keys.revoke \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/api_keys.revoke.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activity.list

Listar atividade da conta. Registro de atividade da conta atual, do mais recente para o mais antigo. Use `before` (id do último item) para a página seguinte.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activity.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `activity:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activity_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activity.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `limit` | integer | não | padrão 50 |
| `before` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activity.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs activity.list --json '{"limit":50}'
```

MCP: ferramenta `activity_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activity.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.accounts.list

Lista contas (gestão). Lista contas com dono, plano, status (pending, active ou blocked), número de membros, canais de WhatsApp conectados, hora do último webhook recebido e datas. `status` aceita pending, active ou all; contas bloqueadas (plano gratuito já ativado antes) só aparecem em all. `plano` filtra pela chave do plano, `inativas` por dias sem atividade (sem atividade, conta desde a criação) e `canal: problema` por contas com canal parado ou que nunca recebeu evento (`channelsAttention`), `canal: sem` por contas sem canal conectado, `includeTest` inclui as contas de teste (dono @test.atomiks.dev), escondidas por padrão, e `limite` (percentual, ex. 80) por contas com membros ou canais a esse percentual ou mais do limite do plano. Nunca retorna conteúdo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.accounts.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_accounts_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.accounts.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `status` | "pending" \| "active" \| "all" | não |  |
| `q` | string | não |  |
| `plano` | string | não |  |
| `inativas` | integer | não |  |
| `canal` | "problema" \| "sem" | não |  |
| `limite` | integer | não |  |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.accounts.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"all"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.accounts.list --json '{"status":"all"}'
```

MCP: ferramenta `admin_accounts_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.accounts.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.accounts.set_plan

Define o plano de uma conta. Troca o plano da conta. Na primeira vez que o plano deixa de ser gratuito, a conta é ativada (activated_at) e deixa de ser apagada. Voltar ao plano gratuito bloqueia a conta, sem apagá-la.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.accounts.set_plan` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `admin_accounts_set_plan`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.accounts.set_plan`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | sim |  |
| `planKey` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.accounts.set_plan \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accountId":"00000000-0000-0000-0000-000000000000","planKey":"teste"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.accounts.set_plan --json '{"accountId":"00000000-0000-0000-0000-000000000000","planKey":"teste"}'
```

MCP: ferramenta `admin_accounts_set_plan` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.accounts.set_plan.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.plans.list

Lista planos. Lista os planos com módulos liberados e limites.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.plans.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_plans_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.plans.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.plans.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs admin.plans.list --json '{}'
```

MCP: ferramenta `admin_plans_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.plans.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.plans.upsert

Cria ou altera um plano. Cria ou altera o plano identificado por `key`. Não há operação para apagar planos nesta etapa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.plans.upsert` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `admin_plans_upsert`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.plans.upsert`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `key` | string | sim |  |
| `name` | string | sim |  |
| `isFree` | boolean | sim |  |
| `modules` | string[] | sim |  |
| `limits` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.plans.upsert \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"teste","name":"Teste","isFree":false,"modules":["messages","crm"],"limits":{"users":5,"channels":2,"contacts":10000,"mediaRetentionDays":7}}'
```

CLI:

```bash
node cli/atomiks.mjs admin.plans.upsert --json '{"key":"teste","name":"Teste","isFree":false,"modules":["messages","crm"],"limits":{"users":5,"channels":2,"contacts":10000,"mediaRetentionDays":7}}'
```

MCP: ferramenta `admin_plans_upsert` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.plans.upsert.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.logs.list

Lista logs de sistema. Linhas de system_logs (warn e error), mais recentes primeiro, com conta por nome, total e filtros opcionais (nível, módulo, mensagem exata, conta, período). Use `before` (id do último item) para a página seguinte. Os logs nunca guardam conteúdo de mensagens, telefones, senhas ou tokens.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.logs.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_logs_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.logs.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `level` | "warn" \| "error" | não |  |
| `module` | string | não |  |
| `message` | string | não |  |
| `accountId` | string (uuid) | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `before` | integer | não |  |
| `limit` | integer | não |  |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.logs.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"level":"error","limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs admin.logs.list --json '{"level":"error","limit":50}'
```

MCP: ferramenta `admin_logs_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.logs.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.logs.groups

Agrupa logs de sistema. Agrupa system_logs por nível, módulo e mensagem no período inteiro (contagem real), mais recente primeiro. `accountId` só vem quando todas as ocorrências são da mesma conta. Contas de teste ficam de fora, a menos que `includeTest` seja true. `sampleId` é a ocorrência mais recente; `truncated` indica que o período passou do limite de linhas lidas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.logs.groups` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_logs_groups`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.logs.groups`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `level` | "warn" \| "error" | não |  |
| `module` | string | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.logs.groups \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"level":"error","from":"2026-10-20T00:00:00Z"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.logs.groups --json '{"level":"error","from":"2026-10-20T00:00:00Z"}'
```

MCP: ferramenta `admin_logs_groups` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.logs.groups.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.audit.list

Auditoria geral (todas as contas). Registro de atividade de todas as contas, do mais recente ao mais antigo, com conta, pessoa (nome e e-mail), canal (via), ação, item, entrada já redigida, IP e id da requisição. Filtros por conta, pessoa, ação (prefixo), canal e período. Use `before` (id do último item) para a página seguinte; até 200 por página.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.audit.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_audit_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.audit.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | não |  |
| `userId` | string (uuid) | não |  |
| `op` | string | não |  |
| `via` | "ui" \| "api" \| "mcp" \| "atom" \| "flow" \| "system"[] | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `before` | integer | não |  |
| `limit` | integer | não | padrão 50 |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.audit.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs admin.audit.list --json '{"limit":50}'
```

MCP: ferramenta `admin_audit_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.audit.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.requests.list

Chamadas de operação (todas as contas). Toda chamada de operação, leitura inclusive, sem a entrada: quem, por qual canal, status, erro e duração. Mais recentes primeiro; `errorsOnly` mostra só status 400 ou mais; filtros por canal (`via`) e período. Use `before` para a página seguinte; até 200 por página.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.requests.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_requests_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.requests.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | não |  |
| `userId` | string (uuid) | não |  |
| `op` | string | não |  |
| `errorsOnly` | boolean | não |  |
| `includeAdminReads` | boolean | não |  |
| `via` | "ui" \| "api" \| "mcp" \| "atom" \| "flow" \| "system"[] | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `before` | integer | não |  |
| `limit` | integer | não | padrão 50 |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.requests.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"errorsOnly":true,"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs admin.requests.list --json '{"errorsOnly":true,"limit":50}'
```

MCP: ferramenta `admin_requests_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.requests.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.trace.get

Rastro de uma requisição. Tudo o que uma requisição fez: chamadas de operação, atividade, logs de sistema e chamadas de IA com o mesmo id de requisição. `around` (hora da linha) limita a ±1 h; até 100 itens por tabela.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.trace.get` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_trace_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.trace.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `requestId` | string | sim |  |
| `around` | string (date-time) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.trace.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"requestId":"req-1"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.trace.get --json '{"requestId":"req-1"}'
```

MCP: ferramenta `admin_trace_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.trace.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.ai_usage.summary

Gasto de IA agregado (todas as contas). Soma de chamadas, tokens e custo em USD das chamadas de IA no período, agrupada por conta, pessoa, modelo, recurso ou dia (fuso de São Paulo). Soma feita no banco.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.ai_usage.summary` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_ai_usage_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.ai_usage.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `groupBy` | "account" \| "user" \| "model" \| "feature" \| "day" | sim |  |
| `accountId` | string (uuid) | não |  |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.ai_usage.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"account"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.ai_usage.summary --json '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"account"}'
```

MCP: ferramenta `admin_ai_usage_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.ai_usage.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.ai_usage.list

Chamadas de IA (todas as contas). Cada chamada a provedor de IA: recurso, modelo, tokens, custo em USD, latência e status. Nunca guarda prompt nem resposta. Use `before` para a página seguinte; até 200 por página.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.ai_usage.list` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_ai_usage_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.ai_usage.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `accountId` | string (uuid) | não |  |
| `userId` | string (uuid) | não |  |
| `feature` | string | não |  |
| `model` | string | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `before` | integer | não |  |
| `limit` | integer | não | padrão 50 |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.ai_usage.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs admin.ai_usage.list --json '{"limit":50}'
```

MCP: ferramenta `admin_ai_usage_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.ai_usage.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# admin.requests.summary

Chamadas de operação agregadas. Chamadas, erros (status 400 ou mais) e duração média no período, agrupadas por conta, pessoa, operação ou dia (fuso de São Paulo). Soma feita no banco; devolve os 100 grupos com mais chamadas (por dia, todos).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/admin.requests.summary` (corpo JSON)
- Quem pode chamar: super-admin da plataforma
- Escopo da chave: `admin:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `admin_requests_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `admin.requests.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `accountId` | string (uuid) | não |  |
| `groupBy` | "account" \| "user" \| "op" \| "day" | sim |  |
| `includeAdminReads` | boolean | não |  |
| `includeTest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/admin.requests.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"op"}'
```

CLI:

```bash
node cli/atomiks.mjs admin.requests.summary --json '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"op"}'
```

MCP: ferramenta `admin_requests_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/admin.requests.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_usage.summary

Gasto de IA da conta. Soma de chamadas, tokens e custo em USD das chamadas de IA da conta atual no período, agrupada por pessoa, modelo, recurso ou dia (fuso de São Paulo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_usage.summary` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `activity:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_usage_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_usage.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `groupBy` | "account" \| "user" \| "model" \| "feature" \| "day" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_usage.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"user"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_usage.summary --json '{"from":"2026-10-01T00:00:00-03:00","to":"2026-11-01T00:00:00-03:00","groupBy":"user"}'
```

MCP: ferramenta `ai_usage_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_usage.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# atom.conversations.list

Listar conversas com a Atom. Histórico de conversas do usuário na conta atual, da mais recente para a mais antiga.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/atom.conversations.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `atom.conversations.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `limit` | integer | não | padrão 30 |
| `before` | string (date-time) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/atom.conversations.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":30}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/atom.conversations.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# atom.conversations.get

Abrir conversa com a Atom. Mensagens, ações e confirmações pendentes de uma conversa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/atom.conversations.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `atom.conversations.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/atom.conversations.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/atom.conversations.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# atom.conversations.delete

Apagar conversa com a Atom. Tira a conversa do histórico (apagamento lógico).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/atom.conversations.delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `atom.conversations.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/atom.conversations.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/atom.conversations.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# atom.chat.send

Conversar com a Atom. Manda uma mensagem à Atom (abre conversa nova sem conversationId) e devolve a conversa atualizada. Ação que altera dados volta em `pending`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/atom.chat.send` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `atom.chat.send`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | não |  |
| `text` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/atom.chat.send \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Quantos contatos eu tenho?"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/atom.chat.send.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# atom.chat.confirm

Confirmar ou recusar ação da Atom. Aprova ou recusa a ação pendente da conversa e deixa a Atom continuar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/atom.chat.confirm` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `atom.chat.confirm`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `approve` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/atom.chat.confirm \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-4000-8000-000000000000","approve":true}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/atom.chat.confirm.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.list

Listar canais de WhatsApp. Números de WhatsApp conectados à conta atual que o membro pode usar, com estado e hora do último webhook recebido.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs channels.list --json '{}'
```

MCP: ferramenta `channels_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.signup_start

Iniciar a conexão de um número de WhatsApp. Cria uma sessão de conexão (válida por 10 minutos, uso único) e devolve o que a janela da Meta precisa: appId, configId e state. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.signup_start` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.signup_start`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `mode` | "coexistence" \| "new_number" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.signup_start \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"coexistence"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.signup_start.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.signup_complete

Concluir a conexão de um número de WhatsApp. Recebe o resultado da janela da Meta, liga o webhook do Atomiks neste número e cria o canal. Coexistência fica em `syncing` até o histórico chegar. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.signup_complete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.signup_complete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `code` | string | sim |  |
| `wabaId` | string | sim |  |
| `phoneNumberId` | string | sim |  |
| `state` | string | sim |  |
| `mode` | "coexistence" \| "new_number" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.signup_complete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code":"AQB...","wabaId":"123456789","phoneNumberId":"987654321","state":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","mode":"coexistence"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.signup_complete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.disconnect

Desconectar um número de WhatsApp. Remove o webhook do Atomiks do número (ele volta ao webhook padrão do app; número por QR code sai e apaga a instância na Evolution) e marca o canal como desconectado. As conversas continuam na conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.disconnect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.disconnect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meta.connection_get

Ver a conexão da conta de anúncios. Estado da conexão com a conta de anúncios da Meta e quantos anúncios cruzaram ou não com a conta conectada. `status` é `none` quando nunca conectou. `matching.okLast7d` conta anúncios resolvidos nos últimos 7 dias.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meta.connection_get` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `meta_connection_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meta.connection_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meta.connection_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs meta.connection_get --json '{}'
```

MCP: ferramenta `meta_connection_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meta.connection_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meta.ad_accounts_list

Listar contas de anúncios do perfil conectado. Contas de anúncios que o perfil do Facebook conectado enxerga (consulta a Meta na hora). Exige conexão ativa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meta.ad_accounts_list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `meta_ad_accounts_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meta.ad_accounts_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meta.ad_accounts_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs meta.ad_accounts_list --json '{}'
```

MCP: ferramenta `meta_ad_accounts_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meta.ad_accounts_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meta.ad_account_select

Escolher a conta de anúncios. Define qual conta de anúncios (`act_...`) a conta do Atomiks usa e recoloca todos os anúncios em cache para nova consulta. A conta precisa estar entre as do perfil conectado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meta.ad_account_select` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meta.ad_account_select`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `adAccountId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meta.ad_account_select \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"adAccountId":"act_1234567890"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meta.ad_account_select.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meta.disconnect

Desconectar a conta de anúncios. Revoga as permissões do app na Meta (melhor esforço) e apaga a conexão e o token da conta de anúncios. `revokedAtMeta` é `false` quando a Meta recusou ou não respondeu; a conexão some do Atomiks do mesmo jeito. Os anúncios já resolvidos continuam em cache; novos não são consultados até reconectar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meta.disconnect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meta.disconnect`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meta.disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meta.disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.list

Listar contatos. Contatos da conta atual, só os que o membro pode ver (administrador vê todos; os demais, os de conversas nos números liberados e os que criou). Contatos na lixeira nunca aparecem.

Filtros: `q` (busca em nome, telefone, e-mail e instagram), `filter` (segmento: lista de nós no formato do construtor de segmentos; grupo = `{id, field: "children", operator: "childrenAnd"|"childrenOr"}` e as condições apontam o grupo em `parentId`; nós sem `parentId` se combinam com E; `negation: true` inverte; valor em `valueString`, `valueNumber`, `valueDate` (AAAA-MM-DD ou ISO), `valueBool` ou `valueUuid`, e listas como JSON em `valueString`). Campos: `name`, `email`, `email_secondary`, `phone`, `instagram`, `linkedin`, `document`, `city`, `state`, `profession`, `language`, `gender`, `birthday`, `created_at`, `updated_at`, `last_activity_at`, `origin_kind`, `ad_id`, `campaign`, `tag`, `list`, `channel` (id do número), `opt_in`/`opt_out` (canal), `temperature`, `temperature_band`, `score`, `score_tier`, `open_opportunities`, `is_customer`, `lgpd`, `email_status` e `cf:<id do campo personalizado>`. Operadores: `contains`, `equals`, `startsWith`, `endsWith`, `isNotEmpty`, `greaterThan`, `greaterThanOrEqual`, `lessThan`, `lessThanOrEqual`, `inLast`/`moreThan` (dias, em `valueNumber`) e `in`. Campo ou operador fora do catálogo dá `invalid_input`.

Os filtros antigos continuam: `origin` (`ad` = primeira indicação de anúncio; `organic` = todo o resto), `adId` e `channelId`, combinados com E.

Ordenação `sort: {key, dir}`: `created` (padrão, mais novo primeiro), `temperature`, `score`, `opportunities`, `name`, `last_activity`; vazios por último.

Paginação por número de página (`page` a partir de 1, `perPage` 20, 50 ou 100) ou por `cursor` (`nextCursor`, tamanho em `limit`; só com a ordenação padrão). `page` e `cursor` juntos dão `invalid_input`. `total` conta tudo que casa com os filtros, sem o cursor.

Cada item traz o que a tabela de contatos mostra: código, origem (`kind` entre `ad`, `organic`, `manual`, `import`, `integration`, `instagram`, `form`, `api`; anúncio e campanha só com consulta à Meta `ok`), indicadores (temperatura e score `null` = ainda sem cálculo), oportunidades abertas, cliente, canais (opt-in por canal: `opted_in`, `opted_out` ou `none` = sem registro, que vale "pode receber"; `hasConversation` só para whatsapp e instagram), tags, tags de sistema (último momento de cada tipo de atividade, mais recente primeiro), campos personalizados por id e as colunas de cadastro. `emailStatus` fica `unverified` até existir verificação real; `possibleFraud` é sempre `null` (sem fonte).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `origin` | "ad" \| "organic" | não |  |
| `adId` | string | não |  |
| `channelId` | string (uuid) | não |  |
| `q` | string | não |  |
| `limit` | integer | não |  |
| `cursor` | string | não |  |
| `page` | integer | não |  |
| `perPage` | 20 \| 50 \| 100 | não |  |
| `filter` | object[] | não |  |
| `sort` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20,"sort":{"key":"temperature","dir":"desc"},"filter":[{"field":"tag","operator":"in","negation":false,"valueString":"[\"00000000-0000-0000-0000-000000000000\"]"},{"field":"temperature","operator":"greaterThanOrEqual","negation":false,"valueNumber":60}]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.list --json '{"page":1,"perPage":20,"sort":{"key":"temperature","dir":"desc"},"filter":[{"field":"tag","operator":"in","negation":false,"valueString":"[\"00000000-0000-0000-0000-000000000000\"]"},{"field":"temperature","operator":"greaterThanOrEqual","negation":false,"valueNumber":60}]}'
```

MCP: ferramenta `contacts_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.get

Ver um contato e sua origem. Contato com a origem completa (primeira indicação de anúncio e o anúncio resolvido: nomes, criativo, `permalinkUrl`, `previewLink`, `lookupStatus`) e todas as indicações do contato, da mais antiga à mais nova. Com `lookupStatus` diferente de `ok` só os dados que vieram na mensagem são confiáveis (título, texto, imagem, `sourceUrl`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.create

Criar contato. Cria um contato com nome e pelo menos um canal: `phone` (só dígitos com DDI, 10 a 15; `+`, espaços e traços são ignorados), `email` ou `instagram` (o @ do perfil). Canal informado e inválido dá `invalid_input`. Origem `manual`; quem cria passa a vê-lo na lista mesmo sem conversa. `tagIds` (tags da conta) são aplicadas sem disparar automações de tag.

Identidade e duplicado: com telefone, procura pelo telefone; sem telefone, pelo e-mail; só com Instagram, pelo @. Se já existe, devolve o contato existente com `created: false` sem alterar nada (com e-mail, só preenche nome vazio) e sem aplicar as tags.

Contato só com e-mail ou Instagram não conversa pelo WhatsApp até ganhar um telefone; o só-Instagram não recebe Direct até a pessoa escrever. Para falar com ele use `inbox.conversation_start`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `phone` | string | não |  |
| `email` | string | não |  |
| `instagram` | string | não |  |
| `tagIds` | string (uuid)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Maria Souza","phone":"+55 11 91234-5678","email":"maria@exemplo.com","instagram":"@mariasouza"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.create --json '{"name":"Maria Souza","phone":"+55 11 91234-5678","email":"maria@exemplo.com","instagram":"@mariasouza"}'
```

MCP: ferramenta `contacts_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ads.list

Listar anúncios que trouxeram pessoas. Anúncios de origem da conta atual com quantas pessoas chegaram por eles. Conta cada contato uma vez, no anúncio da sua primeira indicação. `from` e `to` (data ISO) limitam pela data dessa primeira indicação. Com `lookupStatus` diferente de `ok` os nomes ficam nulos e valem `headline`, `thumbnailUrl` e `permalinkUrl` vindos da mensagem. Ordenado por pessoas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ads.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ads_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ads.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string | não |  |
| `to` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ads.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01"}'
```

CLI:

```bash
node cli/atomiks.mjs ads.list --json '{"from":"2026-10-01"}'
```

MCP: ferramenta `ads_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ads.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ads.get

Ver um anúncio e as pessoas que vieram por ele. Anúncio (nomes de anúncio, conjunto e campanha, criativo, `permalinkUrl`, `previewLink`, `lookupStatus`) mais o que veio nas mensagens (`headline`, `body`, `imageUrl`, `sourceUrl`) e até 100 contatos cuja primeira indicação é dele, do mais novo ao mais antigo. `people` é o total.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ads.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ads_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ads.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `adId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ads.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"adId":"120210000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs ads.get --json '{"adId":"120210000000001"}'
```

MCP: ferramenta `ads_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ads.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ads_manager.tree

Árvore campanha, conjunto e anúncio com métricas da Meta e reais. Campanhas, conjuntos e anúncios da conta de anúncios conectada, com as métricas da Meta no período (gasto, impressões, cliques, CPM, CTR, CPC, `conversationsMeta` = conversas iniciadas segundo a Meta) ao lado das reais (`conversationsReal` = contatos cuja PRIMEIRA indicação é do anúncio, no dia do fuso da conta; `costPerConversationReal`) e as vendas: `sales` e `revenueCents` (vendas não canceladas do contato cuja PRIMEIRA indicação é do anúncio, com `sold_at` no dia do fuso da conta), `costPerSaleCents` (gasto ÷ vendas, em centavos) e `roas` (receita ÷ gasto). Somas sobem de anúncio para conjunto, campanha e `totals`; razões saem das somas e são `null` sem denominador. Item sem entrega no período aparece com zeros. `from` e `to` são datas `AAAA-MM-DD` (até 93 dias). Orçamentos em centavos. `adAccountId` (`act_...`) e `adAccountName` identificam a conta de anúncios conectada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ads_manager.tree` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ads_manager_tree`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ads_manager.tree`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string | sim |  |
| `to` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ads_manager.tree \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01","to":"2026-10-07"}'
```

CLI:

```bash
node cli/atomiks.mjs ads_manager.tree --json '{"from":"2026-10-01","to":"2026-10-07"}'
```

MCP: ferramenta `ads_manager_tree` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ads_manager.tree.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ads_manager.sync

Pedir atualização dos dados do gerenciador. Marca a conta para sincronizar no próximo ciclo do worker (estrutura e insights da Meta). Não chama a Meta na hora; leia `lastSyncedAt` em `ads_manager.tree` para saber quando terminou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ads_manager.sync` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `ads:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ads_manager_sync`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ads_manager.sync`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ads_manager.sync \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs ads_manager.sync --json '{}'
```

MCP: ferramenta `ads_manager_sync` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ads_manager.sync.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attribution.export

Exportar leads e vendas atribuídos a anúncios (sem dado pessoal). Para o RealMetrics puxar a atribuição do Atomiks. `kind` `leads`: um item por contato cuja PRIMEIRA indicação de anúncio (com `source_id`) caiu na janela: `{contactId, firstAt, adId, ctwaClid, sourceType}`. `kind` `sales`: um item por venda com `sold_at` na janela, canceladas inclusive (`cancelledAt` preenchido), só de contatos com primeira indicação de anúncio; `adId` é o anúncio dessa primeira indicação: `{saleId, contactId, soldAt, valueCents, cancelledAt, adId}`. `adId` é o id do anúncio na Meta; `valueCents` em centavos de BRL; datas em ISO-8601 com fuso. `from` e `to` são datas `AAAA-MM-DD` (até 93 dias) no fuso da conta de anúncios (`timezone` na saída; padrão America/Sao_Paulo). Itens ordenados por `contactId` (leads) ou `saleId` (vendas). `limit` de 1 a 1000, padrão 500. Paginação: repita a chamada com `cursor` = `nextCursor` até ele vir nulo; página com menos itens que `limit` não significa fim, o fim é `nextCursor` nulo. Cursor adulterado ou de outro `kind` dá `invalid_input`. Nenhum nome, telefone ou e-mail sai por aqui.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attribution.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `ads:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attribution_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attribution.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "leads" \| "sales" | sim |  |
| `from` | string | sim |  |
| `to` | string | sim |  |
| `cursor` | string | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attribution.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"leads","from":"2026-10-01","to":"2026-10-07"}'
```

CLI:

```bash
node cli/atomiks.mjs attribution.export --json '{"kind":"leads","from":"2026-10-01","to":"2026-10-07"}'
```

MCP: ferramenta `attribution_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attribution.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.conversations_list

Listar conversas da caixa de entrada. Conversas da conta atual, da mais recente à mais antiga, só dos números que o membro pode usar (e, com "só livres e as próprias" ligado, só as sem atendente ou do próprio membro). Filtros combinados com E: `tab` (`mine` = atribuídas a mim; `queue` = abertas sem atendente; `all`), `kind` (`direct` = só individuais; `group` = só grupos), `statusIn` (open, assigned, resolved, closed), `channelId`/`channelIdIn`, `priorityIn`, `unread` (mensagens não lidas), `awaitingReply` (última mensagem é do contato), `unreadByMe` (marcada não lida ou com entrada depois da minha leitura), `lastMessageAfter`/`lastMessageBefore` (ISO, inclusivo), `q` (nome, telefone ou ticket como `#000123` ou `123`). `assignedToIn` e `includeUnassigned` são só para administradores. `origin` diz se o contato veio de anúncio. Paginação por `cursor` (devolvido em `nextCursor`). `total` é a contagem de todas as conversas que casam com os filtros (sem o cursor), só na primeira página; nas seguintes é `null`. `viewAsAttendantId` (só admin) faz `tab: mine` valer para aquele atendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.conversations_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_conversations_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.conversations_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `tab` | "mine" \| "queue" \| "all" | não |  |
| `kind` | "all" \| "direct" \| "group" | não |  |
| `statusIn` | "open" \| "assigned" \| "resolved" \| "closed"[] | não |  |
| `channelId` | string (uuid) | não |  |
| `channelIdIn` | string (uuid)[] | não |  |
| `q` | string | não |  |
| `unread` | boolean | não |  |
| `awaitingReply` | boolean | não |  |
| `unreadByMe` | boolean | não |  |
| `assignedToIn` | string (uuid)[] | não |  |
| `includeUnassigned` | boolean | não |  |
| `priorityIn` | "low" \| "normal" \| "high" \| "urgent"[] | não |  |
| `lastMessageAfter` | string (date-time) | não |  |
| `lastMessageBefore` | string (date-time) | não |  |
| `viewAsAttendantId` | string (uuid) | não |  |
| `archived` | boolean | não |  |
| `cursor` | string | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.conversations_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tab":"queue","statusIn":["open","assigned"],"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.conversations_list --json '{"tab":"queue","statusIn":["open","assigned"],"limit":50}'
```

MCP: ferramenta `inbox_conversations_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.conversations_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.unread_count

Total de conversas não lidas (badge do menu). Quantas conversas abertas ou em atendimento, entre as que o membro enxerga, têm mensagens não lidas. Arquivadas não entram. `archivedCount` = total de conversas arquivadas. Contagem direta no banco, barata para consultar a cada minuto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.unread_count` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_unread_count`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.unread_count`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.unread_count \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.unread_count --json '{}'
```

MCP: ferramenta `inbox_unread_count` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.unread_count.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.conversation_get

Ver uma conversa e a origem do lead. Conversa com contato, número de atendimento, janela de 24 h (`windowExpiresAt`) e a origem completa do lead (`origin.kind`, `referral`, `ad`), na mesma forma de `contacts.get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.conversation_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_conversation_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.conversation_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.conversation_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.conversation_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_conversation_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.conversation_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.messages_list

Listar mensagens de uma conversa. Mensagens de uma conversa em ordem crescente de hora. Sem `before` devolve as mais recentes; para carregar anteriores passe `nextBefore` da resposta em `before`. Cada mensagem traz o estado da mídia (`pending`, `available`, `failed`, `expired`) e quem enviou. A mídia é lida por `GET /api/v1/media/:id`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.messages_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_messages_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.messages_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `before` | string | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.messages_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.messages_list --json '{"conversationId":"00000000-0000-0000-0000-000000000000","limit":50}'
```

MCP: ferramenta `inbox_messages_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.messages_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.mark_read

Marcar conversa como lida. Zera as mensagens não lidas da conversa e a marca "não lida" manual do usuário. Só funciona em conversa de número que o membro pode usar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.mark_read` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_mark_read`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.mark_read`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.mark_read \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.mark_read --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_mark_read` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.mark_read.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.send

Enviar mensagem em uma conversa. Envia texto, mídia (`uploadId` de `POST /api/v1/uploads`), figurinha da biblioteca (`stickerId` de `inbox.stickers_list`, só WhatsApp) ou modelo aprovado (`templateId` + `params`) pelo número da conversa. Informe exatamente um entre `text`, `uploadId`, `stickerId` e `templateId`. `clientRequestId` torna o pedido idempotente: repetir devolve a mensagem original. `replyToMessageId` cita uma mensagem da mesma conversa. Fora da janela de 24 h só modelo. Resposta incerta da Meta deixa a mensagem `unknown` (`uncertain: true`) e nada é reenviado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.send` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_send`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.send`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `clientRequestId` | string (uuid) | sim |  |
| `text` | string | não |  |
| `uploadId` | string (uuid) | não |  |
| `caption` | string | não |  |
| `templateId` | string (uuid) | não |  |
| `params` | object | não |  |
| `stickerId` | string (uuid) | não |  |
| `replyToMessageId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.send \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","clientRequestId":"6f1c2b0e-8a4d-4c3b-9e2f-1a2b3c4d5e6f","text":"Olá!"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.send --json '{"conversationId":"00000000-0000-0000-0000-000000000000","clientRequestId":"6f1c2b0e-8a4d-4c3b-9e2f-1a2b3c4d5e6f","text":"Olá!"}'
```

MCP: ferramenta `inbox_send` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.send.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.templates_list

Listar modelos de mensagem do WhatsApp. Modelos da Meta de um número, com texto, campos a preencher e se o Atomiks consegue enviar cada um (modelos com mídia no cabeçalho ou botão com parâmetro não). Sincroniza antes se a última sincronização tem mais de 1 hora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.templates_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_templates_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.templates_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.templates_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.templates_list --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_templates_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.templates_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.templates_sync

Sincronizar modelos de mensagem do WhatsApp. Busca na Meta os modelos do número e atualiza a lista; modelos que sumiram da Meta ficam desativados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.templates_sync` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_templates_sync`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.templates_sync`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.templates_sync \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.templates_sync --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_templates_sync` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.templates_sync.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.attendance

Agir no atendimento de uma conversa. Ações: `claim` (assumir), `leave` (devolver à fila), `assign` e `transfer` (para `userId`; só gestor, e a pessoa precisa ter acesso ao número), `resolve`, `reopen`, `set_priority` (`priority`; só gestor). Cada atendimento tem um ticket (`#000123`). Resolver conversa com mensagens agendadas pendentes falha com mensagem iniciada por `scheduled_pending:`; repita com `scheduled: "cancel"` ou `"keep"`. Assumir ao mesmo tempo: só uma pessoa fica. "Gestor" é o admin da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.attendance` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_attendance`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.attendance`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `action` | "claim" \| "leave" \| "assign" \| "transfer" \| "resolve" \| "reopen" \| "set_priority" | sim |  |
| `userId` | string (uuid) | não |  |
| `priority` | "low" \| "normal" \| "high" \| "urgent" | não |  |
| `scheduled` | "cancel" \| "keep" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.attendance \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","action":"claim"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.attendance --json '{"conversationId":"00000000-0000-0000-0000-000000000000","action":"claim"}'
```

MCP: ferramenta `inbox_attendance` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.attendance.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.assignable_members

Listar atendentes para atribuir uma conversa. Membros da conta com a quantidade de conversas em andamento (`activeCount`) e se têm acesso ao número da conversa (`allowed`); quem não tem acesso não pode receber a conversa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.assignable_members` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_assignable_members`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.assignable_members`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.assignable_members \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.assignable_members --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_assignable_members` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.assignable_members.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.attendance_events

Histórico de atendimento de uma conversa. Últimos eventos (atribuição, transferência, devolução, resolução, reabertura, prioridade) com nomes e o ticket do atendimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.attendance_events` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_attendance_events`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.attendance_events`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.attendance_events \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.attendance_events --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_attendance_events` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.attendance_events.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.note_create

Criar nota interna em uma conversa. Nota só da equipe (o contato nunca vê nem recebe). `parentNoteId` responde a outra nota da mesma conversa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.note_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_note_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.note_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `body` | string | sim |  |
| `parentNoteId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.note_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno amanhã"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.note_create --json '{"conversationId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno amanhã"}'
```

MCP: ferramenta `inbox_note_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.note_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.note_update

Editar nota interna. Só o autor edita; a nota passa a mostrar "editada". Nota removida não pode ser editada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.note_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_note_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.note_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `body` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.note_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","body":"Texto corrigido"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.note_update --json '{"id":"00000000-0000-0000-0000-000000000000","body":"Texto corrigido"}'
```

MCP: ferramenta `inbox_note_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.note_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.note_delete

Remover nota interna. O autor ou um administrador remove a nota; ela fica na conversa como "Nota removida", sem o texto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.note_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_note_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.note_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.note_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.note_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_note_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.note_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.notes_list

Listar notas internas. Notas e respostas da conta em ordem crescente de hora (as mais recentes quando passa de `limit`, padrão 100). Filtros: `conversationId`, `q` (texto), `userId` (autor), `from`/`to` (data ISO). Traz autor, quantidade de respostas e se foi editada ou removida.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.notes_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_notes_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.notes_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | não |  |
| `q` | string | não |  |
| `userId` | string (uuid) | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.notes_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.notes_list --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_notes_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.notes_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.quick_replies_list

Listar respostas rápidas. Respostas rápidas da conta, por ordem de nome. `q` filtra por nome ou atalho, sem diferenciar maiúsculas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.quick_replies_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_quick_replies_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.quick_replies_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `conversationId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.quick_replies_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"ola"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.quick_replies_list --json '{"q":"ola"}'
```

MCP: ferramenta `inbox_quick_replies_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.quick_replies_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.quick_reply_create

Criar resposta rápida. Cria uma resposta rápida com nome, texto (até 1024) e atalho opcional, único na conta, sem espaço nem barra. `type: "interactive"` exige `contents.buttons` (até 3 de resposta, ou 1 de link https; não combinam) e aceita `contents.header` de texto (até 60) e `contents.footer` (até 60); títulos de botão até 20. `channelKind` limita a um canal (null = todos). Variáveis no texto: {nome}, {primeiro_nome}, {telefone}, {email}, {atendente}. Anexo e cabeçalho de mídia ainda não são suportados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:manage`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_quick_reply_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.quick_reply_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `shortcut` | string \| null | não |  |
| `body` | string | sim |  |
| `uploadId` | string (uuid) \| null | não |  |
| `channelKind` | "whatsapp_cloud" \| "whatsapp_web" \| "instagram" \| null | não |  |
| `type` | "text" \| "interactive" | não |  |
| `contents` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Saudação","shortcut":"ola","body":"Olá! Como posso ajudar?"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.quick_reply_create --json '{"name":"Saudação","shortcut":"ola","body":"Olá! Como posso ajudar?"}'
```

MCP: ferramenta `inbox_quick_reply_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.quick_reply_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.quick_reply_update

Alterar resposta rápida. Altera nome, atalho (`null` remove) ou texto de uma resposta rápida. Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:manage`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_quick_reply_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.quick_reply_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `shortcut` | string \| null | não |  |
| `body` | string | não |  |
| `uploadId` | string (uuid) \| null | não |  |
| `channelKind` | "whatsapp_cloud" \| "whatsapp_web" \| "instagram" \| null | não |  |
| `type` | "text" \| "interactive" | não |  |
| `contents` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","body":"Olá! Em que posso ajudar?"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.quick_reply_update --json '{"id":"00000000-0000-0000-0000-000000000000","body":"Olá! Em que posso ajudar?"}'
```

MCP: ferramenta `inbox_quick_reply_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.quick_reply_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.quick_reply_delete

Excluir resposta rápida. Exclui a resposta rápida para toda a conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:manage`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_quick_reply_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.quick_reply_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.quick_reply_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_quick_reply_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.quick_reply_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.quick_reply_send

Enviar uma resposta rápida na conversa. Resolve as variáveis e envia pelo canal da conversa. Cloud API (whatsapp_cloud/gupshup), janela aberta: mensagem interativa nativa (`mode: "interactive"`, botões de resposta ou de link; salva como texto com `payload.interactive`). Evolution, Instagram e Telegram: texto com opções numeradas (`mode: "numbered_list"`). Tipo texto: texto simples. Janela de 24 h fechada recusa (WhatsApp oficial e Instagram). Resposta rápida de outro canal recusa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_send` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_quick_reply_send`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.quick_reply_send`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `quickReplyId` | string (uuid) | sim |  |
| `clientRequestId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.quick_reply_send \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","quickReplyId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.quick_reply_send --json '{"conversationId":"00000000-0000-0000-0000-000000000000","quickReplyId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_quick_reply_send` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.quick_reply_send.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.archive

Arquivar ou desarquivar uma conversa. Tira a conversa da lista comum (`archived: true`) ou a devolve (`false`). Qualquer membro que possa escrever na conversa. Em número por QR code também arquiva no WhatsApp (melhor esforço: se o servidor do número falhar, a conversa fica arquivada só no Atomiks e `synced` vem `false`). Mensagem nova não desarquiva, como no WhatsApp.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.archive` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `archived` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","archived":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.archive --json '{"conversationId":"00000000-0000-0000-0000-000000000000","archived":true}'
```

MCP: ferramenta `inbox_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.react

Reagir a uma mensagem. Reação da equipe (qualquer membro que possa escrever na conversa, não só o atendente ativo) a uma mensagem do contato ou enviada, com um de 👍 ❤️ ✅ 🙏 👏. Vai ao WhatsApp pela Meta. Uma reação por pessoa por mensagem: trocar substitui, `emoji: ""` remove. Só canais com reação e mensagens que a Meta já aceitou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.react` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_react`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.react`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `emoji` | "👍" \| "❤️" \| "✅" \| "🙏" \| "👏" \| "" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.react \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000","emoji":"👍"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.react --json '{"messageId":"00000000-0000-0000-0000-000000000000","emoji":"👍"}'
```

MCP: ferramenta `inbox_react` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.react.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.edit

Editar o texto de uma mensagem enviada. Troca o texto de uma mensagem de texto enviada pelo número (pelo atendimento ou pelo celular), como o "Editar" do WhatsApp: o contato vê a mensagem marcada como editada. Só número por QR code e até 15 min depois do envio. Texto de até 4.096 caracteres.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.edit` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_edit`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.edit`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `text` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.edit \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000","text":"Texto corrigido"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.edit --json '{"messageId":"00000000-0000-0000-0000-000000000000","text":"Texto corrigido"}'
```

MCP: ferramenta `inbox_edit` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.edit.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.button_reply

Tocar em um botão de resposta de uma mensagem recebida. Faz o toque no botão como o WhatsApp: envia a resposta de botão (`templateButtonReplyMessage` ou `buttonsResponseMessage`, com o id do botão e a citação da mensagem), não um texto. Só número por QR code, em mensagem recebida de modelo ou de botões; `buttonId` é o id do botão na mensagem (`ACT::...`). Se o servidor do número ainda não tem o toque em botão, devolve erro claro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.button_reply` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_button_reply`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.button_reply`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `buttonId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.button_reply \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000","buttonId":"ACT::0000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.button_reply --json '{"messageId":"00000000-0000-0000-0000-000000000000","buttonId":"ACT::0000"}'
```

MCP: ferramenta `inbox_button_reply` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.button_reply.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.favorite

Favoritar ou desfavoritar uma mensagem. Favorita é pessoal: só quem favoritou vê. Notas internas não entram.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.favorite` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_favorite`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.favorite`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `on` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.favorite \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000","on":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.favorite --json '{"messageId":"00000000-0000-0000-0000-000000000000","on":true}'
```

MCP: ferramenta `inbox_favorite` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.favorite.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.favorites_list

Listar mensagens favoritas. Favoritas do usuário, da mais recente favoritada à mais antiga (até 100), de uma conversa (`conversationId`) ou de todas. `q` filtra pelo texto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.favorites_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_favorites_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.favorites_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | não |  |
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.favorites_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.favorites_list --json '{}'
```

MCP: ferramenta `inbox_favorites_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.favorites_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.forward

Encaminhar uma mensagem para outra conversa. Envia o texto ou a mídia (imagem, vídeo, áudio, documento) de uma mensagem para outra conversa, que precisa estar com a janela de 24 h aberta. Nota interna, modelo e mídia indisponível não encaminham. A cópia fica marcada como encaminhada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.forward` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_forward`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.forward`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.forward \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000","conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.forward --json '{"messageId":"00000000-0000-0000-0000-000000000000","conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_forward` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.forward.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.mute

Silenciar ou reativar uma conversa. Silenciar é pessoal: tira som e aviso de mensagem nova só para quem silenciou. Não mexe nas não lidas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.mute` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_mute`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.mute`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `on` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.mute \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","on":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.mute --json '{"conversationId":"00000000-0000-0000-0000-000000000000","on":true}'
```

MCP: ferramenta `inbox_mute` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.mute.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.pin

Fixar ou desafixar uma conversa no topo da lista. Fixar é pessoal: a conversa fica no topo da sua lista, sem mudar a lista dos outros atendentes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.pin` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_pin`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.pin`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `on` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.pin \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","on":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.pin --json '{"conversationId":"00000000-0000-0000-0000-000000000000","on":true}'
```

MCP: ferramenta `inbox_pin` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.pin.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.mark_unread

Marcar conversa como não lida. Marca como não lida só para você; a contagem de não lidas da conversa não muda. `inbox.mark_read` limpa a marca.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.mark_unread` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_mark_unread`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.mark_unread`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.mark_unread \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.mark_unread --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_mark_unread` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.mark_unread.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.stickers_list

Listar figurinhas. Biblioteca pessoal de figurinhas do usuário, até 120. `filter: "recent"` (padrão) mostra da mais recente usada ou criada à mais antiga; `"favorites"` só as favoritas. `url` é assinada e vale 1 hora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.stickers_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_stickers_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.stickers_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filter` | "recent" \| "favorites" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.stickers_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filter":"favorites"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.stickers_list --json '{"filter":"favorites"}'
```

MCP: ferramenta `inbox_stickers_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.stickers_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.sticker_create

Criar figurinha. Adiciona à biblioteca a imagem enviada por `POST /api/v1/uploads` com `kind=sticker` (WebP, PNG ou JPEG até 5 MB; o servidor converte em WebP 512x512 de até 100 KB). A mesma imagem não duplica. `favorite: true` já a favorita.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.sticker_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_sticker_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.sticker_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `uploadId` | string (uuid) | sim |  |
| `favorite` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.sticker_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"00000000-0000-0000-0000-000000000000","favorite":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.sticker_create --json '{"uploadId":"00000000-0000-0000-0000-000000000000","favorite":true}'
```

MCP: ferramenta `inbox_sticker_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.sticker_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.sticker_save

Salvar figurinha de uma mensagem. Guarda na biblioteca do usuário a figurinha de uma mensagem do chat (recebida ou enviada), já como favorita. Só mensagens `sticker` com a mídia disponível.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.sticker_save` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_sticker_save`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.sticker_save`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.sticker_save \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.sticker_save --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_sticker_save` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.sticker_save.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.sticker_favorite

Favoritar ou desfavoritar figurinha. Favoritar é pessoal. A figurinha continua nos recentes ao desfavoritar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.sticker_favorite` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_sticker_favorite`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.sticker_favorite`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `on` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.sticker_favorite \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","on":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.sticker_favorite --json '{"id":"00000000-0000-0000-0000-000000000000","on":true}'
```

MCP: ferramenta `inbox_sticker_favorite` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.sticker_favorite.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.sticker_delete

Excluir figurinha. Remove da biblioteca do usuário (recentes e favoritas). Mensagens já enviadas com ela não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.sticker_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_sticker_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.sticker_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.sticker_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.sticker_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_sticker_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.sticker_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.settings_get

Ver configurações do atendimento. Configurações da caixa: restringir atendentes a conversas livres e próprias, encerramento automático por inatividade (minutos, `null` desligado) e aparência (presets do balão enviado e do fundo). Sem registro, devolve os padrões.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.settings_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.settings_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.settings_get --json '{}'
```

MCP: ferramenta `inbox_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.settings_update

Alterar configurações do atendimento. Altera as configurações da caixa. Campos omitidos não mudam. `autoCloseMinutes` é `null` (desliga) ou de 5 a 10080. Presets do balão: default, accent, graphite, sky, sand. Fundo: none, pattern, solid.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.settings_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:manage`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_settings_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.settings_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `restrictToFreeAndOwn` | boolean | não |  |
| `autoCloseMinutes` | integer \| null | não |  |
| `appearance` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.settings_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"autoCloseMinutes":60,"appearance":{"background":"solid"}}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.settings_update --json '{"autoCloseMinutes":60,"appearance":{"background":"solid"}}'
```

MCP: ferramenta `inbox_settings_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.settings_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.prefs_get

Ver minhas preferências de aviso. Preferências de aviso do próprio usuário: som, escopo (`all`, `mine_free`, `mine`), aviso no app, matriz de avisos (`notifyAssigned`, `notifyDisconnected`, `notifyTaskAssigned` no app; `pushNewMessage`, `pushAssigned`, `pushDisconnected`, `pushTaskAssigned` no push), chave geral por canal (`allInApp`, `allPush`: desligada, nenhum aviso sai por ele) e presença (`online`). Valem em todas as contas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.prefs_get` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_prefs_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.prefs_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.prefs_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.prefs_get --json '{}'
```

MCP: ferramenta `inbox_prefs_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.prefs_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.prefs_update

Alterar minhas preferências de aviso. Altera som, escopo, avisos (app e push) e presença do próprio usuário. Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.prefs_update` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_prefs_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.prefs_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `sound` | boolean | não |  |
| `notifyScope` | "all" \| "mine_free" \| "mine" | não |  |
| `inApp` | boolean | não |  |
| `notifyAssigned` | boolean | não |  |
| `notifyDisconnected` | boolean | não |  |
| `pushNewMessage` | boolean | não |  |
| `pushAssigned` | boolean | não |  |
| `pushDisconnected` | boolean | não |  |
| `online` | boolean | não |  |
| `allInApp` | boolean | não |  |
| `allPush` | boolean | não |  |
| `notifyTaskAssigned` | boolean | não |  |
| `pushTaskAssigned` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.prefs_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"notifyScope":"mine"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.prefs_update --json '{"notifyScope":"mine"}'
```

MCP: ferramenta `inbox_prefs_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.prefs_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.schedule

Agendar mensagens em uma conversa. Agenda de 1 a 5 itens (texto até 4096 ou arquivo de `POST /api/v1/uploads`, com legenda opcional) para `scheduledAt` (ISO, de 30 s a 30 dias à frente). O worker envia no horário, só com a janela de 24 h aberta; senão a agendada falha com o motivo. Um arquivo + um texto sai como arquivo com legenda. Só canais com agendamento. Nota interna não agenda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.schedule` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_schedule`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.schedule`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `scheduledAt` | string (date-time) | sim |  |
| `timezone` | string | sim |  |
| `contents` | object[] | sim |  |
| `replyToMessageId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.schedule \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","scheduledAt":"2030-01-01T12:00:00-03:00","timezone":"America/Sao_Paulo","contents":[{"kind":"text","text":"Bom dia!"}]}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.schedule --json '{"conversationId":"00000000-0000-0000-0000-000000000000","scheduledAt":"2030-01-01T12:00:00-03:00","timezone":"America/Sao_Paulo","contents":[{"kind":"text","text":"Bom dia!"}]}'
```

MCP: ferramenta `inbox_schedule` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.schedule.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.scheduled_list

Listar mensagens agendadas de uma conversa. Agendadas da conversa, da mais próxima à mais distante, com `status` (scheduled, sending, sent, failed, cancelled), `error`, `errorKind`, resumo, autor (`createdByName`) e mensagem citada (`replyTo`). Falhas dispensadas (`inbox.scheduled_dismiss`) não voltam. Até 100.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.scheduled_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_scheduled_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.scheduled_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.scheduled_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.scheduled_list --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_scheduled_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.scheduled_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.scheduled_cancel

Cancelar uma mensagem agendada. Cancela uma agendada ainda não enviada (ou falha, para dispensá-la). Já enviada responde `not_found` ("Já foi enviada"); em envio, `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.scheduled_cancel` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_scheduled_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.scheduled_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.scheduled_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.scheduled_cancel --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_scheduled_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.scheduled_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.scheduled_dismiss

Remover uma agendada com falha da lista. Esconde da lista uma agendada com `status` failed ("Remover da lista"). Não apaga o registro nem reenvia. Outro status responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.scheduled_dismiss` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_scheduled_dismiss`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.scheduled_dismiss`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.scheduled_dismiss \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.scheduled_dismiss --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_scheduled_dismiss` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.scheduled_dismiss.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.message_error

Causa e ação de uma mensagem que falhou. Para mensagem enviada com `status` failed: `code` da Meta, `text` em pt-BR, `action` sugerida (`send_template` para 131047/131026: janela fechada), `canResend` (falso quando reenviar não adianta) e `resent` (já foi reenviada).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.message_error` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_message_error`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.message_error`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.message_error \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.message_error --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_message_error` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.message_error.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.resend

Reenviar uma mensagem que falhou. Reenvia uma mensagem de WhatsApp com `status` failed (texto ou interativa), com a mesma citação, como mensagem nova marcada `payload.resentFrom`. Uma vez por original: repetir devolve a mesma mensagem. Janela de 24 h fechada (131047/131026) recusa: envie um template. Instagram e outros tipos não reenviam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.resend` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_resend`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.resend`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.resend \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.resend --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_resend` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.resend.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.recover_media

Baixar de novo a mídia de uma mensagem. Para mídia em `failed` ou `expired`: zera as tentativas e baixa de novo agora (Cloud API pelo id da mídia: recebida vale 7 dias, enviada 30; Evolution pelo `getBase64FromMediaMessage`, recebida ou enviada; Instagram pela URL guardada). Devolve o `state` final; `pending` = nova tentativa agendada. Mídia sem origem guardada (enviada antes desta versão ou pelo Instagram) não se recupera (`invalid_input`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.recover_media` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_recover_media`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.recover_media`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.recover_media \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.recover_media --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_recover_media` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.recover_media.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.message_context

Mensagens ao redor de uma mensagem. A mensagem `messageId` com até `before` mensagens antes e `after` depois (padrão 3 e 3, máx. 10), em ordem crescente de hora. Serve ao painel "Contexto da mensagem" das favoritas. Notas internas entram como no fio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.message_context` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_message_context`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.message_context`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |
| `before` | integer | não |  |
| `after` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.message_context \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.message_context --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_message_context` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.message_context.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.products_list

Listar produtos. Produtos da conta por ordem de nome. `q` filtra pelo nome; arquivados só com `includeArchived`. Preço em centavos (BRL).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.products_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_products_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.products_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `includeArchived` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.products_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"mentoria"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.products_list --json '{"q":"mentoria"}'
```

MCP: ferramenta `crm_products_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.products_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.product_create

Criar produto. Cria produto físico, digital ou serviço. O nome é único na conta, sem diferenciar maiúsculas. `priceCents` em centavos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.product_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_product_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.product_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "physical" \| "digital" \| "service" | sim |  |
| `name` | string | sim |  |
| `description` | string \| null | não |  |
| `priceCents` | integer | sim |  |
| `imageUploadId` | string (uuid) \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.product_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"digital","name":"Mentoria Pro","priceCents":99700}'
```

CLI:

```bash
node cli/atomiks.mjs crm.product_create --json '{"kind":"digital","name":"Mentoria Pro","priceCents":99700}'
```

MCP: ferramenta `crm_product_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.product_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.product_update

Alterar produto. Altera campos do produto. Campos omitidos não mudam; `description: null` limpa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.product_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_product_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.product_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `kind` | "physical" \| "digital" \| "service" | não |  |
| `name` | string | não |  |
| `description` | string \| null | não |  |
| `priceCents` | integer | não |  |
| `imageUploadId` | string (uuid) \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.product_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","priceCents":129700}'
```

CLI:

```bash
node cli/atomiks.mjs crm.product_update --json '{"id":"00000000-0000-0000-0000-000000000000","priceCents":129700}'
```

MCP: ferramenta `crm_product_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.product_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.product_archive

Arquivar produto. Arquiva (`archived: true`) ou restaura o produto. Vendas e oportunidades antigas continuam apontando para ele.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.product_archive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_product_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.product_archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `archived` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.product_archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","archived":true}'
```

CLI:

```bash
node cli/atomiks.mjs crm.product_archive --json '{"id":"00000000-0000-0000-0000-000000000000","archived":true}'
```

MCP: ferramenta `crm_product_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.product_archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.pipelines_list

Listar pipelines com as etapas. Pipelines não arquivadas da conta, cada uma com as etapas em ordem (abertas, depois Ganho e Perdido).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.pipelines_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_pipelines_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.pipelines_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.pipelines_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.pipelines_list --json '{}'
```

MCP: ferramenta `crm_pipelines_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.pipelines_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.board

Quadro Kanban de uma pipeline. Pipeline, cards por etapa (`cards[stageId]`, em ordem) e totais por etapa (`count`, `valueCents`). `q` filtra por título, nome ou telefone do contato. Só traz cards de contatos que o chamador pode ver.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.board` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_board`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.board`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.board \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.board --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_board` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.board.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunities_list

Oportunidades de um contato. Todas as oportunidades do contato, da mais recente para a mais antiga.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunities_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunities_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunities_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunities_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunities_list --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_opportunities_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunities_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.pipeline_create

Criar pipeline. Cria a pipeline com as etapas abertas na ordem dada; o servidor acrescenta "Ganho" e "Perdido" no fim. A primeira pipeline da conta vira a padrão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.pipeline_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_pipeline_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.pipeline_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `groupName` | string \| null | não |  |
| `stages` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.pipeline_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Vendas","stages":["Novo","Em negociação"]}'
```

CLI:

```bash
node cli/atomiks.mjs crm.pipeline_create --json '{"name":"Vendas","stages":["Novo","Em negociação"]}'
```

MCP: ferramenta `crm_pipeline_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.pipeline_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.pipeline_update

Editar pipeline. Muda nome, grupo ou define como padrão (`isDefault: true`; a antiga padrão deixa de ser). Para trocar o padrão, marque outra pipeline.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.pipeline_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_pipeline_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.pipeline_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `groupName` | string \| null | não |  |
| `isDefault` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.pipeline_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Vendas"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.pipeline_update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Vendas"}'
```

MCP: ferramenta `crm_pipeline_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.pipeline_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.pipeline_archive

Arquivar pipeline. Esconde a pipeline das listas. A pipeline padrão não pode ser arquivada: marque outra como padrão antes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.pipeline_archive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_pipeline_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.pipeline_archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.pipeline_archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.pipeline_archive --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_pipeline_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.pipeline_archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.stage_upsert

Criar ou mover etapa aberta. Sem `id` cria etapa aberta; com `id` renomeia e/ou reposiciona. `position` é o índice (0 = primeira) entre as etapas abertas; Ganho e Perdido ficam sempre no fim e não podem ser editadas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.stage_upsert` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_stage_upsert`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.stage_upsert`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `id` | string (uuid) | não |  |
| `name` | string | sim |  |
| `position` | integer | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.stage_upsert \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","name":"Proposta","position":1}'
```

CLI:

```bash
node cli/atomiks.mjs crm.stage_upsert --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","name":"Proposta","position":1}'
```

MCP: ferramenta `crm_stage_upsert` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.stage_upsert.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.stage_delete

Apagar etapa. Só etapas abertas. Ganho/Perdido não se apagam. Com cards: `moveTo` (outra etapa da mesma pipeline) leva todos para o fim dela, `discard: true` apaga os cards; sem nenhum dos dois recusa com "Mova os cards antes de apagar a etapa".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.stage_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_stage_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.stage_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `moveTo` | string (uuid) | não |  |
| `discard` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.stage_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.stage_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_stage_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.stage_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunity_create

Criar oportunidade. Cria o card do contato. Padrões: pipeline padrão, primeira etapa aberta, título = nome do contato. O contato precisa estar visível ao chamador. Aceita prioridade, previsão de fechamento (AAAA-MM-DD), probabilidade (0-100), origem, empresa (`companyId`). `removeFromOthers: true` apaga as outras oportunidades abertas do contato em outras pipelines.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunity_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunity_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunity_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `pipelineId` | string (uuid) | não |  |
| `stageId` | string (uuid) | não |  |
| `title` | string | não |  |
| `productId` | string (uuid) \| null | não |  |
| `valueCents` | integer \| null | não |  |
| `priority` | "low" \| "normal" \| "high" \| "urgent" \| null | não |  |
| `expectedCloseDate` | string \| null | não |  |
| `probability` | integer \| null | não |  |
| `origin` | string \| null | não |  |
| `lostReason` | string \| null | não |  |
| `companyId` | string (uuid) \| null | não |  |
| `removeFromOthers` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunity_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunity_create --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_opportunity_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunity_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunity_update

Editar oportunidade. Muda título, produto, valor (centavos) ou responsável. `productId`, `valueCents`, `ownerId`, `priority`, `expectedCloseDate`, `probability`, `origin`, `lostReason` e `companyId` aceitam `null` para limpar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunity_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunity_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunity_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `title` | string | não |  |
| `productId` | string (uuid) \| null | não |  |
| `valueCents` | integer \| null | não |  |
| `ownerId` | string (uuid) \| null | não |  |
| `priority` | "low" \| "normal" \| "high" \| "urgent" \| null | não |  |
| `expectedCloseDate` | string \| null | não |  |
| `probability` | integer \| null | não |  |
| `origin` | string \| null | não |  |
| `lostReason` | string \| null | não |  |
| `companyId` | string (uuid) \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunity_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","valueCents":9700}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunity_update --json '{"id":"00000000-0000-0000-0000-000000000000","valueCents":9700}'
```

MCP: ferramenta `crm_opportunity_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunity_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunity_move

Mover oportunidade de etapa. Move o card para uma etapa da mesma pipeline, antes do card `beforeId` (ou no fim). Ganho/Perdido ajustam `status`, `wonAt`/`lostAt`; `lostReason` só vale ao mover para Perdido.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunity_move` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunity_move`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunity_move`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `stageId` | string (uuid) | sim |  |
| `beforeId` | string (uuid) | não |  |
| `lostReason` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunity_move \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunity_move --json '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_opportunity_move` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunity_move.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunity_delete

Apagar oportunidade. Apaga o card. Vendas já registradas continuam, sem o vínculo com a oportunidade.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunity_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunity_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunity_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunity_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunity_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_opportunity_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunity_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sales_list

Listar vendas. Vendas da conta, da mais recente para a mais antiga (50 por página; `cursor` vem de `nextCursor`). Filtros: `contactId`, `from`/`to` (data ISO sobre `soldAt`), `productId`, `source` (manual ou message). Vendas por mensagem trazem a mensagem e a regra de origem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sales_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_sales_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sales_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `productId` | string (uuid) | não |  |
| `source` | "manual" \| "message" | não |  |
| `cursor` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sales_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sales_list --json '{}'
```

MCP: ferramenta `crm_sales_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sales_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_create

Registrar venda à mão. Registra uma venda do contato e leva a oportunidade para Ganho (a indicada em `opportunityId`, a aberta mais recente ou uma nova). Sem `valueCents`, usa o preço do produto; sem os dois, recusa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `productId` | string (uuid) | não |  |
| `valueCents` | integer | não |  |
| `soldAt` | string (date-time) | não |  |
| `opportunityId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","valueCents":9700}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_create --json '{"contactId":"00000000-0000-0000-0000-000000000000","valueCents":9700}'
```

MCP: ferramenta `crm_sale_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_cancel

Cancelar venda. Marca a venda como cancelada: ela sai das métricas do Gerenciador. A oportunidade não muda. Cancelar de novo não faz nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_cancel` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_cancel --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_sale_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_rules_list

Listar regras de venda automática. Regras que registram uma venda quando uma mensagem enviada pela conta casa com o modelo. Variáveis do modelo: `{produto}` e `{valor}`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_rules_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_rules_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_rules_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_rules_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_rules_list --json '{}'
```

MCP: ferramenta `crm_sale_rules_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_rules_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_rule_create

Criar regra de venda automática. Admin. O `template` precisa de `{valor}` ou de `productId`. Ex.: "Pagamento aprovado de {valor}".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_rule_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_rule_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_rule_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `template` | string | sim |  |
| `productId` | string (uuid) \| null | não |  |
| `pipelineId` | string (uuid) \| null | não |  |
| `active` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_rule_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Pagamento aprovado","template":"Pagamento aprovado de {valor}"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_rule_create --json '{"name":"Pagamento aprovado","template":"Pagamento aprovado de {valor}"}'
```

MCP: ferramenta `crm_sale_rule_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_rule_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_rule_update

Editar regra de venda automática. Admin. Campos omitidos não mudam; `productId` e `pipelineId` aceitam null para limpar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_rule_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_rule_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_rule_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `template` | string | não |  |
| `productId` | string (uuid) \| null | não |  |
| `pipelineId` | string (uuid) \| null | não |  |
| `active` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_rule_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_rule_update --json '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

MCP: ferramenta `crm_sale_rule_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_rule_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.sale_rule_delete

Apagar regra de venda automática. Admin. As vendas já registradas pela regra continuam, sem a regra de origem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.sale_rule_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_sale_rule_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.sale_rule_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.sale_rule_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.sale_rule_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_sale_rule_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.sale_rule_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tasks_list

Listar tarefas. Tarefas dos contatos que o chamador vê. Filtros: `contactId`, `assigneeId` (id ou "me"), `bucket` (overdue, today, upcoming, no_date, done; dia no fuso da conta), `q` (título). Até 500.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tasks_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_tasks_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tasks_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | não |  |
| `assigneeId` | string (uuid) \| "me" | não |  |
| `bucket` | "overdue" \| "today" \| "upcoming" \| "no_date" \| "done" | não |  |
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tasks_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"assigneeId":"me","bucket":"today"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tasks_list --json '{"assigneeId":"me","bucket":"today"}'
```

MCP: ferramenta `crm_tasks_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tasks_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tasks_due_count

Contar tarefas atrasadas ou de hoje de uma conversa. Tarefas não feitas, atrasadas ou de hoje (fuso da conta), ligadas à conversa ou ao contato dela.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tasks_due_count` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_tasks_due_count`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tasks_due_count`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tasks_due_count \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tasks_due_count --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_tasks_due_count` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tasks_due_count.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.task_create

Criar tarefa. Tarefa de um contato. `assigneeId` precisa ser membro que veja o contato. `kind: meeting` exige `opportunityId`. `notes` é HTML (negrito, itálico, listas, H1-H3): o servidor sanea e descarta o resto. `meetingUrl` só https; `guests` até 10 e-mails (únicos).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.task_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_task_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.task_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `title` | string | sim |  |
| `kind` | "todo" \| "call" \| "message" \| "meeting" | não |  |
| `dueAt` | string (date-time) | não |  |
| `assigneeId` | string (uuid) | não |  |
| `conversationId` | string (uuid) | não |  |
| `opportunityId` | string (uuid) | não |  |
| `durationMinutes` | integer | não |  |
| `allDay` | boolean | não |  |
| `notes` | string | não |  |
| `meetingUrl` | string | não |  |
| `guests` | string (email)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.task_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","title":"Ligar para fechar","kind":"call"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.task_create --json '{"contactId":"00000000-0000-0000-0000-000000000000","title":"Ligar para fechar","kind":"call"}'
```

MCP: ferramenta `crm_task_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.task_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.task_update

Editar tarefa. Altera título, tipo, prazo, responsável, oportunidade, duração, dia inteiro, anotações (HTML saneado), link da reunião e convidados. `dueAt`, `assigneeId`, `opportunityId`, `durationMinutes`, `notes` e `meetingUrl` aceitam null para limpar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.task_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_task_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.task_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `title` | string | não |  |
| `kind` | "todo" \| "call" \| "message" \| "meeting" | não |  |
| `dueAt` | string (date-time) \| null | não |  |
| `assigneeId` | string (uuid) \| null | não |  |
| `opportunityId` | string (uuid) \| null | não |  |
| `durationMinutes` | integer \| null | não |  |
| `allDay` | boolean | não |  |
| `notes` | string \| null | não |  |
| `meetingUrl` | string \| null | não |  |
| `guests` | string (email)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.task_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","title":"Novo título"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.task_update --json '{"id":"00000000-0000-0000-0000-000000000000","title":"Novo título"}'
```

MCP: ferramenta `crm_task_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.task_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.task_done

Concluir ou reabrir tarefa. `done: true` conclui; `false` reabre. `outcome` (só ao concluir) é o resultado da próxima ação, como no original: `true` = deu certo, `false` = não deu certo, omitido ou `null` = sem resultado. Se a tarefa é a próxima ação de uma cadência de follow-up, o resultado decide o passo seguinte (deu certo pula de fase; os outros seguem o próximo passo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.task_done` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_task_done`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.task_done`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `done` | boolean | sim |  |
| `outcome` | boolean \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.task_done \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","done":true}'
```

CLI:

```bash
node cli/atomiks.mjs crm.task_done --json '{"id":"00000000-0000-0000-0000-000000000000","done":true}'
```

MCP: ferramenta `crm_task_done` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.task_done.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.task_delete

Apagar tarefa. Remove a tarefa de vez.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.task_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_task_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.task_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.task_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.task_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_task_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.task_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.conversation_start

Iniciar conversa com um contato. Devolve a conversa do contato no número escolhido ou cria uma nova (aberta, sem atendente, no WhatsApp oficial a janela de 24 h começa fechada e a primeira mensagem tem de ser um modelo; no número por QR qualquer mensagem). O contato vem de `contactId` ou de `phone` (dígitos com DDI, 10 a 15; `+`, espaços e traços são ignorados): com `phone` o contato é achado pelo telefone ou criado agora (`name` só preenche nome vazio); no número por QR o telefone é conferido no WhatsApp (sem WhatsApp: `invalid_input`) e vale o telefone canônico dele. Exige acesso ao número e que ele esteja conectado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.conversation_start` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_conversation_start`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.conversation_start`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | não |  |
| `phone` | string | não |  |
| `name` | string | não |  |
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.conversation_start \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.conversation_start --json '{"contactId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_conversation_start` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.conversation_start.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.start_candidates

Contatos e números para iniciar conversa. Até 50 contatos com telefone que o membro pode ver (busca por nome ou telefone a partir de 2 caracteres; contatos ainda sem conversa entram) e os números conectados que ele pode usar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.start_candidates` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_start_candidates`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.start_candidates`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.start_candidates \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"Maria"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.start_candidates --json '{"q":"Maria"}'
```

MCP: ferramenta `inbox_start_candidates` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.start_candidates.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.dashboard

Painel do atendimento. Números do atendimento só das conversas que o membro enxerga: `mine` (atribuídas a mim, abertas), `queue` (abertas sem atendente), `resolvedInPeriod` (resolvidas entre `from` e `to`), `byStatus` (todas, por status) e `avgFirstResponseSeconds` (média, nos atendimentos iniciados no período, entre a primeira mensagem do contato e a primeira resposta de uma pessoa; null sem dados). Com `viewAsAttendantId` (só admin) `mine`, `resolvedInPeriod` (resolvidos por ele) e `avgFirstResponseSeconds` (atendimentos atribuídos a ele no período) são os do atendente indicado; `queue` e `byStatus` continuam os das conversas que o admin enxerga. Gráficos e atividade: `inbox.dashboard_metrics`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.dashboard` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_dashboard`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.dashboard`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `viewAsAttendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.dashboard \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00-03:00","to":"2026-10-31T23:59:59-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.dashboard --json '{"from":"2026-10-01T00:00:00-03:00","to":"2026-10-31T23:59:59-03:00"}'
```

MCP: ferramenta `inbox_dashboard` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.dashboard.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.block

Bloquear ou desbloquear o contato de uma conversa. Bloqueia (`block: true`) ou desbloqueia o contato no WhatsApp do número por QR code e marca a conversa (`blockedAt`). Bloqueado no celular também aparece como bloqueado. Só conversa individual de número por QR; se o número ainda não permite, devolve erro claro. Antes da migration `20261030000020` devolve `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.block` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_block`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.block`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `block` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.block \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","block":true}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.block --json '{"conversationId":"00000000-0000-0000-0000-000000000000","block":true}'
```

MCP: ferramenta `inbox_block` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.block.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.vcard_preview

Ver o cartão de contato: foto e se tem WhatsApp. Para cada contato do cartão (`type: contacts`): nome, telefone, se o telefone tem WhatsApp (`hasWhatsapp`, null se não deu para saber), foto (`pictureUrl`) e o `contactId` do Atomiks quando já existe. A consulta ao WhatsApp fica guardada no `meta` da mensagem por 24 h. Em número que não é por QR code só devolve nome e telefone.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.vcard_preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_vcard_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.vcard_preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `messageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.vcard_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.vcard_preview --json '{"messageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_vcard_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.vcard_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# capi.settings_get

Ver configuração das conversões. Configuração da API de Conversões da Meta da conta: ligada, enviar `Purchase` a cada venda, enviar `LeadSubmitted` no primeiro clique de anúncio, página (só dígitos, usada quando não há clique de anúncio) e código de teste do Gerenciador de Eventos. Sem registro, devolve os padrões (desligada).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/capi.settings_get` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `capi_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `capi.settings_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/capi.settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs capi.settings_get --json '{}'
```

MCP: ferramenta `capi_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/capi.settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# capi.settings_update

Alterar configuração das conversões. Altera a configuração das conversões. Campos omitidos não mudam; `pageId` e `testEventCode` aceitam `null` para limpar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/capi.settings_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `capi_settings_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `capi.settings_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `enabled` | boolean | não |  |
| `purchaseOnSale` | boolean | não |  |
| `leadOnCtwa` | boolean | não |  |
| `pageId` | string \| null | não |  |
| `testEventCode` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/capi.settings_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'
```

CLI:

```bash
node cli/atomiks.mjs capi.settings_update --json '{"enabled":true}'
```

MCP: ferramenta `capi_settings_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/capi.settings_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# capi.stage_event_set

Definir o evento da Meta de uma etapa. Define (ou, com `null`, remove) o evento da API de Conversões enviado quando um card entra na etapa. Só etapas abertas; Ganho já manda `Purchase` pela venda. Eventos: LeadSubmitted, InitiateCheckout, AddToCart, ViewContent, OrderCreated, OrderShipped, OrderDelivered, OrderCanceled, OrderReturned, CartAbandoned, QualifiedLead, RatingProvided, ReviewProvided.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/capi.stage_event_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `capi_stage_event_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `capi.stage_event_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `stageId` | string (uuid) | sim |  |
| `eventName` | string \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/capi.stage_event_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stageId":"00000000-0000-0000-0000-000000000000","eventName":"QualifiedLead"}'
```

CLI:

```bash
node cli/atomiks.mjs capi.stage_event_set --json '{"stageId":"00000000-0000-0000-0000-000000000000","eventName":"QualifiedLead"}'
```

MCP: ferramenta `capi_stage_event_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/capi.stage_event_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# capi.deliveries_list

Listar entregas de conversões. Entregas da fila da API de Conversões, da mais recente para a mais antiga, 50 por página. Filtro opcional por `status`. `cursor` é o `nextCursor` da página anterior.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/capi.deliveries_list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `capi_deliveries_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `capi.deliveries_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `status` | "pending" \| "sending" \| "sent" \| "failed" \| "skipped" | não |  |
| `cursor` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/capi.deliveries_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"failed"}'
```

CLI:

```bash
node cli/atomiks.mjs capi.deliveries_list --json '{"status":"failed"}'
```

MCP: ferramenta `capi_deliveries_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/capi.deliveries_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# capi.delivery_retry

Reenviar uma entrega de conversão. Recoloca na fila uma entrega `failed` ou `skipped`, zerando as tentativas. Outros estados são recusados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/capi.delivery_retry` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `capi_delivery_retry`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `capi.delivery_retry`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/capi.delivery_retry \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs capi.delivery_retry --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `capi_delivery_retry` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/capi.delivery_retry.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_connect

Conectar um número por QR code. Cria a sessão do número no servidor do WhatsApp por QR com o webhook do Atomiks, registra o canal `whatsapp_web` em `connecting` e devolve o QR code para escanear no celular. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_connect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_connect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_connect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Atendimento"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_connect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_qr

Estado e QR code de um número por QR. Consulta o estado da sessão do número (reinicia a que caiu). Se ainda não estiver conectada, devolve um QR code novo; ao conectar, o canal fica `ready`. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_qr` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_qr`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_qr \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_qr.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_cancel

Cancelar a conexão por QR code. Apaga a sessão do número no servidor e o canal que ainda não terminou de conectar. Canal já conectado se desconecta por `channels.disconnect`. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_cancel` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_settings_update

Ajustes de um número por QR: grupos e presença online. Só número por QR; manda um ou mais campos. Ajustes sem coluna própria: `rejectCall` (recusa ligações), `msgCall` (texto enviado a quem ligou), `readMessages` (marca como lida ao receber) e `readStatus` (vê os status dos contatos). `receiveGroups`: desligado, as mensagens de grupo não entram no atendimento. `alwaysOnline`: aplica a presença na hora. Ligado, o número aparece online para os contatos, mas o WhatsApp para de mandar notificação ao celular e aos outros aparelhos. Desligado (padrão), o Atomiks reafirma a presença offline a cada 5 minutos e as notificações continuam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_settings_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_settings_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_settings_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `receiveGroups` | boolean | não |  |
| `alwaysOnline` | boolean | não |  |
| `rejectCall` | boolean | não |  |
| `msgCall` | string | não |  |
| `readMessages` | boolean | não |  |
| `readStatus` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_settings_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","receiveGroups":true}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_settings_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","receiveGroups":true}'
```

MCP: ferramenta `channels_evolution_settings_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_settings_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_profile_get

Foto, nome e recado do WhatsApp de um número por QR. Lê do servidor do número o perfil do próprio número: nome do perfil, recado ("Sobre"), URL da foto (expira; a tela renova ao abrir) e o telefone. Dado que o WhatsApp não devolver vem `null`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_profile_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_profile_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_profile_get --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channels_evolution_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_profile_update

Trocar nome, recado ou foto do WhatsApp de um número por QR. Manda um ou mais: `name` (nome do perfil), `about` (recado, até 139 caracteres), `photo` (imagem JPEG/PNG de até 5 MB em base64) ou `removePhoto: true`. Grava direto no WhatsApp e devolve o perfil lido de novo. Só pela interface e API de administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_profile_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_profile_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_profile_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `name` | string | não |  |
| `about` | string | não |  |
| `photo` | object | não |  |
| `removePhoto` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_profile_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","about":"Atendimento de segunda a sexta"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_profile_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","about":"Atendimento de segunda a sexta"}'
```

MCP: ferramenta `channels_evolution_profile_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_profile_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_settings_get

Ajustes de ligação e leitura de um número por QR. Lê do número os ajustes que não têm coluna no Atomiks: `rejectCall`, `msgCall`, `readMessages` e `readStatus`. Grupos e "sempre online" já vêm na conta (`channel_connections.get`). Escreve-se com `channels.evolution_settings_update`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_settings_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_settings_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_settings_get --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channels_evolution_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_privacy_get

Privacidade do WhatsApp de um número por QR. Lê do WhatsApp quem vê: confirmação de leitura (`readreceipts`: `all`/`none`), foto (`profile`), recado (`status`), online (`online`: `all`/`match_last_seen`), visto por último (`last`) e quem adiciona em grupos (`groupadd`). Valores: `all`, `contacts`, `contact_blacklist`, `none`, `match_last_seen`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_privacy_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_privacy_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_privacy_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_privacy_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_privacy_get --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channels_evolution_privacy_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_privacy_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_privacy_update

Mudar a privacidade do WhatsApp de um número por QR. Muda um ou mais campos de privacidade (mesmos nomes e valores de `channels.evolution_privacy_get`). O WhatsApp pede o conjunto todo: o Atomiks lê o atual, troca só o que veio e grava. Devolve o conjunto novo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_privacy_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_privacy_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_privacy_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `readreceipts` | "all" \| "none" | não |  |
| `profile` | "all" \| "contacts" \| "contact_blacklist" \| "none" \| "match_last_seen" | não |  |
| `status` | "all" \| "contacts" \| "contact_blacklist" \| "none" \| "match_last_seen" | não |  |
| `online` | "all" \| "match_last_seen" | não |  |
| `last` | "all" \| "contacts" \| "contact_blacklist" \| "none" \| "match_last_seen" | não |  |
| `groupadd` | "all" \| "contacts" \| "contact_blacklist" \| "none" \| "match_last_seen" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_privacy_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","last":"contacts"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_privacy_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","last":"contacts"}'
```

MCP: ferramenta `channels_evolution_privacy_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_privacy_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.web_switch_provider

Atualizar a conexão de um número por QR (ler o QR de novo). Leva um número por QR já conectado para o servidor de WhatsApp atual sem perder as conversas: cria a sessão nova e devolve o QR code para ler no mesmo celular. Ao ler com o mesmo número, a conexão antiga é apagada e o canal segue com o mesmo id e as mesmas conversas; com outro número, a sessão nova é descartada e `lastAttempt` vem `phone_mismatch` (nova sessão só com `restart: true`). Chamada de novo durante a troca devolve um QR novo; `cancel: true` desiste da troca. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.web_switch_provider` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.web_switch_provider`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `to` | "evolution" \| "waha" | não |  |
| `cancel` | boolean | não |  |
| `restart` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.web_switch_provider \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.web_switch_provider.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.instagram_connect_url

Endereço para conectar uma conta do Instagram. Devolve o endereço que inicia o login do Instagram (conta profissional). O retorno grava o canal `instagram`. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.instagram_connect_url` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: não
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.instagram_connect_url`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.instagram_connect_url \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.instagram_connect_url.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.instagram_disconnect

Desconectar uma conta do Instagram. Cancela a inscrição do Atomiks nos eventos da conta, apaga o token e marca o canal como desconectado. As conversas continuam na conta. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.instagram_disconnect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.instagram_disconnect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.instagram_disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.instagram_disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.instagram_settings

Ajustes de uma conta do Instagram. Liga ou desliga o envio com Human Agent (resposta humana até 7 dias depois da última mensagem do contato). Só funciona depois que a Meta aprovar a permissão no app.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.instagram_settings` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_instagram_settings`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.instagram_settings`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `humanAgent` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.instagram_settings \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","humanAgent":true}'
```

CLI:

```bash
node cli/atomiks.mjs channels.instagram_settings --json '{"channelId":"00000000-0000-0000-0000-000000000000","humanAgent":true}'
```

MCP: ferramenta `channels_instagram_settings` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.instagram_settings.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.list

Listar automações do Instagram. Automações das contas do Instagram que o membro pode usar, com a quantidade de execuções nas últimas 24 horas. `channelId` filtra por conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `automations_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs automations.list --json '{}'
```

MCP: ferramenta `automations_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.get

Ver automação do Instagram. Uma automação pelo id.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `automations_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs automations.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `automations_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.create

Criar automação do Instagram. Cria a automação. Gatilhos: `comment` (post ou reel), `live_comment`, `story_reply`, `dm_keyword`. `mediaIds` vazio = qualquer publicação; `keywords` vazio = qualquer texto. `publicReplies` (até 5, sorteia uma) só para `comment`. Precisa de resposta pública ou `dmText` (até 1000 caracteres). `{nome}` vira o @ de quem escreveu. `reactHeart` reage com ❤ à mensagem do contato (só `story_reply` e `dm_keyword`). `delaySeconds` (0 a 43200) espera esse tempo antes da mensagem no Direct; a resposta pública e a reação saem na hora; `live_comment` não aceita atraso.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `automations_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `name` | string | sim |  |
| `trigger` | "comment" \| "live_comment" \| "story_reply" \| "dm_keyword" | sim |  |
| `mediaIds` | string[] | não | padrão [] |
| `keywords` | string[] | não | padrão [] |
| `matchMode` | "contains" \| "exact" | não | padrão "contains" |
| `publicReplies` | string[] | não | padrão [] |
| `dmText` | string \| null | não | padrão null |
| `oncePerUser` | boolean | não | padrão true |
| `reactHeart` | boolean | não | padrão false |
| `delaySeconds` | integer | não | padrão 0 |
| `enabled` | boolean | não | padrão true |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","name":"Quero o guia","trigger":"comment","mediaIds":[],"keywords":["quero"],"matchMode":"contains","publicReplies":["Te mandei no Direct!"],"dmText":"Oi {nome}, aqui está o guia.","oncePerUser":true,"reactHeart":false,"delaySeconds":0,"enabled":true}'
```

CLI:

```bash
node cli/atomiks.mjs automations.create --json '{"channelId":"00000000-0000-0000-0000-000000000000","name":"Quero o guia","trigger":"comment","mediaIds":[],"keywords":["quero"],"matchMode":"contains","publicReplies":["Te mandei no Direct!"],"dmText":"Oi {nome}, aqui está o guia.","oncePerUser":true,"reactHeart":false,"delaySeconds":0,"enabled":true}'
```

MCP: ferramenta `automations_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.update

Alterar automação do Instagram. Altera campos da automação. Campos omitidos não mudam; `dmText: null` limpa a mensagem. A conta do Instagram não muda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `automations_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `trigger` | "comment" \| "live_comment" \| "story_reply" \| "dm_keyword" | não |  |
| `mediaIds` | string[] | não |  |
| `keywords` | string[] | não |  |
| `matchMode` | "contains" \| "exact" | não |  |
| `publicReplies` | string[] | não |  |
| `dmText` | string \| null | não |  |
| `oncePerUser` | boolean | não |  |
| `reactHeart` | boolean | não |  |
| `delaySeconds` | integer | não |  |
| `enabled` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","keywords":["quero","eu quero"]}'
```

CLI:

```bash
node cli/atomiks.mjs automations.update --json '{"id":"00000000-0000-0000-0000-000000000000","keywords":["quero","eu quero"]}'
```

MCP: ferramenta `automations_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.set_enabled

Ligar ou desligar automação do Instagram. Liga ou desliga a automação. Execuções já na fila de uma automação desligada são puladas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.set_enabled` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `automations_set_enabled`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.set_enabled`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `enabled` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.set_enabled \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","enabled":false}'
```

CLI:

```bash
node cli/atomiks.mjs automations.set_enabled --json '{"id":"00000000-0000-0000-0000-000000000000","enabled":false}'
```

MCP: ferramenta `automations_set_enabled` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.set_enabled.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.delete

Apagar automação do Instagram. Apaga a automação e o histórico de execuções dela.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `automations_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs automations.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `automations_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.runs

Histórico de execuções das automações. Execuções do mais recente para o mais antigo. Filtros: `automationId`, `status`. Use `before` (o `nextBefore` anterior) para a página seguinte.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.runs` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `automations_runs`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.runs`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `automationId` | string (uuid) | não |  |
| `status` | "pending" \| "sending" \| "done" \| "failed" \| "skipped" | não |  |
| `limit` | integer | não | padrão 50 |
| `before` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.runs \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs automations.runs --json '{"limit":50}'
```

MCP: ferramenta `automations_runs` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.runs.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.media

Listar publicações ou stories da conta. Publicações (posts e reels) ou stories da conta do Instagram, para escolher onde a automação vale. Campo ausente na Meta volta `null`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.media` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `automations_media`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.media`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `kind` | "posts" \| "stories" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.media \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","kind":"posts"}'
```

CLI:

```bash
node cli/atomiks.mjs automations.media --json '{"channelId":"00000000-0000-0000-0000-000000000000","kind":"posts"}'
```

MCP: ferramenta `automations_media` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.media.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# automations.test

Testar o texto de uma automação. Diz se um texto (e uma publicação, se a automação limita) dispararia a automação. Não envia nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/automations.test` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `automations_test`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `automations.test`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `automationId` | string (uuid) | sim |  |
| `text` | string | sim |  |
| `mediaId` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/automations.test \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"automationId":"00000000-0000-0000-0000-000000000000","text":"Eu quero!"}'
```

CLI:

```bash
node cli/atomiks.mjs automations.test --json '{"automationId":"00000000-0000-0000-0000-000000000000","text":"Eu quero!"}'
```

MCP: ferramenta `automations_test` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/automations.test.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.profile_get

Perfil completo do contato. Dados do contato (nome, telefone, e-mail, Instagram sem @, Telegram, aniversário AAAA-MM-DD, endereço, documento), permissão de envio por canal (`consents`, os 6 canais; `recorded: false` = sem decisão, vale "pode receber"), tags, listas e campos personalizados ativos da conta com o valor do contato (`value: null` quando vazio).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.profile_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.profile_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.profile_get --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.profile_update

Editar dados do contato. Altera nome, e-mail, Instagram (aceita @), Telegram, aniversário (AAAA-MM-DD), endereço (cep, rua, numero, complemento, bairro, cidade, estado, pais) e documento. Todos aceitam `null` (ou texto vazio) para limpar; o endereço é substituído por inteiro. O telefone não se edita aqui: é a identidade do WhatsApp do contato.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.profile_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_profile_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.profile_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `name` | string | não |  |
| `email` | string (email) \| null \| "" | não |  |
| `instagram` | string \| null \| "" | não |  |
| `telegram` | string \| null | não |  |
| `document` | string \| null | não |  |
| `birthday` | string \| null | não |  |
| `address` | object \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.profile_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","email":"maria@exemplo.com"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.profile_update --json '{"contactId":"00000000-0000-0000-0000-000000000000","email":"maria@exemplo.com"}'
```

MCP: ferramenta `contacts_profile_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.profile_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.consents_list

Permissão de envio por canal. Os 6 canais (whatsapp, email, sms, instagram, telegram, voice) com `status` opted_in/opted_out, `recorded` (houve decisão), `changedAt` e `source`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.consents_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_consents_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.consents_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.consents_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.consents_list --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_consents_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.consents_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.consent_set

Definir permissão de envio de um canal. `status: opted_out` = "Não quer receber"; `opted_in` = "Pode receber". Registra quem mudou e quando. Devolve a lista completa de canais.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.consent_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_consent_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.consent_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `channel` | "whatsapp" \| "email" \| "sms" \| "instagram" \| "telegram" \| "voice" | sim |  |
| `status` | "opted_in" \| "opted_out" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.consent_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","channel":"whatsapp","status":"opted_out"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.consent_set --json '{"contactId":"00000000-0000-0000-0000-000000000000","channel":"whatsapp","status":"opted_out"}'
```

MCP: ferramenta `contacts_consent_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.consent_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.fields_list

Listar campos personalizados da conta. Definições dos campos personalizados, em ordem. `includeArchived: true` traz também os arquivados. `type` é o armazenamento (text, number, date, select com `options`, boolean, file) e `fieldType` o tipo da tela (também textarea, currency, percentage, multi_select, radio, link, rating, image).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.fields_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_fields_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.fields_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `includeArchived` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.fields_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.fields_list --json '{}'
```

MCP: ferramenta `crm_fields_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.fields_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.field_create

Criar campo personalizado. Cria a definição. `key` (a-z, 0-9, _) sai do rótulo se omitida e é única na conta. `options` é obrigatório (e só vale) para `select`. O tipo não muda depois.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.field_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_field_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.field_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `label` | string | sim |  |
| `type` | "text" \| "number" \| "date" \| "select" \| "boolean" \| "file" | sim |  |
| `key` | string | não |  |
| `options` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.field_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"label":"Cidade","type":"text"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.field_create --json '{"label":"Cidade","type":"text"}'
```

MCP: ferramenta `crm_field_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.field_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.field_update

Editar campo personalizado. Muda rótulo, opções (só `select`; valores já gravados que saírem das opções continuam guardados) e posição. `archived: true` arquiva (some do perfil, valores ficam); `false` restaura.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.field_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_field_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.field_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `label` | string | não |  |
| `options` | string[] | não |  |
| `position` | integer | não |  |
| `archived` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.field_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","label":"Cidade natal"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.field_update --json '{"id":"00000000-0000-0000-0000-000000000000","label":"Cidade natal"}'
```

MCP: ferramenta `crm_field_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.field_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.field_delete

Apagar campo personalizado. Apaga a definição e os valores de todos os contatos, de vez. Para só esconder, use `crm.field_update` com `archived: true`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.field_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_field_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.field_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.field_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.field_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_field_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.field_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.field_values_set

Gravar valores de campos personalizados do contato. Lista de `{fieldId, value}`; `value: null` limpa. Pelo `fieldType`: text (1-500), textarea (até 10000), number, currency, percentage, rating (1 a 5), date (AAAA-MM-DD), select e radio (uma das opções), multi_select (lista de opções), link (http/https), boolean, file e image (id do upload). Tudo ou nada: um valor inválido recusa o pedido. Devolve os campos ativos com os valores.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.field_values_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_field_values_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.field_values_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `values` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.field_values_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","values":[{"fieldId":"00000000-0000-0000-0000-000000000000","value":"São Paulo"}]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.field_values_set --json '{"contactId":"00000000-0000-0000-0000-000000000000","values":[{"fieldId":"00000000-0000-0000-0000-000000000000","value":"São Paulo"}]}'
```

MCP: ferramenta `contacts_field_values_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.field_values_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tags_list

Listar tags da conta. Tags da conta em ordem alfabética, com quantos contatos usam cada uma. `q` filtra pelo nome.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tags_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_tags_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tags_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tags_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tags_list --json '{}'
```

MCP: ferramenta `crm_tags_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tags_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tag_create

Criar tag. Qualquer membro cria pelo painel ("Buscar ou criar tag"). Nome único na conta sem diferenciar maiúsculas; `color` é a chave de um token do design system (padrão `gray`). Se a tag já existe, devolve a existente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tag_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_tag_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tag_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `color` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tag_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"VIP"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tag_create --json '{"name":"VIP"}'
```

MCP: ferramenta `crm_tag_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tag_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tag_update

Editar tag. Renomeia ou muda a cor.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tag_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_tag_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tag_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `color` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tag_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Cliente VIP"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tag_update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Cliente VIP"}'
```

MCP: ferramenta `crm_tag_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tag_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tag_delete

Apagar tag. Apaga a tag e a tira de todos os contatos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tag_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_tag_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tag_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tag_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tag_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_tag_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tag_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tag_attach

Aplicar tag ao contato. Idempotente. Devolve as tags do contato.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tag_attach` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_tag_attach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tag_attach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `tagId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tag_attach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","tagId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tag_attach --json '{"contactId":"00000000-0000-0000-0000-000000000000","tagId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_tag_attach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tag_attach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.tag_detach

Tirar tag do contato. Idempotente. Devolve as tags do contato.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.tag_detach` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_tag_detach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.tag_detach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `tagId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.tag_detach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","tagId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.tag_detach --json '{"contactId":"00000000-0000-0000-0000-000000000000","tagId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_tag_detach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.tag_detach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.lists_list

Listar listas de contatos da conta. Listas manuais da conta em ordem alfabética, com o total de contatos. `q` filtra pelo nome.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.lists_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_lists_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.lists_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.lists_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.lists_list --json '{}'
```

MCP: ferramenta `crm_lists_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.lists_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.list_create

Criar lista de contatos. Lista manual. Nome único na conta sem diferenciar maiúsculas; se já existe, devolve a existente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.list_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_list_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.list_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.list_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Clientes de outubro"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.list_create --json '{"name":"Clientes de outubro"}'
```

MCP: ferramenta `crm_list_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.list_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.list_rename

Renomear lista. Muda o nome da lista.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.list_rename` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_list_rename`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.list_rename`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.list_rename \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.list_rename --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP"}'
```

MCP: ferramenta `crm_list_rename` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.list_rename.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.list_delete

Apagar lista. Apaga a lista e tira todos os contatos dela. Os contatos continuam existindo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.list_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_list_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.list_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.list_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.list_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_list_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.list_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.list_add

Adicionar contato a uma lista. Idempotente. Devolve as listas do contato.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.list_add` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_list_add`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.list_add`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `listId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.list_add \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","listId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.list_add --json '{"contactId":"00000000-0000-0000-0000-000000000000","listId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_list_add` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.list_add.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.list_remove

Tirar contato de uma lista. Idempotente. Devolve as listas do contato.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.list_remove` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_list_remove`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.list_remove`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `listId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.list_remove \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","listId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.list_remove --json '{"contactId":"00000000-0000-0000-0000-000000000000","listId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_list_remove` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.list_remove.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.history

Histórico do contato. Linha do tempo do contato (mais recente primeiro) e atividade por semana. `filter`: all, conversation (mensagens, notas internas, eventos de atendimento), purchases (compras), automations (execuções de automação); `all` inclui também oportunidades e tarefas. `weekly` cobre as últimas 12 semanas (janelas de 7 dias terminando hoje, no fuso da conta, da mais antiga à atual) com `total`, `thisWeek` e `peak` (`weeksAgo` 0 = esta semana; null sem atividade), e não muda com nenhum filtro. Itens: até 300 mais recentes por fonte; cada um traz `eventName` (veja `contacts.history_filter_options`). Paginação: `before` = `nextBefore` da resposta anterior. Filtros novos (aba Histórico de Atividades): `q` (texto no título e no detalhe, sem acento nem caixa), `eventNames`, `from`/`to` (ISO com fuso, inclusivos), `tagIds`, `flowIds`, `pipelineIds` (E entre filtros, qualquer valor dentro da lista). Qualquer filtro novo presente, até `eventNames: []`, liga o modo ampliado: entram também execuções de flow (`type: flow`) e eventos de domínio (`type: event`, como etiqueta adicionada ou oportunidade mudou de etapa). Sem eles a resposta é a de sempre.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.history` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_history`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.history`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `filter` | "all" \| "conversation" \| "purchases" \| "automations" | não |  |
| `limit` | integer | não |  |
| `before` | string (date-time) | não |  |
| `q` | string | não |  |
| `eventNames` | string[] | não |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `tagIds` | string (uuid)[] | não |  |
| `flowIds` | string (uuid)[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.history \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","filter":"all"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.history --json '{"contactId":"00000000-0000-0000-0000-000000000000","filter":"all"}'
```

MCP: ferramenta `contacts_history` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.history.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.history_filter_options

Opções dos filtros do histórico. O que os filtros de `contacts.history` aceitam: `events` (tipos de evento com rótulo e grupo; `name` vai em `eventNames`) e as etiquetas, flows (sem os arquivados) e pipelines (sem os arquivados) da conta, por nome.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.history_filter_options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_history_filter_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.history_filter_options`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.history_filter_options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.history_filter_options --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_history_filter_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.history_filter_options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.availability_get

Disponibilidade de um atendente. Expediente semanal usado em "Horários livres": `weekly` = {mon..sun: [["09:00","12:00"], ...]} no `timezone` do atendente, `slotMinutes` é o passo da grade. `configured: false` = ainda sem disponibilidade ("Configurar disponibilidade"). `userId` omitido ou "me" = o chamador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.availability_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_availability_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.availability_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) \| "me" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.availability_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"me"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.availability_get --json '{"userId":"me"}'
```

MCP: ferramenta `crm_availability_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.availability_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.availability_update

Definir disponibilidade de um atendente. Cada um edita a própria; o admin edita a de qualquer atendente. `weekly` substitui por inteiro (faixas HH:MM, início antes do fim, sem sobreposição, até 8 por dia). `slotMinutes` em 5, 10, 15, 20, 30, 45 ou 60. `timezone` é um fuso IANA.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.availability_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_availability_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.availability_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) \| "me" | não |  |
| `weekly` | object | sim |  |
| `slotMinutes` | number | não |  |
| `timezone` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.availability_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"weekly":{"mon":[["09:00","12:00"],["14:00","18:00"]]}}'
```

CLI:

```bash
node cli/atomiks.mjs crm.availability_update --json '{"weekly":{"mon":[["09:00","12:00"],["14:00","18:00"]]}}'
```

MCP: ferramenta `crm_availability_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.availability_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.agenda_get

Agenda de um responsável (blocos ocupados). Tarefas e reuniões do responsável com horário entre `from` e `to` (até 14 dias), para desenhar a linha do dia e achar conflitos. Conta tudo da conta, inclusive de contatos que o chamador não vê: nesses, `title` e `contactId` vêm `null` (só o bloco ocupado). Sem `durationMinutes` o bloco conta 30 min; `allDay` ocupa o dia. Traz também a disponibilidade.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.agenda_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_agenda_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.agenda_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `assigneeId` | string (uuid) \| "me" | não |  |
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.agenda_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"assigneeId":"me","from":"2026-10-24T00:00:00-03:00","to":"2026-10-25T00:00:00-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.agenda_get --json '{"assigneeId":"me","from":"2026-10-24T00:00:00-03:00","to":"2026-10-25T00:00:00-03:00"}'
```

MCP: ferramenta `crm_agenda_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.agenda_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.companies_list

Listar empresas da conta. Empresas para vincular a oportunidades, em ordem alfabética. `q` filtra pelo nome. Até 200.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.companies_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_companies_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.companies_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.companies_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.companies_list --json '{}'
```

MCP: ferramenta `crm_companies_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.companies_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.company_create

Criar empresa. Nome único na conta sem diferenciar maiúsculas; se já existe, devolve a existente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.company_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_company_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.company_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.company_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Acme Ltda"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.company_create --json '{"name":"Acme Ltda"}'
```

MCP: ferramenta `crm_company_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.company_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.dashboard_metrics

Gráficos e atividade do painel do atendimento. Métricas do período `from`..`to` (até 92 dias) das conversas que o membro enxerga: `volume` (atendimentos iniciados por hora, se o período tem até 36 h, senão por dia, no fuso da conta, com buckets vazios preenchidos), `byChannel` (por tipo de canal), `avgFirstResponseSeconds`, `avgResolutionSeconds` (atendimentos resolvidos), `responseBuckets` (primeira resposta média por hora ou por dia da semana, 0 = domingo), `recentActivity` (6 eventos: atribuída, transferida, resolvida, reaberta; sem repetir conversa+evento) e `byAttendant` (admin: todos; membro: só ele). Com `viewAsAttendantId` (só admin) tudo vale para os atendimentos daquele atendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.dashboard_metrics` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_dashboard_metrics`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.dashboard_metrics`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `viewAsAttendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.dashboard_metrics \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-17T00:00:00-03:00","to":"2026-10-24T23:59:59-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.dashboard_metrics --json '{"from":"2026-10-17T00:00:00-03:00","to":"2026-10-24T23:59:59-03:00"}'
```

MCP: ferramenta `inbox_dashboard_metrics` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.dashboard_metrics.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.dashboard_attendant

Atendente do cartão do painel do atendimento. Id, nome e foto (`avatarUrl`, null sem foto) do atendente do cartão do painel: o próprio chamador ou, só admin, o indicado em `viewAsAttendantId`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.dashboard_attendant` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_dashboard_attendant`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.dashboard_attendant`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `viewAsAttendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.dashboard_attendant \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.dashboard_attendant --json '{}'
```

MCP: ferramenta `inbox_dashboard_attendant` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.dashboard_attendant.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.pipelines_overview

Visão geral dos pipelines. Indicadores das oportunidades que o chamador vê, de um pipeline (`pipelineId`) ou de todos: `kpis` (total, abertas e valor em aberto, ganhas e perdidas no período `from`..`to` com valor ganho, `conversionRate` = ganhas ÷ (ganhas + perdidas) em %, `avgCycleDays` da criação ao ganho), `ranking` por responsável (ordenado pelo valor ganho no período), `atRisk` (abertas sem movimento há `riskDays` dias, padrão 14, ou com `expectedCloseDate` vencida; até 50, mais paradas primeiro) e `lostReasons` (perdidas no período por `lost_reason`; `reason` null = sem motivo). Também devolve o que a Visão geral de oportunidades mostra: `pipelines` (contagens e valores por pipeline, para a lista lateral), `temperature` (abertas em quente, morno, frio e congelado: banda do contato; parada há 30 dias ou mais conta como congelada) e `activityMix` (tarefas criadas no período por tipo e as ligações concluídas). Em `atRisk`, `priority` é `high` (ação vencida ou parada há o dobro de `riskDays`) ou `attention`. Em `ranking`, `activities` são as tarefas do responsável criadas no período. Valores em centavos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.pipelines_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_pipelines_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.pipelines_overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | não |  |
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `riskDays` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.pipelines_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00-03:00","to":"2026-10-31T23:59:59-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.pipelines_overview --json '{"from":"2026-10-01T00:00:00-03:00","to":"2026-10-31T23:59:59-03:00"}'
```

MCP: ferramenta `crm_pipelines_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.pipelines_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# me.profile_get

Ver meu perfil. Nome, e-mail e foto (`avatarUrl`, null sem foto) do usuário autenticado ("Meu perfil").

- Endpoint: `POST https://app.atomiks.com.br/api/v1/me.profile_get` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `me_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `me.profile_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/me.profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs me.profile_get --json '{}'
```

MCP: ferramenta `me_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/me.profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# me.profile_update

Alterar meu perfil. Altera nome e/ou foto do próprio usuário. `avatarUrl` é um endereço https ou uma imagem PNG/JPEG/WebP em data URL (até ~200 KB); null remove a foto. Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/me.profile_update` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `me_profile_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `me.profile_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | não |  |
| `avatarUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/me.profile_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Ana Souza"}'
```

CLI:

```bash
node cli/atomiks.mjs me.profile_update --json '{"name":"Ana Souza"}'
```

MCP: ferramenta `me_profile_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/me.profile_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# calendars.list

Listar calendários de atendimento. Calendários de horário da conta: nome, fuso, principal (só um), horários por dia da semana (`mon`..`sun`, intervalos `["09:00","12:00"]`) e exceções por data (`closed`, `open` o dia todo ou `range` com `start`/`end`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/calendars.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `account:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `calendars_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `calendars.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/calendars.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs calendars.list --json '{}'
```

MCP: ferramenta `calendars_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/calendars.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# calendars.create

Criar calendário de atendimento. Cria um calendário. O primeiro da conta vira o principal; `isDefault: true` troca o principal.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/calendars.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `account:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `calendars_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `calendars.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `timezone` | string | não |  |
| `isDefault` | boolean | não |  |
| `weekly` | object | não |  |
| `exceptions` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/calendars.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Comercial","weekly":{"mon":[["09:00","18:00"]]}}'
```

CLI:

```bash
node cli/atomiks.mjs calendars.create --json '{"name":"Comercial","weekly":{"mon":[["09:00","18:00"]]}}'
```

MCP: ferramenta `calendars_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/calendars.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# calendars.update

Alterar calendário de atendimento. Altera nome, fuso, horários ou exceções. `isDefault: true` torna este o principal; o principal não pode ser desmarcado direto (marque outro).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/calendars.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `account:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `calendars_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `calendars.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `timezone` | string | não |  |
| `isDefault` | boolean | não |  |
| `weekly` | object | não |  |
| `exceptions` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/calendars.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Plantão"}'
```

CLI:

```bash
node cli/atomiks.mjs calendars.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Plantão"}'
```

MCP: ferramenta `calendars_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/calendars.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# calendars.delete

Excluir calendário de atendimento. Exclui o calendário. O principal só pode ser excluído se for o único.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/calendars.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `account:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `calendars_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `calendars.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/calendars.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs calendars.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `calendars_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/calendars.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# push.config

Configuração do Web Push. Chave pública VAPID (`publicKey`) para o navegador assinar o push. `null` quando o servidor não tem chaves: a tela deve esconder o push.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/push.config` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `push_config`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `push.config`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/push.config \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs push.config --json '{}'
```

MCP: ferramenta `push_config` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/push.config.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# push.subscribe

Ativar push neste navegador. Guarda a assinatura Web Push (`PushSubscription.toJSON()`) do usuário. Repetir o mesmo `endpoint` atualiza as chaves.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/push.subscribe` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `push_subscribe`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `push.subscribe`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `endpoint` | string (uri) | sim |  |
| `keys` | object | sim |  |
| `userAgent` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/push.subscribe \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endpoint":"https://push.example.com/abc","keys":{"p256dh":"BKey","auth":"secret"}}'
```

CLI:

```bash
node cli/atomiks.mjs push.subscribe --json '{"endpoint":"https://push.example.com/abc","keys":{"p256dh":"BKey","auth":"secret"}}'
```

MCP: ferramenta `push_subscribe` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/push.subscribe.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# push.unsubscribe

Desativar push neste navegador. Apaga a assinatura Web Push do usuário com esse `endpoint`. Se não existir, nada acontece.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/push.unsubscribe` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `push_unsubscribe`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `push.unsubscribe`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `endpoint` | string (uri) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/push.unsubscribe \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endpoint":"https://push.example.com/abc"}'
```

CLI:

```bash
node cli/atomiks.mjs push.unsubscribe --json '{"endpoint":"https://push.example.com/abc"}'
```

MCP: ferramenta `push_unsubscribe` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/push.unsubscribe.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.catalog

Catálogo de eventos e nós dos flows. Eventos que iniciam ou encerram um flow (com filtros e canais aceitos) e os tipos de nó, cada um com um exemplo de configuração e os handles de saída. As arestas do grafo usam `sourceHandle` igual a um desses handles; `send_message` só tem `btn:<id>`, `reply` e `no_reply` quando tem `waitReply`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.catalog` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_catalog`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.catalog`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.catalog \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs flows.catalog --json '{}'
```

MCP: ferramenta `flows_catalog` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.catalog.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.list

Listar flows. Flows da conta, do mais recente para o mais antigo. Arquivados só com `includeArchived`. `status` filtra. Cada item traz o resumo da versão mais recente: `steps` (nós), `startEvent` (primeiro evento de início ou null), `runs` (execuções de todas as versões) e `layout` (posições e ligações para a miniatura).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `status` | "draft" \| "active" \| "paused" \| "archived" | não |  |
| `includeArchived` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs flows.list --json '{}'
```

MCP: ferramenta `flows_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.get

Ver flow. O flow com o rascunho atual (`draft`, a versão mais recente se ainda não publicada) e a versão publicada (`published`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.create

Criar flow. Cria um flow em rascunho (versão 1). Sem `graph`, começa só com o nó de gatilho vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `folder` | string | não |  |
| `graph` | any | não | Grafo do flow: {schema: 1, nodes, edges}. Veja flows.catalog para os tipos de nó e handles. |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Boas-vindas"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.create --json '{"name":"Boas-vindas"}'
```

MCP: ferramenta `flows_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.save_draft

Salvar rascunho do flow. Grava o grafo no rascunho (a versão mais recente, se não publicada; senão cria a próxima versão). `expectedVersion` é o número da versão mais recente que você leu (0 se o flow não tinha versões); se outra pessoa já avançou, devolve conflito (409). A validação completa só acontece ao publicar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.save_draft` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_save_draft`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.save_draft`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `graph` | any | sim | Grafo do flow: {schema: 1, nodes, edges}. Veja flows.catalog para os tipos de nó e handles. |
| `expectedVersion` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.save_draft \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","graph":{"schema":1,"nodes":[{"id":"trigger","type":"trigger","position":{"x":0,"y":0},"config":{"start":[],"exit":[]}}],"edges":[]},"expectedVersion":1}'
```

CLI:

```bash
node cli/atomiks.mjs flows.save_draft --json '{"id":"00000000-0000-0000-0000-000000000000","graph":{"schema":1,"nodes":[{"id":"trigger","type":"trigger","position":{"x":0,"y":0},"config":{"start":[],"exit":[]}}],"edges":[]},"expectedVersion":1}'
```

MCP: ferramenta `flows_save_draft` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.save_draft.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.rename

Renomear flow. Muda só o nome do flow; não cria versão nem mexe no grafo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.rename` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_rename`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.rename`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.rename \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Novo nome"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.rename --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Novo nome"}'
```

MCP: ferramenta `flows_rename` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.rename.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.versions

Versões do flow. Até 50 versões do flow, da mais nova para a mais antiga (sem o grafo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.versions` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_versions`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.versions`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `flowId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.versions \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"flowId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.versions --json '{"flowId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_versions` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.versions.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.restore_version

Restaurar versão do flow. Copia o grafo de uma versão antiga para o rascunho: regrava o rascunho atual ou, se a mais recente está publicada, cria a próxima versão. Devolve o número da versão do rascunho.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.restore_version` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_restore_version`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.restore_version`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `flowId` | string (uuid) | sim |  |
| `versionId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.restore_version \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"flowId":"00000000-0000-0000-0000-000000000000","versionId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.restore_version --json '{"flowId":"00000000-0000-0000-0000-000000000000","versionId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_restore_version` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.restore_version.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.publish

Publicar flow. Valida o rascunho (grafo e gatilhos), marca a versão como publicada (a anterior deixa de ser), regrava os gatilhos de início e saída e deixa o flow `active`. Grafo inválido devolve `invalid_input` com a lista de problemas na mensagem. Runs vivos seguem na versão em que começaram.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.publish` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_publish`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.publish`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.publish \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.publish --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_publish` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.publish.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.pause

Pausar flow. Para de iniciar runs novos (gatilhos de início desligados). Os runs vivos continuam até o fim.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.pause` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_pause`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.pause`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.pause \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.pause --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_pause` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.pause.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.resume

Retomar flow. Volta um flow pausado para ativo e religa os gatilhos de início.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.resume` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_resume`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.resume`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.resume \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.resume --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_resume` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.resume.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.archive

Arquivar flow. Tira o flow da lista e desliga todos os gatilhos. Runs vivos não são cancelados (use flow_runs.cancel).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.archive` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.archive --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.duplicate

Duplicar flow. Cria um flow novo em rascunho com o grafo da versão mais recente. Sem `name`, usa "<nome> (cópia)".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.duplicate` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_duplicate`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.duplicate`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.duplicate \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.duplicate --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_duplicate` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.duplicate.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.export

Exportar flow. JSON `{schema, name, graph}` da versão mais recente, para importar em outra conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.export --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.import

Importar flow. Cria um rascunho a partir do JSON de `flows.export`. `name` substitui o nome do arquivo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.import` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_import`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.import`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `data` | object | sim |  |
| `name` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.import \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"data":{"schema":1,"name":"Boas-vindas","graph":{"schema":1,"nodes":[{"id":"trigger","type":"trigger","position":{"x":0,"y":0},"config":{"start":[],"exit":[]}}],"edges":[]}}}'
```

CLI:

```bash
node cli/atomiks.mjs flows.import --json '{"data":{"schema":1,"name":"Boas-vindas","graph":{"schema":1,"nodes":[{"id":"trigger","type":"trigger","position":{"x":0,"y":0},"config":{"start":[],"exit":[]}}],"edges":[]}}}'
```

MCP: ferramenta `flows_import` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.import.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.test_run

Testar flow num contato. Inicia um run do flow publicado no contato escolhido, ignorando os gatilhos. Falha se o contato já está no flow.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.test_run` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flows_test_run`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.test_run`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.test_run \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.test_run --json '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_test_run` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.test_run.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flow_runs.list

Listar execuções de flows. Execuções do mais recente para o mais antigo. Filtros: `flowId`, `status`, `contactId`. Use `before` (o `nextBefore` anterior) para a página seguinte.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flow_runs.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flow_runs_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flow_runs.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `flowId` | string (uuid) | não |  |
| `status` | "running" \| "waiting_reply" \| "waiting_delay" \| "completed" \| "failed" \| "canceled" \| "expired" | não |  |
| `contactId` | string (uuid) | não |  |
| `limit` | integer | não | padrão 50 |
| `before` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flow_runs.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"failed","limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs flow_runs.list --json '{"status":"failed","limit":50}'
```

MCP: ferramenta `flow_runs_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flow_runs.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flow_runs.get

Ver execução de flow. A execução com todos os passos (diário), na ordem em que rodaram.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flow_runs.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flow_runs_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flow_runs.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flow_runs.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flow_runs.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flow_runs_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flow_runs.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flow_runs.cancel

Cancelar execução de flow. Cancela uma execução viva (rodando ou em espera). `reason` fica registrado no run.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flow_runs.cancel` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flow_runs_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flow_runs.cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `reason` | string | não | padrão "Cancelado manualmente" |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flow_runs.cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","reason":"Contato pediu para parar"}'
```

CLI:

```bash
node cli/atomiks.mjs flow_runs.cancel --json '{"id":"00000000-0000-0000-0000-000000000000","reason":"Contato pediu para parar"}'
```

MCP: ferramenta `flow_runs_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flow_runs.cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flow_runs.retry_step

Repetir passo de uma execução. Recomeça uma execução a partir do nó informado (`nodeId`), por exemplo depois de uma falha.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flow_runs.retry_step` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `flow_runs_retry_step`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flow_runs.retry_step`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `nodeId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flow_runs.retry_step \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","nodeId":"n1"}'
```

CLI:

```bash
node cli/atomiks.mjs flow_runs.retry_step --json '{"id":"00000000-0000-0000-0000-000000000000","nodeId":"n1"}'
```

MCP: ferramenta `flow_runs_retry_step` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flow_runs.retry_step.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# flows.stats

Números por passo do flow. Execuções do período (padrão: últimos 30 dias) da versão publicada, ou de `versionId`. `nodes[nodeId]`: `entered` = execuções distintas que passaram pelo nó, `handles` = quantas saíram por cada handle, `failed` = passos com falha. Lê até 20 000 execuções; acima disso `truncated` fica true e vale só para as mais recentes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/flows.stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `flows_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `flows.stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `flowId` | string (uuid) | sim |  |
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `versionId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/flows.stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"flowId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs flows.stats --json '{"flowId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `flows_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/flows.stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.catalog

Catálogo de conectores. Conectores disponíveis (Hotmart, Kiwify, webhooks, Zapier, Make, n8n) com categoria, direção, tipo de segredo e passos de configuração.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.catalog` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_catalog`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.catalog`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.catalog \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.catalog --json '{}'
```

MCP: ferramenta `integrations_catalog` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.catalog.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.list

Listar integrações. Integrações da conta, da mais recente para a mais antiga, com contadores das últimas 24 horas. O segredo nunca é devolvido, só os 4 últimos caracteres (`secretHint`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.list --json '{}'
```

MCP: ferramenta `integrations_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.get

Ver uma integração. Dados da integração, URL de entrada (nula nas de saída) e configuração. O segredo nunca é devolvido.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.create

Criar integração. Hotmart e Kiwify exigem `secret` (hottok ou token). Webhook de entrada e conectores de saída geram o segredo, devolvido uma única vez nesta resposta. Config: saída `{url (https), events}`; webhook_in `{mapping: {phone, email, name, externalId}}`; Hotmart/Kiwify `{channelId}`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `connector` | string | sim |  |
| `name` | string | sim |  |
| `secret` | string | não |  |
| `config` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"connector":"hotmart","name":"Hotmart","secret":"meu-hottok-123"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.create --json '{"connector":"hotmart","name":"Hotmart","secret":"meu-hottok-123"}'
```

MCP: ferramenta `integrations_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.update

Editar integração. Muda nome, configuração (substitui a anterior) ou o segredo de Hotmart e Kiwify. Nos conectores com segredo gerado use `integrations.rotate_secret`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `config` | object | não |  |
| `secret` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Novo nome"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Novo nome"}'
```

MCP: ferramenta `integrations_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.set_status

Pausar ou retomar integração. Pausada: a entrada responde 200 e ignora os eventos; a saída para de enfileirar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.set_status` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_set_status`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.set_status`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `status` | "active" \| "paused" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.set_status \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","status":"paused"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.set_status --json '{"id":"00000000-0000-0000-0000-000000000000","status":"paused"}'
```

MCP: ferramenta `integrations_set_status` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.set_status.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.delete

Apagar integração. Apaga a integração com os eventos, entregas e produtos dela. Não tem volta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.rotate_secret

Gerar novo segredo. Só para webhook de entrada e conectores de saída. O segredo antigo deixa de valer e o novo é devolvido uma única vez.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.rotate_secret` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_rotate_secret`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.rotate_secret`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.rotate_secret \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.rotate_secret --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_rotate_secret` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.rotate_secret.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.events

Eventos recebidos. Últimos 100 eventos recebidos por uma integração de entrada, sem o corpo (use `integrations.get_event`). `before` pagina por data de recebimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.events` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_events`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.events`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | sim |  |
| `before` | string | não | Cursor: `nextBefore` da página anterior (data ISO). |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.events \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"integrationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.events --json '{"integrationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_events` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.events.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.get_event

Ver um evento recebido. Evento recebido com o corpo normalizado (`payload`), que traz dados pessoais do comprador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.get_event` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_get_event`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.get_event`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.get_event \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.get_event --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_get_event` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.get_event.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.reprocess

Reprocessar evento recebido. Volta o evento para a fila (`pending`, tentativas zeradas). Reprocessar um evento já processado não dispara o flow de novo (dedupe por evento).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.reprocess` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_reprocess`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.reprocess`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.reprocess \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.reprocess --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_reprocess` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.reprocess.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.deliveries

Entregas de saída. Últimas 100 entregas de uma integração de saída. `before` pagina por data de criação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.deliveries` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_deliveries`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.deliveries`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | sim |  |
| `before` | string | não | Cursor: `nextBefore` da página anterior (data ISO). |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.deliveries \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"integrationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.deliveries --json '{"integrationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_deliveries` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.deliveries.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.test

Enviar teste. Só integrações de saída: envia agora o evento `test.ping.v1` assinado para a URL configurada, fora da fila.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.test` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_test`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.test`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.test \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.test --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_test` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.test.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.products

Produtos das plataformas. Produtos vistos nas vendas recebidas (`external_products`), para o filtro "Produto da plataforma" dos gatilhos. `integrationId` restringe a uma integração.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.products` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_products`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.products`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.products \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.products --json '{}'
```

MCP: ferramenta `integrations_products` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.products.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_endpoints

Listar as rotas da Evolution disponíveis para números por QR. Catálogo completo das rotas por instância da Evolution API (2.3.7): instância, envio, conversas, grupos, etiquetas, perfil, privacidade, proxy, eventos, chatbots, Chatwoot e S3. Cada uma é chamada por `channels.evolution_call`. `blocked` diz por que a rota não é chamada direto e qual operação do Atomiks faz o mesmo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_endpoints` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_endpoints`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_endpoints`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_endpoints \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_endpoints --json '{}'
```

MCP: ferramenta `channels_evolution_endpoints` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_endpoints.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.evolution_call

Chamar qualquer rota da Evolution num número por QR. Repassa a chamada à instância da Evolution do canal `whatsapp_web`, com o token dela: o Atomiks põe o `:instanceName`, você manda `method`, `path` (como em `channels.evolution_endpoints`, ex. `group/participants`), `params` (parâmetros de caminho, ex. `{typebotId}`), `query` e `body` exatamente como na documentação da Evolution. Devolve a resposta da Evolution sem mudar nada. Erro 4xx da Evolution vira `invalid_input` com a mensagem dela. Envio por `message/send*` fica gravado na conversa do atendimento (como mensagem do celular).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.evolution_call` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_evolution_call`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.evolution_call`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `method` | "GET" \| "POST" \| "PUT" \| "DELETE" | sim |  |
| `path` | string | sim |  |
| `params` | object | não |  |
| `query` | object | não |  |
| `body` | any | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.evolution_call \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","method":"GET","path":"group/participants","query":{"groupJid":"120363000000000000@g.us"}}'
```

CLI:

```bash
node cli/atomiks.mjs channels.evolution_call --json '{"channelId":"00000000-0000-0000-0000-000000000000","method":"GET","path":"group/participants","query":{"groupJid":"120363000000000000@g.us"}}'
```

MCP: ferramenta `channels_evolution_call` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.evolution_call.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.waha_endpoints

Listar as rotas do servidor novo disponíveis para números por QR. Catálogo completo das rotas por sessão do servidor de números por QR novo (WAHA 2026.10.1): sessão, envio, conversas, grupos, canais, status, etiquetas, contatos, presença, mídia, eventos e privacidade. Cada uma é chamada por `channels.waha_call`. `blocked` diz por que a rota não é chamada direto e qual operação do Atomiks faz o mesmo. Vale para números cujo `channels.list` mostra o servidor novo; os demais usam `channels.evolution_endpoints`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.waha_endpoints` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channels_waha_endpoints`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.waha_endpoints`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.waha_endpoints \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs channels.waha_endpoints --json '{}'
```

MCP: ferramenta `channels_waha_endpoints` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.waha_endpoints.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channels.waha_call

Chamar qualquer rota do servidor novo num número por QR. Repassa a chamada à sessão do canal `whatsapp_web` no servidor novo (WAHA), com a chave da sessão: o Atomiks põe a sessão (`:session` do caminho e o campo `session` do corpo/query), você manda `method`, `path` (como em `channels.waha_endpoints`, ex. `api/:session/groups`), `params` (outros parâmetros de caminho, ex. `{chatId}`), `query` e `body` como na documentação do WAHA. Mandar `session` de outro número dá `invalid_input`. Devolve a resposta do servidor sem mudar nada; erro 4xx vira `invalid_input` com a mensagem dele. Número que usa o servidor anterior responde `invalid_input`: use `channels.evolution_call`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channels.waha_call` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channels_waha_call`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channels.waha_call`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `method` | "GET" \| "POST" \| "PUT" \| "DELETE" | sim |  |
| `path` | string | sim |  |
| `params` | object | não |  |
| `query` | object | não |  |
| `body` | any | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channels.waha_call \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","method":"GET","path":"api/:session/groups"}'
```

CLI:

```bash
node cli/atomiks.mjs channels.waha_call --json '{"channelId":"00000000-0000-0000-0000-000000000000","method":"GET","path":"api/:session/groups"}'
```

MCP: ferramenta `channels_waha_call` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channels.waha_call.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.group_participants

Participantes de um grupo do WhatsApp. Lista quem está no grupo da conversa (número por QR), com telefone quando o WhatsApp informa (quem aparece só por `@lid` vem sem), nome salvo no Atomiks ou o do WhatsApp, e papel (`member`, `admin`, `superadmin`). `canManage` = o número conectado é administrador do grupo (pode adicionar, remover, promover e rebaixar por `inbox.group_participants_update`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.group_participants` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `inbox_group_participants`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.group_participants`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.group_participants \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.group_participants --json '{"conversationId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `inbox_group_participants` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.group_participants.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# inbox.group_participants_update

Adicionar, remover, promover ou rebaixar participantes de um grupo. Age no grupo da conversa pelo número por QR, que precisa ser administrador do grupo. `participants` = telefones com DDI (só dígitos) ou JIDs (`...@s.whatsapp.net`, `...@lid`), até 50. Devolve o resultado de cada um como o WhatsApp informa (`status` "200" = feito; 403/409 = sem permissão ou já está/não está no grupo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/inbox.group_participants_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `inbox_group_participants_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `inbox.group_participants_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `conversationId` | string (uuid) | sim |  |
| `action` | "add" \| "remove" \| "promote" \| "demote" | sim |  |
| `participants` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/inbox.group_participants_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"00000000-0000-0000-0000-000000000000","action":"add","participants":["5511999990000"]}'
```

CLI:

```bash
node cli/atomiks.mjs inbox.group_participants_update --json '{"conversationId":"00000000-0000-0000-0000-000000000000","action":"add","participants":["5511999990000"]}'
```

MCP: ferramenta `inbox_group_participants_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/inbox.group_participants_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.indicators_get

Ver a configuração de Temperatura e Score. Modelo de Temperatura em uso (pesos das dimensões R/F/P/D, faixas Frio/Morno/Quente, peso de cada canal, janela em dias, meia-vida de Recência e Frequência), catálogo de eventos com peso padrão e efetivo (`available: false` = evento que o Atomiks ainda não observa: nunca pontua), modelos prontos e o Score (ligado ou não, teto, cortes Médio/Alto e regras).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.indicators_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_indicators_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.indicators_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.indicators_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.indicators_get --json '{}'
```

MCP: ferramenta `crm_indicators_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.indicators_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.indicators_update

Ajustar Temperatura e Score. Admin. `temperature` substitui os ajustes sobre o modelo (`{}` restaura tudo ao padrão): `modelId` (modelo pronto base), `customModelId` (modelo próprio ativo, de `crm.temperature_model_create`; os blocos dele vão junto nos ajustes), `thresholds {morno, quente}` (Morno ao menos 5 abaixo de Quente), `channels` (0 a 100), `windowDays` (7, 14, 21, 30 ou 60), `halflives {R, F}` (1 a 30 dias) e `eventWeights` (−100 a 100 por evento do catálogo). `score` troca `maxScore`, `thresholdMedium`, `thresholdHigh` e `rules` (cada regra: `name`, `description`, `points` de −1000 a 1000, `enabled` e `filters`, o filtro de segmento de `contacts.list`; ao menos uma condição e sem filtrar pelo próprio Score). Ao salvar, a conta inteira é recalculada pelo worker em alguns minutos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.indicators_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_indicators_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.indicators_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `temperature` | object | não |  |
| `score` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.indicators_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"temperature":{"thresholds":{"morno":30,"quente":60}}}'
```

CLI:

```bash
node cli/atomiks.mjs crm.indicators_update --json '{"temperature":{"thresholds":{"morno":30,"quente":60}}}'
```

MCP: ferramenta `crm_indicators_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.indicators_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.indicators_activate_score

Ligar ou desligar o Score. Admin. O Score vem desligado; ligado, cada contato soma os pontos das regras que casam (de 0 ao teto). Desligar apaga o número dos contatos ("—"). A conta é recalculada pelo worker.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.indicators_activate_score` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_indicators_activate_score`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.indicators_activate_score`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `enabled` | boolean | não | padrão true |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.indicators_activate_score \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'
```

CLI:

```bash
node cli/atomiks.mjs crm.indicators_activate_score --json '{"enabled":true}'
```

MCP: ferramenta `crm_indicators_activate_score` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.indicators_activate_score.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.score_overview

Ver a distribuição do Score e o alcance de cada regra. Números da tela Score: `distribution` (contatos na base, quantos ainda sem cálculo, média, histograma em 10 faixas de largura teto/10, e contatos em Baixo, Médio e Alto), `reach` (para cada regra, quantos contatos casam com o filtro dela, ligada ou não; `null` = filtro inválido) e `lastRecomputedAt` (último recálculo gravado na base). Conta só os contatos que o membro vê. Sem a migration 20261026000008 volta tudo zerado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.score_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_score_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.score_overview`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.score_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.score_overview --json '{}'
```

MCP: ferramenta `crm_score_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.score_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.score_rule_preview

Prévia de uma regra de Score antes de salvar. Admin. Para o filtro de segmento (`filters`, o mesmo de `contacts.list`) e os `points` da regra: quantos contatos ela alcança (`matchingContacts` de `totalContacts`), quantos mudam de faixa (`bandShift`, por faixa) e três exemplos de quem entra, com o Score de antes e de depois. Com `ruleId`, desconta o que a versão salva da regra já soma, para mostrar só o efeito da mudança. Não grava nada. Sem a migration 20261026000008 responde `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.score_rule_preview` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_score_rule_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.score_rule_preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object[] | sim |  |
| `points` | integer | não |  |
| `ruleId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.score_rule_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filters":[{"field":"is_customer","operator":"equals","negation":false,"valueBool":true}],"points":20,"ruleId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.score_rule_preview --json '{"filters":[{"field":"is_customer","operator":"equals","negation":false,"valueBool":true}],"points":20,"ruleId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_score_rule_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.score_rule_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.temperature_model_create

Salvar um modelo de Temperatura próprio. Admin. Guarda como modelo próprio (até 10 por conta) os blocos ajustados sobre um modelo pronto: `basedOn`, `thresholds`, `channels`, `windowDays` e `halflives`. Não ativa o modelo: para usá-lo, `crm.indicators_update` com `temperature.customModelId` e os mesmos blocos. Depende de uma migration; sem ela responde migration_pendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.temperature_model_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_temperature_model_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.temperature_model_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `basedOn` | "lancamento" \| "perpetuo" \| "highticket" \| "afiliado" \| "lowticket" \| "ecommerce" | sim |  |
| `thresholds` | object | sim |  |
| `channels` | object | sim |  |
| `windowDays` | integer | sim |  |
| `halflives` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.temperature_model_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Lançamento de infoproduto customizado","basedOn":"lancamento","thresholds":{"morno":30,"quente":60},"channels":{"email":25,"msg":70,"page":50,"pay":100,"crm":70},"windowDays":14,"halflives":{"R":5,"F":7}}'
```

CLI:

```bash
node cli/atomiks.mjs crm.temperature_model_create --json '{"name":"Lançamento de infoproduto customizado","basedOn":"lancamento","thresholds":{"morno":30,"quente":60},"channels":{"email":25,"msg":70,"page":50,"pay":100,"crm":70},"windowDays":14,"halflives":{"R":5,"F":7}}'
```

MCP: ferramenta `crm_temperature_model_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.temperature_model_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.temperature_preview

Amostra de contatos para a prévia da Temperatura. Até 3 contatos reais (de preferência com atividade), espalhados da temperatura mais alta à mais baixa, com os sinais dos últimos 60 dias (`activities`: evento do catálogo e data). A tela recalcula a nota deles ao vivo conforme o admin ajusta a configuração. Sem contatos com temperatura calculada, `candidates` vem vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.temperature_preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_temperature_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.temperature_preview`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.temperature_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.temperature_preview --json '{}'
```

MCP: ferramenta `crm_temperature_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.temperature_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.temperature_model_impact

Efeito de trocar o modelo de Temperatura na base. Simula a troca para `modelId` (modelo pronto ou personalizado) sem salvar: recalcula contatos com temperatura (até 300) com a configuração de hoje e com os parâmetros do modelo escolhido (mantendo os pesos por evento salvos) e devolve quantos ficariam em Frio, Morno e Quente (`current` e `next`), três contatos de exemplo (`samples`) e, acima de 300 contatos ativos, `estimated: true` com os totais proporcionais. Contato sem temperatura conta como Frio nos dois lados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.temperature_model_impact` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_temperature_model_impact`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.temperature_model_impact`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `modelId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.temperature_model_impact \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"modelId":"perpetuo"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.temperature_model_impact --json '{"modelId":"perpetuo"}'
```

MCP: ferramenta `crm_temperature_model_impact` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.temperature_model_impact.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.temperature_explain

Explicar a temperatura de um contato. O porquê do número: `stored` é o último cálculo gravado (o que a lista mostra), `live` refaz a conta agora com os mesmos sinais (a temperatura esfria sozinha; a varredura diária regrava o número). `components` traz índice e contribuição de Recência, Frequência, Profundidade e Declaração (a soma das contribuições é o valor). `events` = o que pesou (agrupado por evento, com pontos e se define a Recência); `notDone` = sinais que o Atomiks observa e o contato ainda não fez na janela, com os pontos que dariam. `history` = valor por dia (60 dias) e as mudanças.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.temperature_explain` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_temperature_explain`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.temperature_explain`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.temperature_explain \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.temperature_explain --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_temperature_explain` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.temperature_explain.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.xray

Raio-X do contato. Tudo o que o Raio-X mostra numa chamada: cabeçalho (desde quando, de onde veio, tags, cliente, oportunidades abertas), temperatura e Score gravados, intenção (sinais de compra dos últimos 30 dias, pelo catálogo da temperatura), compras (quantidade, produtos distintos, ticket médio, LTV e valor em oportunidades abertas, em centavos), comunicação por canal (última interação, quem falou por último e consentimento: `can_receive` sem registro de opt-out, `subscribed` com opt-in, `unsubscribed` com opt-out; null = sem endereço no canal) e atividade dos últimos 14 dias. `contact` traz `code` (número sequencial), `city` e `state` do endereço. `purchases.products` = produtos distintos; `purchases.externalByCurrency` = vendas de plataformas integradas por moeda (aprovadas e renovações; `ltvCents` desconta reembolso e chargeback), vazio sem integração. `summary` traz o resumo da Atom guardado (`text` e `generatedAt`; `available: false` e `text: null` enquanto não há); quem gera e refaz é `contacts.xray_summary`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.xray` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_xray`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.xray`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.xray \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.xray --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_xray` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.xray.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.xray_summary

Resumo da Atom no Raio-X do contato. Resumo em 2 ou 3 frases do contato, escrito pela Atom (claude-haiku-5-5) só com os fatos do Raio-X. Devolve o resumo guardado (`cached: true`) enquanto ele tiver menos de 24 h; gera de novo (`cached: false`) quando não há resumo, depois de 24 h ou com `force: true` (o "refazer" da tela). `locale` é o idioma da tela (padrão pt-BR). Sem a variável ANTHROPIC_API_KEY no servidor responde `credencial_ausente` (503). O contato precisa estar visível para quem chama; o texto fica em `contacts.xray` > `summary`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.xray_summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_xray_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.xray_summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `force` | boolean | não |  |
| `locale` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.xray_summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","force":false,"locale":"pt-BR"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.xray_summary --json '{"contactId":"00000000-0000-0000-0000-000000000000","force":false,"locale":"pt-BR"}'
```

MCP: ferramenta `contacts_xray_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.xray_summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# me.view_prefs_get

Ver minhas preferências de tela. Preferências do próprio usuário para uma tela, na conta atual. `contacts`: `columns` (ids visíveis na ordem; `null` = padrão) e `perPage` (20, 50 ou 100). Sem registro, devolve o padrão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/me.view_prefs_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `me_view_prefs_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `me.view_prefs_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `view` | "contacts" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/me.view_prefs_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"view":"contacts"}'
```

CLI:

```bash
node cli/atomiks.mjs me.view_prefs_get --json '{"view":"contacts"}'
```

MCP: ferramenta `me_view_prefs_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/me.view_prefs_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# me.view_prefs_set

Salvar minhas preferências de tela. Substitui as preferências do próprio usuário para a tela, na conta atual. Restaurar o padrão das colunas = `columns: null`. `contacts.columns` aceita os ids do catálogo e `cf:{customFieldId}` (até 20), sem repetir.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/me.view_prefs_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `me_view_prefs_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `me.view_prefs_set`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/me.view_prefs_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"view":"contacts","prefs":{"columns":["contact","tags","email","phone"],"perPage":50}}'
```

CLI:

```bash
node cli/atomiks.mjs me.view_prefs_set --json '{"view":"contacts","prefs":{"columns":["contact","tags","email","phone"],"perPage":50}}'
```

MCP: ferramenta `me_view_prefs_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/me.view_prefs_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.segments_list

Listar segmentos da conta. Segmentos salvos da conta em ordem alfabética, cada um com o filtro (`filter`, mesmo formato do construtor). `q` filtra pelo nome ("Buscar segmento...").

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.segments_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `crm_segments_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.segments_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.segments_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs crm.segments_list --json '{}'
```

MCP: ferramenta `crm_segments_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.segments_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.segment_create

Criar segmento. Salva o filtro atual como segmento da conta. Nome único na conta sem diferenciar maiúsculas; repetido dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.segment_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_segment_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.segment_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `emoji` | string \| null | não |  |
| `filter` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.segment_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Clientes VIP","filter":[]}'
```

CLI:

```bash
node cli/atomiks.mjs crm.segment_create --json '{"name":"Clientes VIP","filter":[]}'
```

MCP: ferramenta `crm_segment_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.segment_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.segment_update

Editar segmento. Renomeia, troca o emoji e/ou substitui o filtro. Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.segment_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_segment_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.segment_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `emoji` | string \| null | não |  |
| `filter` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.segment_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP 2026"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.segment_update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP 2026"}'
```

MCP: ferramenta `crm_segment_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.segment_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.segment_delete

Apagar segmento. Apaga o segmento. Os contatos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.segment_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_segment_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.segment_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.segment_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs crm.segment_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `crm_segment_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.segment_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_tags

Aplicar ou tirar tags de vários contatos. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`). Só entram contatos que o membro vê e fora da lixeira; acima de 10 000 dá `invalid_input` (refine o filtro). `add` e `remove` são ids de tag (até 100 cada; os dois juntos valem). Idempotente. Não dispara flows de "tag adicionada/removida"; temperatura e score dos contatos são recalculados. `count` = contatos do alvo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_tags` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_tags`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_tags`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |
| `add` | string (uuid)[] | não |  |
| `remove` | string (uuid)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_tags \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"add":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_tags --json '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"add":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `contacts_bulk_tags` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_tags.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_lists

Pôr ou tirar vários contatos de listas. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`). Só entram contatos que o membro vê e fora da lixeira; acima de 10 000 dá `invalid_input` (refine o filtro). `add` e `remove` são ids de lista (até 100 cada). Idempotente. `count` = contatos do alvo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_lists` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_lists`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_lists`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |
| `add` | string (uuid)[] | não |  |
| `remove` | string (uuid)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_lists \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"filter":[],"q":"maria"},"add":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_lists --json '{"target":{"filter":[],"q":"maria"},"add":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `contacts_bulk_lists` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_lists.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_add_to_pipeline

Adicionar vários contatos a uma pipeline. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`). Só entram contatos que o membro vê e fora da lixeira; acima de 10 000 dá `invalid_input` (refine o filtro). Cria um card por contato na etapa `stageId` da pipeline `pipelineId` (título = nome, senão telefone; responsável = quem chamou). Quem já tem oportunidade aberta nesta pipeline fica onde está e conta em `skipped`. Não dispara flows de "entrou na etapa"; temperatura e score são recalculados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_add_to_pipeline` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_add_to_pipeline`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_add_to_pipeline`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |
| `pipelineId` | string (uuid) | sim |  |
| `stageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_add_to_pipeline \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_add_to_pipeline --json '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_bulk_add_to_pipeline` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_add_to_pipeline.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_delete

Mandar contatos para a lixeira. Só administrador. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`). Só entram contatos que o membro vê e fora da lixeira; acima de 10 000 dá `invalid_input` (refine o filtro). Os contatos somem da lista, das buscas e das estatísticas e ficam 30 dias na lixeira (`contacts.trash_restore` traz de volta); depois disso são apagados de vez, com conversas, mensagens, vendas e oportunidades. `count` = contatos que foram para a lixeira.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]}}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_delete --json '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]}}'
```

MCP: ferramenta `contacts_bulk_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.trash_restore

Tirar contatos da lixeira. Só administrador. Devolve à lista os contatos da lixeira (ids que não estão na lixeira são ignorados). `count` = contatos restaurados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.trash_restore` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_trash_restore`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.trash_restore`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `ids` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.trash_restore \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.trash_restore --json '{"ids":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `contacts_trash_restore` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.trash_restore.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_send

Enviar mensagem em massa. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`). Só entram contatos que o membro vê e fora da lixeira; acima de 10 000 dá `invalid_input` (refine o filtro). Enfileira um envio pelo número `channelId` (WhatsApp; precisa de acesso ao número). API oficial: só modelo aprovado (`templateId` + `params` com as variáveis `1`, `2`… e `header`). Número por QR code: só `text`. O worker envia em ritmo controlado; quem tem opt-out de WhatsApp, contato sem telefone ou excluído é pulado. Acompanhe com `contacts.bulk_send_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_send` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_send`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_send`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |
| `channelId` | string (uuid) | sim |  |
| `templateId` | string (uuid) | não |  |
| `params` | object | não |  |
| `text` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_send \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"channelId":"00000000-0000-0000-0000-000000000000","templateId":"00000000-0000-0000-0000-000000000000","params":{"1":"Maria"}}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_send --json '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"channelId":"00000000-0000-0000-0000-000000000000","templateId":"00000000-0000-0000-0000-000000000000","params":{"1":"Maria"}}'
```

MCP: ferramenta `contacts_bulk_send` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_send.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_send_get

Andamento de um envio em massa. Quem criou o envio ou um administrador. `status`: `queued` (na fila), `running`, `done` ou `failed`. Contagens por item; `failures` traz até 100 contatos com falha ou pulados e o motivo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_send_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_send_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_send_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_send_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_send_get --json '{"jobId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_bulk_send_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_send_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.stats

Saúde da base, canais de entrada e vendas dos contatos. Números do recorte (`filter` e `q` iguais aos de `contacts.list`), só com os contatos que o membro vê e fora da lixeira. Percentuais de 0 a 100.

`temperature`: média (null sem cálculo), faixa da média pelos cortes da conta, `computed` (contatos com temperatura) e contagem por faixa (`pct` sobre os calculados). `score`: idem por tier, com `enabled` da conta.

`channels`: contatos por origem (`key` = `origin_kind`: `ad`, `organic`, `manual`, `import`, `integration`, `instagram`, `form`, `api`; `pct` sobre o total), do maior para o menor.

`origins`: contatos por origem · sub-origem (`kind` = `origin_kind`; `detail` = campanha do anúncio para `ad`, senão `origin_detail`; null = sem sub-origem), `pct` sobre o total, do maior para o menor. `visits.identified`: contatos com visita identificada (sempre 0: o Atomiks não rastreia páginas).

`sales` (vendas não canceladas dos contatos do recorte): `totalSales` (compras), `avgPurchasesPerContact` (compras ÷ contatos), `ltvCents` (receita ÷ contatos) e `ticketCents` (receita ÷ compras), em centavos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filter` | object[] | não |  |
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filter":[{"field":"tag","operator":"in","negation":false,"valueUuid":"00000000-0000-0000-0000-000000000000"}]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.stats --json '{"filter":[{"field":"tag","operator":"in","negation":false,"valueUuid":"00000000-0000-0000-0000-000000000000"}]}'
```

MCP: ferramenta `contacts_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.growth

Novos contatos por dia ou semana. Contatos criados (`first_seen_at`) por dia ou semana (começa na segunda) entre `from` e `to` (AAAA-MM-DD, inclusivos, no fuso da conta; até 1200 dias), com zero nos períodos sem contato. `cumulative` é a soma dentro do período. Mesmo recorte e mesma visibilidade de `contacts.stats`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.growth` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_growth`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.growth`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string | sim |  |
| `to` | string | sim |  |
| `bucket` | "day" \| "week" | sim |  |
| `filter` | object[] | não |  |
| `q` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.growth \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-11","to":"2026-10-25","bucket":"day"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.growth --json '{"from":"2026-10-11","to":"2026-10-25","bucket":"day"}'
```

MCP: ferramenta `contacts_growth` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.growth.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.import_create

Importar contatos de um arquivo. Enfileira a importação; o processamento roda em segundo plano, em lotes de 500. Acompanhe por `contacts.import_get`.

Entrada: `fileName`, `header` (cabeçalho do arquivo), as linhas e `mapping`. Linhas: `rows` (já lidas no navegador, até 50 000, cada uma na ordem do cabeçalho) ou `fileId` (o CSV cru enviado com `contacts.import_upload_url`, até 100 MB e 500 000 linhas; o servidor lê o arquivo, confere que o cabeçalho é igual a `header` e conta as linhas, e até lá `total` fica 0). `mapping`: coluna do arquivo -> `ignore`, uma chave do contato (`contact`/`name`, `email`, `phone`/`whatsapp` (com DDI; 10 ou 11 dígitos ganham 55), `secondaryEmail`, `document`, `city`, `state`, `profession`, `language`, `gender` (masculino/feminino/outro), `birthday` (DD/MM/AAAA ou AAAA-MM-DD), `instagram`, `linkedin`, `telegram`, `lgpd` (sim/não)), `cf:<id do campo personalizado>` ou `consent:<canal>` (sim/não = opt-in/opt-out; canais `whatsapp`, `email`, `sms`, `instagram`, `telegram`, `voice`). E-mail ou telefone mapeado é obrigatório; um campo só pode receber uma coluna.

Identidade: telefone, senão e-mail. Contato que já existe só tem os campos vazios preenchidos (mescla); opt-out importado sempre vale. Contatos novos ficam com origem `import` (detalhe = nome do arquivo) e visíveis para quem importou. `tagIds` e `listId` valem para todas as linhas importadas. Eventos de automação (contato criado, tag, campo) não disparam na importação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.import_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_import_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.import_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `fileName` | string | sim |  |
| `header` | string[] | sim |  |
| `rows` | string[][] | não |  |
| `fileId` | string (uuid) | não |  |
| `mapping` | object | sim |  |
| `tagIds` | string (uuid)[] | não |  |
| `listId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.import_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"clientes.csv","header":["Nome","Celular"],"rows":[["Maria","11912345678"]],"mapping":{"Nome":"name","Celular":"phone"}}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.import_create --json '{"fileName":"clientes.csv","header":["Nome","Celular"],"rows":[["Maria","11912345678"]],"mapping":{"Nome":"name","Celular":"phone"}}'
```

MCP: ferramenta `contacts_import_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.import_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.import_upload_url

Pedir URL para enviar um arquivo de importação. Para arquivos grandes (até 100 MB e 500 000 linhas). Devolve `fileId` e uma URL assinada (vale 2 horas): envie o CSV cru com `PUT` em `signedUrl` (corpo = o arquivo, `Content-Type: text/csv`). Depois chame `contacts.import_create` com `fileId` no lugar de `rows`. Só quem pediu a URL importa o arquivo. `fileName` termina em .csv, .tsv ou .txt.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.import_upload_url` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_import_upload_url`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.import_upload_url`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `fileName` | string | sim |  |
| `size` | integer | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.import_upload_url \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"clientes.csv","size":1048576}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.import_upload_url --json '{"fileName":"clientes.csv","size":1048576}'
```

MCP: ferramenta `contacts_import_upload_url` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.import_upload_url.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.import_get

Ver o andamento de uma importação. Status (`queued`, `running`, `done`, `failed`), linhas totais e processadas, contatos criados, atualizados e com falha, e até 100 falhas por linha (`row` = linha do arquivo, contando o cabeçalho como 1). Quem importou vê a sua; admin vê todas da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.import_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_import_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.import_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.import_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.import_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_import_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.import_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.imports_list

Listar importações de contatos. As 50 importações mais recentes que o membro pode ver (as suas; admin vê as da conta), da mais nova para a mais antiga.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.imports_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_imports_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.imports_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.imports_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.imports_list --json '{}'
```

MCP: ferramenta `contacts_imports_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.imports_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.export_create

Exportar contatos em CSV. Enfileira um CSV (UTF-8 com BOM, vírgula) com tudo que casa com `filter`/`q` (mesmo formato de `contacts.list`), nas colunas pedidas e na ordem dada. Até 100 000 contatos. Roda em segundo plano com as permissões de quem pediu: só sai o que a pessoa vê na lista. Acompanhe por `contacts.export_get`.

Colunas: ids de coluna da lista de contatos (`me.view_prefs_get`), `cf:<id>` e as só da exportação: `id`, `subOrigin` (anúncio/detalhe da origem), `createdAt` (DD/MM/AAAA HH:mm, Brasília) e, das vendas não canceladas, `purchasesCount`, `productsCount`, `lifetimeValue`, `ticketAverage`, `lastBuyPrice`, `lastBuyDate` (DD/MM/AAAA), `purchasedOfferNames` (produtos separados por `; `). Valores em reais como número puro com ponto (1234.50).

Cabeçalhos em snake_case, como no original: `nome`, `email`, `telefone`, `documento`, `tags` (separadas por `; `), `origem`, `sub_origem`, `status_email`, `cidade`, `estado`, `endereco`, `criado_em`, `ultimo_valor`, `qtd_compras`, `qtd_produtos`, `ltv`, `ticket_medio`, `ultima_compra`, `ofertas_compradas`, `id`; campo personalizado = rótulo em minúsculas com `_` no lugar dos espaços.

`notifyEmail` (opcional): ao terminar, manda para esse endereço um e-mail com o link do arquivo, válido pelas 24 horas em que ele fica guardado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.export_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_export_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.export_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filter` | object[] | não |  |
| `q` | string | não |  |
| `columns` | string[] | sim |  |
| `notifyEmail` | string (email) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.export_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"columns":["contact","email","phone","tags","origin"]}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.export_create --json '{"columns":["contact","email","phone","tags","origin"]}'
```

MCP: ferramenta `contacts_export_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.export_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.export_get

Ver uma exportação e baixar o CSV. Status (`queued`, `running`, `done`, `failed`), contatos no arquivo e, quando pronta, `url` assinada para baixar (vale 5 minutos; chame de novo para outra). O arquivo fica guardado por 24 horas; depois `url` volta `null` com `expired: true`. Quem pediu vê a sua; admin vê todas da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.export_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_export_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.export_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.export_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.export_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_export_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.export_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.bulk_enroll_flow

Colocar vários contatos num flow. `target` é `{ids}` (contatos escolhidos) ou `{filter, q?, excludeIds?}` ("todos os que casam", mesmo filtro e busca de `contacts.list`); só entram contatos que o membro vê, até 10 000. `flowId` é um flow ativo (publicado e ligado; veja `flows.list` com `status: "active"`). Cada contato começa uma execução da versão publicada, como em `flows.test_run`, ignorando os gatilhos de início; o worker roda as execuções em segundo plano. Quem já está no flow fica onde está e conta em `skipped`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.bulk_enroll_flow` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_bulk_enroll_flow`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.bulk_enroll_flow`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `target` | object | sim |  |
| `flowId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.bulk_enroll_flow \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"flowId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.bulk_enroll_flow --json '{"target":{"ids":["00000000-0000-0000-0000-000000000000"]},"flowId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_bulk_enroll_flow` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.bulk_enroll_flow.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.participations

Participações do contato. Bloco Participações: envios em massa que o contato recebeu (`broadcasts`, nome = modelo ou início do texto), execuções de automação (`flows`), pipelines em que tem oportunidade (`pipelines`, uma linha por pipeline com a oportunidade mais recente; `value` em centavos) e listas manuais (`lists`). `count` é o total; `items` traz até 50, mais recentes primeiro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.participations` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_participations`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.participations`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.participations \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.participations --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_participations` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.participations.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.flows

Automações do contato. Execuções de automação (flows) deste contato, mais recentes primeiro (até 200). `status`: active (rodando), waiting (esperando resposta ou prazo), completed, failed, cancelled (cancelada ou expirada). `lastStepAt` = último passo executado; `error` = último erro da execução.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.flows` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_flows`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.flows`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.flows \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.flows --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_flows` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.flows.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.outbound_messages

Mensagens enviadas ao contato. Aba Histórico de Conversas: mensagens que saíram para o contato em todas as conversas dele (mais recentes primeiro). `channel` filtra pelo tipo do canal. `source`: bulk (envio em massa), flow (automação), automation (automação do Instagram) ou manual (atendente, API ou celular). Paginação: `before` = `nextBefore` da resposta anterior.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.outbound_messages` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_outbound_messages`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.outbound_messages`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `channel` | "whatsapp_cloud" \| "whatsapp_web" \| "instagram" | não |  |
| `before` | string (date-time) | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.outbound_messages \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.outbound_messages --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_outbound_messages` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.outbound_messages.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# audit.list

Auditoria de um contato. Só administradores. Alterações registradas na atividade da conta que citam o contato (alvo da ação, `contactId` da entrada ou dentro de `ids`/`contactIds`/`target.ids`), da mais recente para a mais antiga. Ação em massa por filtro ("todos os que casam") não cita os ids e não aparece aqui. `actor` null = sistema. Paginação: `before` = `nextBefore` (id da linha).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/audit.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `activity:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `audit_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `audit.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `resource` | "contact" | sim |  |
| `id` | string (uuid) | sim |  |
| `before` | integer | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/audit.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resource":"contact","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs audit.list --json '{"resource":"contact","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `audit_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/audit.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.avatar_set

Trocar a foto do contato. Põe como foto do contato uma imagem enviada antes por `POST /api/v1/uploads` (kind `image`; o próprio membro que enviou). Aceita JPEG, PNG ou WebP até 5 MB. A foto posta à mão não é trocada pela sincronização do WhatsApp ou do Instagram. Devolve a URL da foto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.avatar_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `contacts_avatar_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.avatar_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |
| `uploadId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.avatar_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000","uploadId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.avatar_set --json '{"contactId":"00000000-0000-0000-0000-000000000000","uploadId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_avatar_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.avatar_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# contacts.merge_candidates

Possíveis duplicados do contato. Outros contatos (não excluídos, visíveis ao membro) com o mesmo e-mail (sem caixa), telefone (ou o mesmo número como WhatsApp) ou Instagram (sem caixa). `matchedBy` diz o que coincidiu. Até 20.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/contacts.merge_candidates` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `contacts_merge_candidates`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `contacts.merge_candidates`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/contacts.merge_candidates \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs contacts.merge_candidates --json '{"contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `contacts_merge_candidates` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/contacts.merge_candidates.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# notifications.list

Listar minhas notificações. Notificações do próprio usuário na conta atual, mais novas primeiro. `filter`: all, unread, activity (atribuições), system (números com falha ou desconectados), mention (menções a você). `limit` até 50; `nextCursor` continua a lista.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/notifications.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `notifications_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `notifications.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filter` | "all" \| "unread" \| "activity" \| "system" \| "mention" | não | padrão "all" |
| `limit` | integer | não | padrão 30 |
| `cursor` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/notifications.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filter":"unread","limit":30}'
```

CLI:

```bash
node cli/atomiks.mjs notifications.list --json '{"filter":"unread","limit":30}'
```

MCP: ferramenta `notifications_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/notifications.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# notifications.unread_count

Total de notificações não lidas (badge do sino). Quantas notificações do próprio usuário na conta atual ainda não foram lidas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/notifications.unread_count` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `notifications_unread_count`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `notifications.unread_count`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/notifications.unread_count \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs notifications.unread_count --json '{}'
```

MCP: ferramenta `notifications_unread_count` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/notifications.unread_count.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# notifications.mark_read

Marcar notificações como lidas. Marca como lidas as notificações do próprio usuário com esses ids (até 100). `all: true` marca todas da conta atual. Ids de outra pessoa são ignorados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/notifications.mark_read` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `notifications_mark_read`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `notifications.mark_read`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/notifications.mark_read \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"all":true}'
```

CLI:

```bash
node cli/atomiks.mjs notifications.mark_read --json '{"all":true}'
```

MCP: ferramenta `notifications_mark_read` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/notifications.mark_read.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# onboarding.get

Ver meus primeiros passos. Checklist "Primeiros passos" da conta atual para o próprio usuário: grupos com passos marcados sozinhos pelo que já existe na conta (número conectado, conta de anúncios, contatos, venda...). Passos de telas que o usuário não acessa ficam de fora. `dismissed`: o usuário pulou o checklist nesta conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/onboarding.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `onboarding_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `onboarding.get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/onboarding.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs onboarding.get --json '{}'
```

MCP: ferramenta `onboarding_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/onboarding.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# onboarding.dismiss

Pular ou retomar meus primeiros passos. `dismissed: true` esconde o checklist "Primeiros passos" para o próprio usuário na conta atual; `false` mostra de novo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/onboarding.dismiss` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `onboarding_dismiss`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `onboarding.dismiss`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `dismissed` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/onboarding.dismiss \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dismissed":true}'
```

CLI:

```bash
node cli/atomiks.mjs onboarding.dismiss --json '{"dismissed":true}'
```

MCP: ferramenta `onboarding_dismiss` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/onboarding.dismiss.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# search.global

Busca global (paleta ⌘K). Busca por nome em contatos (nome, telefone, e-mail, instagram), oportunidades, listas, segmentos, tags, pipelines, flows e produtos da conta atual. `q` com 2+ caracteres; `types` restringe os tipos; `limit` por tipo (até 20, padrão 5). Volta grupos na ordem fixa dos tipos, sem grupo vazio, cada item com `href` para abrir no app. Tipos sem acesso (plano, permissão do membro ou escopo da chave) ficam de fora sem erro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/search.global` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `search_global`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `search.global`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | sim |  |
| `types` | "contact" \| "opportunity" \| "list" \| "segment" \| "tag" \| "pipeline" \| "flow" \| "product"[] | não |  |
| `limit` | integer | não | padrão 5 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/search.global \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"maria","types":["contact","opportunity"],"limit":5}'
```

CLI:

```bash
node cli/atomiks.mjs search.global --json '{"q":"maria","types":["contact","opportunity"],"limit":5}'
```

MCP: ferramenta `search_global` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/search.global.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.list

Listar atendentes com números. Membros da conta que são atendentes, cada um com tipos, pipelines e números das oportunidades de que é responsável (ganhas, perdidas, receita ganha, comissão, reuniões, conversão), mais os totais do topo da tela (`kpis`, calculados sobre todos, sem o filtro). `search` filtra pelo nome. Número sem fonte vem `null`. Sem a migration de atendentes, tipos e pipelines vêm vazios.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.list --json '{}'
```

MCP: ferramenta `attendants_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.get

Ver um atendente. Um atendente com tipos, pipelines, sala de reunião e números. `id` é o do usuário (membro da conta).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.update

Editar um atendente. Altera o nome de exibição (`name`; `null` volta ao nome do perfil) e a sala de reunião (`meetingRoomUrl`, link http/https; vazio ou `null` limpa). Só o que for enviado muda. Exige a migration de atendentes (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string \| null | não |  |
| `meetingRoomUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","meetingRoomUrl":"https://meet.google.com/abc-defg-hij"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.update --json '{"id":"00000000-0000-0000-0000-000000000000","meetingRoomUrl":"https://meet.google.com/abc-defg-hij"}'
```

MCP: ferramenta `attendants_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.remove

Excluir um atendente. Tira a pessoa da lista de atendentes e solta seus tipos, pipelines e canais. O membro continua na conta (para remover da conta use `members.remove`) e as oportunidades dele não mudam de responsável. Exige a migration de atendentes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.remove` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_remove`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.remove`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.remove \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.remove --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_remove` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.remove.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.set_types

Definir os tipos de um atendente. Troca o conjunto de tipos do atendente por `attendantTypeIds` (lista vazia tira todos). Devolve o atendente atualizado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.set_types` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_set_types`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.set_types`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `attendantTypeIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.set_types \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","attendantTypeIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.set_types --json '{"id":"00000000-0000-0000-0000-000000000000","attendantTypeIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `attendants_set_types` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.set_types.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.set_pipelines

Definir os pipelines de um atendente. Troca o conjunto de pipelines em que o atendente participa por `pipelineIds`. Quem já estava mantém o peso do rodízio; quem entra começa com 5. Devolve o atendente atualizado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.set_pipelines` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_set_pipelines`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.set_pipelines`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `pipelineIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.set_pipelines \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","pipelineIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.set_pipelines --json '{"id":"00000000-0000-0000-0000-000000000000","pipelineIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `attendants_set_pipelines` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.set_pipelines.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.channels_get

Ver os canais de um atendente. Ids dos canais (números/contas conectados) que o atendente atende. Sem a migration de atendentes, vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.channels_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_channels_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.channels_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.channels_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.channels_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_channels_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.channels_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.channels_set

Definir os canais de um atendente. Troca os canais do atendente por `channelInstanceIds` (ids de `channels.list`; lista vazia tira todos).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.channels_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_channels_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.channels_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `channelInstanceIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.channels_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","channelInstanceIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.channels_set --json '{"id":"00000000-0000-0000-0000-000000000000","channelInstanceIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `attendants_channels_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.channels_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendant_types.list

Listar tipos de atendente. Tipos de atendente da conta em ordem, cada um com nome, descrição, ícone (`emoji`, nome do ícone), cor e quantos atendentes o têm. Sem a migration de atendentes, lista vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendant_types.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendant_types_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendant_types.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendant_types.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs attendant_types.list --json '{}'
```

MCP: ferramenta `attendant_types_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendant_types.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendant_types.create

Criar tipo de atendente. Cria um tipo (ex.: SDR, Closer) com nome único na conta, descrição, ícone (`emoji`, nome do ícone) e cor `#rrggbb` opcionais. Vai para o fim da ordem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendant_types.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendant_types_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendant_types.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `description` | string \| null | não |  |
| `emoji` | string \| null | não |  |
| `color` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendant_types.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Closer","emoji":"User","color":"#3b82f6"}'
```

CLI:

```bash
node cli/atomiks.mjs attendant_types.create --json '{"name":"Closer","emoji":"User","color":"#3b82f6"}'
```

MCP: ferramenta `attendant_types_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendant_types.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendant_types.update

Editar tipo de atendente. Altera nome, descrição, ícone ou cor de um tipo; só o que for enviado muda (`null` limpa descrição, ícone e cor).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendant_types.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendant_types_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendant_types.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `description` | string \| null | não |  |
| `emoji` | string \| null | não |  |
| `color` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendant_types.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Closer sênior"}'
```

CLI:

```bash
node cli/atomiks.mjs attendant_types.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Closer sênior"}'
```

MCP: ferramenta `attendant_types_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendant_types.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendant_types.delete

Excluir tipo de atendente. Exclui o tipo; ele sai dos atendentes e das configurações de pipeline (comissão incluída). Os atendentes continuam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendant_types.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendant_types_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendant_types.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendant_types.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendant_types.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendant_types_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendant_types.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.attendant_types_get

Ver tipos de atendente e atendentes de um pipeline. Tipos de atendente usados no pipeline, com a comissão de cada um (`commissionType` `percentage` em pontos-base, 100 = 1%, ou `fixed` em centavos por oportunidade ganha), e os atendentes do pipeline com o peso do rodízio (0 a 10). Sem a migration de atendentes, vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.attendant_types_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_attendant_types_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.attendant_types_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.attendant_types_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.attendant_types_get --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_attendant_types_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.attendant_types_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.attendant_types_set

Definir tipos de atendente e comissão de um pipeline. Troca os tipos do pipeline por `types`, na ordem enviada. Cada um pode ter comissão: `percentage` exige `commissionPercentBp` (0 a 10000, 100 = 1%) e `fixed` exige `commissionFixedCents`; sem `commissionType` fica sem comissão. Devolve o mesmo que `pipelines.attendant_types_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.attendant_types_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_attendant_types_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.attendant_types_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `types` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.attendant_types_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","types":[{"attendantTypeId":"00000000-0000-0000-0000-000000000000","commissionType":"percentage","commissionPercentBp":500}]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.attendant_types_set --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","types":[{"attendantTypeId":"00000000-0000-0000-0000-000000000000","commissionType":"percentage","commissionPercentBp":500}]}'
```

MCP: ferramenta `pipelines_attendant_types_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.attendant_types_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.attendants_set

Definir os atendentes de um pipeline. Troca os atendentes do pipeline por `attendantIds` (ids de usuário de `attendants.list`). Quem já estava mantém o peso do rodízio; quem entra começa com 5. Devolve o mesmo que `pipelines.attendant_types_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.attendants_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_attendants_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.attendants_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `attendantIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.attendants_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","attendantIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.attendants_set --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","attendantIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_attendants_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.attendants_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.attendant_routing_set

Definir o peso de um atendente no rodízio do pipeline. Peso (0 a 10, padrão 5) que o atendente tem no rodízio de distribuição deste pipeline. O atendente precisa estar no pipeline (`pipelines.attendants_set`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.attendant_routing_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_attendant_routing_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.attendant_routing_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `attendantId` | string (uuid) | sim |  |
| `weight` | integer | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.attendant_routing_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","attendantId":"00000000-0000-0000-0000-000000000000","weight":5}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.attendant_routing_set --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","attendantId":"00000000-0000-0000-0000-000000000000","weight":5}'
```

MCP: ferramenta `pipelines_attendant_routing_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.attendant_routing_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.availability_get

Ver a disponibilidade semanal de um atendente. Fuso e faixas de horário por dia da semana (`dayOfWeek` 0 = domingo a 6 = sábado, `startTime`/`endTime` em HH:mm). Sem disponibilidade gravada (ou sem a migration), `timezone` vem `null` e `slots` vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.availability_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_availability_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.availability_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.availability_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.availability_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_availability_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.availability_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.availability_set

Definir a disponibilidade semanal de um atendente. Troca o fuso e todas as faixas semanais do atendente (lista vazia = indisponível a semana toda). Faixas válidas têm início antes do fim e não se sobrepõem no mesmo dia; senão `invalid_input`. O próprio atendente ou um administrador. Exige a migration de disponibilidade (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.availability_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_availability_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.availability_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `timezone` | string | sim |  |
| `slots` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.availability_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","timezone":"America/Sao_Paulo","slots":[{"dayOfWeek":1,"startTime":"09:00","endTime":"17:00"}]}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.availability_set --json '{"id":"00000000-0000-0000-0000-000000000000","timezone":"America/Sao_Paulo","slots":[{"dayOfWeek":1,"startTime":"09:00","endTime":"17:00"}]}'
```

MCP: ferramenta `attendants_availability_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.availability_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.availability_overrides_list

Listar exceções de disponibilidade de um atendente. Exceções por data em ordem: `isBlocked` true = indisponível (o dia todo se `startTime`/`endTime` vêm `null`, ou só a faixa); false = faixa extra. Até 500, da mais antiga à mais nova.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.availability_overrides_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_availability_overrides_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.availability_overrides_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.availability_overrides_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.availability_overrides_list --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_availability_overrides_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.availability_overrides_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.availability_override_create

Criar exceção de disponibilidade. Marca uma data (`AAAA-MM-DD`) como indisponível (`isBlocked` true, padrão; sem horário vale o dia todo, com `startTime` e `endTime` só a faixa) ou acrescenta uma faixa extra (`isBlocked` false, exige as duas horas). O próprio atendente ou um administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.availability_override_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_availability_override_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.availability_override_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `date` | string | sim |  |
| `isBlocked` | boolean | não | padrão true |
| `startTime` | string \| null | não |  |
| `endTime` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.availability_override_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","date":"2026-12-25","isBlocked":true}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.availability_override_create --json '{"id":"00000000-0000-0000-0000-000000000000","date":"2026-12-25","isBlocked":true}'
```

MCP: ferramenta `attendants_availability_override_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.availability_override_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.availability_override_delete

Remover exceção de disponibilidade. Apaga uma exceção pelo id (de `attendants.availability_overrides_list`). O próprio atendente ou um administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.availability_override_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `attendants_availability_override_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.availability_override_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.availability_override_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.availability_override_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_availability_override_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.availability_override_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.calendars_get

Ver os calendários de um atendente. Calendários externos (Google, Outlook) ligados ao atendente que bloqueiam horários na agenda. O Atomiks ainda não integra calendários externos: `externalCalendars` vem sempre vazio e a agenda usa só a disponibilidade (`attendants.availability_get`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.calendars_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_calendars_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.calendars_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.calendars_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.calendars_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_calendars_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.calendars_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.activity

Atividades de um atendente. Linha do tempo das ações da pessoa, do mais recente para o mais antigo (30 por página; `cursor` = `nextCursor` da resposta anterior). Junta o que o Atomiks grava com ela como autora: atendimentos (atribuição, transferência, resolução), autorização de envio de mensagens (opt-in/opt-out) alterada, conversas (mensagens enviadas por conversa e dia), notas internas, tarefas criadas e concluídas, oportunidades criadas, ganhas e perdidas em que é responsável e compras registradas à mão. Cada item traz `eventName` (nome do evento equivalente no Clickmax), `title`, `subtitle` e `look` (tipo de cor e ícone). Cada fonte entra com as 100 linhas mais recentes. Só mostra o que o chamador pode ver.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.activity` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_activity`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.activity`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `cursor` | string (date-time) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.activity \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.activity --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_activity` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.activity.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# attendants.activity_summary

Resumo de atividade de um atendente. Cartão-resumo que aparece ao passar o mouse no avatar da linha do tempo: nome e tipos, atividades (total, 7 e 30 dias, série diária dos últimos 30 dias, hora de pico no fuso da conta, tipos mais frequentes), oportunidades (em aberto, ganhas e valor ganho nos últimos 30 dias, em centavos) e as 5 atividades mais recentes. Conta as 100 linhas mais recentes de cada fonte de `attendants.activity`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/attendants.activity_summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `attendants_activity_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `attendants.activity_summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/attendants.activity_summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs attendants.activity_summary --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `attendants_activity_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/attendants.activity_summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# crm.opportunities_bulk_attendants

Atribuir atendentes a várias oportunidades. Troca os atendentes de várias oportunidades de uma vez (`POST /v2/opportunities/bulk-action/attendants` do original). Escolha as oportunidades por `cardIds` ou por `allMatching: true` com `scope` (`pipelineId`, `stageId` opcional e `filters` opcional com `status` e `attendantIds`, o responsável atual; outro filtro dá `invalid_input`). `assignments` leva um atendente por papel (`attendantTypeId`); o principal (`isPrimary`, ou o primeiro) vira o responsável (`owner_id`) da oportunidade e os outros ficam como atendentes por papel. Substitui os atendentes que a oportunidade tinha. Só atua em oportunidades que o chamador pode ver; as demais entram em `skipped`. Até 5000 por chamada, sempre síncrono (`mode: "sync"`, `jobId: null`). Exige a migration de disponibilidade (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/crm.opportunities_bulk_attendants` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `crm_opportunities_bulk_attendants`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `crm.opportunities_bulk_attendants`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `assignments` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/crm.opportunities_bulk_attendants \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

CLI:

```bash
node cli/atomiks.mjs crm.opportunities_bulk_attendants --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

MCP: ferramenta `crm_opportunities_bulk_attendants` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/crm.opportunities_bulk_attendants.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.list

Listar times. Times de distribuição da conta, do mais antigo ao mais novo, cada um com nome, slug, descrição, ícone (`emoji`, nome do ícone), cor da marca (`color`, o mesmo valor de `brandColor`), logo, modo de distribuição e quantos membros tem (`memberCount`, o mesmo valor de `totalMembers`), com a contagem por tipo de atendente (`memberTypeCounts`; `attendantTypeId` nulo = sem tipo). `appointmentSchedules` traz as agendas do time (mesmo formato de `scheduling.schedules_list`; vazio sem a migration de agendas). Sem a migration de times, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `teams_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs teams.list --json '{}'
```

MCP: ferramenta `teams_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.get

Ver um time. Um time com os membros em ordem da fila. Cada membro traz papel (`admin` ou `member`), prioridade (1 a 10, menor = mais prioridade), peso (1 a 1000), `isFixed` (atendente fixo), `capOpen` (limite de atendimentos abertos, `null` = sem limite), regras por temperatura (`temperatureRules`: `hot`, `warm`, `cold`, cada uma com `cap`), `operational` (ainda é atendente) e `inPipeline` (está em algum pipeline; `null` sem a migration de atendentes). `queueCursorMemberId` é quem recebeu por último no modo `strict`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `teams_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `teams_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.create

Criar time. Cria um time. `slug` (letras minúsculas, números e hífen) é gerado do nome quando vazio e é único na conta (gerado repetido ganha `-2`, `-3`; informado repetido dá `invalid_input`). `emoji` é o nome do ícone; `color`/`brandColor` são `#rrggbb`. Começa no modo `weighted` e sem membros. Exige a migration de times (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `slug` | string | não |  |
| `description` | string \| null | não |  |
| `emoji` | string \| null | não |  |
| `color` | string \| null | não |  |
| `brandColor` | string \| null | não |  |
| `logoUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Time Comercial","description":"Atende os leads novos"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.create --json '{"name":"Time Comercial","description":"Atende os leads novos"}'
```

MCP: ferramenta `teams_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.update

Editar time. Altera nome, slug, descrição, ícone, cor da marca (`color` ou `brandColor`), logo, modo de distribuição (`weighted` = rodízio por peso e prioridade; `strict` = fila 1 a 1) e `strictRespectCaps` (no modo `strict`, pular quem atingiu o limite). Só o que for enviado muda; `null` limpa descrição, ícone, cor e logo. Slug repetido dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `slug` | string | não |  |
| `description` | string \| null | não |  |
| `emoji` | string \| null | não |  |
| `color` | string \| null | não |  |
| `brandColor` | string \| null | não |  |
| `logoUrl` | string \| null | não |  |
| `distributionMode` | "weighted" \| "strict" | não |  |
| `strictRespectCaps` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","distributionMode":"strict"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.update --json '{"id":"00000000-0000-0000-0000-000000000000","distributionMode":"strict"}'
```

MCP: ferramenta `teams_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.delete

Excluir time. Exclui o time com seus membros e regras. As pessoas continuam na conta e como atendentes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `teams_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.members_list

Listar membros de um time. Membros do time na ordem da fila, com papel, prioridade, peso, atendente fixo, limite de atendimentos abertos e regras por temperatura (mesmo formato de `teams.get`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.members_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `teams_members_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.members_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.members_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.members_list --json '{"teamId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `teams_members_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.members_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.members_add

Adicionar atendentes a um time. Põe os atendentes (`attendantIds`, ids de `attendants.list`) no fim da fila do time. Começam como `member`, prioridade 5, peso 100, sem limite e sem regra de temperatura. Quem já está no time é ignorado. Devolve todos os membros do time.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.members_add` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_members_add`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.members_add`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `attendantIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.members_add \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","attendantIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs teams.members_add --json '{"teamId":"00000000-0000-0000-0000-000000000000","attendantIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `teams_members_add` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.members_add.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.members_update

Editar um membro do time. Altera o papel (`admin` ou `member`), a prioridade (1 a 10, menor = mais prioridade), o peso (1 a 1000), `isFixed` e o limite de atendimentos abertos (`capOpen` >= 1; `null` = sem limite). Só o que for enviado muda. As regras por temperatura têm operações próprias (`teams.member_temperature_rule_*`). `memberId` é o `id` do membro (de `teams.get`), não o do atendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.members_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_members_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.members_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberId` | string (uuid) | sim |  |
| `role` | "admin" \| "member" | não |  |
| `priority` | integer | não |  |
| `weight` | integer | não |  |
| `isFixed` | boolean | não |  |
| `capOpen` | integer \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.members_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","weight":200,"capOpen":20}'
```

CLI:

```bash
node cli/atomiks.mjs teams.members_update --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","weight":200,"capOpen":20}'
```

MCP: ferramenta `teams_members_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.members_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.members_remove

Remover um membro do time. Tira o membro do time (e suas regras por temperatura). A pessoa continua na conta e como atendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.members_remove` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_members_remove`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.members_remove`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.members_remove \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.members_remove --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `teams_members_remove` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.members_remove.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.member_temperature_rule_set

Definir a regra de uma temperatura de um membro. Liga a temperatura (`hot`, `warm` ou `cold`) para o membro e define o limite de atendimentos dela (`cap` >= 1; `null` ou omitido = sem limite). Já ligada: troca o limite. Devolve o membro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rule_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_member_temperature_rule_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.member_temperature_rule_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberId` | string (uuid) | sim |  |
| `temperature` | "hot" \| "warm" \| "cold" | sim |  |
| `cap` | integer \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rule_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","temperature":"hot","cap":5}'
```

CLI:

```bash
node cli/atomiks.mjs teams.member_temperature_rule_set --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","temperature":"hot","cap":5}'
```

MCP: ferramenta `teams_member_temperature_rule_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.member_temperature_rule_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.member_temperature_rule_delete

Desligar uma temperatura de um membro. Tira a temperatura (`hot`, `warm` ou `cold`) do membro: ele deixa de receber leads dessa temperatura. Temperatura que já estava desligada não dá erro. Devolve o membro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rule_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_member_temperature_rule_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.member_temperature_rule_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberId` | string (uuid) | sim |  |
| `temperature` | "hot" \| "warm" \| "cold" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rule_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","temperature":"cold"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.member_temperature_rule_delete --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","temperature":"cold"}'
```

MCP: ferramenta `teams_member_temperature_rule_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.member_temperature_rule_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.member_temperature_rules_set

Definir todas as regras de temperatura de um membro. Troca o conjunto de regras do membro por `rules` (cada temperatura uma vez, `cap` >= 1 ou `null` = sem limite). Lista vazia desliga todas as temperaturas. Devolve o membro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rules_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_member_temperature_rules_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.member_temperature_rules_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberId` | string (uuid) | sim |  |
| `rules` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.member_temperature_rules_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","rules":[{"temperature":"hot","cap":5},{"temperature":"warm","cap":null}]}'
```

CLI:

```bash
node cli/atomiks.mjs teams.member_temperature_rules_set --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberId":"00000000-0000-0000-0000-000000000000","rules":[{"temperature":"hot","cap":5},{"temperature":"warm","cap":null}]}'
```

MCP: ferramenta `teams_member_temperature_rules_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.member_temperature_rules_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.queue_order_set

Definir a ordem da fila do time. Define a ordem da fila do modo `strict` (1 a 1): `memberIds` são os `id` dos membros e precisam ser exatamente os membros do time, uma vez cada (senão `invalid_input`). Devolve os membros na nova ordem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.queue_order_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `teams_queue_order_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.queue_order_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `memberIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.queue_order_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","memberIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs teams.queue_order_set --json '{"teamId":"00000000-0000-0000-0000-000000000000","memberIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `teams_queue_order_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.queue_order_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.stats

Estatísticas de um time. Números da aba Estatísticas do time no período (`from` e `to`, ISO 8601; ambos opcionais = todo o histórico): reuniões por membro (`memberCalls`), cards por membro (`memberCards`) e distribuição por temperatura (`temperatureDistribution`, só as temperaturas com contagem). Calculado das tarefas de reunião e das oportunidades do Atomiks: `completed` = reuniões concluídas no período; `cancelled` e `no_show` não existem aqui e vêm 0; `openCards` = oportunidades abertas criadas no período e `wonCards` = ganhas no período, de que o membro é responsável; temperatura = faixa do contato das abertas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `teams_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |
| `from` | string | não |  |
| `to` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000","from":"2026-09-01T00:00:00.000Z"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.stats --json '{"teamId":"00000000-0000-0000-0000-000000000000","from":"2026-09-01T00:00:00.000Z"}'
```

MCP: ferramenta `teams_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# teams.member_calendars

Calendários externos dos membros de um time. Calendários externos (Google, Outlook) dos membros do time para a agenda do time. O Atomiks ainda não integra calendários externos: `items` vem sempre vazio e `members` traz cada membro com `externalCalendars` vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/teams.member_calendars` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `teams_member_calendars`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `teams.member_calendars`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `teamId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/teams.member_calendars \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"teamId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs teams.member_calendars --json '{"teamId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `teams_member_calendars` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/teams.member_calendars.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedules_list

Listar agendas. Agendas da conta, da mais antiga à mais nova, com tudo que o formulário do original edita (ver `scheduling.schedules_create`) e `attendantName`, `teamName`, `teamColor` e `publicPath` (`/book/{workspaceSlug}/{slug}` quando pública). `ownerType` filtra por time (`team`) ou atendente (`attendant`); `teamId` e `attendantId` filtram por dono. Cada atendente ativo ganha uma agenda pessoal (`isPersonal`, com o nome do atendente) na primeira listagem. Sem a migration, a lista traz só as agendas pessoais de cada atendente ativo, montadas em memória (`id` `pessoal:<atendente>`, padrões da criação): a leitura funciona e qualquer escrita responde `migration_pendente`. Ids `pessoal:<atendente>` valem também em `schedules_get`, `available_slots` e nas notificações.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedules_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedules_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedules_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `ownerType` | "team" \| "attendant" | não |  |
| `teamId` | string (uuid) | não |  |
| `attendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedules_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ownerType":"attendant"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedules_list --json '{"ownerType":"attendant"}'
```

MCP: ferramenta `scheduling_schedules_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedules_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedules_get

Ver uma agenda. Uma agenda com todos os campos do formulário (mesmo formato de `scheduling.schedules_list`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedules_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedules_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedules_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedules_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedules_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `scheduling_schedules_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedules_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedules_create

Criar agenda. Cria uma agenda. Dono: `attendantId` (ou `memberId`, o mesmo id) para `individual`/`group`, ou `teamId` para `round_robin` (padrão quando só há `teamId`); sem dono `invalid_input`. `duration` 5 a 480 min (padrão 30). `slug` (3 a 48 letras minúsculas, números e hífen, único na conta) é gerado do nome quando a agenda é pública e ele vem vazio. `bookingFields` são as perguntas do formulário (`field`: name, email, secondaryEmail, telephone, whatsappNumber, instagram, linkedin, twitterX, tiktok, youtube, observations, city, state, document, birthday ou `custom` + `customFieldId`; nome e e-mail são sempre obrigatórios). `meetingLocationMode`: `clickmax_meet`, `google_meet` (padrão), `attendant_room` ou `fixed_link` (exige `meetingLocationUrl` http/https). Agenda `group` exige `groupCapacity` (1 a 100) e `sessionRules` (dia da semana + HH:mm que cabe no mesmo dia). `bufferMinutes` (intervalo), `minNoticeMinutes`, `maxAdvanceDays`, `maxBookingsPerDay` e `maxBookingsPerMemberPerDay` limitam os horários. `memberCalendars` define quem do time participa (vazio = todo o time). Com `isPublic`, valem também confirmação, botões, redirecionamento, pixel e verificação por código. `rollingWindow*` é só gravado (a janela rolante ainda não afeta os horários). Exige a migration de agendas (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedules_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedules_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedules_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `description` | string \| null | não |  |
| `duration` | integer | não | padrão 30 |
| `color` | string \| null | não |  |
| `isPublic` | boolean | não | padrão false |
| `slug` | string | não |  |
| `pipelineId` | string (uuid) \| null | não |  |
| `stageId` | string (uuid) \| null | não |  |
| `bufferMinutes` | integer | não | padrão 0 |
| `minNoticeMinutes` | integer | não | padrão 0 |
| `maxBookingsPerDay` | integer \| null | não |  |
| `maxBookingsPerMemberPerDay` | integer \| null | não |  |
| `maxAdvanceDays` | integer \| null | não |  |
| `rollingWindowEnabled` | boolean | não |  |
| `rollingWindowThresholdPercent` | integer | não |  |
| `rollingWindowStepDays` | integer | não |  |
| `confirmationMessage` | string \| null | não |  |
| `bookingFields` | object[] \| null | não |  |
| `confirmationButtons` | object[] \| null | não |  |
| `redirectUrl` | string \| null | não |  |
| `pixelId` | string \| null | não |  |
| `redirectDelaySeconds` | integer \| null | não |  |
| `emailLayoutTemplateId` | string \| null | não |  |
| `otpVerificationEnabled` | boolean | não |  |
| `otpChannel` | "email" \| "whatsapp" | não |  |
| `otpEmailSenderSignatureId` | string \| null | não |  |
| `otpWhatsappTemplateId` | string \| null | não |  |
| `meetingLocationMode` | "clickmax_meet" \| "google_meet" \| "attendant_room" \| "fixed_link" | não |  |
| `meetingLocationUrl` | string \| null | não |  |
| `meetPlaybookId` | string \| null | não |  |
| `meetCopilotAgentId` | string \| null | não |  |
| `groupCapacity` | integer | não |  |
| `groupShowSeatsLeft` | boolean | não |  |
| `sessionRules` | object[] | não |  |
| `schedulingType` | "individual" \| "group" \| "round_robin" | não |  |
| `attendantId` | string (uuid) \| null | não |  |
| `memberId` | string (uuid) \| null | não |  |
| `teamId` | string (uuid) \| null | não |  |
| `memberCalendars` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedules_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Reunião de apresentação","duration":30,"bufferMinutes":0,"minNoticeMinutes":0,"attendantId":"00000000-0000-0000-0000-000000000000","isPublic":true}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedules_create --json '{"name":"Reunião de apresentação","duration":30,"bufferMinutes":0,"minNoticeMinutes":0,"attendantId":"00000000-0000-0000-0000-000000000000","isPublic":true}'
```

MCP: ferramenta `scheduling_schedules_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedules_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedules_update

Editar agenda. Só o que for enviado muda (mesmos campos de `scheduling.schedules_create`); texto vazio ou `null` limpa. Trocar o dono (`attendantId`/`memberId` ou `teamId`) limpa o outro lado e o roster; a agenda pessoal mantém o dono. Tornar pública sem slug gera um do nome. Slug repetido dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedules_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedules_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedules_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |
| `name` | string | não |  |
| `description` | string \| null | não |  |
| `duration` | integer | não |  |
| `color` | string \| null | não |  |
| `isPublic` | boolean | não |  |
| `slug` | string | não |  |
| `pipelineId` | string (uuid) \| null | não |  |
| `stageId` | string (uuid) \| null | não |  |
| `bufferMinutes` | integer | não |  |
| `minNoticeMinutes` | integer | não |  |
| `maxBookingsPerDay` | integer \| null | não |  |
| `maxBookingsPerMemberPerDay` | integer \| null | não |  |
| `maxAdvanceDays` | integer \| null | não |  |
| `rollingWindowEnabled` | boolean | não |  |
| `rollingWindowThresholdPercent` | integer | não |  |
| `rollingWindowStepDays` | integer | não |  |
| `confirmationMessage` | string \| null | não |  |
| `bookingFields` | object[] \| null | não |  |
| `confirmationButtons` | object[] \| null | não |  |
| `redirectUrl` | string \| null | não |  |
| `pixelId` | string \| null | não |  |
| `redirectDelaySeconds` | integer \| null | não |  |
| `emailLayoutTemplateId` | string \| null | não |  |
| `otpVerificationEnabled` | boolean | não |  |
| `otpChannel` | "email" \| "whatsapp" | não |  |
| `otpEmailSenderSignatureId` | string \| null | não |  |
| `otpWhatsappTemplateId` | string \| null | não |  |
| `meetingLocationMode` | "clickmax_meet" \| "google_meet" \| "attendant_room" \| "fixed_link" | não |  |
| `meetingLocationUrl` | string \| null | não |  |
| `meetPlaybookId` | string \| null | não |  |
| `meetCopilotAgentId` | string \| null | não |  |
| `groupCapacity` | integer | não |  |
| `groupShowSeatsLeft` | boolean | não |  |
| `sessionRules` | object[] | não |  |
| `schedulingType` | "individual" \| "group" \| "round_robin" | não |  |
| `attendantId` | string (uuid) \| null | não |  |
| `memberId` | string (uuid) \| null | não |  |
| `teamId` | string (uuid) \| null | não |  |
| `memberCalendars` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedules_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","duration":45,"bufferMinutes":10}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedules_update --json '{"id":"00000000-0000-0000-0000-000000000000","duration":45,"bufferMinutes":10}'
```

MCP: ferramenta `scheduling_schedules_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedules_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedules_delete

Excluir agenda. Exclui a agenda com roster e notificações. A agenda pessoal do atendente não pode ser excluída (`invalid_input`). Reuniões já marcadas continuam como tarefas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedules_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedules_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedules_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedules_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedules_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `scheduling_schedules_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedules_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedulable_members

Listar quem pode ser escolhido numa agenda. Atendentes da conta que podem ter agenda: os papéis de `scheduling.settings_get` (`schedulableRoles`; `seatRole` = `owner` para quem criou a conta, `admin` ou `member`), por nome. `attendantId`, `personId` e `memberId` são o mesmo id (o usuário). `hasAvailability` = tem faixas semanais em `attendants.availability_set`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedulable_members` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedulable_members`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedulable_members`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedulable_members \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedulable_members --json '{}'
```

MCP: ferramenta `scheduling_schedulable_members` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedulable_members.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.settings_get

Ver os ajustes de agendamento. Ajustes da conta: `timezone` (fuso do negócio; sem ajuste vale o da conta, em geral America/Sao_Paulo), `workspaceSlug` (trecho do link público /book/{workspaceSlug}/{slug}; sem ajuste vale o id da conta), as chaves `googleMeetAutoLink`, `bidirectionalCalendarSync`, `autoNoShow`, `meetingRecording`, `meetingRecordingVideo` e `schedulableRoles` (`owner`, `admin`, `member`: quem pode ser escolhido nas agendas). Sem a migration, vêm os padrões.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.settings_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.settings_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.settings_get --json '{}'
```

MCP: ferramenta `scheduling_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.settings_set

Alterar os ajustes de agendamento. Só o que for enviado muda. `timezone` e `workspaceSlug` aceitam `null` para voltar ao padrão (`workspaceSlug`: 3 a 48 letras minúsculas, números e hífen, único entre as contas, senão `invalid_input`). Devolve os ajustes. Exige a migration de agendas (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.settings_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_settings_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.settings_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `timezone` | string \| null | não |  |
| `workspaceSlug` | string \| null | não |  |
| `googleMeetAutoLink` | boolean | não |  |
| `bidirectionalCalendarSync` | boolean | não |  |
| `autoNoShow` | boolean | não |  |
| `meetingRecording` | boolean | não |  |
| `meetingRecordingVideo` | boolean | não |  |
| `schedulableRoles` | "owner" \| "admin" \| "member"[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.settings_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timezone":"America/Sao_Paulo","schedulableRoles":["owner","admin"]}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.settings_set --json '{"timezone":"America/Sao_Paulo","schedulableRoles":["owner","admin"]}'
```

MCP: ferramenta `scheduling_settings_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.settings_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedule_notifications_list

Listar notificações de uma agenda. Notificações da agenda, da mais antiga à mais nova: quem recebe (`recipient`: `lead` ou `attendant`), quando (`direction` antes/depois da reunião, `offsetMinutes`, `atTime` HH:mm só quando o prazo é em dias), por qual canal (`internal` só para o atendente; `email`, `sms`, `whatsapp`, `tag` só para o lead) e o conteúdo. `mode` é `active` ou `paused`. `flowId` vem vazio: o disparo ainda não está ligado aos flows do Atomiks. Até 5 por agenda. Sem a migration, vem vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedule_notifications_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedule_notifications_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `scheduleId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scheduleId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedule_notifications_list --json '{"scheduleId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `scheduling_schedule_notifications_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedule_notifications_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedule_notifications_create

Criar notificação de uma agenda. Cria a notificação (começa `active`). Regras do original: atendente só recebe `internal` (exige `title` e `message`); lead não recebe `internal`; `email` exige `emailSubject` e `message`; `sms` exige `message`; `whatsapp` exige `gupshupTemplateId` (o template aprovado; `gupshupAppId` é o número de envio); `tag` exige `tagIds`. `atTime` só com prazo em dias. Até 5 por agenda (`limit_reached`). Exige a migration de agendas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedule_notifications_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedule_notifications_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `scheduleId` | string | sim |  |
| `config` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scheduleId":"00000000-0000-0000-0000-000000000000","config":{"recipient":"lead","direction":"before","offsetMinutes":60,"channel":"email","emailSubject":"Sua reunião é daqui a pouco","message":"Nos vemos em 1 hora."}}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedule_notifications_create --json '{"scheduleId":"00000000-0000-0000-0000-000000000000","config":{"recipient":"lead","direction":"before","offsetMinutes":60,"channel":"email","emailSubject":"Sua reunião é daqui a pouco","message":"Nos vemos em 1 hora."}}'
```

MCP: ferramenta `scheduling_schedule_notifications_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedule_notifications_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedule_notifications_update

Editar notificação de uma agenda. Troca a configuração inteira (`config`, mesmas regras de `scheduling.schedule_notifications_create`); o estado ativo/pausado não muda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedule_notifications_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedule_notifications_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `config` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","config":{"recipient":"attendant","direction":"before","offsetMinutes":15,"channel":"internal","title":"Reunião em 15 min","message":"Prepare-se."}}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedule_notifications_update --json '{"id":"00000000-0000-0000-0000-000000000000","config":{"recipient":"attendant","direction":"before","offsetMinutes":15,"channel":"internal","title":"Reunião em 15 min","message":"Prepare-se."}}'
```

MCP: ferramenta `scheduling_schedule_notifications_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedule_notifications_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedule_notifications_delete

Excluir notificação de uma agenda. Apaga a notificação pelo id (de `scheduling.schedule_notifications_list`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedule_notifications_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedule_notifications_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedule_notifications_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `scheduling_schedule_notifications_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedule_notifications_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.schedule_notifications_set_active

Ativar ou pausar uma notificação. Liga (`active` true, `mode` `active`) ou pausa (`mode` `paused`) a notificação sem apagar a configuração. Devolve a notificação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_set_active` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_schedule_notifications_set_active`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.schedule_notifications_set_active`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `active` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.schedule_notifications_set_active \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.schedule_notifications_set_active --json '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

MCP: ferramenta `scheduling_schedule_notifications_set_active` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.schedule_notifications_set_active.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.availability_preview

Pré-visualizar os horários de uma agenda. Horários livres de uma agenda ainda não salva, para a prévia do formulário. `scheduleDraft`: `durationMinutes` e os limites (`bufferMinutes`, `minNoticeMinutes`, `maxAdvanceDays`, `maxBookingsPerDay`, `maxBookingsPerMemberPerDay`) e quem atende: `memberIds` (o roster), ou `attendantId`, ou `teamId` (todo o time). Para `schedulingType` `group`, `sessionRules` são as sessões. `from` e `to` (AAAA-MM-DD, no máximo 62 dias, no fuso do negócio). Devolve `days` (dias com horário livre) e `slots` (`startAt`/`endAt` ISO e `memberIds` livres), no mesmo cálculo de `scheduling.available_slots`: horário semanal e exceções de `attendants.availability_*`, menos as reuniões já marcadas (tarefas `meeting`), com folga de `bufferMinutes`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.availability_preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_availability_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.availability_preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `scheduleDraft` | object | sim |  |
| `from` | string | sim |  |
| `to` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.availability_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scheduleDraft":{"durationMinutes":30,"bufferMinutes":10,"attendantId":"00000000-0000-0000-0000-000000000000"},"from":"2026-11-01","to":"2026-11-30"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.availability_preview --json '{"scheduleDraft":{"durationMinutes":30,"bufferMinutes":10,"attendantId":"00000000-0000-0000-0000-000000000000"},"from":"2026-11-01","to":"2026-11-30"}'
```

MCP: ferramenta `scheduling_availability_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.availability_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.available_slots

Horários livres de uma agenda. Horários livres da agenda salva em [`from`, `to`] (AAAA-MM-DD, no máximo 62 dias, no fuso do negócio de `scheduling.settings_get`). Usa a duração, os intervalos, a antecedência mínima/máxima e os limites por dia da agenda, o horário semanal e as exceções de quem atende (`attendants.availability_*`) e as reuniões já marcadas (tarefas `meeting`). Em agenda de time, o horário existe se ao menos um participante está livre (`memberIds` lista quem). Agenda `group` devolve as sessões de `sessionRules`. Devolve `days` e `slots`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.available_slots` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_available_slots`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.available_slots`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `scheduleId` | string | sim |  |
| `from` | string | sim |  |
| `to` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.available_slots \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scheduleId":"00000000-0000-0000-0000-000000000000","from":"2026-11-01","to":"2026-11-30"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.available_slots --json '{"scheduleId":"00000000-0000-0000-0000-000000000000","from":"2026-11-01","to":"2026-11-30"}'
```

MCP: ferramenta `scheduling_available_slots` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.available_slots.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.recordings_token

Gerar o token de pareamento da extensão de gravação. Gera um token de curta duração (10 minutos) para a extensão do Chrome se conectar a esta conta e registra o navegador em `scheduling.recordings_devices_list` (`deviceKey` identifica o navegador: reconectar o mesmo reaproveita o registro e reativa se tinha sido revogado). O token em claro só vem nesta resposta; o banco guarda o hash. Exige a gravação de reuniões ligada (`meetingRecording` em `scheduling.settings_set`), senão `forbidden`. Exige a migration de gravações (`migration_pendente` sem ela). Devolve `token` e `expiresAt`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.recordings_token` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_recordings_token`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.recordings_token`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `deviceName` | string \| null | não |  |
| `deviceKey` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.recordings_token \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"deviceName":"Chrome · Windows","deviceKey":"f3b1c9e2-0d0f-4c7e-9a3b-5f6f0a1d2e3c"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.recordings_token --json '{"deviceName":"Chrome · Windows","deviceKey":"f3b1c9e2-0d0f-4c7e-9a3b-5f6f0a1d2e3c"}'
```

MCP: ferramenta `scheduling_recordings_token` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.recordings_token.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.recordings_devices_list

Listar os navegadores autorizados para gravar. Navegadores da extensão de gravação autorizados por quem chama nesta conta (os revogados não aparecem), do mais recente ao mais antigo. `lastSeenAt` é nulo enquanto o navegador nunca foi usado. Sem a migration, vem vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.recordings_devices_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_recordings_devices_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.recordings_devices_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.recordings_devices_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.recordings_devices_list --json '{}'
```

MCP: ferramenta `scheduling_recordings_devices_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.recordings_devices_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# scheduling.recordings_device_revoke

Revogar um navegador da extensão de gravação. Corta a gravação no navegador na hora (o token deixa de valer); dá para reconectar depois com `scheduling.recordings_token`. Só os navegadores de quem chama; outro id responde `not_found`. Exige a migration de gravações (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/scheduling.recordings_device_revoke` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `scheduling_recordings_device_revoke`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `scheduling.recordings_device_revoke`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/scheduling.recordings_device_revoke \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs scheduling.recordings_device_revoke --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `scheduling_recordings_device_revoke` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/scheduling.recordings_device_revoke.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.list

Listar playbooks. Playbooks da conta, do mais recém-editado ao mais antigo, com escopos (`meeting`, `livechat`; `whatsapp` e `flows` ainda não estão disponíveis), quantos pipelines usam (`pipelinesCount`) e quantas etapas e perguntas têm. `scope` filtra por escopo (o seletor do cockpit do lead usa `livechat`). Sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `scope` | "meeting" \| "whatsapp" \| "livechat" \| "flows" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scope":"livechat"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.list --json '{"scope":"livechat"}'
```

MCP: ferramenta `playbooks_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.get

Ver um playbook. O playbook completo: etapas (cada uma com `objective`, `talkTrack`, `watchOut` e `questions`), tons de voz, gatilhos por palavra (`keywords`, com `terms`, `text` e `tone` `info`, `warning` ou `urgent`), anexos e proteções (`guardrails`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.create

Criar playbook. Cria um playbook. Só `name` é obrigatório; `scopes` começa em `["meeting"]`. Limites: 20 etapas, 30 perguntas por etapa, 12 tons, 40 gatilhos (até 12 palavras de 2+ letras cada), 30 anexos e 20 proteções. Ids de etapa, pergunta, tom, gatilho e anexo são texto livre (até 80) e únicos no playbook (`invalid_input` com PLAYBOOK_DUPLICATE_ID). Escopos disponíveis: meeting, livechat (os outros dão PLAYBOOK_SCOPE_NOT_AVAILABLE). Exige a migration de playbooks (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `description` | string | não |  |
| `scopes` | "meeting" \| "whatsapp" \| "livechat" \| "flows"[] | não |  |
| `stages` | object[] | não |  |
| `tones` | object[] | não |  |
| `keywords` | object[] | não |  |
| `attachments` | object[] | não |  |
| `guardrails` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"NEPQ","scopes":["meeting"],"stages":[{"id":"connecting","title":"Conexão","objective":"","talkTrack":"","watchOut":"","questions":[{"id":"connecting-1","text":"O que te fez aceitar essa conversa hoje?"}]}]}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.create --json '{"name":"NEPQ","scopes":["meeting"],"stages":[{"id":"connecting","title":"Conexão","objective":"","talkTrack":"","watchOut":"","questions":[{"id":"connecting-1","text":"O que te fez aceitar essa conversa hoje?"}]}]}'
```

MCP: ferramenta `playbooks_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.update

Editar playbook. Altera o playbook. Só o que for enviado muda; cada lista enviada (`stages`, `tones`, `keywords`, `attachments`, `guardrails`, `scopes`) substitui a anterior inteira, como no salvar do editor. Mesmas regras de `playbooks.create`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `description` | string | não |  |
| `scopes` | "meeting" \| "whatsapp" \| "livechat" \| "flows"[] | não |  |
| `stages` | object[] | não |  |
| `tones` | object[] | não |  |
| `keywords` | object[] | não |  |
| `attachments` | object[] | não |  |
| `guardrails` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"NEPQ v2","guardrails":["Nunca prometer prazo."]}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"NEPQ v2","guardrails":["Nunca prometer prazo."]}'
```

MCP: ferramenta `playbooks_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.delete

Excluir playbook. Exclui o playbook. Os pipelines que o usavam ficam sem playbook (`pipelinesCount` em `playbooks.list` diz quantos) e o progresso das conversas nele é apagado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.pipelines_list

Pipelines de um playbook. Todos os pipelines (não arquivados) da conta. `linked` = o pipeline usa este playbook; `currentPlaybookName` = nome do outro playbook que o pipeline usa hoje (vincular troca por este).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.pipelines_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_pipelines_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.pipelines_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.pipelines_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.pipelines_list --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_pipelines_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.pipelines_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.pipeline_attach

Vincular playbook a um pipeline. O pipeline passa a sugerir este playbook às reuniões. Cada pipeline tem um playbook só: se já tinha outro, este o substitui. Devolve a lista de `playbooks.pipelines_list`. O playbook precisa ter o escopo `meeting`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_attach` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_pipeline_attach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.pipeline_attach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_attach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.pipeline_attach --json '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_pipeline_attach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.pipeline_attach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.pipeline_detach

Desvincular playbook de um pipeline. Tira o playbook do pipeline (o pipeline fica sem playbook). Pipeline que usava outro playbook não é alterado. Devolve a lista de `playbooks.pipelines_list`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_detach` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_pipeline_detach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.pipeline_detach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_detach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.pipeline_detach --json '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_pipeline_detach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.pipeline_detach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.pipeline_get

Playbook de um pipeline. O playbook que o pipeline sugere às reuniões (`null` se não tem) e o id do agente copiloto padrão (`defaultCopilotAgentId`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_pipeline_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.pipeline_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.pipeline_get --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_pipeline_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.pipeline_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.pipeline_set

Definir o playbook de um pipeline. Define `playbookId` (`null` = sem playbook; precisa ter o escopo `meeting`) e/ou `defaultCopilotAgentId` (`null` = sem agente). Só o que for enviado muda. Devolve o mesmo formato de `playbooks.pipeline_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_pipeline_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.pipeline_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `playbookId` | string (uuid) \| null | não |  |
| `defaultCopilotAgentId` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.pipeline_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","playbookId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.pipeline_set --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","playbookId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_pipeline_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.pipeline_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.thread_get

Playbook de uma conversa. `threadId` é o id da conversa da caixa de entrada. Devolve o playbook da conversa (`source: thread`, escolhido nela, com `progress`: etapa atual e perguntas já marcadas) ou, sem escolha, o do pipeline da oportunidade aberta do contato (`source: pipeline`, `progress` nulo) quando tem o escopo `livechat`. Sem nenhum, `playbook` vem nulo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.thread_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_thread_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.thread_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `threadId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.thread_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"threadId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.thread_get --json '{"threadId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_thread_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.thread_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.thread_set

Escolher o playbook ou marcar o progresso de uma conversa. Com `playbookId` (escopo `livechat`), a conversa passa a usar esse playbook e o progresso volta ao início (primeira etapa, nenhuma pergunta marcada). Sem `playbookId`, grava o progresso: `stageId` (etapa do playbook) e/ou `coveredQuestionIds` (perguntas do playbook; as desconhecidas são ignoradas). Se a conversa ainda usava o playbook do pipeline, ele passa a ser o dela. `playbookId: null` volta a seguir o pipeline. Devolve o mesmo formato de `playbooks.thread_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.thread_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_thread_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.thread_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `threadId` | string (uuid) | sim |  |
| `playbookId` | string (uuid) \| null | não |  |
| `stageId` | string | não |  |
| `coveredQuestionIds` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.thread_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"threadId":"00000000-0000-0000-0000-000000000000","playbookId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.thread_set --json '{"threadId":"00000000-0000-0000-0000-000000000000","playbookId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `playbooks_thread_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.thread_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.simulate

Simular o copiloto do playbook (IA). Aba Testar do editor: dada a conversa simulada (`turns`, até 40 falas, `host` = vendedor e `guest` = cliente), a ficha (`briefing`: objetivo, perfil, fatos, roteiro, proteções) e o que já foi sugerido, a Atom decide se sopra algo ao vendedor agora. Devolve `{suggest: true, title?, text, tone}` (`tone`: info, warning ou urgent) ou `{suggest: false, reason?}` (silêncio). `reason` é o motivo do acionamento (`question` ou `signal`). `agentId` é aceito por compatibilidade e ainda não muda a resposta. Roda no servidor com o modelo claude-haiku-5-5; sem a variável ANTHROPIC_API_KEY responde `credencial_ausente` (503).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.simulate` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_simulate`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.simulate`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `agentId` | string | não |  |
| `turns` | object[] | sim |  |
| `reason` | string | não |  |
| `briefing` | object | não |  |
| `alreadySuggested` | string[] | não |  |
| `locale` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.simulate \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"turns":[{"role":"guest","text":"Achei o valor alto, vou pensar."}],"reason":"signal","locale":"pt-BR"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.simulate --json '{"turns":[{"role":"guest","text":"Achei o valor alto, vou pensar."}],"reason":"signal","locale":"pt-BR"}'
```

MCP: ferramenta `playbooks_simulate` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.simulate.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.transcribe_audio

Transcrever áudio do simulador. Transcreve a fala gravada no simulador. `audio` é o arquivo em base64 (até 20 MB), `format` a extensão (webm, m4a, mp4, ogg, oga, wav, mp3, mpeg, mpga, flac) e `language` o idioma de 2 letras (opcional). Devolve `{text}` (vazio se não entendeu). Provedor escolhido por TRANSCRIBE_PROVIDER (`openai` padrão, ou `groq`) com OPENAI_API_KEY ou GROQ_API_KEY; sem a chave responde `credencial_ausente` (503).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.transcribe_audio` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_transcribe_audio`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.transcribe_audio`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `audio` | string | sim |  |
| `format` | "webm" \| "m4a" \| "mp4" \| "ogg" \| "oga" \| "wav" \| "mp3" \| "mpeg" \| "mpga" \| "flac" | sim |  |
| `language` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.transcribe_audio \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"audio":"UklGRg==","format":"webm","language":"pt"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.transcribe_audio --json '{"audio":"UklGRg==","format":"webm","language":"pt"}'
```

MCP: ferramenta `playbooks_transcribe_audio` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.transcribe_audio.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# playbooks.attachment_upload

Enviar anexo de apoio do playbook. Guarda um arquivo (até 10 MB) para ser anexo de um playbook e devolve o item pronto para a lista `attachments` de `playbooks.create`/`playbooks.update` ({id, name, url, mimeType, size}). `content` é o arquivo em base64; `mimeType` aceita PDF, imagens (PNG, JPEG, WebP, GIF), TXT, CSV e documentos do Office. O `url` é `/api/v1/playbook-files/<id>` (GET com sessão ou chave `crm:read`, responde 302 para um link assinado de 60 s). Enviar não anexa: o arquivo só passa a fazer parte do playbook quando o item entra em `attachments` e o playbook é salvo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/playbooks.attachment_upload` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `playbooks_attachment_upload`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `playbooks.attachment_upload`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `mimeType` | string | sim |  |
| `content` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/playbooks.attachment_upload \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"precos.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQK"}'
```

CLI:

```bash
node cli/atomiks.mjs playbooks.attachment_upload --json '{"name":"precos.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQK"}'
```

MCP: ferramenta `playbooks_attachment_upload` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/playbooks.attachment_upload.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.list

Listar cadências de follow-up. Cadências da conta, da mais antiga à mais nova. Cada uma traz os passos planos (`steps`: `position` e `phase` a partir de 1, `type` call/whatsapp/meeting/task, `priority`, `waitMinutes` depois do passo anterior, título e orientação), `phaseNames`, a etapa que a dispara (`stageId`/`stageName`; nulo = avulsa, só aplicada à mão), calendário de atendimento, limite diário por atendente e `liveRuns` (oportunidades em andamento). Sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `cadences_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.list --json '{}'
```

MCP: ferramenta `cadences_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.create

Criar cadência de follow-up. Cria a cadência em `phases` (1 a 10 fases, até 20 passos no total, cada fase com ao menos um passo; passo = `type`, `priority`, `waitMinutes` 0 a 129600, `title`, `description` até 2000 caracteres, `durationMinutes` 5 a 1440). Cada passo vira uma tarefa quando chega a vez. Deu certo -> pula para a próxima fase (na última, conclui); sem sucesso -> segue para o próximo passo (no fim, esgota). `stageId` (etapa aberta) inicia a cadência sozinha quando a oportunidade entra nela e tira a etapa de outra cadência que a usava. `businessHoursCalendarId` empurra prazos para o horário de atendimento (sem ele vale o calendário principal). `dailyLimitPerAttendant` (1 a 500) passa o passo para o dia seguinte quando o atendente atinge o limite. Começa ativa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `description` | string \| null | não |  |
| `isActive` | boolean | não |  |
| `stageId` | string (uuid) \| null | não |  |
| `businessHoursCalendarId` | string (uuid) \| null | não |  |
| `dailyLimitPerAttendant` | integer \| null | não |  |
| `phases` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Reativação de lead frio","phases":[{"name":"Retomada","steps":[{"type":"whatsapp","priority":"none","waitMinutes":0,"title":"Retomar a conversa com uma novidade"},{"type":"call","priority":"high","waitMinutes":1440,"title":"Ligar para entender o momento"}]}]}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.create --json '{"name":"Reativação de lead frio","phases":[{"name":"Retomada","steps":[{"type":"whatsapp","priority":"none","waitMinutes":0,"title":"Retomar a conversa com uma novidade"},{"type":"call","priority":"high","waitMinutes":1440,"title":"Ligar para entender o momento"}]}]}'
```

MCP: ferramenta `cadences_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.update

Editar cadência de follow-up. Altera a cadência. Só o que for enviado muda; `phases` substitui todos os passos. Execuções em andamento seguem pelo número do passo (passo removido conta como fim da lista). `stageId`, `businessHoursCalendarId`, `dailyLimitPerAttendant` e `description` aceitam null para limpar. Mesmas regras de `cadences.create`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `description` | string \| null | não |  |
| `isActive` | boolean | não |  |
| `stageId` | string (uuid) \| null | não |  |
| `businessHoursCalendarId` | string (uuid) \| null | não |  |
| `dailyLimitPerAttendant` | integer \| null | não |  |
| `phases` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Reativação","isActive":true}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Reativação","isActive":true}'
```

MCP: ferramenta `cadences_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.delete

Excluir cadência de follow-up. Exclui a cadência e o histórico das oportunidades que passaram por ela (execuções e painel). As tarefas já criadas continuam na agenda. Para só parar de usar, desative com `cadences.set_active`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.set_active

Ativar ou desativar cadência. Cadência desativada não pode ser aplicada nem inicia sozinha pela etapa; as execuções em andamento continuam. Devolve a cadência.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.set_active` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_set_active`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.set_active`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `isActive` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.set_active \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","isActive":false}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.set_active --json '{"id":"00000000-0000-0000-0000-000000000000","isActive":false}'
```

MCP: ferramenta `cadences_set_active` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.set_active.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.set_stage

Vincular cadência a uma etapa. A cadência passa a começar sozinha quando a oportunidade entra na etapa (`stageId`, etapa aberta). `null` desvincula (avulsa). Cada etapa tem uma cadência: a que já estava nela deixa de começar ali. Devolve a cadência.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.set_stage` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_set_stage`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.set_stage`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `stageId` | string (uuid) \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.set_stage \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.set_stage --json '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_set_stage` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.set_stage.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.stats

Painel de uma cadência. Números desde a criação: execuções por situação (`runs`; `successRate` = concluídas / (concluídas + esgotadas), `avgHoursToComplete` da aplicação à conclusão), encerradas por motivo (`won`, `lost`, `removed`, `stage_changed`, `other`), uma linha por passo (`generated`, `resolved`, `positive`, `negative`, `noOutcome`, `open`, `overdue`, `currentRuns`, `avgHoursToResolve`; passo removido da cadência aparece só no histórico), os últimos 30 dias (`daily`, no fuso da conta) e por atendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `cadences_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.stats --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.runs_list

Cadências de uma oportunidade. Execuções da oportunidade, da mais recente à mais antiga (`opportunityId` é o id do card). `status`: `active` (em andamento), `paused` (pausada: `statusReason` `existing_next_action` = a oportunidade já tinha outra próxima ação aberta), `completed` (deu certo na última fase), `exhausted` (todos os passos sem resultado positivo), `stopped` (`statusReason`: `won`, `lost`, `removed`, `stage_changed`). Traz fase e passo atuais, a próxima ação (`currentTaskTitle`, `currentTaskStatus`, `nextAt`) e as datas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.runs_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `cadences_runs_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.runs_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `opportunityId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.runs_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"opportunityId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.runs_list --json '{"opportunityId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_runs_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.runs_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.runs_start

Aplicar cadência a uma oportunidade. Inicia a cadência (ativa) na oportunidade aberta e cria a tarefa do passo 1 na hora (mesmo que a oportunidade já tenha outra próxima ação aberta). Responsável da tarefa: o dono da oportunidade, ou quem aplicou. Oportunidade que já está em uma cadência (ativa ou pausada) dá `limit_reached` (409): tire-a da atual antes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.runs_start` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_runs_start`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.runs_start`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cadenceId` | string (uuid) | sim |  |
| `opportunityId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.runs_start \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cadenceId":"00000000-0000-0000-0000-000000000000","opportunityId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.runs_start --json '{"cadenceId":"00000000-0000-0000-0000-000000000000","opportunityId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_runs_start` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.runs_start.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.runs_stop

Tirar a oportunidade da cadência. Encerra a execução (`stopped`, motivo `removed`). As tarefas já criadas continuam na agenda; a cadência só para de criar as próximas. Execução já encerrada é devolvida como está.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.runs_stop` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_runs_stop`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.runs_stop`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.runs_stop \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.runs_stop --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_runs_stop` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.runs_stop.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.runs_resume

Retomar cadência pausada. Cria a tarefa do passo em que a execução parou e a deixa em andamento. Vale para a pausada e para a ativa cujo passo atual não tem mais tarefa aberta; ativa com tarefa aberta dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.runs_resume` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_runs_resume`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.runs_resume`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.runs_resume \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.runs_resume --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `cadences_runs_resume` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.runs_resume.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.runs_advance

Registrar o resultado do passo e gerar a próxima ação. Conclui a tarefa do passo atual com `outcome` (`positive` = deu certo; `negative` ou `none` = sem sucesso) e faz o que a cadência manda: deu certo pula para a primeira etapa da próxima fase (na última fase, a execução fica `completed`); sem sucesso cria a tarefa do próximo passo (sem próximo, fica `exhausted`). Se a oportunidade já tem outra próxima ação aberta, a execução fica `paused` (`existing_next_action`) até `cadences.runs_resume`. Só execução `active`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.runs_advance` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_runs_advance`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.runs_advance`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `outcome` | "positive" \| "negative" \| "none" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.runs_advance \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","outcome":"negative"}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.runs_advance --json '{"id":"00000000-0000-0000-0000-000000000000","outcome":"negative"}'
```

MCP: ferramenta `cadences_runs_advance` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.runs_advance.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# cadences.tasks_create

Criar uma sequência de tarefas para uma oportunidade. Cadência avulsa do "novo item de agenda": cria uma tarefa por passo (`steps`, 1 a 20), com o prazo de cada uma contado da anterior (`waitMinutes` acumulado a partir de agora; o primeiro passo conta a partir do momento da chamada). `type` `whatsapp` vira tarefa de mensagem. `attendantId` (padrão: o dono da oportunidade, ou quem chamou) precisa ver o contato. O texto de `automation.message` entra nas anotações da tarefa como mensagem planejada: o Atomiks ainda não envia essa mensagem sozinho nem para ao receber resposta. Não usa execução de cadência (não aparece em `cadences.runs_list`). Devolve as tarefas criadas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/cadences.tasks_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `cadences_tasks_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `cadences.tasks_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `opportunityId` | string (uuid) | sim |  |
| `attendantId` | string (uuid) | não |  |
| `steps` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/cadences.tasks_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"opportunityId":"00000000-0000-0000-0000-000000000000","steps":[{"waitMinutes":0,"title":"Mandar apresentação","type":"whatsapp","automation":{"message":"Olá! Tudo bem?"}}]}'
```

CLI:

```bash
node cli/atomiks.mjs cadences.tasks_create --json '{"opportunityId":"00000000-0000-0000-0000-000000000000","steps":[{"waitMinutes":0,"title":"Mandar apresentação","type":"whatsapp","automation":{"message":"Olá! Tudo bem?"}}]}'
```

MCP: ferramenta `cadences_tasks_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/cadences.tasks_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.list

Listar as conexões do Google. Conexões ativas de Google Calendar (`provider: google`, agendamentos e links do Google Meet) e Google Drive (`google_drive`) dos atendentes. Sem `attendantId` vêm as da conta toda; com ele, só as daquele atendente. `canWrite` (Drive) = autorizou escrita. `calendars` traz os calendários do Google Calendar e se cada um bloqueia horários (`selected`). `available` = o servidor tem `GOOGLE_CLIENT_ID` e `GOOGLE_CLIENT_SECRET` (sem eles `connections.google_authorize` responde `credencial_ausente`). Nunca devolve tokens. Microsoft Teams está "em breve" no original e não tem operação. Sem a migration a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `connections_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs connections.list --json '{}'
```

MCP: ferramenta `connections_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_authorize

Gerar a URL para conectar o Google. Devolve `url`: a tela de consentimento do Google (escopos de Calendar/Meet com `provider: google`, ou de Drive com `google_drive`; `access: write` pede escrita no Drive). Abra a `url` no navegador; o Google volta para `/api/integrations/google/callback`, que grava a conexão e redireciona para `returnTo` (só a própria aplicação; padrão a tela de Conexões) com `?calendar_integration=google_success|google_error` ou `?drive_integration=google_drive_success|google_drive_error` e, no erro, `reason` (`state_expired`, `missing_refresh_token`, `access_denied`, `token_exchange_failed`, `persist_failed`, `callback_failed`, `unknown`). O link vale 10 minutos. `attendantId` conecta em nome de outro atendente (só administrador). Sem `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET` responde `credencial_ausente`; sem a migration, `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_authorize` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_authorize`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_authorize`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `provider` | "google" \| "google_drive" | não | padrão "google" |
| `returnTo` | string | não |  |
| `attendantId` | string (uuid) | não |  |
| `access` | "read" \| "write" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_authorize \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provider":"google","returnTo":"https://app.atomiks.example/comercial/configuracoes-crm/conexoes"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_authorize --json '{"provider":"google","returnTo":"https://app.atomiks.example/comercial/configuracoes-crm/conexoes"}'
```

MCP: ferramenta `connections_google_authorize` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_authorize.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.disconnect

Desconectar o Google de um atendente. Revoga o acesso no Google (melhor esforço) e apaga a conexão (`id` de `connections.list`) com os calendários guardados. O próprio atendente ou um administrador. As agendas que usavam os calendários deixam de bloqueá-los.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.disconnect` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `connections_disconnect`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.disconnect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.disconnect --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `connections_disconnect` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_calendars

Ver os calendários do Google de um atendente. Calendários do Google Calendar do atendente (`id` é o que as agendas guardam em `externalCalendarIds`; `calendarId` é o id no Google, o e-mail no principal; `selected` = bloqueia horários). `connected: false` = ainda não conectou. Qualquer membro lê; `refresh: true` pede ao Google a lista de novo (só o próprio atendente ou administrador). Mesmo formato de `attendants.calendars_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_calendars` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_calendars`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_calendars`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `refresh` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_calendars \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_calendars --json '{}'
```

MCP: ferramenta `connections_google_calendars` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_calendars.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_calendars_select

Escolher quais calendários bloqueiam horários. Define os calendários do Google (`id` de `connections.google_calendars`) que contam como horário ocupado do atendente: os de `selectedIds` ficam marcados e os demais, não. O próprio atendente ou um administrador. Devolve a lista nova.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_calendars_select` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_calendars_select`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_calendars_select`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `selectedIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_calendars_select \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selectedIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_calendars_select --json '{"selectedIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `connections_google_calendars_select` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_calendars_select.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_events

Ver os eventos ocupados do Google Calendar. Eventos do atendente entre `from` e `to` (ISO 8601) nos calendários marcados (`selected`): `externalId`, `startAt`, `endAt`, `title`. Fora cancelados, os marcados como "livre" e os recusados. Sem conexão (ou conexão expirada) vem vazio. O próprio atendente ou um administrador; até 366 dias.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_events` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_events`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_events`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `attendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_events \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-11-02T00:00:00-03:00","to":"2026-11-03T00:00:00-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_events --json '{"from":"2026-11-02T00:00:00-03:00","to":"2026-11-03T00:00:00-03:00"}'
```

MCP: ferramenta `connections_google_events` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_events.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_event_create

Criar evento no Google Calendar (com link do Meet). Cria o evento no calendário do atendente (`calendarId`, padrão `primary`) e, por padrão (`withMeet`, padrão true), gera o link do Google Meet: `meetUrl`. `attendeeEmails` convida pessoas; `notifyAttendees` manda o convite do Google. É o que as agendas usam ao marcar uma reunião. O próprio atendente ou um administrador. Sem conexão, `not_found`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_event_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_event_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_event_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `calendarId` | string | não |  |
| `title` | string | sim |  |
| `description` | string \| null | não |  |
| `location` | string \| null | não |  |
| `startAt` | string (date-time) | sim |  |
| `endAt` | string (date-time) | sim |  |
| `timeZone` | string \| null | não |  |
| `attendeeEmails` | string (email)[] | não |  |
| `notifyAttendees` | boolean | não |  |
| `withMeet` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_event_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Reunião de apresentação","startAt":"2026-11-02T14:00:00-03:00","endAt":"2026-11-02T14:30:00-03:00","attendeeEmails":["cliente@exemplo.com"]}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_event_create --json '{"title":"Reunião de apresentação","startAt":"2026-11-02T14:00:00-03:00","endAt":"2026-11-02T14:30:00-03:00","attendeeEmails":["cliente@exemplo.com"]}'
```

MCP: ferramenta `connections_google_event_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_event_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_event_update

Alterar evento do Google Calendar. Altera só o que vier (`title`, `description`, `location`, `startAt`/`endAt`, `attendeeEmails`). `withMeet: true` acrescenta o link do Meet se o evento ainda não tiver. Use o `eventId` e o `calendarId` de `connections.google_event_create`. O próprio atendente ou um administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_event_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_event_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_event_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `calendarId` | string | não |  |
| `eventId` | string | sim |  |
| `withMeet` | boolean | não |  |
| `title` | string | não |  |
| `description` | string \| null | não |  |
| `location` | string \| null | não |  |
| `startAt` | string (date-time) | não |  |
| `endAt` | string (date-time) | não |  |
| `timeZone` | string \| null | não |  |
| `attendeeEmails` | string (email)[] | não |  |
| `notifyAttendees` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_event_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"eventId":"abc123","startAt":"2026-11-02T15:00:00-03:00","endAt":"2026-11-02T15:30:00-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_event_update --json '{"eventId":"abc123","startAt":"2026-11-02T15:00:00-03:00","endAt":"2026-11-02T15:30:00-03:00"}'
```

MCP: ferramenta `connections_google_event_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_event_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_event_cancel

Cancelar evento do Google Calendar. Apaga o evento do calendário (`notifyAttendees` avisa os convidados). Evento que já não existe conta como cancelado. O próprio atendente ou um administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_event_cancel` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_event_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_event_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `calendarId` | string | não |  |
| `eventId` | string | sim |  |
| `notifyAttendees` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_event_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"eventId":"abc123"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_event_cancel --json '{"eventId":"abc123"}'
```

MCP: ferramenta `connections_google_event_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_event_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# connections.google_drive_files

Listar arquivos do Google Drive de um atendente. Arquivos do Drive conectado do atendente, do mais recente ao mais antigo: `search` filtra pelo nome, `folderId` lista uma pasta, `nextPageToken` continua (use como `pageToken`). `pageSize` até 100. O próprio atendente ou um administrador. Sem Drive conectado, `not_found`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/connections.google_drive_files` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `connections_google_drive_files`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `connections.google_drive_files`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `attendantId` | string (uuid) | não |  |
| `search` | string | não |  |
| `folderId` | string | não |  |
| `pageToken` | string | não |  |
| `pageSize` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/connections.google_drive_files \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"search":"proposta"}'
```

CLI:

```bash
node cli/atomiks.mjs connections.google_drive_files --json '{"search":"proposta"}'
```

MCP: ferramenta `connections_google_drive_files` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/connections.google_drive_files.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.list

Listar agentes de IA. Agentes de IA da conta (sem os excluídos), do mais antigo ao mais novo, em páginas (`page` a partir de 1, `perPage` até 100, padrão 48). Cada agente traz nome, objetivo (`purpose`), rosto (`avatarPreset`, chave de um rosto pronto, ou `avatarUrl`), `status` (`draft`, `active`, `paused`), provedor, `credentialId`, modelo, temperatura (0 a 1), persona, ferramentas, regras de escalonamento, `primaryRole`, versão publicada, `dirty` (há alterações não publicadas) e os contadores de conversas. Sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 48 |
| `status` | "draft" \| "active" \| "paused" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":48}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.list --json '{"page":1,"perPage":48}'
```

MCP: ferramenta `ai_agents_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.summary

Resumo do time de agentes. Totais do time de agentes: quantos são, quantos ativos, pausados e em rascunho, e a soma de conversas, resolvidas, agendadas e passadas para o time.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.summary`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.summary --json '{}'
```

MCP: ferramenta `ai_agents_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.get

Ver um agente de IA. Um agente de IA com toda a configuração (mesmo formato de `ai_agents.list`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `ai_agents_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.providers

Provedores e modelos de IA. Provedores de IA aceitos (`openai`, `anthropic`) e os modelos de cada um, com o nível (`fast`, `balanced`, `best`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.providers` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_providers`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.providers`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.providers \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.providers --json '{}'
```

MCP: ferramenta `ai_agents_providers` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.providers.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.create

Criar agente de IA. Cria um agente em `draft` (rascunho; precisa de `ai_agents.publish` antes de ativar). `credentialId` é uma chave de `ai_credentials.list` ainda válida e o provedor sai dela. Sem `avatarPreset` nem `avatarUrl` o rosto é escolhido pelo id. Padrões: temperatura 0.4, persona vazia, nenhuma ferramenta, nenhuma regra, `primaryRole` `sdr_inbound`. Exige a migration de agentes (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `credentialId` | string (uuid) | sim |  |
| `purpose` | string \| null | não |  |
| `avatarPreset` | "pedro" \| "ana" \| "fernando" \| "clara" \| "mateus" \| "beatriz" \| "rodrigo" \| "samuel" \| "laura" \| "felipe" \| "alice" \| "joao" \| "henrique" \| "isabela" \| "daniel" \| "yasmin" \| "otavio" \| "manuela" \| "eduardo" \| "lara" \| "gabriel" \| "valentina" \| "cecilia" \| "leo" \| "amanda" \| "theo" \| "leila" \| "murilo" \| "lorena" \| "enzo" \| "priscila" \| "ricardo" \| null | não |  |
| `avatarUrl` | string \| null | não |  |
| `modelId` | string | sim |  |
| `temperature` | number | não | padrão 0.4 |
| `persona` | string | não | padrão "" |
| `tools` | "consultar_agenda" \| "agendar_reuniao" \| "registrar_qualificacao" \| "registrar_oportunidade" \| "criar_tarefa" \| "registrar_nota" \| "criar_campo" \| "aplicar_tag" \| "escalar_para_humano" \| "encerrar_conversa"[] | não | padrão [] |
| `escalation` | object[] | não | padrão [] |
| `primaryRole` | "sdr_inbound" \| "sdr_outbound" \| "support" | não | padrão "sdr_inbound" |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Lia","credentialId":"00000000-0000-0000-0000-000000000000","modelId":"gpt-4.1-mini","purpose":"Qualifica quem chega pelo WhatsApp","temperature":0.4,"persona":"","tools":[],"escalation":[],"primaryRole":"sdr_inbound"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.create --json '{"name":"Lia","credentialId":"00000000-0000-0000-0000-000000000000","modelId":"gpt-4.1-mini","purpose":"Qualifica quem chega pelo WhatsApp","temperature":0.4,"persona":"","tools":[],"escalation":[],"primaryRole":"sdr_inbound"}'
```

MCP: ferramenta `ai_agents_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.update

Editar agente de IA. Altera o agente. Só o que for enviado muda; `null` limpa objetivo e rosto. Nome, objetivo e rosto valem na hora; chave (`credentialId`, que também troca o provedor), modelo, temperatura, persona, ferramentas e regras só entram em uso depois de `ai_agents.publish` (`dirty` fica `true` até lá).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `credentialId` | string (uuid) | não |  |
| `purpose` | string \| null | não |  |
| `avatarPreset` | "pedro" \| "ana" \| "fernando" \| "clara" \| "mateus" \| "beatriz" \| "rodrigo" \| "samuel" \| "laura" \| "felipe" \| "alice" \| "joao" \| "henrique" \| "isabela" \| "daniel" \| "yasmin" \| "otavio" \| "manuela" \| "eduardo" \| "lara" \| "gabriel" \| "valentina" \| "cecilia" \| "leo" \| "amanda" \| "theo" \| "leila" \| "murilo" \| "lorena" \| "enzo" \| "priscila" \| "ricardo" \| null | não |  |
| `avatarUrl` | string \| null | não |  |
| `modelId` | string | não |  |
| `temperature` | number | não |  |
| `persona` | string | não |  |
| `tools` | "consultar_agenda" \| "agendar_reuniao" \| "registrar_qualificacao" \| "registrar_oportunidade" \| "criar_tarefa" \| "registrar_nota" \| "criar_campo" \| "aplicar_tag" \| "escalar_para_humano" \| "encerrar_conversa"[] | não |  |
| `escalation` | object[] | não |  |
| `primaryRole` | "sdr_inbound" \| "sdr_outbound" \| "support" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","temperature":0.2}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.update --json '{"id":"00000000-0000-0000-0000-000000000000","temperature":0.2}'
```

MCP: ferramenta `ai_agents_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.publish

Publicar alterações do agente. Congela a configuração atual (chave, modelo, temperatura, persona, ferramentas e regras de escalonamento) como a versão em uso: soma 1 à versão, grava `publishedAt` e zera `dirty`. Um rascunho vira `paused` (ative com `ai_agents.status_set`). Regras de escalonamento sem gatilho ou sem ação impedem a publicação. A chave precisa estar válida.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.publish` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_publish`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.publish`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.publish \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.publish --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `ai_agents_publish` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.publish.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.status_set

Ativar ou pausar agente de IA. Liga (`active`) ou pausa (`paused`) o agente. Agente nunca publicado responde `invalid_input` (publique antes).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.status_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_status_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.status_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `status` | "active" \| "paused" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.status_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","status":"active"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.status_set --json '{"id":"00000000-0000-0000-0000-000000000000","status":"active"}'
```

MCP: ferramenta `ai_agents_status_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.status_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_agents.delete

Excluir agente de IA. Tira o agente da lista e o pausa. A chave do provedor continua cadastrada e as conversas ficam registradas (o registro é marcado como excluído, não apagado).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_agents.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_agents_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_agents.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_agents.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_agents.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `ai_agents_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_agents.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_credentials.list

Listar chaves de provedor de IA. Chaves de OpenAI e Anthropic cadastradas na conta, da mais antiga à mais nova. Mostra só os 4 últimos dígitos (`keyLast4`), o `label`, o `status` (`active` válida, `invalid`, `revoked` removida) e quando foi validada. O valor da chave nunca é devolvido. Sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_credentials.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `ai_credentials_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_credentials.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_credentials.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs ai_credentials.list --json '{}'
```

MCP: ferramenta `ai_credentials_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_credentials.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_credentials.create

Cadastrar chave de provedor de IA. Guarda a chave de um provedor (`openai`: `sk-...`; `anthropic`: `sk-ant-...`), cifrada, e devolve só os 4 últimos dígitos. O provedor é consultado: chave recusada dá `invalid_input`; se ele não responder, a chave entra como "não validada". A mesma chave duas vezes na conta dá `invalid_input`. `label` é opcional (padrão: o nome do provedor). Sem `TOKEN_ENC_KEY` no servidor responde `credencial_ausente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_credentials.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_credentials_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_credentials.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `provider` | "openai" \| "anthropic" | sim |  |
| `label` | string | não |  |
| `apiKey` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_credentials.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provider":"openai","label":"Chave principal","apiKey":"sk-proj-exemplo-exemplo-exemplo"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_credentials.create --json '{"provider":"openai","label":"Chave principal","apiKey":"sk-proj-exemplo-exemplo-exemplo"}'
```

MCP: ferramenta `ai_credentials_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_credentials.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# ai_credentials.delete

Remover chave de provedor de IA. Remove a chave: o valor cifrado é apagado e o cadastro fica como `revoked`. Chave usada por agente (que não foi excluído) responde `limit_reached`; troque a chave do agente antes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/ai_credentials.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `ai_credentials_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `ai_credentials.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/ai_credentials.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs ai_credentials.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `ai_credentials_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/ai_credentials.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.list

Listar objetos personalizados. Objetos personalizados da conta, do mais antigo ao mais novo, com nome no singular e no plural, `apiName` (não muda se o objeto for renomeado), ícone, cor, gênero da palavra (`masculine`/`feminine`), campo-título e as contagens de registros, campos ativos e ligações. Os arquivados só vêm com `includeArchived: true`. Exige o módulo de plano `crm.custom-objects`; sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `includeArchived` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.list --json '{}'
```

MCP: ferramenta `custom_objects_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.overview

Visão geral dos objetos e ligações. Tudo da tela Objetos de uma vez: `objects` (arquivados inclusive, com `archivedAt`), `relations` (ligações dos objetos, com `linkCount`) e `system` (Contatos, Oportunidades e Empresas com `recordCount` e `customFieldCount`; Oportunidades e Empresas não têm campos personalizados no Atomiks).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.overview`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.overview --json '{}'
```

MCP: ferramenta `custom_objects_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.get

Ver um objeto. Um objeto com o campo-título (`titleField`) e as contagens de registros, campos ativos e ligações. Objeto de outra conta ou inexistente dá `not_found`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.create

Criar objeto personalizado. Cria o objeto. `singularName`/`pluralName` (até 60 caracteres), `gender` (`masculine` ou `feminine`, padrão masculino), `icon` (casa, prédio, carro… ver `custom_objects.list`) e `color` (teal, blue, violet, pink, orange, amber, green, slate). `apiName` sai do nome no plural (sem acento, minúsculo, `_` entre palavras; repetido ganha `_2`, `_3`) e nunca muda. `fields` cria os campos juntos (os modelos Imóveis, Veículos, Contratos e Turmas da tela são listas de campos): um deles, de tipo `text`, é o campo-título (`isTitle: true`; sem marca, o primeiro texto). Sem `fields`, nasce só o campo texto "Nome" como título. Tipos: text, textarea, number, currency, percentage, date, select, multi_select, radio, link, rating, boolean, file, image; os de seleção levam `options`. Exige a migration de objetos (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `singularName` | string | sim |  |
| `pluralName` | string | sim |  |
| `gender` | "masculine" \| "feminine" | não |  |
| `icon` | "home" \| "building" \| "car" \| "contract" \| "graduation" \| "box" \| "key" \| "tag" \| "calendar" \| "pin" \| "wrench" \| "heart" \| "star" \| "plane" \| "paw" \| "grid" | não |  |
| `color` | "teal" \| "blue" \| "violet" \| "pink" \| "orange" \| "amber" \| "green" \| "slate" | não |  |
| `fields` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"singularName":"Imóvel","pluralName":"Imóveis","gender":"masculine","icon":"home","color":"teal","fields":[{"displayName":"Endereço","fieldType":"text","isTitle":true},{"displayName":"Status","fieldType":"select","options":["Disponível","Vendido"]}]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.create --json '{"singularName":"Imóvel","pluralName":"Imóveis","gender":"masculine","icon":"home","color":"teal","fields":[{"displayName":"Endereço","fieldType":"text","isTitle":true},{"displayName":"Status","fieldType":"select","options":["Disponível","Vendido"]}]}'
```

MCP: ferramenta `custom_objects_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.update

Editar objeto personalizado. Muda nome no singular e no plural, gênero, ícone, cor e o campo-título (`titleFieldId`: um campo de texto ativo do objeto; os títulos dos registros são refeitos). Só o que for enviado muda. O `apiName` nunca muda. Objeto arquivado também pode ser editado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `singularName` | string | não |  |
| `pluralName` | string | não |  |
| `gender` | "masculine" \| "feminine" | não |  |
| `icon` | "home" \| "building" \| "car" \| "contract" \| "graduation" \| "box" \| "key" \| "tag" \| "calendar" \| "pin" \| "wrench" \| "heart" \| "star" \| "plane" \| "paw" \| "grid" | não |  |
| `color` | "teal" \| "blue" \| "violet" \| "pink" \| "orange" \| "amber" \| "green" \| "slate" | não |  |
| `titleFieldId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","pluralName":"Imóveis","color":"blue"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.update --json '{"id":"00000000-0000-0000-0000-000000000000","pluralName":"Imóveis","color":"blue"}'
```

MCP: ferramenta `custom_objects_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.archive

Arquivar objeto. Tira o objeto do menu, dos filtros e das ligações. Os registros e vínculos ficam guardados e voltam ao desarquivar (`custom_objects.unarchive`). Objeto já arquivado não dá erro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.archive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.archive --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.unarchive

Desarquivar objeto. Devolve o objeto arquivado ao menu, aos filtros e às ligações, com os registros e vínculos de antes. Objeto que não estava arquivado não dá erro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.unarchive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_unarchive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.unarchive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.unarchive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.unarchive --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_unarchive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.unarchive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.fields_list

Listar campos de um objeto. Campos do objeto em ordem. Cada um traz identificador (`fieldName`), rótulo (`displayName`), tipo, opções, `isTitle` (campo-título), `required`, `filterable`, `pinned`, `isActive` e o preenchimento (`fillRate` de 0 a 1, `filledCount` de `totalRecords`). `usageCount`/`usageByKind` contam os consumidores reais (segmentos, flows e agendas que citam o campo). `groupName` é o grupo (nulo = sem grupo) e `unique` diz se o valor não pode repetir entre registros. `groups` traz os grupos com a quantidade de campos ativos e a média de preenchimento. Inativos só com `includeInactive: true`; `search` filtra por nome, identificador ou descrição. Também devolve `totalFields` (ativos), `inactiveFields`, `healthDistribution` (saudável, atenção, crítico, sem uso) e `typeCounts`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.fields_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_fields_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.fields_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `includeInactive` | boolean | não |  |
| `onlyInactive` | boolean | não |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.fields_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.fields_list --json '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_fields_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.fields_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.field_create

Criar campo em um objeto. Cria um campo no objeto. `fieldName` (a-z, 0-9, _) sai do rótulo se omitido e é único no objeto (repetido informado dá `invalid_input`; o gerado ganha `_2`, `_3`). `groupName` põe o campo num grupo e `unique: true` proíbe valor repetido entre registros. O tipo não muda depois. Os tipos `select`, `multi_select` e `radio` exigem `options` (lista de textos ou `{label, value}`); os demais não aceitam. Vai para o fim da lista.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.field_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_field_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.field_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `displayName` | string | sim |  |
| `fieldName` | string | não |  |
| `fieldType` | "text" \| "textarea" \| "number" \| "currency" \| "percentage" \| "date" \| "select" \| "multi_select" \| "radio" \| "link" \| "rating" \| "boolean" \| "file" \| "image" | sim |  |
| `options` | string \| object[] | não |  |
| `description` | string \| null | não |  |
| `required` | boolean | não |  |
| `filterable` | boolean | não |  |
| `pinned` | boolean | não |  |
| `groupName` | string \| null | não |  |
| `unique` | boolean | não |  |
| `objectId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.field_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","displayName":"Bairro","fieldType":"text"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.field_create --json '{"objectId":"00000000-0000-0000-0000-000000000000","displayName":"Bairro","fieldType":"text"}'
```

MCP: ferramenta `custom_objects_field_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.field_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.field_update

Editar campo de um objeto. Muda rótulo, descrição, opções (só campos de seleção; valores já gravados que saírem das opções continuam guardados), `required`, `filterable`, `pinned`, `groupName` (nulo ou vazio tira do grupo), `unique` e `isActive`. `isActive: false` é o "Excluir campo" da tela: o campo sai dos formulários e filtros, os valores continuam guardados e voltam ao reativar (`true`). O identificador e o tipo não mudam. O campo-título não pode ser desativado: troque-o antes em `custom_objects.update`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.field_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_field_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.field_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `displayName` | string | não |  |
| `description` | string \| null | não |  |
| `options` | string \| object[] | não |  |
| `required` | boolean | não |  |
| `filterable` | boolean | não |  |
| `pinned` | boolean | não |  |
| `isActive` | boolean | não |  |
| `groupName` | string \| null | não |  |
| `unique` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.field_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","displayName":"Bairro","required":true}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.field_update --json '{"id":"00000000-0000-0000-0000-000000000000","displayName":"Bairro","required":true}'
```

MCP: ferramenta `custom_objects_field_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.field_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.fields_reorder

Reordenar os campos de um objeto. Define a ordem dos campos: `ids` são os `id` dos campos do objeto, uma vez cada (campos de fora, como os inativos, vão para o fim, na ordem de antes), ou `items` (`{id, order, groupName}`, o que o arrastar da tela envia: muda a posição e o grupo de cada campo citado). Devolve a lista de campos na nova ordem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.fields_reorder` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_fields_reorder`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.fields_reorder`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `ids` | string (uuid)[] | não |  |
| `items` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.fields_reorder \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","ids":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.fields_reorder --json '{"objectId":"00000000-0000-0000-0000-000000000000","ids":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `custom_objects_fields_reorder` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.fields_reorder.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.field_insights

Uso de um campo de objeto. As abas Uso e Onde é usado do campo: `fillRate`, `fillCount` de `totalEntities`, `emptyCount`, `filledLast30Days`, `trend` (curva acumulada dos últimos 6 meses: `month` AAAA-MM, `filled`, `fillRate`), `numeric` (mínimo, média, máximo e soma, só campos numéricos), `distinctValues`, `topValues` (`label`, `count`, `share`) e `references` (segmentos, flows e agendas que citam o campo; é o que apareceria ao arquivar). `lastEditedAt` é o último preenchimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.field_insights` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_field_insights`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.field_insights`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.field_insights \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.field_insights --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_field_insights` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.field_insights.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.field_records

Quem preencheu um campo de objeto. A aba Quem preencheu: os registros que têm valor no campo, do preenchimento mais recente para o mais antigo (`limit` até 100, padrão 50). Cada um traz `entityId`, `name` (título do registro), `value` em texto, `filledAt` e `source` (manual, import, form, booking, webchat, flow, api, system, unknown; valor sem origem registrada vem como `unknown`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.field_records` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_field_records`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.field_records`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.field_records \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.field_records --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_field_records` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.field_records.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.field_groups

Grupos de campos de um objeto. Nomes dos grupos já usados pelos campos do objeto (para o seletor "Grupo"), em ordem alfabética.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.field_groups` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_field_groups`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.field_groups`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.field_groups \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.field_groups --json '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_field_groups` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.field_groups.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.fields_bulk_update

Alterar vários campos de um objeto. Aplica o mesmo `patch` a vários campos (`ids`, até 200, do mesmo objeto): `groupName` (nulo tira do grupo), `filterable`, `pinned`, `required` e `isActive`. O campo-título não pode ser desativado. Devolve `updated`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.fields_bulk_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_fields_bulk_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.fields_bulk_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `ids` | string (uuid)[] | sim |  |
| `patch` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.fields_bulk_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["00000000-0000-0000-0000-000000000000"],"patch":{"pinned":true}}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.fields_bulk_update --json '{"ids":["00000000-0000-0000-0000-000000000000"],"patch":{"pinned":true}}'
```

MCP: ferramenta `custom_objects_fields_bulk_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.fields_bulk_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.relations_list

Listar ligações dos objetos. Ligações entre objetos e Contatos, Oportunidades, Empresas ou outros objetos. Com `objectId`, as que envolvem o objeto (como origem ou como alvo); sem ele, todas. Cada uma traz os dois nomes (`sourceLabel` na ficha da origem, `targetLabel` na ficha do outro lado), `cardinality` (`many_to_one`: cada registro da origem tem um só do outro lado; `one_to_many`: o outro lado tem um só da origem; `many_to_many`), `showOnCard` (selo no card da oportunidade) e `linkCount` (quantos vínculos existem). As ligações fixas do sistema entre Contatos, Oportunidades e Empresas não entram.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.relations_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_relations_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.relations_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.relations_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.relations_list --json '{}'
```

MCP: ferramenta `custom_objects_relations_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.relations_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.relation_create

Criar ligação de um objeto. Liga o objeto (`objectId`, a origem) a Contatos (`leads`), Oportunidades (`opportunities`), Empresas (`companies`) ou outro objeto (`objects` + `targetObjectId`, que pode ser o próprio objeto: aí os dois nomes precisam ser diferentes). `cardinality`: `many_to_one` (cada registro da origem tem um só do outro lado), `one_to_many` (cada um do outro lado tem um só da origem) ou `many_to_many`. `sourceLabel` aparece na ficha da origem e `targetLabel` na ficha do outro lado. `showOnCard` só vale com Oportunidades (selo no card do kanban). Nome repetido entre os mesmos dois lados dá `invalid_input`. Objetos arquivados não recebem ligação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.relation_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_relation_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.relation_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardinality` | "many_to_one" \| "one_to_many" \| "many_to_many" | sim |  |
| `sourceLabel` | string | sim |  |
| `targetLabel` | string | sim |  |
| `showOnCard` | boolean | não |  |
| `objectId` | string (uuid) | sim |  |
| `targetType` | "leads" \| "opportunities" \| "companies" \| "objects" | sim |  |
| `targetObjectId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.relation_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","targetType":"leads","cardinality":"many_to_one","sourceLabel":"Proprietário","targetLabel":"Imóveis"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.relation_create --json '{"objectId":"00000000-0000-0000-0000-000000000000","targetType":"leads","cardinality":"many_to_one","sourceLabel":"Proprietário","targetLabel":"Imóveis"}'
```

MCP: ferramenta `custom_objects_relation_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.relation_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.relation_update

Editar ligação. Renomeia os dois lados, liga ou desliga `showOnCard` (só com Oportunidades) e muda `cardinality` — esta só enquanto a ligação não tem vínculos (senão `invalid_input` com a contagem). Os dois lados da outra ponta não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.relation_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_relation_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.relation_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardinality` | "many_to_one" \| "one_to_many" \| "many_to_many" | não |  |
| `sourceLabel` | string | não |  |
| `targetLabel` | string | não |  |
| `showOnCard` | boolean | não |  |
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.relation_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","sourceLabel":"Dono","targetLabel":"Imóveis do dono"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.relation_update --json '{"id":"00000000-0000-0000-0000-000000000000","sourceLabel":"Dono","targetLabel":"Imóveis do dono"}'
```

MCP: ferramenta `custom_objects_relation_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.relation_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.relation_delete

Excluir ligação. Exclui a ligação e apaga os vínculos dela dos dois lados. Não dá para desfazer. Os registros ficam. Devolve `linksRemoved`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.relation_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_relation_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.relation_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.relation_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.relation_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_relation_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.relation_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.access_list

Cargos e permissões de objetos. A aba Acesso: quem mexe nos registros. O Atomiks não tem grupos de permissão, então os "cargos" são os papéis do membro: `admin` (ver, criar, editar, excluir e configurar, em todos os registros) e `user` (ver, criar, editar e excluir todos os registros, sem configurar objetos, campos e ligações). Cada cargo traz `members` (ids dos membros) e `permissions` (`custom-objects:<ação>:all`). A permissão vale para todos os objetos juntos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.access_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_access_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.access_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.access_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.access_list --json '{}'
```

MCP: ferramenta `custom_objects_access_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.access_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_query

Listar registros de um objeto. Registros do objeto, 50 por página (`perPage` até 200). `filters` é uma lista (todos valem): `{fieldId, op, value}` com `fieldId` = id de um campo, `title`, `responsible` (id do responsável) ou `createdAt`/`updatedAt` (AAAA-MM-DD, compara o dia) e `op` em eq, neq, contains, not_contains, gt, gte, lt, lte, empty, not_empty, in, not_in, starts_with, ends_with. `relations` filtra por ligação (`{relationId, side, quantifier: any|all|none, value?, conditions?}`: o registro tem (algum, todos) ou não tem vínculo; `value` restringe ao outro lado cujo nome contém o texto e `conditions` (`{fieldId, op, value}`, as chaves vêm de `custom_objects.relation_filter_fields`) aos vínculos cujo outro lado cumpre todas as condições). Cada registro traz `relations` (por ligação e lado: `count` e `preview` com os 3 primeiros vínculos). `search` procura no título e nos textos. Ordem: `sortBy` (title, responsible, createdAt, updatedAt) ou `sortFieldId`, com `sortDir`; o padrão é o mais novo primeiro. `responsibleAttendantId` limita ao responsável. Cada registro traz `title` (valor do campo-título), `values` (`{<id do campo>: valor}`) e o responsável. `meta` traz página, total de páginas e de itens.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_query` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_query`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_query`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `filters` | object[] | não |  |
| `relations` | object[] | não |  |
| `search` | string | não |  |
| `responsibleAttendantId` | string (uuid) | não |  |
| `sortBy` | "title" \| "responsible" \| "createdAt" \| "updatedAt" | não |  |
| `sortFieldId` | string (uuid) | não |  |
| `sortDir` | "asc" \| "desc" | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_query \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","search":"centro"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_query --json '{"objectId":"00000000-0000-0000-0000-000000000000","search":"centro"}'
```

MCP: ferramenta `custom_objects_records_query` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_query.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.relation_filter_fields

Campos filtráveis do outro lado de uma ligação. Campos que o filtro por ligação aceita nas pontas: `side` é o lado em que estão os registros do objeto (`source` = a ponta é o alvo da ligação; `target` = a ponta é o objeto dono). Devolve `type` e `objectId` da ponta e `fields` (`key` para o `fieldId` de `conditions`, `label`, `group` fields|dates, `type` text|number|date|boolean|enum, `multi` e `enumOptions`). Contato: nome, telefone, e-mail, criação e campos personalizados; oportunidade: título, situação, valor e criação; objeto: título, campos filtráveis e datas; empresa não tem campos (só ter ou não vínculo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.relation_filter_fields` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_relation_filter_fields`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.relation_filter_fields`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `relationId` | string (uuid) | sim |  |
| `side` | "source" \| "target" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.relation_filter_fields \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"relationId":"00000000-0000-0000-0000-000000000000","side":"source"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.relation_filter_fields --json '{"relationId":"00000000-0000-0000-0000-000000000000","side":"source"}'
```

MCP: ferramenta `custom_objects_relation_filter_fields` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.relation_filter_fields.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_search

Buscar registros de um objeto por título. Busca rápida (seletor de vínculos): registros cujo título contém `q`, até `limit` (padrão 20, máximo 50). Cada achado traz `id`, `title` e `subtitle` (o primeiro outro texto do registro).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_search` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_search`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_search`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `q` | string | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_search \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","q":"apto"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_search --json '{"objectId":"00000000-0000-0000-0000-000000000000","q":"apto"}'
```

MCP: ferramenta `custom_objects_records_search` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_search.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_get

Ver um registro. Um registro do objeto com título, valores por campo e responsável. Registro de outra conta ou inexistente dá `not_found`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_create

Criar registro de um objeto. Cria um registro. `values` é `{<id do campo>: valor}` ou a lista `[{customFieldId, value}]` do original; cada valor é validado pelo tipo do campo (texto, número, data AAAA-MM-DD, opção existente, link http…), campo obrigatório vazio e título vazio dão `invalid_input`. `responsibleAttendantId` é o responsável (membro da conta). `links` já liga o registro novo: `{relationId, targetId}` quando o objeto é a origem da ligação, ou `{relationId, recordId}` quando é o alvo (`recordId` = registro de origem). Objeto arquivado não recebe registro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `values` | object \| object[] | não |  |
| `responsibleAttendantId` | string (uuid) \| null | não |  |
| `links` | object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","values":{"00000000-0000-0000-0000-000000000001":"Apto 101"}}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_create --json '{"objectId":"00000000-0000-0000-0000-000000000000","values":{"00000000-0000-0000-0000-000000000001":"Apto 101"}}'
```

MCP: ferramenta `custom_objects_record_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_update

Editar registro. Altera valores e/ou responsável. Só os campos enviados em `values` mudam; valor vazio (`null`, texto vazio, lista vazia) apaga. `responsibleAttendantId: null` tira o responsável. Valida pelo tipo e pelos campos obrigatórios, como na criação. O título é refeito a partir do campo-título.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `values` | object \| object[] | não |  |
| `responsibleAttendantId` | string (uuid) \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","values":{"00000000-0000-0000-0000-000000000001":"Apto 102"}}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_update --json '{"id":"00000000-0000-0000-0000-000000000000","values":{"00000000-0000-0000-0000-000000000001":"Apto 102"}}'
```

MCP: ferramenta `custom_objects_record_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_delete

Excluir registro. Exclui o registro com suas notas, atividades e vínculos (dos dois lados). Não dá para desfazer.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_bulk_delete

Excluir registros em massa. Exclui vários registros do objeto de uma vez: `recordIds` (até 5.000) ou `allMatching: true` com `filters`/`search` (tudo o que casa). Até 200 registros roda na hora (`mode: "sync"`, com `affected`); acima disso vira uma tarefa em segundo plano (`mode: "async"`, com `jobId`): acompanhe com `custom_objects.record_job_get` (até 100.000 registros). Não dá para desfazer.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_bulk_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_bulk_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_bulk_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `recordIds` | string (uuid)[] | não |  |
| `allMatching` | boolean | não |  |
| `filters` | object[] | não |  |
| `relations` | object[] | não |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_bulk_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","recordIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_bulk_delete --json '{"objectId":"00000000-0000-0000-0000-000000000000","recordIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `custom_objects_records_bulk_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_bulk_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_bulk_update

Alterar registros em massa. Aplica uma mudança a vários registros: mesma seleção da exclusão em massa (`recordIds` ou `allMatching` + `filters`/`search`) e `target`: `responsible` (`responsibleAttendantId`, `null` tira o responsável), `field` (`customFieldId` e `value`; `value: null` limpa o campo; vale a validação do tipo) ou `note` (`note`, uma nota nova em cada registro). Até 200 registros roda na hora (`mode: "sync"`, com `affected`); acima disso vira uma tarefa em segundo plano (`mode: "async"`, com `jobId`): acompanhe com `custom_objects.record_job_get` (até 100.000 registros).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_bulk_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_bulk_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_bulk_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `recordIds` | string (uuid)[] | não |  |
| `allMatching` | boolean | não |  |
| `filters` | object[] | não |  |
| `relations` | object[] | não |  |
| `search` | string | não |  |
| `target` | "responsible" \| "field" \| "note" | sim |  |
| `responsibleAttendantId` | string (uuid) \| null | não |  |
| `customFieldId` | string (uuid) | não |  |
| `value` | any | não |  |
| `note` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_bulk_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","recordIds":["00000000-0000-0000-0000-000000000000"],"target":"responsible","responsibleAttendantId":null}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_bulk_update --json '{"objectId":"00000000-0000-0000-0000-000000000000","recordIds":["00000000-0000-0000-0000-000000000000"],"target":"responsible","responsibleAttendantId":null}'
```

MCP: ferramenta `custom_objects_records_bulk_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_bulk_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_notes_list

Listar notas de um registro. Notas do registro, da mais nova para a mais antiga, com o autor.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_notes_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_notes_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_notes_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recordId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_notes_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recordId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_notes_list --json '{"recordId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_notes_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_notes_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_note_create

Criar nota em um registro. Adiciona uma nota (até 10.000 caracteres, Markdown simples) ao registro. O autor é quem chama.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_note_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_note_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recordId` | string (uuid) | sim |  |
| `body` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recordId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno na sexta."}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_note_create --json '{"recordId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno na sexta."}'
```

MCP: ferramenta `custom_objects_record_note_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_note_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_note_update

Editar nota de um registro. Troca o texto da nota. Só quem escreveu a nota ou um administrador pode editar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_note_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_note_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recordId` | string (uuid) | sim |  |
| `noteId` | string (uuid) | sim |  |
| `body` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recordId":"00000000-0000-0000-0000-000000000000","noteId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno na segunda."}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_note_update --json '{"recordId":"00000000-0000-0000-0000-000000000000","noteId":"00000000-0000-0000-0000-000000000000","body":"Cliente pediu retorno na segunda."}'
```

MCP: ferramenta `custom_objects_record_note_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_note_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_note_delete

Excluir nota de um registro. Exclui a nota. Só quem escreveu ou um administrador pode excluir.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_note_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_note_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recordId` | string (uuid) | sim |  |
| `noteId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_note_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recordId":"00000000-0000-0000-0000-000000000000","noteId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_note_delete --json '{"recordId":"00000000-0000-0000-0000-000000000000","noteId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_note_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_note_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_activities

Histórico de um registro. Linha do tempo do registro, da mais nova para a mais antiga: criação, edições, responsável, vínculos e notas (`type`: created, updated, link_created, link_deleted, note_added), com `metadata` e o autor.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_activities` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_activities`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_activities`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recordId` | string (uuid) | sim |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_activities \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recordId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_activities --json '{"recordId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_activities` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_activities.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.links_list

Vínculos de um registro ou de um contato, oportunidade ou empresa. O que está ligado a uma coisa, agrupado por ligação (o que a ficha de contato, oportunidade, empresa e registro mostra). `targetType` é `leads` (contato), `opportunities`, `companies` ou `objects` (`targetId` é o id de um registro). Cada grupo traz a `relation`, o `side` em que a coisa está (`source`: ela é a origem e os itens são o outro lado; `target`: ela é o alvo e os itens são registros de objetos) e `items` (`linkId`, `type`, `id`, `label`, `subtitle`). Ligações sem vínculo também vêm, com `items` vazio. Objetos arquivados ficam de fora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.links_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_links_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.links_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `targetType` | "leads" \| "opportunities" \| "companies" \| "objects" | sim |  |
| `targetId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.links_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"targetType":"leads","targetId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.links_list --json '{"targetType":"leads","targetId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_links_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.links_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.link_create

Vincular registros. Cria vínculos de uma ligação: `relationId` e `links` (`{recordId, targetId}`: `recordId` é o registro da origem — do objeto dono da ligação — e `targetId` o contato, oportunidade, empresa ou registro do outro lado). Lado "um" da cardinalidade guarda um vínculo só: ligar de novo troca o anterior (`replaced` conta as trocas). Vínculo que já existe é ignorado. Objetos arquivados não recebem vínculos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.link_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_link_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.link_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `relationId` | string (uuid) | sim |  |
| `links` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.link_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"relationId":"00000000-0000-0000-0000-000000000000","links":[{"recordId":"00000000-0000-0000-0000-000000000000","targetId":"00000000-0000-0000-0000-000000000000"}]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.link_create --json '{"relationId":"00000000-0000-0000-0000-000000000000","links":[{"recordId":"00000000-0000-0000-0000-000000000000","targetId":"00000000-0000-0000-0000-000000000000"}]}'
```

MCP: ferramenta `custom_objects_link_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.link_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.link_delete

Desfazer um vínculo. Remove o vínculo (os dois registros continuam).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.link_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_link_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.link_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `linkId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.link_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"linkId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.link_delete --json '{"linkId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_link_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.link_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.links_opportunity_badges

Selos de objetos nos cards de oportunidade. Para cada oportunidade de `opportunityIds` (até 200), os registros ligados por ligações com `showOnCard` ligado: `{opportunityId, relationId, recordId, title, objectId, icon, color, label}` (`label` é o nome da ligação do lado da oportunidade). É o selo do card no kanban.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.links_opportunity_badges` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_links_opportunity_badges`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.links_opportunity_badges`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `opportunityIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.links_opportunity_badges \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"opportunityIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.links_opportunity_badges --json '{"opportunityIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `custom_objects_links_opportunity_badges` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.links_opportunity_badges.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.views_list

Listar visões salvas de um objeto. Visões salvas da listagem de registros (filtros, layout `table`/`cards`/`kanban`, campo do kanban e colunas), da mais antiga para a mais nova.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.views_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_views_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.views_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.views_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.views_list --json '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_views_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.views_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.view_create

Salvar visão de um objeto. Salva a listagem atual: `name` (até 80 caracteres), `filters` (mesmo formato de `custom_objects.records_query`), `layout`, `kanbanFieldId` e `display` (por exemplo `columnOrder`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.view_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_view_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.view_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `name` | string | sim |  |
| `filters` | object[] | não |  |
| `layout` | "table" \| "cards" \| "kanban" \| null | não |  |
| `kanbanFieldId` | string (uuid) \| null | não |  |
| `display` | object \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.view_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","name":"Disponíveis","filters":[]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.view_create --json '{"objectId":"00000000-0000-0000-0000-000000000000","name":"Disponíveis","filters":[]}'
```

MCP: ferramenta `custom_objects_view_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.view_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.view_update

Atualizar visão salva. Regrava a visão com os filtros e o layout enviados e/ou renomeia (`name`). Só o que for enviado muda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.view_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_view_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.view_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `filters` | object[] | não |  |
| `layout` | "table" \| "cards" \| "kanban" \| null | não |  |
| `kanbanFieldId` | string (uuid) \| null | não |  |
| `display` | object \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.view_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","filters":[]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.view_update --json '{"id":"00000000-0000-0000-0000-000000000000","filters":[]}'
```

MCP: ferramenta `custom_objects_view_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.view_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.view_delete

Excluir visão salva. Exclui a visão salva. Os registros não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.view_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_view_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.view_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.view_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.view_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_view_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.view_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_export

Exportar registros de um objeto em CSV. Cria a tarefa de exportação (`kind: "export"`, `state: "waiting"`) e devolve na hora; o worker gera o CSV em segundo plano. Acompanhe com `custom_objects.record_job_get` (`progress`, `state`): ao ficar `completed`, `downloadUrl` é o link do arquivo (vale 5 minutos; a cada consulta vem um novo; o arquivo fica guardado por 24 horas). Seleção como a das ações em massa: `recordIds` (até 5.000) ou `allMatching: true` com `filters`/`relations`/`search`. `columns` (na ordem do arquivo): `cf:<id do campo>`, `rel:<id da ligação>:<source|target>` (nomes dos vinculados, separados por "; "), `responsible`, `createdAt`, `updatedAt`, `id`. Até 100.000 registros. `notifyEmail` (opcional): ao terminar, manda para esse endereço um e-mail com o link do arquivo, válido pelas 24 horas em que ele fica guardado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `recordIds` | string (uuid)[] | não |  |
| `allMatching` | boolean | não |  |
| `filters` | object[] | não |  |
| `relations` | object[] | não |  |
| `search` | string | não |  |
| `columns` | string[] | sim |  |
| `notifyEmail` | string (email) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","allMatching":true,"columns":["responsible","createdAt"]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_export --json '{"objectId":"00000000-0000-0000-0000-000000000000","allMatching":true,"columns":["responsible","createdAt"]}'
```

MCP: ferramenta `custom_objects_records_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_import_upload_url

Pedir URL para enviar a planilha de importação. Primeiro passo da importação (equivale a `records/import/upload` do original). Devolve `uploadId` e uma URL assinada (vale 2 horas): envie o CSV cru com `PUT` em `signedUrl` (corpo = o arquivo, `Content-Type: text/csv`; até 100 MB). Depois chame `custom_objects.records_import` com `uploadId`. Só quem pediu a URL importa o arquivo. `fileName` termina em .csv, .tsv ou .txt (o original também não lê .xlsx).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_upload_url` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_import_upload_url`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_import_upload_url`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `fileName` | string | sim |  |
| `size` | integer | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_upload_url \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","fileName":"imoveis.csv","size":1048576}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_import_upload_url --json '{"objectId":"00000000-0000-0000-0000-000000000000","fileName":"imoveis.csv","size":1048576}'
```

MCP: ferramenta `custom_objects_records_import_upload_url` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_import_upload_url.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_import

Importar registros de uma planilha. Cria a tarefa de importação (`kind: "import"`, `state: "waiting"`) do arquivo enviado com `records_import_upload_url` (`uploadId`) e devolve na hora; o worker lê o arquivo em lotes de 500 linhas (até 100.000). `columnMappings`: `{csvColumn, customFieldId}` (o campo-título precisa estar mapeado; a coluna é o texto do cabeçalho do arquivo). Cada célula é lida pelo tipo do campo (números "1.234,56", datas "26/10/2026", sim/não, opções pelo nome). `matchFieldId` casa com registros que já existem pelo valor desse campo e `conflictStrategy` decide: `merge` preenche só o que está vazio, `overwrite` troca os valores mapeados, `keep` pula a linha. Sem `matchFieldId`, toda linha cria registro. `responsibleAttendantId` vale para os criados. Acompanhe com `custom_objects.record_job_get`: `progress`, `affected` (criados + atualizados) e, em `meta`: `created`, `updated`, `skipped`, `failed` e `errors` (`{row, message}`, até 50; a linha 2 é a primeira de dados). Valores entram com a origem `import`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_import` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_import`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_import`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `uploadId` | string (uuid) | sim |  |
| `fileName` | string | sim |  |
| `columnMappings` | object[] | sim |  |
| `matchFieldId` | string (uuid) \| null | não |  |
| `conflictStrategy` | "merge" \| "overwrite" \| "keep" | não |  |
| `responsibleAttendantId` | string (uuid) \| null | não |  |
| `totalRows` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_import \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","uploadId":"00000000-0000-0000-0000-000000000000","fileName":"imoveis.csv","columnMappings":[{"csvColumn":"Endereço","customFieldId":"00000000-0000-0000-0000-000000000000"}]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_import --json '{"objectId":"00000000-0000-0000-0000-000000000000","uploadId":"00000000-0000-0000-0000-000000000000","fileName":"imoveis.csv","columnMappings":[{"csvColumn":"Endereço","customFieldId":"00000000-0000-0000-0000-000000000000"}]}'
```

MCP: ferramenta `custom_objects_records_import` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_import.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_import_ai_mapping

Sugerir o mapeamento das colunas da planilha com IA. Equivale a `records/import/ai-suggest-mapping` do original. Manda o cabeçalho e até 5 linhas de exemplo ao modelo e devolve `suggestions` (`{csvColumn, customFieldId}`, um campo por coluna) e `uncertainColumns` (colunas em que a IA não teve certeza). Sem a chave da IA ou com falha, responde `aiFailed: true` com o motivo em `reason` e a tela usa o nome das colunas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_ai_mapping` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_import_ai_mapping`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_import_ai_mapping`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `headers` | string[] | sim |  |
| `sampleRows` | string[][] | não | padrão [] |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_ai_mapping \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","headers":["Endereço","Preço"],"sampleRows":[["Rua A, 10","450000"]]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_import_ai_mapping --json '{"objectId":"00000000-0000-0000-0000-000000000000","headers":["Endereço","Preço"],"sampleRows":[["Rua A, 10","450000"]]}'
```

MCP: ferramenta `custom_objects_records_import_ai_mapping` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_import_ai_mapping.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.records_import_ai_column

Sugerir o campo de uma coluna da planilha com IA. Equivale a `records/import/ai-suggest-column` do original ("Sugerir campo com IA" no mapeamento). Manda o nome da coluna e até 10 valores ao modelo e devolve até 3 `candidates` (`{customFieldId, confidence: high|medium|low, reason}`). Sem a chave da IA ou com falha, responde o erro `credencial_ausente` ou `internal` (a tela mostra "Não foi possível analisar agora").

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_ai_column` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_records_import_ai_column`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.records_import_ai_column`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `header` | string | sim |  |
| `values` | string[] | não | padrão [] |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.records_import_ai_column \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000","header":"Preço","values":["450000","820000"]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.records_import_ai_column --json '{"objectId":"00000000-0000-0000-0000-000000000000","header":"Preço","values":["450000","820000"]}'
```

MCP: ferramenta `custom_objects_records_import_ai_column` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.records_import_ai_column.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_job_get

Ver uma tarefa de registros. Estado de uma tarefa de registros (exportação, importação, alterar ou excluir em massa): `state` (waiting, active, completed, failed), `progress` (0 a 100), `total`, `affected`, contagens e erros por linha em `meta` e, na exportação concluída, um `downloadUrl` novo (vale 5 minutos). Equivale a `GET /custom-objects/records-bulk-jobs/{id}`; o original consulta de 2 em 2 segundos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_job_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_job_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_job_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_job_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_job_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_job_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_job_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.record_jobs_list

Listar tarefas de registros de um objeto. As últimas 50 tarefas (exportações, importações e ações em massa) do objeto, da mais nova para a mais antiga. `kind` filtra.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.record_jobs_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_record_jobs_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.record_jobs_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `objectId` | string (uuid) | sim |  |
| `kind` | "bulk_update" \| "bulk_delete" \| "export" \| "import" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.record_jobs_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.record_jobs_list --json '{"objectId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_objects_record_jobs_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.record_jobs_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_objects.image_upload

Enviar foto de um registro. Guarda uma imagem (JPEG, PNG, WebP ou GIF, até 10 MB; `content` em base64) e devolve `url`, o link para gravar num campo de tipo `image` (o link é assinado e vale 1 ano). O campo guarda uma lista de links (até 20); a primeira é a capa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_objects.image_upload` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_objects_image_upload`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_objects.image_upload`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `mimeType` | string | sim |  |
| `content` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_objects.image_upload \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"fachada.png","mimeType":"image/png","content":"iVBORw0KGgo="}'
```

CLI:

```bash
node cli/atomiks.mjs custom_objects.image_upload --json '{"name":"fachada.png","mimeType":"image/png","content":"iVBORw0KGgo="}'
```

MCP: ferramenta `custom_objects_image_upload` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_objects.image_upload.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.profile_wallet

Carteira de uma pessoa (detalhe do membro). Oportunidades de que a pessoa é responsável: abertas (as 200 de maior valor, com o total), ganhas e perdidas desde `from` (até 200 de cada), cada uma com pipeline, etapa, contato, valor, chance, previsão de fechamento, origem, motivo da perda e a próxima tarefa aberta (`nextStep`). `leads` junta os contatos das oportunidades abertas. Dinheiro em centavos. Não traz temperatura do contato (o Atomiks não calcula por oportunidade).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.profile_wallet` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_profile_wallet`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.profile_wallet`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |
| `from` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.profile_wallet \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000","from":"2026-09-26T00:00:00Z"}'
```

CLI:

```bash
node cli/atomiks.mjs members.profile_wallet --json '{"userId":"00000000-0000-0000-0000-000000000000","from":"2026-09-26T00:00:00Z"}'
```

MCP: ferramenta `members_profile_wallet` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.profile_wallet.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.profile_service

Atendimento de uma pessoa (detalhe do membro). Conversas atribuídas à pessoa: as 100 mais recentes (`items`, com status, não lidas, última mensagem e canal), o total e as contagens do período (`inPeriod`: com mensagem desde `from`; `assigned`: em atendimento agora; `resolved`: resolvidas desde `from`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.profile_service` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_profile_service`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.profile_service`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |
| `from` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.profile_service \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000","from":"2026-09-26T00:00:00Z"}'
```

CLI:

```bash
node cli/atomiks.mjs members.profile_service --json '{"userId":"00000000-0000-0000-0000-000000000000","from":"2026-09-26T00:00:00Z"}'
```

MCP: ferramenta `members_profile_service` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.profile_service.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.profile_agenda

Agenda de uma pessoa (detalhe do membro). Reuniões (tarefas do tipo meeting) e tarefas abertas da pessoa. `week`: reuniões com data entre `weekStart` e 7 dias depois; `period`: reuniões entre `from` e agora; `openTasks`: tarefas não concluídas que não são reunião, com o grupo (atrasada, hoje, próxima). Lê as 500 tarefas mais próximas da pessoa. O Atomiks não registra falta nem cancelamento de reunião: uma reunião é aberta ou concluída.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.profile_agenda` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_profile_agenda`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.profile_agenda`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |
| `weekStart` | string (date-time) | sim |  |
| `from` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.profile_agenda \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000","weekStart":"2026-10-26T00:00:00Z","from":"2026-09-26T00:00:00Z"}'
```

CLI:

```bash
node cli/atomiks.mjs members.profile_agenda --json '{"userId":"00000000-0000-0000-0000-000000000000","weekStart":"2026-10-26T00:00:00Z","from":"2026-09-26T00:00:00Z"}'
```

MCP: ferramenta `members_profile_agenda` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.profile_agenda.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.profile_builds

O que a pessoa criou (detalhe do membro). Respostas rápidas (`quickReplies`, as 8 mais recentes e o total), arquivos enviados na caixa de entrada (`files`, com o total de bytes) e chaves de IA (`aiCredentials`) cadastrados pela pessoa. O original também conta metas e comentários em funis, que o Atomiks não tem; os modelos da Meta não guardam quem criou. Sem a migration de agentes de IA, `aiCredentials` vem vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.profile_builds` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_profile_builds`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.profile_builds`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `userId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.profile_builds \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs members.profile_builds --json '{"userId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `members_profile_builds` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.profile_builds.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# members.profile_facts

Telefone e quem convidou (detalhe do membro). Dados do cabeçalho do perfil que `members.list` não traz: `phone` (perfil da pessoa, ou null) e `invitedBy` (quem criou o convite, ou null). `id` é o de um membro ou o de um convite pendente. Para o membro, o convite é o último aceito com o mesmo e-mail; quem entrou como dono da conta, sem convite, volta com `invitedBy` null.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/members.profile_facts` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `members_profile_facts`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `members.profile_facts`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/members.profile_facts \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs members.profile_facts --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `members_profile_facts` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/members.profile_facts.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meetings.coaching_settings_get

Zonas-alvo e pesos da nota da avaliação de reunião. Configuração de coaching de reunião da conta: `targets` (faixa mín./máx. por métrica; `fillerRatio` é razão de 0 a 1, `longestMonologueSeconds` em segundos) e `methodology.stages` (peso salvo e `defaultWeight` de cada etapa do método). Exige a chave de plano `messages.livechat-meetings` (senão forbidden). Sem configuração salva, devolve os padrões. Depende de uma migration; sem ela devolve os padrões.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meetings.coaching_settings_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `meetings_coaching_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meetings.coaching_settings_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meetings.coaching_settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs meetings.coaching_settings_get --json '{}'
```

MCP: ferramenta `meetings_coaching_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meetings.coaching_settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meetings.coaching_settings_set

Salvar zonas-alvo e pesos da nota da avaliação de reunião. Admin. Grava `targets` (por métrica `{min?, max?}`; objeto vazio = sem limite; métrica omitida volta ao padrão) e `stageWeights` (peso >= 0 por etapa; zero desliga a etapa e pelo menos uma precisa ser maior que zero). Exige a chave de plano `messages.livechat-meetings`. Mínimo maior que o máximo responde invalid_input. Quem não é dono/administrador recebe forbidden. Depende de uma migration; sem ela responde migration_pendente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meetings.coaching_settings_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `meetings_coaching_settings_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meetings.coaching_settings_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `targets` | object | sim |  |
| `stageWeights` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meetings.coaching_settings_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"targets":{"wordsPerMinute":{"min":120,"max":185},"fillerRatio":{"max":0.05}},"stageWeights":[{"key":"rapport","weight":10},{"key":"situation","weight":15}]}'
```

CLI:

```bash
node cli/atomiks.mjs meetings.coaching_settings_set --json '{"targets":{"wordsPerMinute":{"min":120,"max":185},"fillerRatio":{"max":0.05}},"stageWeights":[{"key":"rapport","weight":10},{"key":"situation","weight":15}]}'
```

MCP: ferramenta `meetings_coaching_settings_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meetings.coaching_settings_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# meetings.coaching_targets_suggestion

Faixas sugeridas pelas reuniões conduzidas. Para cada métrica, o tamanho da amostra (`sampleSize`) nos últimos 30 dias e a faixa `suggested` (p25 a p75, só no lado que a métrica tem no padrão). Só sugere com `sampleSize >= minSamples`; senão `suggested` é null. `nonInclusiveCount` é zona fixa e não aparece. Exige a chave de plano `messages.livechat-meetings`. Lê os relatórios de reunião; sem eles devolve amostra 0.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/meetings.coaching_targets_suggestion` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `meetings_coaching_targets_suggestion`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `meetings.coaching_targets_suggestion`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/meetings.coaching_targets_suggestion \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs meetings.coaching_targets_suggestion --json '{}'
```

MCP: ferramenta `meetings_coaching_targets_suggestion` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/meetings.coaching_targets_suggestion.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.list

Listar caixas de e-mail conectadas. Caixas de e-mail (canal `email`) da conta, da mais antiga à mais nova, só as que o membro pode usar. Cada item é o "canal" do original: `status` (`pending` conexão incompleta, `live` ativa, `archived` desconectada), `emailAddress`, `emailLastSuccessAt`, `emailFailingSince` e `emailLastErrorCode` (quando a leitura está falhando, e por quê). Os arquivados só com `includeArchived`. Exige o módulo de plano `messages.email-inbox` (senão `forbidden`). Sem a migration, a lista vem vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `includeArchived` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"includeArchived":false}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.list --json '{"includeArchived":false}'
```

MCP: ferramenta `email_inbox_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.members

Quem tem acesso a cada caixa de e-mail. Para cada caixa de e-mail ativa da conta, as pessoas da conta e se podem usá-la: administradores sempre (`alwaysAllowed`, `seatRole` `admin`) e membros só se a caixa estiver liberada para eles em Configurações > Equipe (`hasAccess`; `channels` da permissão, `*` = todas). Traz nome e foto do perfil. `managementAccess` é sempre `false` (o Atomiks não separa gestão de uso). Só administrador (o `channels:manage` do original).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.members` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_members`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.members`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.members \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.members --json '{}'
```

MCP: ferramenta `email_inbox_members` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.members.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.get

Ver a configuração de uma caixa de e-mail. Servidores IMAP e SMTP (host, porta, segurança, usuário), nome do remetente, assinatura (texto e logo), se a pasta Enviados é sincronizada, o estado da conexão (última leitura bem-sucedida, desde quando falha, código e texto do erro, falhas seguidas) e a importação de histórico (`historyImport`: desde quando, total, lidos, concluída em). A senha nunca é devolvida.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `email_inbox_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.preview

Prévia de um e-mail com a assinatura. Monta o HTML do e-mail como sairá: o `text` (aceita *negrito*, _itálico_, listas com "- " e links) seguido da assinatura da caixa. `signatureText` e `signatureLogoUrl` (https) testam uma assinatura ainda não salva; `null` tira a da caixa. Todo o HTML vem escapado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `text` | string | sim |  |
| `signatureText` | string \| null | não |  |
| `signatureLogoUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","text":"Olá! Segue a resposta que você pediu."}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.preview --json '{"id":"00000000-0000-0000-0000-000000000000","text":"Olá! Segue a resposta que você pediu."}'
```

MCP: ferramenta `email_inbox_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.test_settings

Testar as credenciais de uma caixa antes de conectar. Abre uma conexão IMAP (recebimento) e uma SMTP (envio) com os dados informados e devolve o resultado de cada uma: `ok` ou `errorCode` (`auth_failed`, `host_not_found`, `connection_refused`, `tls_error`, `timeout`, `host_not_allowed`, `credential_unreadable`, `unknown`). Nada é salvo. Só servidores públicos de e-mail (rede interna dá `host_not_allowed`). Limite de 20 testes por conta a cada 10 minutos (`limit_reached`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.test_settings` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_test_settings`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.test_settings`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `emailAddress` | string | sim |  |
| `imapHost` | string | sim |  |
| `imapPort` | integer | sim |  |
| `imapSecure` | boolean | sim |  |
| `imapUsername` | string | sim |  |
| `imapPassword` | string | sim |  |
| `smtpHost` | string | sim |  |
| `smtpPort` | integer | sim |  |
| `smtpSecure` | boolean | sim |  |
| `smtpUsername` | string | sim |  |
| `smtpPassword` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.test_settings \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emailAddress":"comercial@empresa.com.br","imapHost":"imap.gmail.com","imapPort":993,"imapSecure":true,"imapUsername":"comercial@empresa.com.br","imapPassword":"senha-de-app","smtpHost":"smtp.gmail.com","smtpPort":465,"smtpSecure":true,"smtpUsername":"comercial@empresa.com.br","smtpPassword":"senha-de-app"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.test_settings --json '{"emailAddress":"comercial@empresa.com.br","imapHost":"imap.gmail.com","imapPort":993,"imapSecure":true,"imapUsername":"comercial@empresa.com.br","imapPassword":"senha-de-app","smtpHost":"smtp.gmail.com","smtpPort":465,"smtpSecure":true,"smtpUsername":"comercial@empresa.com.br","smtpPassword":"senha-de-app"}'
```

MCP: ferramenta `email_inbox_test_settings` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.test_settings.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.test

Testar a conexão de uma caixa já conectada. Testa o recebimento (IMAP) e o envio (SMTP) com as credenciais guardadas e devolve o resultado de cada um. O estado da caixa acompanha: sucesso limpa o "falhando desde"; falha o marca. Senha ilegível dá `credential_unreadable` nas duas pontas (informe a senha de novo em `email_inbox.update_credentials`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.test` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_test`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.test`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.test \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.test --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `email_inbox_test` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.test.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.update_credentials

Trocar a senha de uma caixa de e-mail. Testa a nova senha (recebimento e envio, com os servidores já salvos) e só então a guarda cifrada. Se o teste falhar nada é salvo e `saved` vem `false`, com o motivo em `result`. Ao salvar, o estado "falhando" é limpo e a leitura recomeça. A senha nunca volta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.update_credentials` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_update_credentials`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.update_credentials`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `imapPassword` | string | sim |  |
| `smtpPassword` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.update_credentials \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","imapPassword":"nova-senha-de-app","smtpPassword":"nova-senha-de-app"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.update_credentials --json '{"id":"00000000-0000-0000-0000-000000000000","imapPassword":"nova-senha-de-app","smtpPassword":"nova-senha-de-app"}'
```

MCP: ferramenta `email_inbox_update_credentials` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.update_credentials.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.create

Conectar uma caixa de e-mail. Testa o recebimento (IMAP) e o envio (SMTP); se os dois passam, cria o canal `email` ativo e guarda as senhas cifradas. Falha no teste: `invalid_input` com `EMAIL_IMAP_FAILED:<código>` ou `EMAIL_SMTP_FAILED:<código>` e nada é criado. Caixa já conectada nesta conta: `limit_reached` com `CHANNEL_ALREADY_CONNECTED`; conectada em outra conta: `limit_reached` com `CHANNEL_HELD_ELSEWHERE`, e `confirmTakeover: true` desconecta a outra e move para cá. A leitura começa dali em diante (o que já estava na caixa só entra por `email_inbox.history_import`). Exige `TOKEN_ENC_KEY` no servidor (senão `credencial_ausente`) e a migration (senão `migration_pendente`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `emailAddress` | string | sim |  |
| `imapHost` | string | sim |  |
| `imapPort` | integer | sim |  |
| `imapSecure` | boolean | sim |  |
| `imapUsername` | string | sim |  |
| `imapPassword` | string | sim |  |
| `smtpHost` | string | sim |  |
| `smtpPort` | integer | sim |  |
| `smtpSecure` | boolean | sim |  |
| `smtpUsername` | string | sim |  |
| `smtpPassword` | string | sim |  |
| `confirmTakeover` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emailAddress":"comercial@empresa.com.br","imapHost":"imap.gmail.com","imapPort":993,"imapSecure":true,"imapUsername":"comercial@empresa.com.br","imapPassword":"senha-de-app","smtpHost":"smtp.gmail.com","smtpPort":465,"smtpSecure":true,"smtpUsername":"comercial@empresa.com.br","smtpPassword":"senha-de-app","confirmTakeover":false}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.create --json '{"emailAddress":"comercial@empresa.com.br","imapHost":"imap.gmail.com","imapPort":993,"imapSecure":true,"imapUsername":"comercial@empresa.com.br","imapPassword":"senha-de-app","smtpHost":"smtp.gmail.com","smtpPort":465,"smtpSecure":true,"smtpUsername":"comercial@empresa.com.br","smtpPassword":"senha-de-app","confirmTakeover":false}'
```

MCP: ferramenta `email_inbox_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.update_settings

Ajustar o envio de uma caixa de e-mail. Nome do remetente (`fromName`, até 120 caracteres; aparece antes do endereço nos e-mails enviados), assinatura (`signatureText` até 2000 caracteres, com *negrito*, _itálico_, listas "- " e links; `signatureLogoUrl` com https) e `syncSentFolder` (grava na conversa o que você envia direto pelo webmail ou celular para um contato com conversa aberta; vale só do momento em que liga). Só o que for enviado muda; `null` ou texto vazio limpa. Devolve a configuração (mesmo formato de `email_inbox.get`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.update_settings` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_update_settings`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.update_settings`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `fromName` | string \| null | não |  |
| `syncSentFolder` | boolean | não |  |
| `signatureText` | string \| null | não |  |
| `signatureLogoUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.update_settings \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","fromName":"Ana da Loja Exemplo","syncSentFolder":true}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.update_settings --json '{"id":"00000000-0000-0000-0000-000000000000","fromName":"Ana da Loja Exemplo","syncSentFolder":true}'
```

MCP: ferramenta `email_inbox_update_settings` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.update_settings.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.history_import

Importar o histórico de uma caixa de e-mail. Pede a importação das conversas recentes que já estavam na caixa (`days`: 7 ou 30). O worker lê em segundo plano e acompanha em `historyImport` (`total`, `processed`, `completedAt`) de `email_inbox.get`. Os e-mails entram com a data original, sem não lida, sem janela e sem disparar automações. Uma vez por caixa: repetir dá `limit_reached` com `EMAIL_HISTORY_ALREADY_REQUESTED`. Inclui a pasta Enviados se `syncSentFolder` estiver ligado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.history_import` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_history_import`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.history_import`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `days` | 7 \| 30 | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.history_import \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","days":7}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.history_import --json '{"id":"00000000-0000-0000-0000-000000000000","days":7}'
```

MCP: ferramenta `email_inbox_history_import` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.history_import.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.sync_now

Ler a caixa de e-mail agora. Faz uma rodada de leitura da caixa na hora (o worker faz isso a cada minuto) e devolve quantas mensagens novas entraram no atendimento e o estado do canal. Se o servidor de e-mail recusar, a caixa passa a "falhando" (`emailFailingSince`, `emailLastErrorCode`) e a resposta traz `failing: true`. `more: true` = ainda há mensagens para ler (chame de novo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.sync_now` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_sync_now`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.sync_now`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.sync_now \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.sync_now --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `email_inbox_sync_now` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.sync_now.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.archive

Desconectar uma caixa de e-mail. Desconecta a caixa: o canal sai do ar, a leitura e o envio param e as senhas guardadas são apagadas. As conversas e mensagens continuam na conta. Para conectar de novo é preciso informar as credenciais (`email_inbox.create`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.archive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.archive --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `email_inbox_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.cancel

Cancelar uma conexão de e-mail incompleta. Descarta uma tentativa de conexão que não chegou a ficar ativa (`status` `pending`); nenhuma conversa é perdida. Caixa ativa responde `invalid_input` (use `email_inbox.archive`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.cancel` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.cancel --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `email_inbox_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# email_inbox.send

Enviar um e-mail pela caixa conectada. Envia pelo SMTP da caixa um e-mail para `to`, com `subject` (sem ele: "Mensagem de <remetente>") e `text` (aceita *negrito*, _itálico_, listas "- " e links), no formato da caixa: remetente com o nome configurado e a assinatura (texto e logo) no fim. A mensagem entra na conversa desse contato no atendimento (criada se não existir). `clientRequestId` (UUID) torna o envio idempotente. Se o servidor não confirmar, `uncertain: true` e nada é reenviado sozinho. Responder numa conversa que já existe também pode ser feito por `inbox.send`, que usa o mesmo envio. Exige acesso ao canal.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/email_inbox.send` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:send`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `email_inbox_send`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `email_inbox.send`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `to` | string | sim |  |
| `subject` | string | não |  |
| `text` | string | sim |  |
| `clientRequestId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/email_inbox.send \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","to":"cliente@exemplo.com.br","subject":"Sua proposta","text":"Olá! Segue a proposta."}'
```

CLI:

```bash
node cli/atomiks.mjs email_inbox.send --json '{"id":"00000000-0000-0000-0000-000000000000","to":"cliente@exemplo.com.br","subject":"Sua proposta","text":"Olá! Segue a proposta."}'
```

MCP: ferramenta `email_inbox_send` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/email_inbox.send.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.list

Histórico global de atividades. Atividades de todos os contatos que quem pede enxerga, do mais recente para o mais antigo, com os filtros do Histórico de atividades do Clickmax. Cada item traz `eventName` (nome do evento no original, como `crm.tag.lead.apply.v1`), `name`, `category` (Checkout, Email, Chat, Tag, Lead, Opportunity, PageView, Cart, PaymentFailedOrExpired ou MemberArea), `leadId`/`leadName`, `opportunityId`, `leadTaskId`, `messageId`, quem fez (`actorType`, `actorId`, `actorName`) e `meta` com os detalhes do tipo (tag, etapa, valor, produto, texto da mensagem…).

Filtros (E entre eles; dentro de cada lista, qualquer valor): `eventName`, `startDate`/`endDate` (AAAA-MM-DD ou ISO; dia sem hora vale o dia inteiro em UTC), `tagIds`, `pipelineIds`, `flowIds`, `productIds`. `offerIds`, `pageIds`, `funnelIds` e `messageIds` existem no original e não têm fonte aqui: com algum valor a lista vem vazia. `leadId` limita a um contato (precisa estar visível, senão `not_found`).

Paginação como o original: `page` (de 1) e `perPage` (50, até 100); `meta.countItens` é o total ("N atividades no total") e `meta.countPages` as páginas. Só as 5 000 mais recentes de cada fonte ficam ao alcance de páginas fundas: acima disso `data` vem vazio e `countPages` para antes; filtre por período para chegar mais longe. `timezone` é o fuso da conta, para agrupar por dia. Ao vivo: repita `page: 1, perPage: 50` a cada 5 segundos.

Fontes: mensagens e notas internas, atendimentos, compras e cancelamentos, oportunidades (criada, ganha, perdida), tarefas, consentimentos de envio, execuções de automação (flows e Instagram) e eventos de domínio (etiquetas, campos, etapas, vendas de integrações, carrinho, assinatura, comentários do Instagram). Tipos do original sem fonte aqui (e-mail, campanha, voz, Telegram, páginas, área de membros do original, leitura da conversa por IA…) aparecem em `activities.filter_options` com `hasSource: false`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `eventName` | string[] | não |  |
| `startDate` | string | não |  |
| `endDate` | string | não |  |
| `offerIds` | string[] | não |  |
| `pageIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `productIds` | string (uuid)[] | não |  |
| `tagIds` | string (uuid)[] | não |  |
| `messageIds` | string[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `flowIds` | string (uuid)[] | não |  |
| `leadId` | string (uuid) | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01","eventName":["crm.tag.lead.apply.v1"],"page":1,"perPage":50}'
```

CLI:

```bash
node cli/atomiks.mjs activities.list --json '{"startDate":"2026-10-01","eventName":["crm.tag.lead.apply.v1"],"page":1,"perPage":50}'
```

MCP: ferramenta `activities_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.filter_options

Opções dos filtros do histórico global. O que os filtros de dimensão de `activities.list` aceitam no período (`startDate`/`endDate`, opcionais): `products`, `tags`, `pipelines` e `flows` com `id`, `name` e `count` (atividades no período); `offers`, `pages`, `funnels` e `messages` vêm vazias (sem fonte). `events` é o catálogo do filtro de tipo: `eventName`, `label` em português, `category` e `hasSource` (false = o Clickmax original tem o tipo e o Atomiks ainda não grava atividade dele).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.filter_options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_filter_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.filter_options`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `startDate` | string | não |  |
| `endDate` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.filter_options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01","endDate":"2026-10-26"}'
```

CLI:

```bash
node cli/atomiks.mjs activities.filter_options --json '{"startDate":"2026-10-01","endDate":"2026-10-26"}'
```

MCP: ferramenta `activities_filter_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.filter_options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.stats

Estatísticas do histórico global. Barra lateral do Histórico de atividades: `byCategory` (por categoria), `topLeads` (5 contatos mais ativos), `topEventTypes` (5 tipos mais frequentes) e `byHour` (volume por hora do dia, no fuso da conta; só horas com atividade). Sem `startDate`/`endDate`, os últimos 30 dias. Conta até as 2 000 atividades mais recentes de cada fonte no período.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `startDate` | string | não |  |
| `endDate` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs activities.stats --json '{}'
```

MCP: ferramenta `activities_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.export

Exportar o histórico global em CSV. Enfileira um CSV (UTF-8 com BOM, vírgula, até 50 000 atividades) com os mesmos filtros de `activities.list`. Roda em segundo plano com as permissões de quem pediu. `labels` (opcional) traz o rótulo de cada `eventName` no idioma da tela; sem ele sai o rótulo em português. Colunas: `data`, `hora` (fuso da conta), `contato`, `atividade`, `evento`, `categoria`, `responsavel`, `detalhes`. Devolve `jobId`; acompanhe e baixe por `activities.export_get`. Sem a migration do job, responde `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `activities_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `eventName` | string[] | não |  |
| `startDate` | string | não |  |
| `endDate` | string | não |  |
| `offerIds` | string[] | não |  |
| `pageIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `productIds` | string (uuid)[] | não |  |
| `tagIds` | string (uuid)[] | não |  |
| `messageIds` | string[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `flowIds` | string (uuid)[] | não |  |
| `labels` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01","endDate":"2026-10-26"}'
```

CLI:

```bash
node cli/atomiks.mjs activities.export --json '{"startDate":"2026-10-01","endDate":"2026-10-26"}'
```

MCP: ferramenta `activities_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.export_get

Ver uma exportação do histórico global. Status do job de `activities.export` (`queued`, `running`, `done`, `failed`), atividades no arquivo e, quando pronto, `url` assinada (vale 5 minutos; chame de novo para outra). O arquivo fica 24 horas; depois `url` volta `null` com `expired: true`. Quem pediu vê a sua; admin vê todas da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.export_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_export_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.export_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.export_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs activities.export_get --json '{"jobId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `activities_export_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.export_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.message_detail

Detalhe da mensagem de uma atividade. Detalhe da mensagem de uma atividade de conversa (`activityId` = `id` da atividade): `channel`, `deliveryStatus` (queued, sent, delivered, visualized ou failed; só em mensagem enviada), `deliveryError`, `subject`, `contents` ([{format, content, fileName, caption}]) e, quando a mensagem saiu de uma automação ou disparo, `flow`/`broadcast` (o Atomiks não guarda essa origem: sempre `null`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.message_detail` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_message_detail`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.message_detail`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `activityId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.message_detail \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"activityId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs activities.message_detail --json '{"activityId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `activities_message_detail` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.message_detail.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.message_leads

Contatos com mensagens (Registro de mensagens). Lista da aba "Registro de mensagens": um item por contato com conversa, do mais recente, com `lastPlatform` (whatsapp, evolution ou instagram), `lastMessageName` (prévia da última mensagem) e `lastMessageAt`. `platform` filtra pelo canal (e-mail, SMS, Telegram e voz do original não existem aqui: lista vazia); `search` busca por nome, e-mail ou telefone, sem acento. Lê as 2 000 conversas mais recentes. Página de 20 por padrão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.message_leads` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_message_leads`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.message_leads`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `page` | integer | não |  |
| `perPage` | integer | não |  |
| `platform` | string | não |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.message_leads \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs activities.message_leads --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `activities_message_leads` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.message_leads.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities.message_thread

Mensagens enviadas a um contato. Mensagens enviadas ao contato (mais recente primeiro), uma por item: `instanceId` (id da mensagem), `platform`, `status` (queued, sent, delivered, visualized, failed), `queuedAt`, `contents` ([{id, order, format, content, fileName, caption}]) e `error`. `emailSubject`, `messageName` e `creditCost` existem no original e ficam `null`. O contato precisa estar visível (`not_found` se não). Página de 200 por padrão, até 500.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities.message_thread` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_message_thread`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities.message_thread`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `leadId` | string (uuid) | sim |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |
| `platform` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities.message_thread \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"leadId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs activities.message_thread --json '{"leadId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `activities_message_thread` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities.message_thread.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.overview

Cartões de vendas do Atomiks. Totais da aba "Vendas via Atomiks" com os filtros da tela: receita (`totalSales`, só vendas ativas), total de transações e aprovadas, compradores, valor a recuperar (vendas canceladas, uma vez por comprador e produto) e a origem das compras (`utmSourceBreakdown`). Faturas, falhas, reembolsos, PIX/boleto em aberto e abandono de carrinho não existem nas vendas do Atomiks e vêm zerados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs sales.overview --json '{}'
```

MCP: ferramenta `sales_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.list

Listar vendas do Atomiks (tabela de vendas). Vendas do Atomiks (registradas à mão ou pela mensagem) com comprador, produto, valor e situação (`paid` enquanto ativa, `canceled` depois de cancelada), ordenadas por `column` (createdAt, buyerName, status ou gateway) e `order`. Paginação: `page` e `perPage` (50, até 100).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |
| `column` | "createdAt" \| "buyerName" \| "status" \| "cxFeeFix" \| "cxFeePercentage" \| "installments" \| "gateway" \| "type" | não |  |
| `order` | "asc" \| "desc" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":50}'
```

CLI:

```bash
node cli/atomiks.mjs sales.list --json '{"page":1,"perPage":50}'
```

MCP: ferramenta `sales_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.chart

Gráfico de vendas do Atomiks. Receita (centavos) e número de vendas aprovadas por dia, semana ISO ou mês (`period`), no fuso da conta, entre `from` e `to`. Só vêm os períodos com venda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.chart` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_chart`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.chart`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `period` | "daily" \| "weekly" \| "monthly" | sim |  |
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.chart \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.chart --json '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

MCP: ferramenta `sales_chart` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.chart.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.get

Detalhe da venda. Venda do Atomiks (`id` uuid) ou pedido de plataforma (`id` = código do pedido): situação, datas, pagamento, produto e transações. O Atomiks não cobra taxa nem parcela e não guarda garantia: esses campos vêm zerados ou nulos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `sales_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.buyer

Dados do comprador da venda. Nome, e-mail, telefone (separado em DDI, DDD e número), documento e endereço do contato da venda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.buyer` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_buyer`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.buyer`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.buyer \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.buyer --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `sales_buyer` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.buyer.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.utms

Rastreamento (UTMs) da venda. UTMs, `src` e `sck` da venda. Vendas do Atomiks usam a origem de anúncio do contato; pedidos de plataforma trazem os parâmetros que a plataforma enviou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.utms` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_utms`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.utms`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.utms \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.utms --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `sales_utms` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.utms.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.by_reference

Achar a venda pela referência. Devolve o `id` do pedido de plataforma com o código `externalId` (a tela abre o detalhe dele). `not_found` se nenhum pedido tem esse código.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.by_reference` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_by_reference`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.by_reference`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `externalId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.by_reference \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"externalId":"HP12345678"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.by_reference --json '{"externalId":"HP12345678"}'
```

MCP: ferramenta `sales_by_reference` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.by_reference.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.external_list

Listar vendas de plataformas externas. Último estado de cada pedido recebido por integração (Hotmart, Kiwify...), com comprador, produto, código da oferta, valor, moeda, gateway, método e referência. `column`: value, createdAt, updatedAt, productName, method, leadName, installments, gatewayOrigin ou offerCode.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.external_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_external_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.external_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |
| `column` | "value" \| "createdAt" \| "updatedAt" \| "productName" \| "method" \| "leadName" \| "installments" \| "gatewayOrigin" \| "offerCode" | não |  |
| `order` | "asc" \| "desc" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.external_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":50}'
```

CLI:

```bash
node cli/atomiks.mjs sales.external_list --json '{"page":1,"perPage":50}'
```

MCP: ferramenta `sales_external_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.external_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.external_overview

Cartões de vendas de plataformas externas. Receita, compradores, ticket médio por comprador e vendas por canal dos pedidos aprovados, na moeda escolhida em `filters.currency` (ou a de maior receita). `currency` vem nulo sem vendas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.external_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_external_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.external_overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.external_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs sales.external_overview --json '{}'
```

MCP: ferramenta `sales_external_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.external_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.external_chart

Gráfico de vendas de plataformas externas. Receita (centavos) e número de vendas aprovadas por dia, semana ISO ou mês (`period`), no fuso da conta, entre `from` e `to`. Só vêm os períodos com venda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.external_chart` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_external_chart`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.external_chart`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `period` | "daily" \| "weekly" \| "monthly" | sim |  |
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.external_chart \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.external_chart --json '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

MCP: ferramenta `sales_external_chart` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.external_chart.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.autocomplete_products

Produtos para o filtro de vendas. Produtos das plataformas externas (`scope: "external"`) ou do Atomiks, filtrados por `searchText`. `id` é o que o filtro `productIds` espera.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.autocomplete_products` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_autocomplete_products`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.autocomplete_products`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `searchText` | string | não |  |
| `scope` | "atomiks" \| "external" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.autocomplete_products \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"searchText":"curso"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.autocomplete_products --json '{"searchText":"curso"}'
```

MCP: ferramenta `sales_autocomplete_products` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.autocomplete_products.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.autocomplete_utms

UTMs vistos nas vendas. Valores distintos de UTM (source, medium, campaign, content, term) e de `src`/`sck` das vendas e pedidos da conta, para o filtro "Origem das compras".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.autocomplete_utms` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_autocomplete_utms`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.autocomplete_utms`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.autocomplete_utms \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs sales.autocomplete_utms --json '{}'
```

MCP: ferramenta `sales_autocomplete_utms` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.autocomplete_utms.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales.export_csv

Exportar vendas em CSV. Texto CSV (separador ";") das vendas com os filtros da tela, da aba `clickmax` ou `external` (até 20000 linhas), na ordem de `column`/`order`. A tela baixa como `sales.csv`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales.export_csv` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_export_csv`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales.export_csv`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `tab` | "clickmax" \| "external" | sim |  |
| `filters` | object | não |  |
| `column` | string | não |  |
| `order` | "asc" \| "desc" | não |  |
| `viewMode` | "by-sale" \| "by-transaction" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales.export_csv \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tab":"clickmax"}'
```

CLI:

```bash
node cli/atomiks.mjs sales.export_csv --json '{"tab":"clickmax"}'
```

MCP: ferramenta `sales_export_csv` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales.export_csv.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# notifications.prefs_get

Ver minhas preferências de notificação. Matriz de Configurações > Notificações: chave geral por canal (`general`: `inApp` no app, `mobilePush` push no celular) e, por categoria, cada tipo de aviso com seu valor em cada canal. Canal `null`: o aviso não sai por ele (chave inativa). Chave geral desligada: nenhum aviso sai pelo canal. Valem em todas as contas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/notifications.prefs_get` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `notifications_prefs_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `notifications.prefs_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/notifications.prefs_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs notifications.prefs_get --json '{}'
```

MCP: ferramenta `notifications_prefs_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/notifications.prefs_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# notifications.prefs_set

Alterar uma preferência de notificação. Liga ou desliga um canal (`inApp` ou `mobilePush`) para um tipo de aviso, ou para todos (`kind` = `ALL`). Tipos: PURCHASE_COMPLETED, PIX_EXPIRED, TRIAL_STARTED, PAYMENT_GENERATED, OPPORTUNITY_CREATED, OPPORTUNITY_WON, OPPORTUNITY_LOST, OPPORTUNITY_ASSIGNED, OPPORTUNITY_SLA_BREACHED, FLOWS_PAUSED_CHANNEL_DOWN, FLOWS_RESUMED, FLOW_RESUME_REQUIRED, FLOW_RUN_FAILED, FLOW_RUN_AT_RISK, DOMAIN_CONNECTED, DOMAIN_MIGRATION_NEEDED, DOMAIN_SETUP_PENDING, DOMAIN_DISCONNECTED, SKILLS_UPDATE_AVAILABLE, CREDITS_LOW, GROUPS_ALERT, CHANNEL_ACCOUNT_LIVECHAT_DISABLED, EMAIL_INBOX_SYNC_FAILING, EMAIL_INBOX_SYNC_RECOVERED, WHATSAPP_NUMBER_UNAVAILABLE, WHATSAPP_NUMBER_RESTORED, CHANNEL_RECONNECT_REQUIRED, CHANNEL_DISCONNECTED, WHATSAPP_COEXISTENCE_DISCONNECTED, WHATSAPP_COEXISTENCE_INACTIVITY_WARNING, NEW_MESSAGE, CONVERSATION_ASSIGNED, SCHEDULED_MESSAGE_FAILED, MARKETPLACE_TESTIMONIAL_REQUESTED, MARKETPLACE_TESTIMONIAL_SUBMITTED, TASK_ASSIGNED. Canal que o tipo não usa responde `invalid_input`. Devolve a matriz inteira.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/notifications.prefs_set` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `notifications_prefs_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `notifications.prefs_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "ALL" \| "PURCHASE_COMPLETED" \| "PIX_EXPIRED" \| "TRIAL_STARTED" \| "PAYMENT_GENERATED" \| "OPPORTUNITY_CREATED" \| "OPPORTUNITY_WON" \| "OPPORTUNITY_LOST" \| "OPPORTUNITY_ASSIGNED" \| "OPPORTUNITY_SLA_BREACHED" \| "FLOWS_PAUSED_CHANNEL_DOWN" \| "FLOWS_RESUMED" \| "FLOW_RESUME_REQUIRED" \| "FLOW_RUN_FAILED" \| "FLOW_RUN_AT_RISK" \| "DOMAIN_CONNECTED" \| "DOMAIN_MIGRATION_NEEDED" \| "DOMAIN_SETUP_PENDING" \| "DOMAIN_DISCONNECTED" \| "SKILLS_UPDATE_AVAILABLE" \| "CREDITS_LOW" \| "GROUPS_ALERT" \| "CHANNEL_ACCOUNT_LIVECHAT_DISABLED" \| "EMAIL_INBOX_SYNC_FAILING" \| "EMAIL_INBOX_SYNC_RECOVERED" \| "WHATSAPP_NUMBER_UNAVAILABLE" \| "WHATSAPP_NUMBER_RESTORED" \| "CHANNEL_RECONNECT_REQUIRED" \| "CHANNEL_DISCONNECTED" \| "WHATSAPP_COEXISTENCE_DISCONNECTED" \| "WHATSAPP_COEXISTENCE_INACTIVITY_WARNING" \| "NEW_MESSAGE" \| "CONVERSATION_ASSIGNED" \| "SCHEDULED_MESSAGE_FAILED" \| "MARKETPLACE_TESTIMONIAL_REQUESTED" \| "MARKETPLACE_TESTIMONIAL_SUBMITTED" \| "TASK_ASSIGNED" | sim |  |
| `channel` | "inApp" \| "mobilePush" | sim |  |
| `enabled` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/notifications.prefs_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"PURCHASE_COMPLETED","channel":"mobilePush","enabled":false}'
```

CLI:

```bash
node cli/atomiks.mjs notifications.prefs_set --json '{"kind":"PURCHASE_COMPLETED","channel":"mobilePush","enabled":false}'
```

MCP: ferramenta `notifications_prefs_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/notifications.prefs_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.list

Listar as contas conectadas de WhatsApp ou Instagram. As "instâncias de canal" do original (`GET /channel-instances`), só do canal pedido (`whatsapp`: números da API oficial e por QR code; `instagram`) e só as que o membro pode usar. Cada item traz `status` (`live`, `connecting` = QR ainda sem leitura, `error` = precisa reconectar), `syncing` (coexistência importando o histórico), número e conta da WABA, qualidade (`GREEN`/`YELLOW`/`RED`), limite de envio (`messagingLimitTier`), status do número, verificação do negócio e nome em revisão (da Meta, ao vivo e com cache de 5 minutos), nome, usuário, foto, seguidores e mídias do Instagram, `usagePermissions` (Chat ao Vivo, automações e disparo) e as flags do Atomiks (`humanAgent`, `receiveGroups`, `alwaysOnline`). Dado que a Meta não devolver vem `null`. Desconectados não aparecem.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channel` | "whatsapp" \| "instagram" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channel":"whatsapp"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.list --json '{"channel":"whatsapp"}'
```

MCP: ferramenta `channel_connections_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.get

Ver uma conta conectada de WhatsApp ou Instagram. O mesmo item de `channel_connections.list` para uma conta só (`GET /channel-instances/{id}`). `not_found` se a conta não existe, foi desconectada ou o membro não pode usá-la.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.get --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channel_connections_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.refresh

Atualizar os dados de uma conta conectada. Busca de novo na Meta (ou no Instagram) a qualidade, o limite de envio, o status e a verificação do número, ou o nome, a foto e as contagens da conta do Instagram, ignorando o cache (`POST /channel-instances/{id}/resync`). Devolve o item atualizado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.refresh` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_refresh`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.refresh`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.refresh \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.refresh --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channel_connections_refresh` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.refresh.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.members

Quem pode usar cada conta de WhatsApp ou Instagram. Para cada conta do canal pedido, as pessoas da conta e se podem usá-la: administradores sempre (`alwaysAllowed`, `seatRole` `admin`) e membros só se a conta estiver liberada para eles em Configurações > Equipe (`hasAccess`). Traz nome e foto do perfil. `managementAccess` é sempre `false` (o Atomiks não separa gestão de uso). Só administrador (o `channels:manage` do original).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.members` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_members`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.members`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channel` | "whatsapp" \| "instagram" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.members \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channel":"whatsapp"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.members --json '{"channel":"whatsapp"}'
```

MCP: ferramenta `channel_connections_members` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.members.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.members_update

Escolher quem pode usar uma conta de WhatsApp ou Instagram. Define quais membros (não administradores) veem esta conta: `memberIds` é a lista completa dos que ficam com acesso. Administradores têm acesso sempre. Quem estava com acesso a todas as contas (`*`) passa a ter a lista explícita das contas da conta atual, menos esta se foi desmarcado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.members_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_members_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.members_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `memberIds` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.members_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","memberIds":[]}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.members_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","memberIds":[]}'
```

MCP: ferramenta `channel_connections_members_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.members_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.profile_get

Ver o perfil comercial de um número de WhatsApp. O perfil que os clientes veem no WhatsApp (`whatsapp_business_profile` da Graph): sobre, descrição, endereço, e-mail, categoria, sites e foto, mais o nome de exibição e se um novo nome está em revisão. Só número da API oficial. `coexistence` diz que o número usa o app WhatsApp Business: a foto é do app e o nome passa por revisão manual.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.profile_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.profile_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.profile_get --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channel_connections_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.profile_update

Editar o perfil comercial de um número de WhatsApp. Grava na Meta (`POST /{phone_number_id}/whatsapp_business_profile`) só os campos enviados: `about` (até 139), `description` (até 512), `address` (até 256), `email`, `vertical` (categoria) e `websites` (até 2, com https). Texto vazio apaga o campo. Devolve o perfil atualizado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.profile_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_profile_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.profile_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `about` | string | não |  |
| `description` | string | não |  |
| `address` | string | não |  |
| `email` | "" \| string (email) | não |  |
| `vertical` | "" \| "AUTO" \| "BEAUTY" \| "APPAREL" \| "EDU" \| "ENTERTAIN" \| "EVENT_PLAN" \| "FINANCE" \| "GROCERY" \| "GOVT" \| "HOTEL" \| "HEALTH" \| "NONPROFIT" \| "PROF_SERVICES" \| "RETAIL" \| "TRAVEL" \| "RESTAURANT" \| "OTHER" | não |  |
| `websites` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.profile_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","description":"Loja de roupas"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.profile_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","description":"Loja de roupas"}'
```

MCP: ferramenta `channel_connections_profile_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.profile_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.display_name_update

Pedir a troca do nome de exibição de um número de WhatsApp. Envia o novo nome à Meta (`new_display_name`). O nome passa por revisão e só vale depois da aprovação; até lá o nome atual continua. Devolve `pendingReview`. Número em coexistência: a Meta revisa à mão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.display_name_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_display_name_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.display_name_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.display_name_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","name":"Minha Loja"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.display_name_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","name":"Minha Loja"}'
```

MCP: ferramenta `channel_connections_display_name_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.display_name_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.profile_photo

Trocar a foto do perfil de um número de WhatsApp. Recebe a imagem (JPEG ou PNG, até 5 MB, em base64), envia à Meta pelo envio retomável (`/{app_id}/uploads`) e liga o resultado ao perfil (`profile_picture_handle`). Não vale para número em coexistência (a foto é do app WhatsApp Business). Exige `META_APP_ID` no servidor.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.profile_photo` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_profile_photo`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.profile_photo`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `mimeType` | "image/jpeg" \| "image/png" | sim |  |
| `dataBase64` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.profile_photo \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","mimeType":"image/png","dataBase64":"iVBORw0KGgo="}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.profile_photo --json '{"channelId":"00000000-0000-0000-0000-000000000000","mimeType":"image/png","dataBase64":"iVBORw0KGgo="}'
```

MCP: ferramenta `channel_connections_profile_photo` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.profile_photo.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.templates_list

Listar os templates de um número de WhatsApp. Os modelos da Meta do número, com categoria, status (`APPROVED`, `PENDING`, `REJECTED`, `PAUSED`), motivo da recusa, cabeçalho, corpo, rodapé e botões. Sincroniza antes se a última sincronização tem mais de 1 hora ou com `sync: true`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.templates_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_templates_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.templates_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `sync` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.templates_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","sync":false}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.templates_list --json '{"channelId":"00000000-0000-0000-0000-000000000000","sync":false}'
```

MCP: ferramenta `channel_connections_templates_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.templates_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.template_create

Criar um template de WhatsApp e enviar para análise. Cria o modelo na Meta (`POST /{waba}/message_templates`) e ele entra em análise. `name` com minúsculas, números e sublinhado; `category` `MARKETING` ou `UTILITY`; `language` (`pt_BR`, `pt_PT`, `en`, `es`...). `body` até 1024 caracteres, sem variável no começo nem no fim, e com `bodyExamples` (um exemplo por variável `{{1}}`, `{{2}}`...). Cabeçalho de texto (até 60, uma variável com `headerExample`), rodapé (até 60) e botões: até 3 de resposta ou 2 de link (variável só no fim da URL, com `example`). Cabeçalho de mídia, localização e autenticação ainda não.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.template_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_template_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.template_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `name` | string | sim |  |
| `category` | "MARKETING" \| "UTILITY" | sim |  |
| `language` | string | sim |  |
| `headerText` | string | não |  |
| `headerExample` | string | não |  |
| `body` | string | sim |  |
| `bodyExamples` | string[] | não | padrão [] |
| `footer` | string | não |  |
| `buttons` | object[] | não | padrão [] |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.template_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","name":"boas_vindas","category":"UTILITY","language":"pt_BR","body":"Olá {{1}}, seu pedido foi recebido.","bodyExamples":["Ana"],"buttons":[]}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.template_create --json '{"channelId":"00000000-0000-0000-0000-000000000000","name":"boas_vindas","category":"UTILITY","language":"pt_BR","body":"Olá {{1}}, seu pedido foi recebido.","bodyExamples":["Ana"],"buttons":[]}'
```

MCP: ferramenta `channel_connections_template_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.template_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.template_delete

Excluir um template de WhatsApp. Apaga o modelo na Meta (`DELETE /{waba}/message_templates?name=`), em todos os idiomas daquele nome, e atualiza a lista. Não dá para desfazer.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.template_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_template_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.template_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.template_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","name":"boas_vindas"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.template_delete --json '{"channelId":"00000000-0000-0000-0000-000000000000","name":"boas_vindas"}'
```

MCP: ferramenta `channel_connections_template_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.template_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.test_status

Ver se o número já recebeu uma mensagem para o teste. A conversa mais recente deste número com a janela de 24 h aberta (quem escreveu por último), para o passo "Teste a conexão": `received` diz se já chegou mensagem, com `conversationId` para responder por `inbox.send`, o telefone e quando a janela fecha. Só número da API oficial.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.test_status` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_test_status`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.test_status`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.test_status \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.test_status --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channel_connections_test_status` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.test_status.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.whatsapp_web_history

Ligar ou desligar o histórico no pareamento de um número por QR code. Liga a importação de histórico na sessão do número: ao ler o QR code o WhatsApp entrega as conversas antigas e o Atomiks as importa (conversas individuais, até 50 mensagens por conversa, como histórico: sem não lida nem notificação). Só vale antes de o número parear; o WhatsApp decide quanto entrega, sem filtro por período. Desligado é o padrão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.whatsapp_web_history` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_whatsapp_web_history`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.whatsapp_web_history`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `importHistory` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.whatsapp_web_history \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","importHistory":true}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.whatsapp_web_history --json '{"channelId":"00000000-0000-0000-0000-000000000000","importHistory":true}'
```

MCP: ferramenta `channel_connections_whatsapp_web_history` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.whatsapp_web_history.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.diagnostics

Eventos e falhas recentes de uma conta conectada. O rastro da conexão (`channel_events`): os últimos 20 eventos do ciclo da conta (criada, credenciais obtidas, webhooks registrados, ativada, dados atualizados, permissões, desconexão, erro...), cada um com `outcome` (`success`, `failure`, `partial`, `in_progress`) e `traceId` (o `request_id` que liga ao Registro de auditoria). `failures` reúne, entre os últimos 100 eventos, os de falha, mais as falhas ao processar webhooks (`webhook_events`). Só administrador.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.diagnostics` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_diagnostics`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.diagnostics`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.diagnostics \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.diagnostics --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `channel_connections_diagnostics` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.diagnostics.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# channel_connections.usage_update

Ligar ou desligar o que uma conta de WhatsApp ou Instagram pode fazer. Edita as "Permissões de uso" da conta: `liveChat` (responder pelo Atendimento), `automations` (fluxos e automações enviarem por ela) e `broadcast` (envio em massa; só o número da API oficial). Mande um ou mais campos. Desligado, o envio daquele tipo é recusado com `forbidden`; as conversas e os dados ficam. Devolve a conta atualizada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/channel_connections.usage_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `channels:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `channel_connections_usage_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `channel_connections.usage_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `liveChat` | boolean | não |  |
| `automations` | boolean | não |  |
| `broadcast` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/channel_connections.usage_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","automations":false}'
```

CLI:

```bash
node cli/atomiks.mjs channel_connections.usage_update --json '{"channelId":"00000000-0000-0000-0000-000000000000","automations":false}'
```

MCP: ferramenta `channel_connections_usage_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/channel_connections.usage_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.list

Listar campos customizados de Contatos ou Oportunidades. Todos os campos do escopo (`entityType`: `leads` = Contatos, `opportunities` = Oportunidades), ativos e inativos, em ordem. Cada um traz a chave (`fieldName`), o rótulo (`displayName`), o tipo, as opções, a descrição, `required`, `filterable`, `pinned`, `isActive`, o grupo (`groupName`, nulo = sem grupo), `unique`, o preenchimento (`fillRate` de 0 a 1, `filledCount` de `totalRecords`) e os consumidores reais (`usageCount`, `usageByKind`: segmentos, automações e agendas que citam o campo). Também devolve `totalFields` (ativos), `inactiveFields`, `healthDistribution`, `typeCounts` e `groups` (quantidade de campos ativos e preenchimento médio por grupo).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.list --json '{"entityType":"leads"}'
```

MCP: ferramenta `custom_fields_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.counts

Quantidade de campos customizados por escopo. Campos ativos de Contatos (`leads`) e de Oportunidades (`opportunities`): os números ao lado de "Aplicado em".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.counts` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_counts`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.counts`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.counts \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.counts --json '{}'
```

MCP: ferramenta `custom_fields_counts` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.counts.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.create

Criar campo customizado de Contatos ou Oportunidades. Cria o campo no escopo `entityType`. `fieldName` (a-z, 0-9, _) sai do nome de exibição se omitido (repetido informado dá `invalid_input`; o gerado ganha `_2`, `_3`). `groupName` põe o campo num grupo. Os tipos `select`, `multi_select` e `radio` exigem `options` (lista de textos ou `{label, value}`); os demais não aceitam. O tipo e a chave não mudam depois. Vai para o fim da lista.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `displayName` | string | sim |  |
| `fieldName` | string | não |  |
| `fieldType` | "text" \| "textarea" \| "number" \| "currency" \| "percentage" \| "date" \| "select" \| "multi_select" \| "radio" \| "link" \| "rating" \| "boolean" \| "file" \| "image" | sim |  |
| `groupName` | string \| null | não |  |
| `options` | string \| object[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","displayName":"Cidade","fieldType":"text"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.create --json '{"entityType":"leads","displayName":"Cidade","fieldType":"text"}'
```

MCP: ferramenta `custom_fields_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.update

Editar campo customizado de Contatos ou Oportunidades. Muda o nome de exibição, a descrição, as opções (só campos de seleção; valores já gravados que saírem das opções continuam guardados), `required`, `filterable`, `pinned`, `unique`, `groupName` (nulo ou vazio tira do grupo) e `isActive`. `isActive: false` é o "Excluir campo" da tela: o campo sai de formulários, filtros e relatórios, os valores continuam guardados e voltam ao reativar (`true`). A chave e o tipo não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `id` | string (uuid) | sim |  |
| `displayName` | string | não |  |
| `description` | string \| null | não |  |
| `options` | string \| object[] | não |  |
| `required` | boolean | não |  |
| `filterable` | boolean | não |  |
| `pinned` | boolean | não |  |
| `unique` | boolean | não |  |
| `groupName` | string \| null | não |  |
| `isActive` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000","displayName":"Cidade natal"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.update --json '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000","displayName":"Cidade natal"}'
```

MCP: ferramenta `custom_fields_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.bulk_update

Alterar vários campos customizados. Aplica o mesmo `patch` a vários campos (`ids`, até 200, do escopo `entityType`): `groupName` (nulo tira do grupo), `filterable`, `pinned`, `required` e `isActive`. Devolve `updated`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.bulk_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_bulk_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.bulk_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `ids` | string (uuid)[] | sim |  |
| `patch` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.bulk_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","ids":["00000000-0000-0000-0000-000000000000"],"patch":{"pinned":true}}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.bulk_update --json '{"entityType":"leads","ids":["00000000-0000-0000-0000-000000000000"],"patch":{"pinned":true}}'
```

MCP: ferramenta `custom_fields_bulk_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.bulk_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.reorder

Reordenar os campos customizados. Define a posição e o grupo dos campos citados em `items` (`{id, order, groupName}`, o que o arrastar da tela envia). Campo de fora fica como estava. Devolve `updated`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.reorder` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_reorder`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.reorder`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `items` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.reorder \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","items":[{"id":"00000000-0000-0000-0000-000000000000","order":0,"groupName":null}]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.reorder --json '{"entityType":"leads","items":[{"id":"00000000-0000-0000-0000-000000000000","order":0,"groupName":null}]}'
```

MCP: ferramenta `custom_fields_reorder` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.reorder.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.groups

Grupos de campos customizados. Nomes dos grupos já usados pelos campos do escopo (para o seletor "Grupo"), em ordem alfabética.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.groups` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_groups`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.groups`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.groups \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.groups --json '{"entityType":"leads"}'
```

MCP: ferramenta `custom_fields_groups` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.groups.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.insights

Uso de um campo customizado. As abas Uso e Onde é usado: `fillRate`, `fillCount` de `totalEntities` (contatos ou oportunidades da conta), `emptyCount`, `filledLast30Days`, `trend` (curva acumulada dos últimos 6 meses: `month` AAAA-MM, `filled`, `fillRate`), `numeric` (mínimo, média, máximo e soma, só campos numéricos), `distinctValues`, `topValues` (`label`, `count`, `share`) e `references` (segmentos, automações e agendas que citam o campo; é o que pararia ao inativar). `lastEditedAt` é o último preenchimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.insights` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_insights`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.insights`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.insights \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.insights --json '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_fields_insights` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.insights.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.records

Quem preencheu um campo customizado. A aba Quem preencheu: os registros (contatos ou oportunidades) que têm valor no campo, do preenchimento mais recente para o mais antigo (`limit` até 100, padrão 50). Cada um traz `entityId`, `name`, `value` em texto, `filledAt` e `source` (manual, import, form, booking, webchat, flow, api, system, unknown; valor sem origem registrada vem como `unknown`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.records` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_records`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.records`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entityType` | "leads" \| "opportunities" | sim |  |
| `id` | string (uuid) | sim |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.records \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.records --json '{"entityType":"leads","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_fields_records` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.records.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.values_get

Valores dos campos customizados de uma oportunidade. Os campos ativos de Oportunidades (`custom_fields.list` com `entityType: opportunities`), cada um com o `value` gravado na oportunidade `id` (nulo quando vazio), na ordem da tela: é o que a gaveta da oportunidade mostra. O valor segue o tipo: texto, número, `AAAA-MM-DD`, opção, lista de opções (`multi_select`), sim/não, link, 1 a 5 (`rating`) ou id de arquivo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.values_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_values_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.values_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entity` | "opportunity" | sim |  |
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.values_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entity":"opportunity","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.values_get --json '{"entity":"opportunity","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `custom_fields_values_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.values_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# custom_fields.values_set

Gravar valores de campos customizados de uma oportunidade. Lista de `{fieldId, value}` (até 50); `value: null` limpa, exceto em campo obrigatório. Cada valor é validado pelo tipo do campo (texto, número, data `AAAA-MM-DD`, opção, lista de opções, link, 1 a 5, sim/não, id de arquivo). Tudo ou nada: um valor inválido recusa o pedido. Devolve os campos ativos com os valores, como `custom_fields.values_get`. `unique` ainda não é verificado na gravação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/custom_fields.values_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `custom_fields_values_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `custom_fields.values_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `entity` | "opportunity" | sim |  |
| `id` | string (uuid) | sim |  |
| `values` | object[] | sim |  |
| `source` | "manual" \| "import" \| "form" \| "booking" \| "webchat" \| "flow" \| "api" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/custom_fields.values_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entity":"opportunity","id":"00000000-0000-0000-0000-000000000000","values":[{"fieldId":"00000000-0000-0000-0000-000000000000","value":"Mentoria"}]}'
```

CLI:

```bash
node cli/atomiks.mjs custom_fields.values_set --json '{"entity":"opportunity","id":"00000000-0000-0000-0000-000000000000","values":[{"fieldId":"00000000-0000-0000-0000-000000000000","value":"Mentoria"}]}'
```

MCP: ferramenta `custom_fields_values_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/custom_fields.values_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.overview

Números por pipeline (lista de todos os pipelines). Pipelines não arquivados da conta com o que a lista de pipelines mostra: contatos, valor total, oportunidades abertas, ganhas e perdidas (quantidade e valor, em centavos), última atividade (a atualização mais recente de uma oportunidade), atendentes e tipos vinculados, e o funil por etapa (quantidade e valor).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.overview`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.overview --json '{}'
```

MCP: ferramenta `pipelines_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.settings_get

Ver as configurações de um pipeline. Nome, grupo, se é o padrão e se está arquivado, mais o que a tela "Configurações do Pipeline" guarda: descrição, distribuição automática (`autoAssign`, `autoAssignStrategy` manual ou rodízio), SLA de inatividade e de primeiro contato, propriedade e agendamento, motivos de perda (`lostReasons`, `restrictLossReasons`), prioridade e moeda padrão, exibição do card (`cardDisplay`) e o pixel do pipeline. Sem a migration de configurações, devolve os padrões.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.settings_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_settings_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.settings_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.settings_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.settings_get --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_settings_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.settings_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.settings_update

Alterar as configurações de um pipeline. Altera só o que for enviado (campos de `pipelines.settings_get`; nome e grupo ficam em `crm.pipeline_update`). `description` vazio limpa; `slaTargetStageId` precisa ser etapa do pipeline; `lostReasons` troca a lista inteira; `cardDisplay` troca o objeto inteiro (chaves `show…` e `hideWhenEmpty`). Exige a migration de configurações (`migration_pendente` sem ela).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.settings_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_settings_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.settings_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `description` | string \| null | não |  |
| `autoAssign` | boolean | não |  |
| `autoAssignStrategy` | "manual" \| "round_robin" | não |  |
| `slaEnabled` | boolean | não |  |
| `slaInactivityDays` | integer | não |  |
| `slaTargetStageId` | string (uuid) \| null | não |  |
| `slaFirstContactEnabled` | boolean | não |  |
| `slaFirstContactMinutes` | integer | não |  |
| `assignResponsibleOnScheduling` | boolean | não |  |
| `restrictSchedulingToPeers` | boolean | não |  |
| `lostReasons` | string[] | não |  |
| `restrictLossReasons` | boolean | não |  |
| `defaultPriority` | "urgent" \| "high" \| "medium" \| "low" \| "none" | não |  |
| `defaultCurrency` | "BRL" \| "USD" \| "EUR" | não |  |
| `cardDisplay` | object | não |  |
| `pixelEnabled` | boolean | não |  |
| `pixelEvent` | string \| null | não |  |
| `cardOrder` | "manual" \| "createdAtDesc" \| "createdAtAsc" \| "stageTimeAsc" \| "stageTimeDesc" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.settings_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","autoAssign":true}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.settings_update --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","autoAssign":true}'
```

MCP: ferramenta `pipelines_settings_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.settings_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.archive_set

Arquivar ou restaurar um pipeline. `archived: true` esconde o pipeline das listas (o padrão não pode: marque outro antes); `archived: false` o restaura. Os cards permanecem salvos. Devolve as configurações do pipeline.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.archive_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_archive_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.archive_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `archived` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.archive_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","archived":true}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.archive_set --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","archived":true}'
```

MCP: ferramenta `pipelines_archive_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.archive_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stages_reorder

Reordenar as etapas abertas de um pipeline. Define a ordem das etapas abertas (`stageIds`, todas as abertas do pipeline, sem repetir); Ganho e Perdido ficam sempre no fim.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stages_reorder` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stages_reorder`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stages_reorder`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `stageIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stages_reorder \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stages_reorder --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_stages_reorder` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stages_reorder.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_rules_list

Regras das etapas de um pipeline. Regras de cada etapa do pipeline (campos obrigatórios, limite de cards, direção) com o número atual de cards (`currentCount`). Etapa sem regra volta com os padrões (tudo desligado).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_rules_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_rules_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_rules_list --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_stage_rules_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_rules_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_rules_get

Regras de uma etapa. Campos obrigatórios para entrar (`requiredOn`, `requiredFields` com `kind` standard ou custom), limite de cards (`wipOn`, `wipLimit`, `wipMode` warn ou block), direção permitida (`directionOn`, `direction`: any, forward, one_step, terminal) e `currentCount`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_rules_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_rules_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `stageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_rules_get --json '{"stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_stage_rules_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_rules_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_rules_set

Definir as regras de uma etapa. Troca as regras da etapa aberta (campos de `pipelines.stage_rules_get`; o que não for enviado fica como está). Os campos obrigatórios padrão (`kind: standard`) são: value, expectedClosingDate, priority, probability, origin, title, productIds, primaryCompany, primaryAttendant; `kind: custom` leva o id de um campo de `custom_fields.list` com `entityType: opportunities` (campo arquivado ou apagado deixa de exigir). Exige a migration de configurações.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_rules_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_rules_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `stageId` | string (uuid) | sim |  |
| `requiredOn` | boolean | não |  |
| `requiredFields` | object[] | não |  |
| `wipOn` | boolean | não |  |
| `wipLimit` | integer | não |  |
| `wipMode` | "warn" \| "block" | não |  |
| `directionOn` | boolean | não |  |
| `direction` | "any" \| "forward" \| "one_step" \| "terminal" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_rules_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stageId":"00000000-0000-0000-0000-000000000000","wipOn":true,"wipLimit":20,"wipMode":"warn"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_rules_set --json '{"stageId":"00000000-0000-0000-0000-000000000000","wipOn":true,"wipLimit":20,"wipMode":"warn"}'
```

MCP: ferramenta `pipelines_stage_rules_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_rules_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_move_check

Conferir se um card pode ir para uma etapa. Avalia as regras antes de mover: campos obrigatórios e limite de cards da etapa de destino, direção da etapa de origem. `allowed` é falso quando alguma violação bloqueia (`blocking`); aviso de limite (`mode: warn`) não bloqueia e pede confirmação na tela. Não move nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_move_check` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_move_check`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_move_check`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `opportunityId` | string (uuid) | sim |  |
| `toStageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_move_check \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"opportunityId":"00000000-0000-0000-0000-000000000000","toStageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_move_check --json '{"opportunityId":"00000000-0000-0000-0000-000000000000","toStageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_stage_move_check` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_move_check.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_get

Detalhe da oportunidade (gaveta). Tudo que a gaveta da oportunidade mostra: o card (contatos, empresas e ofertas vinculados, responsável e atendentes por papel, tags, prioridade, previsão, probabilidade, origem, "indicado por", motivo e observação da perda), as etapas do pipeline, as passagens por etapa (tempo em cada uma), os motivos de perda já usados no pipeline e o total de arquivos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_extra_set

Editar "indicado por" da oportunidade. Define (ou limpa com `null`) o campo "Indicado por" do card. Os demais campos (título, valor, prioridade, previsão, probabilidade, origem) saem por `crm.opportunity_update`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_extra_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_extra_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_extra_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `referredBy` | string \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_extra_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","referredBy":"Ana"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_extra_set --json '{"id":"00000000-0000-0000-0000-000000000000","referredBy":"Ana"}'
```

MCP: ferramenta `pipelines_opportunity_extra_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_extra_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_status_set

Marcar a oportunidade como ganha, perdida ou reabrir. `won` e `lost` levam o card para a etapa Ganho/Perdido do pipeline (`lost` aceita `lossReason` e `lossObservation`); `open` reabre na primeira etapa aberta. Dispara o evento da Meta e a cadência da etapa, como `crm.opportunity_move`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_status_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_status_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_status_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `status` | "open" \| "won" \| "lost" | sim |  |
| `lossReason` | string | não |  |
| `lossObservation` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_status_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","status":"lost","lossReason":"Preço"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_status_set --json '{"id":"00000000-0000-0000-0000-000000000000","status":"lost","lossReason":"Preço"}'
```

MCP: ferramenta `pipelines_opportunity_status_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_status_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_links_set

Vincular contatos, empresas e ofertas à oportunidade. Troca as listas informadas (as omitidas ficam como estão). O primeiro de cada lista é o principal (`contactId`, `companyId` e `productId` do card; o contato principal não pode ficar vazio); os demais ficam nos vínculos extras. `applyOfferValue: true` troca o valor do card pela soma do preço das ofertas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_links_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_links_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_links_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `contactIds` | string (uuid)[] | não |  |
| `companyIds` | string (uuid)[] | não |  |
| `offerIds` | string (uuid)[] | não |  |
| `applyOfferValue` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_links_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","offerIds":["00000000-0000-0000-0000-000000000000"],"applyOfferValue":true}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_links_set --json '{"id":"00000000-0000-0000-0000-000000000000","offerIds":["00000000-0000-0000-0000-000000000000"],"applyOfferValue":true}'
```

MCP: ferramenta `pipelines_opportunity_links_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_links_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_tags_set

Definir as tags da oportunidade. Troca as tags do card por `tagIds` (de `crm.tags_list`). As tags do contato não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_tags_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_tags_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_tags_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `tagIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_tags_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","tagIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_tags_set --json '{"id":"00000000-0000-0000-0000-000000000000","tagIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_opportunity_tags_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_tags_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_assignments_set

Definir os atendentes da oportunidade por papel. Troca os atendentes do card (um por papel, `attendantTypeId`; sem papel vale "Sem categoria"). O principal (`isPrimary`, ou o primeiro) vira o responsável (`ownerId`). Lista vazia tira todos os atendentes e o responsável. Diferente de `crm.opportunities_bulk_attendants`, aceita lista vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_assignments_set` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_assignments_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_assignments_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `assignments` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_assignments_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_assignments_set --json '{"id":"00000000-0000-0000-0000-000000000000","assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

MCP: ferramenta `pipelines_opportunity_assignments_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_assignments_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_feed

Linha do tempo da oportunidade. Atividades do contato (as da oportunidade têm `opportunityId`) mais as anotações manuais do card, do mais recente para o mais antigo, no formato de `activities.list`. `q` procura no texto das anotações e nos dados de cada atividade. As anotações manuais entram todas na página 1.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_feed` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_feed`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_feed`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `q` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_feed \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_feed --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_feed` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_feed.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_activity_create

Registrar atividade manual na oportunidade. Anotação, ligação, WhatsApp, reunião, tarefa ou e-mail registrados à mão no card (`type`: note, call, whatsapp, meeting, task, email). Aparece na linha do tempo como "Atividade manual".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_activity_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_activity_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `type` | "note" \| "call" \| "whatsapp" \| "meeting" \| "task" \| "email" | sim |  |
| `description` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","type":"note","description":"Cliente pediu desconto."}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_activity_create --json '{"id":"00000000-0000-0000-0000-000000000000","type":"note","description":"Cliente pediu desconto."}'
```

MCP: ferramenta `pipelines_opportunity_activity_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_activity_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_activity_update

Editar atividade manual da oportunidade. Muda o texto de uma atividade manual (`description`) ou a fixa/desafixa (`pinned`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_activity_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_activity_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `description` | string | não |  |
| `pinned` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","description":"Texto novo"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_activity_update --json '{"id":"00000000-0000-0000-0000-000000000000","description":"Texto novo"}'
```

MCP: ferramenta `pipelines_opportunity_activity_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_activity_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_activity_delete

Apagar atividade manual da oportunidade. Apaga uma atividade manual. Não dá para desfazer.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_activity_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_activity_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_activity_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_activity_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_activity_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_activity_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_attachments_list

Arquivos da oportunidade. Arquivos anexados ao card (mais recentes primeiro), cada um com um link temporário (1 hora) em `url`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachments_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_attachments_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_attachments_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachments_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_attachments_list --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_attachments_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_attachments_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_attachment_upload

Anexar arquivo à oportunidade. Guarda um arquivo (até 10 MB; PDF, imagem, TXT, CSV, ZIP ou documento do Office) no card. `content` é o arquivo em base64.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachment_upload` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_attachment_upload`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_attachment_upload`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | sim |  |
| `mimeType` | string | sim |  |
| `content` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachment_upload \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"proposta.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQK"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_attachment_upload --json '{"id":"00000000-0000-0000-0000-000000000000","name":"proposta.pdf","mimeType":"application/pdf","content":"JVBERi0xLjQK"}'
```

MCP: ferramenta `pipelines_opportunity_attachment_upload` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_attachment_upload.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_attachment_delete

Remover arquivo da oportunidade. Remove o arquivo do card e do armazenamento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachment_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_attachment_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_attachment_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `attachmentId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_attachment_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","attachmentId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_attachment_delete --json '{"id":"00000000-0000-0000-0000-000000000000","attachmentId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_attachment_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_attachment_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.opportunity_transfer

Transferir a oportunidade para outro pipeline. Leva o card para a etapa `stageId` (aberta) de outro pipeline, no fim da coluna.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_transfer` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_opportunity_transfer`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.opportunity_transfer`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `pipelineId` | string (uuid) | sim |  |
| `stageId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.opportunity_transfer \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.opportunity_transfer --json '{"id":"00000000-0000-0000-0000-000000000000","pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_opportunity_transfer` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.opportunity_transfer.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.board

Quadro de oportunidades com filtros. Como `crm.board` (pipeline, cards por etapa em ordem, totais por etapa e próxima ação), com a consulta do quadro: busca `q`, status (`open`, `won`, `lost`, `all`), atendentes, safra (`AAAA-MM` ou `AAAA-Www`, pela criação), filtros simples (prioridade, origem, tags, produtos, empresas, contatos, valor, previsão), ordem dos cards e o filtro avançado `filter`: grupos "todas/qualquer" ligados por E/OU, com os campos de Oportunidade, Datas, Pipeline, Relações, Tarefa e `lead` (filtro de contato). Os totais e as contagens já refletem o filtro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.board` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_board`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.board`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `attendantId` | string (uuid) | não |  |
| `attendantIds` | string (uuid)[] | não |  |
| `cohort` | string | não |  |
| `status` | "open" \| "won" \| "lost" \| "all" | não |  |
| `filter` | object[] | não |  |
| `priorities` | "low" \| "normal" \| "high" \| "urgent"[] | não |  |
| `origins` | string[] | não |  |
| `tagIds` | string (uuid)[] | não |  |
| `productIds` | string (uuid)[] | não |  |
| `companyIds` | string (uuid)[] | não |  |
| `contactIds` | string (uuid)[] | não |  |
| `valueMinCents` | integer | não |  |
| `valueMaxCents` | integer | não |  |
| `expectedClosingDateFrom` | string | não |  |
| `expectedClosingDateTo` | string | não |  |
| `cardOrder` | "manual" \| "createdAtDesc" \| "createdAtAsc" \| "stageTimeAsc" \| "stageTimeDesc" | não |  |
| `pipelineId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.board \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","status":"open","priorities":["high"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.board --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","status":"open","priorities":["high"]}'
```

MCP: ferramenta `pipelines_board` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.board.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.filter_count

Contar oportunidades de um filtro avançado. Quantas oportunidades visíveis ao chamador, em todos os pipelines, casam com o filtro avançado (o número do rodapé do modal de filtro). Sem condições, conta todas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.filter_count` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_filter_count`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.filter_count`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filter` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.filter_count \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filter":[{"matcher":"all","connector":"and","conditions":[{"field":"status","operator":"equals","value":"open"}]}]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.filter_count --json '{"filter":[{"matcher":"all","connector":"and","conditions":[{"field":"status","operator":"equals","value":"open"}]}]}'
```

MCP: ferramenta `pipelines_filter_count` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.filter_count.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_cards

Cards de uma etapa, com paginação (visão em lista). Oportunidades de uma etapa na ordem do quadro, filtradas pelo `query` (busca, status, atendente, coorte). `page` a partir de 1; `perPage` até 200 (padrão 50). `meta.countItens` é o total da etapa com o filtro, `valueCents` a soma, `countPages` as páginas. Cada card traz as tags do contato e a próxima tarefa aberta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_cards` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_cards`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_cards`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `stageId` | string (uuid) | sim |  |
| `query` | object | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_cards \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_cards --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_stage_cards` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_cards.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.stage_summary

Total e valor por etapa com o filtro do quadro. Para cada etapa do pipeline: quantas oportunidades batem com o `query` e a soma dos valores (centavos). Etapas sem card vêm com zero.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.stage_summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_stage_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.stage_summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `query` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.stage_summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.stage_summary --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_stage_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.stage_summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.forecast

Previsão de vendas por período. Baldes por dia, semana (segunda a domingo) ou mês, pela data prevista de fechamento: cards abertos com probabilidade (valor e valor ponderado `valor × probabilidade`) e, com `includeWon`, os ganhos pelo valor cheio. Perdidos nunca entram. Respeita o `query` do quadro; o status dele é ignorado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.forecast` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_forecast`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.forecast`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `query` | object | não |  |
| `granularity` | "day" \| "week" \| "month" | não |  |
| `includeWon` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.forecast \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.forecast --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_forecast` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.forecast.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.forecast_cards

Cards de um período da previsão. Oportunidades elegíveis (abertas com probabilidade e, com `includeWon`, ganhas) cuja data prevista cai entre `periodStart` e `periodEnd` (AAAA-MM-DD), por data e depois maior probabilidade. Paginado como `pipelines.stage_cards`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.forecast_cards` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_forecast_cards`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.forecast_cards`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `query` | object | não |  |
| `periodStart` | string | sim |  |
| `periodEnd` | string | não |  |
| `granularity` | "day" \| "week" \| "month" | não |  |
| `includeWon` | boolean | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.forecast_cards \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","periodStart":"2026-10-26"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.forecast_cards --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","periodStart":"2026-10-26"}'
```

MCP: ferramenta `pipelines_forecast_cards` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.forecast_cards.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_move

Mover oportunidades de etapa em massa. Move as oportunidades escolhidas para uma etapa do mesmo pipeline, no fim da coluna. Ganho e Perdido ajustam `status`, `won_at` e `lost_at`; o evento da Meta e as cadências da etapa disparam como no `crm.opportunity_move`. Quem já está na etapa não conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_move` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_move`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_move`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `targetStageId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_move \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"targetStageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_move --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"targetStageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_bulk_move` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_move.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_transfer

Transferir oportunidades para outro pipeline. Leva as oportunidades para uma etapa de outro pipeline (`targetPipelineId`/`targetStageId`). `keepResponsible` mantém o responsável e `keepRoles` os atendentes por papel, só de quem atende o pipeline de destino (se ele não tem atendentes cadastrados, todos servem). Serve também para uma só oportunidade (`cardIds: [id]`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_transfer` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_transfer`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_transfer`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `targetPipelineId` | string (uuid) | sim |  |
| `targetStageId` | string (uuid) | sim |  |
| `keepResponsible` | boolean | não |  |
| `keepRoles` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_transfer \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"targetPipelineId":"00000000-0000-0000-0000-000000000000","targetStageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_transfer --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"targetPipelineId":"00000000-0000-0000-0000-000000000000","targetStageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_bulk_transfer` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_transfer.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_attendants

Atribuir atendentes por papel em massa. Troca os atendentes das oportunidades por `assignments` (um atendente por papel; o principal, ou o primeiro, vira o responsável). Igual ao `crm.opportunities_bulk_attendants`, mas aceita o filtro completo do quadro em `scope.query`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_attendants` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_attendants`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_attendants`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `assignments` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_attendants \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_attendants --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignments":[{"attendantId":"00000000-0000-0000-0000-000000000000","attendantTypeId":"00000000-0000-0000-0000-000000000000","isPrimary":true}]}'
```

MCP: ferramenta `pipelines_bulk_attendants` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_attendants.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_responsible

Definir o responsável das oportunidades em massa. `assignment.mode`: `fixed` (um atendente), `multiple` (revezamento entre `attendantIds`) ou `round_robin` (membros do time `teamId`, na ordem da fila). Troca o `owner_id` das oportunidades escolhidas; o rodízio segue a ordem em que o servidor as lê.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_responsible` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_responsible`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_responsible`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `assignment` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_responsible \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignment":{"mode":"fixed","attendantId":"00000000-0000-0000-0000-000000000000"}}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_responsible --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"assignment":{"mode":"fixed","attendantId":"00000000-0000-0000-0000-000000000000"}}'
```

MCP: ferramenta `pipelines_bulk_responsible` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_responsible.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_offers

Atribuir ofertas (produtos) em massa. No Atomiks a oferta é o produto do catálogo (`crm.products_list`). Grava o primeiro de `offerIds` como produto da oportunidade (lista vazia limpa) e, com `applyOfferValue`, troca o valor pela soma dos preços dos escolhidos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_offers` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_offers`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_offers`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `offerIds` | string (uuid)[] | sim |  |
| `applyOfferValue` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_offers \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"offerIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_offers --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"offerIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_bulk_offers` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_offers.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_value

Trocar o valor das oportunidades em massa. `value` em centavos; `null` limpa o valor.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_value` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_value`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_value`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `value` | integer \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_value \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"value":150000}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_value --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"value":150000}'
```

MCP: ferramenta `pipelines_bulk_value` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_value.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_priority

Trocar a prioridade das oportunidades em massa. `priority`: urgent, high, medium, low ou none (sem prioridade).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_priority` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_priority`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_priority`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `priority` | "urgent" \| "high" \| "medium" \| "low" \| "none" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_priority \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"priority":"high"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_priority --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"priority":"high"}'
```

MCP: ferramenta `pipelines_bulk_priority` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_priority.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_closing_date

Trocar a data de fechamento em massa. `expectedClosingDate` no formato AAAA-MM-DD; `null` limpa a data.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_closing_date` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_closing_date`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_closing_date`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `expectedClosingDate` | string \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_closing_date \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"expectedClosingDate":"2026-12-31"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_closing_date --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"expectedClosingDate":"2026-12-31"}'
```

MCP: ferramenta `pipelines_bulk_closing_date` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_closing_date.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_delete

Excluir oportunidades em massa. Apaga as oportunidades escolhidas. Vendas já registradas continuam, sem o vínculo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_delete --json '{"cardIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_bulk_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_tags

Aplicar tags aos contatos das oportunidades em massa. Soma as tags `tagIds` aos contatos das oportunidades escolhidas; quem já tem a tag não é duplicado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_tags` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_tags`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_tags`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `tagIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_tags \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"tagIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_tags --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"tagIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_bulk_tags` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_tags.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_custom_field

Gravar um campo personalizado de oportunidade em massa. `customFieldId` de `custom_fields.list` com `entityType: opportunities` (campo ativo). `value: null` apaga o valor (recusado em campo obrigatório). O valor segue o tipo do campo, como em `custom_fields.values_set`: texto, número, data AAAA-MM-DD, opção, lista de opções, sim/não, link, 1 a 5. Grava em `opportunity_field_values` (sem a migration dos campos de oportunidade responde `migration_pendente`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_custom_field` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_custom_field`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_custom_field`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `customFieldId` | string (uuid) | sim |  |
| `value` | any \| null | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_custom_field \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"customFieldId":"00000000-0000-0000-0000-000000000000","value":"Mentoria"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_custom_field --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"customFieldId":"00000000-0000-0000-0000-000000000000","value":"Mentoria"}'
```

MCP: ferramenta `pipelines_bulk_custom_field` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_custom_field.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_next_action

Criar a próxima ação (tarefa) nas oportunidades em massa. Cria uma tarefa por oportunidade, no contato dela (`type`: task, call, whatsapp ou meeting). `deadline` é um instante ISO; `attendantId` é quem faz.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_next_action` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_next_action`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_next_action`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `type` | "task" \| "call" \| "whatsapp" \| "meeting" | sim |  |
| `title` | string | sim |  |
| `deadline` | string (date-time) | não |  |
| `description` | string | não |  |
| `attendantId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_next_action \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"type":"call","title":"Ligar para fechar"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_next_action --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"type":"call","title":"Ligar para fechar"}'
```

MCP: ferramenta `pipelines_bulk_next_action` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_next_action.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.bulk_create_list

Criar uma lista com os contatos das oportunidades. Cria (ou reaproveita, se o nome já existe) uma lista de contatos e põe nela os contatos das oportunidades escolhidas, uma vez cada. `emoji` é aceito mas a lista do Atomiks não guarda emoji.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.bulk_create_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_bulk_create_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.bulk_create_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `name` | string | sim |  |
| `emoji` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.bulk_create_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"name":"Oportunidades quentes"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.bulk_create_list --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"name":"Oportunidades quentes"}'
```

MCP: ferramenta `pipelines_bulk_create_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.bulk_create_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.export_csv

Exportar oportunidades em CSV. Devolve o texto do CSV (UTF-8 com BOM) das oportunidades escolhidas, com as `columns` na ordem pedida (chaves de `EXPORT_COLUMNS` ou `cf:<id do campo personalizado do contato>`). Até 5000 linhas por chamada, sempre síncrono. Valor em unidades com duas casas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.export_csv` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_export_csv`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.export_csv`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cardIds` | string (uuid)[] | não |  |
| `allMatching` | true | não |  |
| `scope` | object | não |  |
| `columns` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.export_csv \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cardIds":["00000000-0000-0000-0000-000000000000"],"columns":["title","stageName"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.export_csv --json '{"cardIds":["00000000-0000-0000-0000-000000000000"],"columns":["title","stageName"]}'
```

MCP: ferramenta `pipelines_export_csv` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.export_csv.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.import_sources

Listas ou segmentos de contatos para importar numa etapa. Até 50 listas (`kind: "lists"`) ou segmentos (`kind: "segments"`) por busca no nome (`q`), cada um com `leadCount`. Com `ids`, devolve só esses e recalcula a contagem dos segmentos na hora (passo de confirmação).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.import_sources` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_import_sources`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.import_sources`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "lists" \| "segments" | sim |  |
| `q` | string | não |  |
| `ids` | string (uuid)[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.import_sources \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"lists"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.import_sources --json '{"kind":"lists"}'
```

MCP: ferramenta `pipelines_import_sources` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.import_sources.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.import_contacts

Importar contatos de listas e segmentos para uma etapa. Cria uma oportunidade por contato das listas (`listIds`) e segmentos (`segmentIds`, recalculados na hora) na etapa aberta, no fim da coluna e com o nome do contato como título. Contato que já tem oportunidade no pipeline é pulado (`skipped`). `assignment`: `fixed`, `multiple` (revezamento) ou `round_robin` (time); sem ele o card fica sem responsável. Etapa com limite de cards em modo `block` recusa a importação que o passaria. Até 5000 contatos por chamada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.import_contacts` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_import_contacts`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.import_contacts`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `stageId` | string (uuid) | sim |  |
| `listIds` | string (uuid)[] | não | padrão [] |
| `segmentIds` | string (uuid)[] | não |  |
| `assignment` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.import_contacts \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000","listIds":["00000000-0000-0000-0000-000000000000"]}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.import_contacts --json '{"pipelineId":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000","listIds":["00000000-0000-0000-0000-000000000000"]}'
```

MCP: ferramenta `pipelines_import_contacts` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.import_contacts.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.people_stats

Atendentes de um pipeline com contagem de oportunidades. Atendentes do pipeline (`isMember`) e, fora dele, os que têm oportunidades nele, cada um com `openCards`, `wonCards`, `lostCards` e `totalCards` neste pipeline, e os tipos de atendente. Com `includeAll`, devolve também os atendentes sem vínculo e sem oportunidades (para escolher quem entra no pipeline). Sem a migration de atendentes, ninguém é membro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.people_stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_people_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.people_stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `pipelineId` | string (uuid) | sim |  |
| `includeAll` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.people_stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.people_stats --json '{"pipelineId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_people_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.people_stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pipelines.card_move

Mover oportunidade de etapa com as regras da etapa. Igual a `crm.opportunity_move`, mas antes confere as regras da etapa de destino (`pipelines.stage_rules_*`): campo obrigatório faltando ou limite de cards (modo bloqueio) recusa o movimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pipelines.card_move` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pipelines_card_move`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pipelines.card_move`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `stageId` | string (uuid) | sim |  |
| `beforeId` | string (uuid) | não |  |
| `lostReason` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pipelines.card_move \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs pipelines.card_move --json '{"id":"00000000-0000-0000-0000-000000000000","stageId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `pipelines_card_move` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pipelines.card_move.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# audit_hub.list

Auditoria da conta. Quem alterou o quê na conta, quando e por qual canal, do mais recente ao mais antigo (último ano). Filtros por período, área, ação, canal, papel, pessoa, item e busca. Use `before` (id do último item) para a página seguinte.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/audit_hub.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `activity:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `audit_hub_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `audit_hub.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | não |  |
| `to` | string (date-time) | não |  |
| `resources` | string[] | não |  |
| `actions` | "create" \| "update" \| "delete" \| "manage" \| "import" \| "export" \| "publish" \| "unpublish" \| "activate" \| "pause" \| "archive" \| "duplicate"[] | não |  |
| `channels` | "user" \| "ai" \| "api" \| "flow" \| "system"[] | não |  |
| `roles` | "owner" \| "admin" \| "member" \| "integrator"[] | não |  |
| `people` | string (uuid)[] | não |  |
| `search` | string | não |  |
| `entity` | string | não |  |
| `before` | integer | não |  |
| `limit` | integer | não | padrão 30 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/audit_hub.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":30}'
```

CLI:

```bash
node cli/atomiks.mjs audit_hub.list --json '{"limit":30}'
```

MCP: ferramenta `audit_hub_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/audit_hub.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.hub_active

Integrações ativas (selo do catálogo). Conectores com ao menos uma integração ativa e os eventos assinados pelas integrações de saída ativas. O catálogo `/integracoes/explorar` usa para marcar o cartão como ativo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.hub_active` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_hub_active`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.hub_active`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.hub_active \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.hub_active --json '{}'
```

MCP: ferramenta `integrations_hub_active` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.hub_active.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.records

Requisições de uma integração (página). Histórico da integração como no original: entrada lista os eventos recebidos, saída as entregas. Paginado por página (`page`, `perPage`), com filtro de status (COMPLETED, PROCESSING, FAILED, DELAYED) e ordem por data. Devolve também a contagem por status (sem o filtro) para os cartões do topo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.records` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_records`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.records`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | sim |  |
| `status` | "COMPLETED" \| "PROCESSING" \| "FAILED" \| "DELAYED" | não |  |
| `order` | "ASC" \| "DESC" | não | padrão "DESC" |
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 10 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.records \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"integrationId":"00000000-0000-0000-0000-000000000000","order":"DESC","page":1,"perPage":10}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.records --json '{"integrationId":"00000000-0000-0000-0000-000000000000","order":"DESC","page":1,"perPage":10}'
```

MCP: ferramenta `integrations_records` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.records.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.record

Detalhe de uma requisição. Corpo, cabeçalhos e tentativas de uma requisição de `integrations.records`. Entrada: o corpo normalizado que o Atomiks guardou (traz dados pessoais do comprador); os cabeçalhos recebidos não são guardados. Saída: o corpo e os cabeçalhos enviados (sem a assinatura), a resposta e o erro da última tentativa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.record` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `automations:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `integrations_record`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.record`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | sim |  |
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.record \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"integrationId":"00000000-0000-0000-0000-000000000000","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.record --json '{"integrationId":"00000000-0000-0000-0000-000000000000","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_record` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.record.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.retry_delivery

Reenviar uma entrega de saída. Volta a entrega para a fila (`pending`, tentativas zeradas) e o envio roda no próximo ciclo. Só integrações de saída; entrega em andamento não pode ser reenviada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.retry_delivery` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_retry_delivery`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.retry_delivery`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `integrationId` | string (uuid) | sim |  |
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.retry_delivery \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"integrationId":"00000000-0000-0000-0000-000000000000","id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.retry_delivery --json '{"integrationId":"00000000-0000-0000-0000-000000000000","id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `integrations_retry_delivery` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.retry_delivery.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# integrations.test_url

Enviar teste para uma URL (antes de criar). Envia agora o evento `test.ping.v1` para a URL (https) da tela de criação de uma integração de saída, sem criar nada. O envio vai assinado com um segredo descartável; depois de criar, use `integrations.test`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/integrations.test_url` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `automations:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `integrations_test_url`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `integrations.test_url`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `url` | string (uri) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/integrations.test_url \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.com/atomiks"}'
```

CLI:

```bash
node cli/atomiks.mjs integrations.test_url --json '{"url":"https://hooks.example.com/atomiks"}'
```

MCP: ferramenta `integrations_test_url` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/integrations.test_url.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.segments_overview

Segmentos com a contagem de contatos. Lista de "Segmentos" (Contatos & Comercial > Segmentação > Filtros): cada segmento salvo com o total de contatos que o filtro casa agora (`leadCount`, só os contatos que quem pede vê). Do mais recentemente editado ao mais antigo; `q` filtra pelo nome. Paginação de 10 por padrão.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.segments_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_segments_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.segments_overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.segments_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":10}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.segments_overview --json '{"page":1,"perPage":10}'
```

MCP: ferramenta `segmentation_segments_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.segments_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.segment_get

Ver um segmento com a contagem de contatos. Um segmento salvo (nome, emoji, `filter`) e o total de contatos que ele casa agora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.segment_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_segment_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.segment_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.segment_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.segment_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_segment_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.segment_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.segment_duplicate

Duplicar segmento. Cria uma cópia do segmento (mesmo filtro e emoji) chamada "<nome> (cópia)"; se o nome já existe, "<nome> (cópia 2)" e assim por diante.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.segment_duplicate` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_segment_duplicate`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.segment_duplicate`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.segment_duplicate \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.segment_duplicate --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_segment_duplicate` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.segment_duplicate.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.lists_overview

Listas com contagem, compradores e receita. Lista de "Listas" (Contatos & Comercial > Segmentação > Listas): cada lista com emoji, total de contatos, última atualização e, quando há venda, compradores (`buyersCount`) e receita (`totalRevenue`, centavos). Das atualizadas há pouco para as mais antigas; `q` filtra pelo nome. 20 por página. As vendas somam até 1 000 membros por lista.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.lists_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_lists_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.lists_overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.lists_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.lists_overview --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `segmentation_lists_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.lists_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.list_get

Ver uma lista. Uma lista (nome, emoji, total de contatos, última atualização, fonte).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.list_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_list_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.list_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.list_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.list_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_list_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.list_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.list_create

Criar lista com emoji. Cria uma lista manual com nome e emoji opcional. Nome único na conta sem diferenciar maiúsculas; repetido dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.list_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_list_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.list_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `emoji` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.list_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Clientes premium","emoji":"🎯"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.list_create --json '{"name":"Clientes premium","emoji":"🎯"}'
```

MCP: ferramenta `segmentation_list_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.list_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.list_update

Editar nome e emoji da lista. Muda o nome e/ou o emoji (`null` tira o emoji). Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.list_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_list_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.list_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `emoji` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.list_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.list_update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Clientes VIP"}'
```

MCP: ferramenta `segmentation_list_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.list_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.list_recount

Reprocessar a contagem da lista. Recontar os membros da lista e marcar a atualização. A contagem do Atomiks é ao vivo; a operação existe pelo "Reprocessar contagens" do original e devolve a lista com o total atual.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.list_recount` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_list_recount`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.list_recount`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.list_recount \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.list_recount --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_list_recount` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.list_recount.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.list_analytics

Análise de uma lista: vendas, oportunidades e mensagens. Aba "Análise" da lista: `sales` (audiência, compradores, receita e ticket médio em centavos, `frequency` por número de compras e `monthly` compras por mês), `opportunities` (contatos com oportunidade, em aberto, ganhas e perdidas com valor, por funil) e `messages` (`whatsapp`: enviadas aos membros, entregues, lidas e com falha, com a taxa; `email` e `sms` são `null`). Lê até 5000 membros que quem pede vê.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.list_analytics` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_list_analytics`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.list_analytics`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.list_analytics \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.list_analytics --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_list_analytics` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.list_analytics.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.tags_overview

Minhas tags com uso. Aba "Minhas tags": cada tag com cor (hexadecimal sem "#"), contatos, oportunidades, automações e segmentos que a usam, formulários e quadros (sempre 0, não existem aqui) e data de criação. `q` filtra pelo nome; `orderBy` e `order` ordenam (padrão nome, crescente). 10 por página.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.tags_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_tags_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.tags_overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `orderBy` | "name" \| "leadsCount" \| "opportunitiesCount" \| "flowsCount" \| "segmentsCount" \| "formsCount" \| "boardsCount" \| "createdAt" | não |  |
| `order` | "asc" \| "desc" | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.tags_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orderBy":"leadsCount","order":"desc"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.tags_overview --json '{"orderBy":"leadsCount","order":"desc"}'
```

MCP: ferramenta `segmentation_tags_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.tags_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.tag_create

Criar tag com cor em hexadecimal. Cria a tag com nome (até 40) e cor hexadecimal de 6 dígitos (com ou sem "#"; padrão cinza). Nome único na conta sem diferenciar maiúsculas; repetido dá `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.tag_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_tag_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.tag_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `color` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.tag_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"VIP","color":"#3B82F6"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.tag_create --json '{"name":"VIP","color":"#3B82F6"}'
```

MCP: ferramenta `segmentation_tag_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.tag_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.tag_update

Editar nome e cor da tag. Renomeia e/ou muda a cor (hexadecimal de 6 dígitos). Campos omitidos não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.tag_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_tag_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.tag_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `color` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.tag_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Cliente VIP"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.tag_update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Cliente VIP"}'
```

MCP: ferramenta `segmentation_tag_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.tag_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.tag_usage

Uso e insights de uma tag. Painel da tag e confirmação de exclusão: contatos, oportunidades, automações e segmentos que a usam (`references`, com `kind` flow ou segment e o nome), `coverage` (contatos com a tag / contatos da conta), aplicações nos últimos 30 dias, `trend` (acumulado de 6 meses), `dailyApplied` (14 dias), `lastAppliedAt` e uma prévia de até 5 contatos (`leadsPreview`) que perdem a tag se ela for apagada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.tag_usage` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_tag_usage`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.tag_usage`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.tag_usage \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.tag_usage --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_tag_usage` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.tag_usage.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.tag_leads

Contatos que receberam a tag. Aba "Quem recebeu": os contatos que receberam a tag, do mais recente (`appliedAt`) ao mais antigo, só os que quem pede vê. `total` conta todos que a têm.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.tag_leads` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_tag_leads`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.tag_leads`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.tag_leads \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.tag_leads --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `segmentation_tag_leads` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.tag_leads.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.system_tags

Tags do sistema (eventos). Aba "Tags do sistema": cada tipo de atividade que algum contato fez (`eventName`, ex.: crm.tag.lead.apply.v1) com a categoria, os contatos (`count`), as ocorrências, as dos últimos 7 dias e a primeira e a última vez. Vem das fontes do Histórico de atividades (as 2 000 ocorrências mais recentes de cada fonte). `q` filtra pelo nome do evento; `orderBy` (eventName, count, occurrences, occurrencesLast7Days, firstSeenAt, lastSeenAt) e `order` ordenam (padrão última atividade, decrescente).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.system_tags` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_system_tags`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.system_tags`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `orderBy` | "eventName" \| "count" \| "occurrences" \| "occurrencesLast7Days" \| "firstSeenAt" \| "lastSeenAt" | não |  |
| `order` | "asc" \| "desc" | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.system_tags \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.system_tags --json '{}'
```

MCP: ferramenta `segmentation_system_tags` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.system_tags.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.system_tag_insights

Insights de uma tag do sistema. Painel do evento: `coverage` (contatos que o fizeram / contatos da conta), ocorrências (total, 7 e 30 dias), novos contatos em 30 dias, séries `daily` (30 dias) e `monthly` (6 meses), `weekdays` (domingo a sábado) e `hours` (0 a 23) no fuso da conta, `coOccurring` (outros eventos dos mesmos contatos), `topLeads` (quem mais dispara) e `flows` (automações com gatilho de entrada ou saída neste evento).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.system_tag_insights` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_system_tag_insights`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.system_tag_insights`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `eventName` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.system_tag_insights \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"eventName":"crm.tag.lead.apply.v1"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.system_tag_insights --json '{"eventName":"crm.tag.lead.apply.v1"}'
```

MCP: ferramenta `segmentation_system_tag_insights` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.system_tag_insights.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# segmentation.system_tag_activities

Ocorrências de uma tag do sistema. Histórico do evento (`/segments/tags/system/{eventName}`): as ocorrências, da mais recente à mais antiga, com a categoria e o contato (nome, e-mail, telefone). 20 por página. Mesmas fontes e mesmo limite de `activities.list`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/segmentation.system_tag_activities` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `segmentation_system_tag_activities`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `segmentation.system_tag_activities`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `eventName` | string | sim |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/segmentation.system_tag_activities \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"eventName":"crm.tag.lead.apply.v1"}'
```

CLI:

```bash
node cli/atomiks.mjs segmentation.system_tag_activities --json '{"eventName":"crm.tag.lead.apply.v1"}'
```

MCP: ferramenta `segmentation_system_tag_activities` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/segmentation.system_tag_activities.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.profile_get

Ver meu perfil completo. Perfil de Configurações > Meu usuário > Perfil: nome, sobrenome, e-mail (login, só leitura), telefone (com DDI), foto (`avatarUrl`) e endereço (CEP, país, estado, cidade, rua, número, bairro, complemento). Campo vazio vem como texto vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.profile_get` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `account_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.profile_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs account.profile_get --json '{}'
```

MCP: ferramenta `account_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.profile_update

Alterar meu perfil completo. Altera nome, sobrenome, telefone (`+` e 6 a 15 dígitos) e endereço do próprio usuário. Campo omitido não muda; texto vazio limpa (menos `firstName`, obrigatório). `zipCode` leva só os 8 dígitos. O nome completo mostrado à equipe (`me.profile_get`) passa a ser "nome sobrenome". A foto continua em `me.profile_update`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.profile_update` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `account_profile_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.profile_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `firstName` | string | não |  |
| `lastName` | string | não |  |
| `phone` | string | não |  |
| `zipCode` | string | não |  |
| `country` | string | não |  |
| `state` | string | não |  |
| `city` | string | não |  |
| `street` | string | não |  |
| `number` | string | não |  |
| `neighborhood` | string | não |  |
| `complement` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.profile_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"firstName":"Ana","lastName":"Souza","zipCode":"01310100"}'
```

CLI:

```bash
node cli/atomiks.mjs account.profile_update --json '{"firstName":"Ana","lastName":"Souza","zipCode":"01310100"}'
```

MCP: ferramenta `account_profile_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.profile_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.password_change

Trocar minha senha. Confere a senha atual (`oldPassword`) e grava a nova (`password`): 8 a 32 caracteres com maiúscula, minúscula, número e um especial entre `-#$.%&*@!~`. Só pela interface (não aceita chave de API). Limite de 5 tentativas por hora.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.password_change` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.password_change`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `oldPassword` | string | sim |  |
| `password` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.password_change \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"oldPassword":"senha-atual","password":"Nova#Senha1"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.password_change.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.plan_get

Ver o plano e o uso da conta. Plano da conta atual (nome, módulos, limites de usuários, canais, contatos e dias de retenção de mídia) e o uso de cada limite: `usage.users` (membros), `usage.channels` (números conectados) e `usage.contacts`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.plan_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `account:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `account_plan_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.plan_get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.plan_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs account.plan_get --json '{}'
```

MCP: ferramenta `account_plan_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.plan_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.plans_list

Listar os planos do Atomiks. Planos disponíveis (nome, módulos e limites) e `currentKey`, o plano da conta atual. Sem preço: a contratação não passa pelo app.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.plans_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `account:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `account_plans_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.plans_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.plans_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs account.plans_list --json '{}'
```

MCP: ferramenta `account_plans_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.plans_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.devices_list

Listar meus dispositivos conectados. Navegadores e aparelhos em que o usuário ativou os avisos (assinaturas Web Push), com nome (`Chrome no Windows`), tipo e data. Vale para todas as contas do usuário.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.devices_list` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `account_devices_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.devices_list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.devices_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs account.devices_list --json '{}'
```

MCP: ferramenta `account_devices_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.devices_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# account.device_disconnect

Desconectar um dispositivo. Apaga a assinatura do dispositivo (`id` de `account.devices_list`): ele deixa de receber avisos até ser ativado de novo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/account.device_disconnect` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `account_device_disconnect`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `account.device_disconnect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/account.device_disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs account.device_disconnect --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `account_device_disconnect` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/account.device_disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_overview

Cartões e limite de Meus produtos. Totais da tela Meus produtos: produtos (não arquivados), `total` (com arquivados), ofertas ativas, ofertas aguardando ajuste (incompletas) e faturamento (centavos, vendas ativas do CRM). `limit` vem de `plans.limits.products` do plano da conta; `null` quando o plano não limita.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_overview`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_overview --json '{}'
```

MCP: ferramenta `products_hub_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_list

Listar produtos com ofertas. Produtos da conta com ofertas, status da oferta principal, vendas, faturamento e série de vendas dos últimos 30 dias. Filtros: `search` (nome ou descrição), `types`, `categories`, `statuses` (da oferta principal), `includeActive` e `includeArchived` (padrão: os dois). Ordem em `sort`; página `page`/`perPage` (10, até 50).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `types` | "course" \| "community" \| "ebook" \| "mentorship" \| "event" \| "software" \| "physical" \| "other"[] | não |  |
| `categories` | string[] | não |  |
| `statuses` | "incomplete" \| "ready_to_submit" \| "approved" \| "archived"[] | não |  |
| `includeActive` | boolean | não |  |
| `includeArchived` | boolean | não |  |
| `sort` | "newest" \| "oldest" \| "nameAsc" \| "nameDesc" \| "salesDesc" \| "revenueDesc" | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sort":"newest","page":1,"perPage":10}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_list --json '{"sort":"newest","page":1,"perPage":10}'
```

MCP: ferramenta `products_hub_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_get

Detalhe do produto. Produto com ofertas (cada uma com status e o que falta para ativar), vendas e faturamento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_hub_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_create

Criar produto com oferta principal. Cria o produto e a oferta principal (`priceCents` mínimo 500, `recurrence` para assinatura; produto físico só aceita pagamento único e exige `quantity`). `limit_reached` quando o plano define `plans.limits.products` e a conta já usa todos. A oferta nasce inativa até estar completa.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `type` | "course" \| "community" \| "ebook" \| "mentorship" \| "event" \| "software" \| "physical" \| "other" | sim |  |
| `name` | string | sim |  |
| `description` | string | sim |  |
| `category` | string | sim |  |
| `priceCents` | integer | sim |  |
| `recurrence` | object \| null | não |  |
| `quantity` | integer | não |  |
| `checkoutType` | "internal" \| "external" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"course","name":"Curso de vendas","description":"Aulas gravadas para quem quer aprender a vender mais pelo WhatsApp, passo a passo.","category":"Educacional","priceCents":49700}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_create --json '{"type":"course","name":"Curso de vendas","description":"Aulas gravadas para quem quer aprender a vender mais pelo WhatsApp, passo a passo.","category":"Educacional","priceCents":49700}'
```

MCP: ferramenta `products_hub_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_update

Alterar produto. Altera os campos informados; o tipo não muda depois de criado. `null` limpa suporte, descritor e prazo de reembolso. `stockQuantity` é o estoque do produto físico.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `description` | string | não |  |
| `category` | string \| null | não |  |
| `supportEmail` | string (email) \| null | não |  |
| `supportPhone` | string \| null | não |  |
| `softDescriptor` | string \| null | não |  |
| `refundDays` | integer \| null | não |  |
| `stockQuantity` | integer \| null | não |  |
| `checkoutType` | "internal" \| "external" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","softDescriptor":"MINHA MARCA"}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_update --json '{"id":"00000000-0000-0000-0000-000000000000","softDescriptor":"MINHA MARCA"}'
```

MCP: ferramenta `products_hub_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_delete

Excluir produto. Exclui o produto, as ofertas, os entregáveis e os cupons. Produto com vendas registradas não é excluído (`invalid_input`): arquive. Oportunidades e vendas antigas perdem o vínculo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_hub_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.offer_save

Criar ou editar oferta. Sem `id` cria uma oferta nova (inativa); com `id` altera nome, preço (`priceCents`, mínimo 500), preço promocional (`newPriceCents`, menor que o preço) e recorrência. A oferta principal mantém o preço do produto no CRM.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.offer_save` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_offer_save`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.offer_save`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `productId` | string (uuid) | sim |  |
| `id` | string (uuid) | não |  |
| `name` | string | sim |  |
| `priceCents` | integer | sim |  |
| `newPriceCents` | integer \| null | não |  |
| `recurrence` | object \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.offer_save \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productId":"00000000-0000-0000-0000-000000000000","name":"Oferta de lançamento","priceCents":29700}'
```

CLI:

```bash
node cli/atomiks.mjs products.offer_save --json '{"productId":"00000000-0000-0000-0000-000000000000","name":"Oferta de lançamento","priceCents":29700}'
```

MCP: ferramenta `products_offer_save` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.offer_save.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.offer_set_active

Ativar ou desativar oferta. Ativa a oferta quando está completa (`incompleteReason` vazio); senão `invalid_input` com o que falta. É só o estado no Atomiks: não há publicação em gateway nem link de pagamento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.offer_set_active` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_offer_set_active`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.offer_set_active`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `active` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.offer_set_active \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","active":true}'
```

CLI:

```bash
node cli/atomiks.mjs products.offer_set_active --json '{"id":"00000000-0000-0000-0000-000000000000","active":true}'
```

MCP: ferramenta `products_offer_set_active` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.offer_set_active.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.offer_archive

Arquivar ou desarquivar oferta. Arquiva (`archived: true`) ou restaura a oferta; arquivar também a desativa. A oferta principal não é arquivada: arquive o produto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.offer_archive` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_offer_archive`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.offer_archive`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `archived` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.offer_archive \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","archived":true}'
```

CLI:

```bash
node cli/atomiks.mjs products.offer_archive --json '{"id":"00000000-0000-0000-0000-000000000000","archived":true}'
```

MCP: ferramenta `products_offer_archive` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.offer_archive.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.offer_delete

Excluir oferta. Exclui uma oferta que não seja a principal. Os cupons só dela perdem o vínculo e ela some dos entregáveis.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.offer_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_offer_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.offer_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.offer_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.offer_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_offer_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.offer_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.deliverable_list

Entregáveis do produto. Entregáveis do produto (`offerId` nulo vale para todas as ofertas) e os só de uma oferta, com `exclusions`: por oferta, os entregáveis do produto que ela não entrega.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.deliverable_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_deliverable_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.deliverable_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `productId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.deliverable_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.deliverable_list --json '{"productId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_deliverable_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.deliverable_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.deliverable_save

Criar ou editar entregável. Sem `id` cria; com `id` altera nome, categoria e `config` (link, e-mail, webhook, evento ou área de membros: o que a categoria pede). `offerId` cria um entregável só daquela oferta. O Atomiks não entrega nada sozinho: guarda o que a oferta promete.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.deliverable_save` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_deliverable_save`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.deliverable_save`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `productId` | string (uuid) | sim |  |
| `id` | string (uuid) | não |  |
| `offerId` | string (uuid) \| null | não |  |
| `category` | "file" \| "link" \| "event" \| "email" \| "membership" \| "internal_membership" \| "webhook" | sim |  |
| `name` | string | sim |  |
| `config` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.deliverable_save \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productId":"00000000-0000-0000-0000-000000000000","category":"link","name":"Acesso ao curso","config":{"url":"https://exemplo.com/curso"}}'
```

CLI:

```bash
node cli/atomiks.mjs products.deliverable_save --json '{"productId":"00000000-0000-0000-0000-000000000000","category":"link","name":"Acesso ao curso","config":{"url":"https://exemplo.com/curso"}}'
```

MCP: ferramenta `products_deliverable_save` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.deliverable_save.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.deliverable_delete

Excluir entregável. Exclui o entregável do produto ou da oferta. Ofertas já ativas que ficariam sem nenhum entregável (tipo que exige) voltam a ficar inativas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.deliverable_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_deliverable_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.deliverable_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.deliverable_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.deliverable_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_deliverable_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.deliverable_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.offer_deliverables_set

Definir o que a oferta não entrega. Troca a lista de entregáveis do produto que a oferta NÃO entrega (`excludedIds`). A oferta principal herda tudo e não aceita exclusões.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.offer_deliverables_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_offer_deliverables_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.offer_deliverables_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `offerId` | string (uuid) | sim |  |
| `excludedIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.offer_deliverables_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"offerId":"00000000-0000-0000-0000-000000000000","excludedIds":[]}'
```

CLI:

```bash
node cli/atomiks.mjs products.offer_deliverables_set --json '{"offerId":"00000000-0000-0000-0000-000000000000","excludedIds":[]}'
```

MCP: ferramenta `products_offer_deliverables_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.offer_deliverables_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.coupon_list

Cupons do produto. Cupons de desconto do produto (percentual ou valor fixo em centavos) com uso, validade e público.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.coupon_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_coupon_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.coupon_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `productId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.coupon_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.coupon_list --json '{"productId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_coupon_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.coupon_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.coupon_save

Criar ou editar cupom. Código sem espaços, único na conta (sem diferenciar maiúsculas). `discountValue`: 1 a 100 para `percentage`; centavos para `fixed`. `offerIds` nulo vale para todas as ofertas. O Atomiks não tem checkout: o cupom fica guardado, sem aplicar desconto a pagamento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.coupon_save` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_coupon_save`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.coupon_save`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `productId` | string (uuid) | sim |  |
| `id` | string (uuid) | não |  |
| `code` | string | sim |  |
| `discountType` | "percentage" \| "fixed" | sim |  |
| `discountValue` | integer | sim |  |
| `maxUses` | integer \| null | não |  |
| `startsAt` | string (date-time) \| null | não |  |
| `endsAt` | string (date-time) \| null | não |  |
| `offerIds` | string (uuid)[] \| null | não |  |
| `audience` | "everyone" \| "email_list" \| "offer_buyers" | não |  |
| `allowedEmails` | string (email)[] | não |  |
| `requiredOfferIds` | string (uuid)[] | não |  |
| `requiredMatch` | "any" \| "all" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.coupon_save \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"productId":"00000000-0000-0000-0000-000000000000","code":"DESCONTO10","discountType":"percentage","discountValue":10}'
```

CLI:

```bash
node cli/atomiks.mjs products.coupon_save --json '{"productId":"00000000-0000-0000-0000-000000000000","code":"DESCONTO10","discountType":"percentage","discountValue":10}'
```

MCP: ferramenta `products_coupon_save` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.coupon_save.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.coupon_set_active

Ativar ou desativar cupom. Liga ou desliga o cupom sem apagar o histórico de uso.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.coupon_set_active` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_coupon_set_active`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.coupon_set_active`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `active` | boolean | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.coupon_set_active \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

CLI:

```bash
node cli/atomiks.mjs products.coupon_set_active --json '{"id":"00000000-0000-0000-0000-000000000000","active":false}'
```

MCP: ferramenta `products_coupon_set_active` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.coupon_set_active.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.coupon_delete

Excluir cupom. Exclui o cupom. Para só pausar, use `products.coupon_set_active`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.coupon_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `products_coupon_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.coupon_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.coupon_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.coupon_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_coupon_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.coupon_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_dashboard

Dashboard do produto. Faturamento (centavos) por dia entre `from` e `to` (ISO) e os totais do dia, do período e de todo o tempo, sobre as vendas ativas do CRM desse produto (`sales`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_dashboard` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_dashboard`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_dashboard`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_dashboard \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","from":"2026-10-01T00:00:00.000Z","to":"2026-10-31T23:59:59.999Z"}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_dashboard --json '{"id":"00000000-0000-0000-0000-000000000000","from":"2026-10-01T00:00:00.000Z","to":"2026-10-31T23:59:59.999Z"}'
```

MCP: ferramenta `products_hub_dashboard` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_dashboard.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# products.hub_sales

Vendas do produto. Vendas do CRM desse produto, as 100 mais recentes, com contato (nome), valor (centavos), origem e se foram canceladas. A RLS de contato decide o que aparece.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/products.hub_sales` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `products_hub_sales`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `products.hub_sales`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/products.hub_sales \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs products.hub_sales --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `products_hub_sales` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/products.hub_sales.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.list

Listar atividades (tarefas e reuniões). Tarefas e reuniões dos contatos que o chamador vê, com os filtros da tela Atividades. `bucket`: `ongoing` (abertas, da mais próxima para a mais distante, sem data por último), `done` (concluídas, da mais recente) ou omitido (todas, por prazo). Paginado: `page`, `perPage` (40, até 1000); `total` é a contagem do filtro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `types` | "call" \| "whatsapp" \| "meeting" \| "task" \| "appointment"[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `overdue` | boolean | não |  |
| `overdueBefore` | string (date-time) | não |  |
| `allDayStart` | string (date-time) | não |  |
| `conditions` | object[] | não |  |
| `search` | string | não |  |
| `startDate` | string (date-time) | não |  |
| `endDate` | string (date-time) | não |  |
| `withoutDeadline` | boolean | não |  |
| `bucket` | "ongoing" \| "done" | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bucket":"ongoing"}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.list --json '{"bucket":"ongoing"}'
```

MCP: ferramenta `activities_board_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.summary

Contagens da tela Atividades. Com os mesmos filtros da lista: `total`, `ongoing` (abertas), `done` (concluídas) e `overdue` (abertas com o horário vencido; "Atrasadas").

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `types` | "call" \| "whatsapp" \| "meeting" \| "task" \| "appointment"[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `overdue` | boolean | não |  |
| `overdueBefore` | string (date-time) | não |  |
| `allDayStart` | string (date-time) | não |  |
| `conditions` | object[] | não |  |
| `search` | string | não |  |
| `startDate` | string (date-time) | não |  |
| `endDate` | string (date-time) | não |  |
| `withoutDeadline` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.summary --json '{}'
```

MCP: ferramenta `activities_board_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.calendar

Atividades do calendário por dia. Atividades com prazo entre `startDate` e `endDate`, agrupadas por dia no fuso `timeZone` (IANA; o do navegador). Cada dia traz até `perDay` itens (12) e `total` com todos, para o "+ N mais".

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.calendar` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_calendar`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.calendar`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `types` | "call" \| "whatsapp" \| "meeting" \| "task" \| "appointment"[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `overdue` | boolean | não |  |
| `overdueBefore` | string (date-time) | não |  |
| `allDayStart` | string (date-time) | não |  |
| `conditions` | object[] | não |  |
| `search` | string | não |  |
| `startDate` | string (date-time) | não |  |
| `endDate` | string (date-time) | não |  |
| `withoutDeadline` | boolean | não |  |
| `timeZone` | string | não |  |
| `perDay` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.calendar \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01T00:00:00.000Z","endDate":"2026-10-31T23:59:59.999Z"}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.calendar --json '{"startDate":"2026-10-01T00:00:00.000Z","endDate":"2026-10-31T23:59:59.999Z"}'
```

MCP: ferramenta `activities_board_calendar` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.calendar.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.export

Exportar atividades em CSV. CSV (UTF-8 com BOM) das atividades que passam nos filtros, até 5 mil: tipo, título, prazo (fuso da conta), situação, contato, e-mail, telefone, pipeline, oportunidade e atendente. Devolve o texto em `csv`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `types` | "call" \| "whatsapp" \| "meeting" \| "task" \| "appointment"[] | não |  |
| `pipelineIds` | string (uuid)[] | não |  |
| `overdue` | boolean | não |  |
| `overdueBefore` | string (date-time) | não |  |
| `allDayStart` | string (date-time) | não |  |
| `conditions` | object[] | não |  |
| `search` | string | não |  |
| `startDate` | string (date-time) | não |  |
| `endDate` | string (date-time) | não |  |
| `withoutDeadline` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.export --json '{}'
```

MCP: ferramenta `activities_board_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.set_outcome

Concluir, cancelar ou reabrir uma atividade. `done: true` conclui; `outcome: false` marca como não resolvida (tarefa) ou cancelada (reunião) e guarda `outcomeNote` (o motivo); `done: false` reabre e limpa o resultado. Sem a migration de atividades, concluir funciona e cancelar responde `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.set_outcome` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_set_outcome`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.set_outcome`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `done` | boolean | sim |  |
| `outcome` | boolean \| null | não |  |
| `outcomeNote` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.set_outcome \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","done":true,"outcome":true}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.set_outcome --json '{"id":"00000000-0000-0000-0000-000000000000","done":true,"outcome":true}'
```

MCP: ferramenta `activities_board_set_outcome` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.set_outcome.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.bulk_outcome

Concluir ou cancelar várias atividades. `action: completed` conclui com resultado positivo; `cancelled` fecha como não resolvida/cancelada com o mesmo `reason`. Até 200. Cada uma é independente: `failed` conta as que o chamador não vê ou não puderam mudar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.bulk_outcome` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_bulk_outcome`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.bulk_outcome`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `ids` | string (uuid)[] | sim |  |
| `action` | "completed" \| "cancelled" | sim |  |
| `reason` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.bulk_outcome \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["00000000-0000-0000-0000-000000000000"],"action":"completed"}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.bulk_outcome --json '{"ids":["00000000-0000-0000-0000-000000000000"],"action":"completed"}'
```

MCP: ferramenta `activities_board_bulk_outcome` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.bulk_outcome.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# activities_board.opportunity_options

Oportunidades para vincular a uma atividade. Oportunidades abertas dos contatos que o chamador vê, mais recentes primeiro, com o contato e o pipeline. `q` filtra por título, contato ou telefone; `contactId` limita a um contato. Até 30.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/activities_board.opportunity_options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `activities_board_opportunity_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `activities_board.opportunity_options`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `contactId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/activities_board.opportunity_options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"proposta"}'
```

CLI:

```bash
node cli/atomiks.mjs activities_board.opportunity_options --json '{"q":"proposta"}'
```

MCP: ferramenta `activities_board_opportunity_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/activities_board.opportunity_options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.list

Lista os cargos e quem os tem. Cargos fixos (Administrador, Membro) e nomeados, na ordem da matriz, cada um com o acesso do Atomiks (módulos, telas, canais) e as pessoas que o têm. `writable` é falso antes da migration dos cargos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `roles_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs roles.list --json '{}'
```

MCP: ferramenta `roles_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.create

Cria um cargo. Do zero (só as telas pessoais) ou de um modelo do original (operator, collaborator, attendant, finance, guest). Nome repetido responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `template` | "operator" \| "collaborator" \| "attendant" \| "finance" \| "guest" \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Atendimento","template":"attendant"}'
```

CLI:

```bash
node cli/atomiks.mjs roles.create --json '{"name":"Atendimento","template":"attendant"}'
```

MCP: ferramenta `roles_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.update

Renomeia um cargo ou muda as telas dele. Cargos fixos não mudam (`forbidden`). Mudar as telas regrava o acesso de quem tem o cargo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |
| `name` | string | não |  |
| `screens` | string[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","name":"Atendimento"}'
```

CLI:

```bash
node cli/atomiks.mjs roles.update --json '{"id":"00000000-0000-0000-0000-000000000000","name":"Atendimento"}'
```

MCP: ferramenta `roles_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.delete

Exclui um cargo. Cargos fixos não saem. Quem tinha o cargo passa a ter só os outros; sem nenhum outro, mantém o acesso atual.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs roles.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `roles_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.duplicate

Duplica um cargo. A cópia leva as mesmas telas e nasce logo depois do original; as pessoas não vêm junto. Vale também para os cargos fixos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.duplicate` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_duplicate`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.duplicate`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.duplicate \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"fixed:member","name":"Membro (cópia)"}'
```

CLI:

```bash
node cli/atomiks.mjs roles.duplicate --json '{"id":"fixed:member","name":"Membro (cópia)"}'
```

MCP: ferramenta `roles_duplicate` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.duplicate.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.reorder

Reordena os cargos nomeados. Recebe os ids dos cargos nomeados na nova ordem da matriz. Os fixos ficam sempre à frente e são ignorados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.reorder` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_reorder`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.reorder`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `ids` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.reorder \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":[]}'
```

CLI:

```bash
node cli/atomiks.mjs roles.reorder --json '{"ids":[]}'
```

MCP: ferramenta `roles_reorder` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.reorder.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# roles.set_members

Define quem tem um cargo. Troca a lista de pessoas do cargo (só membros com papel `user`; administradores têm acesso total). Quem entra ou sai recebe o acesso novo no próximo carregamento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/roles.set_members` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `team:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `roles_set_members`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `roles.set_members`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |
| `userIds` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/roles.set_members \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","userIds":[]}'
```

CLI:

```bash
node cli/atomiks.mjs roles.set_members --json '{"id":"00000000-0000-0000-0000-000000000000","userIds":[]}'
```

MCP: ferramenta `roles_set_members` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/roles.set_members.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# getting_started.get

Ver Configurações › Primeiros passos. Estado da tela Primeiros passos para o próprio usuário na conta atual: `hidden` (o usuário escondeu o checklist; mesma preferência de onboarding.dismiss) e `milestones`, o mapa marco → feito dos marcos que têm equivalente no Atomiks (produto, oferta, WhatsApp conectado, automação, pipeline, oportunidade, primeira venda). Marco que não vem no mapa ainda não existe no Atomiks.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/getting_started.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `getting_started_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `getting_started.get`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/getting_started.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs getting_started.get --json '{}'
```

MCP: ferramenta `getting_started_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/getting_started.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# proposals.list

Listar propostas. Propostas consolidadas da conta, com contato, oportunidade (valor em centavos) e modelo. Filtros combinados com E: `statuses`, `kinds`, `templateIds` (qualquer um dentro de cada lista), `viewed` e `hasOpportunity`; `search` procura no título e no nome do contato. Ordem por `orderBy` (`createdAt` padrão, `viewedAt`, `title`) e `orderByMode`. Sem a migration do banco devolve a lista vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/proposals.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `proposals_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `proposals.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 20 |
| `orderBy` | "createdAt" \| "viewedAt" \| "title" | não | padrão "createdAt" |
| `orderByMode` | "asc" \| "desc" | não | padrão "desc" |
| `search` | string | não |  |
| `statuses` | "draft" \| "sent" \| "viewed" \| "accepted" \| "rejected" \| "expired"[] | não |  |
| `kinds` | "slide_deck" \| "document" \| "pdf"[] | não |  |
| `templateIds` | string (uuid)[] | não |  |
| `viewed` | boolean | não |  |
| `hasOpportunity` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/proposals.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20,"orderBy":"createdAt","orderByMode":"desc","statuses":["sent"]}'
```

CLI:

```bash
node cli/atomiks.mjs proposals.list --json '{"page":1,"perPage":20,"orderBy":"createdAt","orderByMode":"desc","statuses":["sent"]}'
```

MCP: ferramenta `proposals_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/proposals.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# proposals.create

Consolidar proposta. Gera uma proposta a partir de um modelo ativo, para um contato (`contactId`) e, se houver, uma oportunidade dele (`opportunityId`). A proposta nasce em rascunho, com o título e a capa do modelo. O link público ainda não existe no Atomiks: `slug` é o identificador reservado para ele. Sem a migration do banco responde `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/proposals.create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `proposals_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `proposals.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `templateId` | string (uuid) | sim |  |
| `contactId` | string (uuid) | não |  |
| `opportunityId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/proposals.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"templateId":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs proposals.create --json '{"templateId":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `proposals_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/proposals.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# proposals.templates_list

Listar modelos de proposta. Modelos de proposta da conta, do mais recente ao mais antigo. Filtros: `search` (nome), `kind`, `status`; `library: true` traz só os que podem gerar proposta (ativos, slide deck ou documento). `stats` conta tudo da conta (total, ativos, rascunhos e slide decks), sem os filtros. Sem a migration do banco devolve a lista vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/proposals.templates_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `proposals_templates_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `proposals.templates_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 20 |
| `search` | string | não |  |
| `kind` | "slide_deck" \| "document" \| "pdf" | não |  |
| `status` | "draft" \| "active" \| "archived" | não |  |
| `library` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/proposals.templates_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20,"library":true}'
```

CLI:

```bash
node cli/atomiks.mjs proposals.templates_list --json '{"page":1,"perPage":20,"library":true}'
```

MCP: ferramenta `proposals_templates_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/proposals.templates_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# proposals.template_create

Criar modelo de proposta. Cria um modelo em rascunho (slide deck ou documento). O conteúdo é montado no editor visual, que ainda não existe no Atomiks: até lá o modelo guarda só nome, descrição e tipo. Sem a migration do banco responde `migration_pendente`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/proposals.template_create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `proposals_template_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `proposals.template_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `kind` | "slide_deck" \| "document" | não | padrão "slide_deck" |
| `description` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/proposals.template_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Proposta comercial","kind":"document"}'
```

CLI:

```bash
node cli/atomiks.mjs proposals.template_create --json '{"name":"Proposta comercial","kind":"document"}'
```

MCP: ferramenta `proposals_template_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/proposals.template_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.list

Listar empresas. Empresas da conta (20 por página). `q` busca na razão social, no nome fantasia e no CNPJ; filtros `states` (UF), `cities`, `sizeTiers` (`SMB`, `MID`, `ENTERPRISE`) e `sectors`; `sort`: `name_asc` (padrão), `name_desc`, `created_desc`, `employees_desc`, `revenue_desc` (os dois últimos dependem do Econodata e ordenam por nome). Os filtros do Econodata (`cnaes`, `sizes`, `statuses`, `empMin`, `empMax`, `revMin`, `revMax`, `debt`, `enriched`) não têm dado no Atomiks: com qualquer um a lista vem vazia. `metrics` conta a conta inteira, sem os filtros; `enriched` é sempre 0.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `companies_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `q` | string | não |  |
| `sort` | "name_asc" \| "name_desc" \| "created_desc" \| "employees_desc" \| "revenue_desc" | não |  |
| `states` | string[] | não |  |
| `cities` | string[] | não |  |
| `sizeTiers` | "SMB" \| "MID" \| "ENTERPRISE"[] | não |  |
| `sectors` | string[] | não |  |
| `cnaes` | string[] | não |  |
| `sizes` | string[] | não |  |
| `statuses` | string[] | não |  |
| `empMin` | number | não |  |
| `empMax` | number | não |  |
| `revMin` | number | não |  |
| `revMax` | number | não |  |
| `debt` | boolean | não |  |
| `enriched` | boolean | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"sort":"name_asc"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.list --json '{"page":1,"sort":"name_asc"}'
```

MCP: ferramenta `companies_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.facets

Opções dos filtros de empresas. Valores que a conta já usa em UF, cidade e setor (para os filtros da lista). `cnaes`, `sizeEstimates` e `statuses` vêm do Econodata e saem vazios.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.facets` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `companies_facets`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.facets`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.facets \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs companies.facets --json '{}'
```

MCP: ferramenta `companies_facets` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.facets.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.get

Ver uma empresa. Cadastro da empresa. `enrichment` é sempre nulo (sem Econodata).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `companies_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.create

Criar empresa. Cria a empresa com a razão social (`legalName`, única na conta sem diferenciar maiúsculas) e, se quiser, o resto do cadastro. `taxId` é o CNPJ; `sizeTier` é `SMB`, `MID` ou `ENTERPRISE`. Sem a atualização do banco só a razão social é aceita (`migration_pendente` nos demais campos).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.create` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `companies_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `legalName` | string | sim |  |
| `tradeName` | string \| null | não |  |
| `taxId` | string \| null | não |  |
| `taxIdType` | string \| null | não |  |
| `email` | string \| null | não |  |
| `phone` | string \| null | não |  |
| `website` | string \| null | não |  |
| `addressStreet` | string \| null | não |  |
| `addressCity` | string \| null | não |  |
| `addressState` | string \| null | não |  |
| `addressPostalCode` | string \| null | não |  |
| `countryCode` | string \| null | não |  |
| `industry` | string \| null | não |  |
| `sizeTier` | "SMB" \| "MID" \| "ENTERPRISE" \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"legalName":"Acme Comércio Ltda","tradeName":"Acme","taxId":"12.345.678/0001-90","taxIdType":"CNPJ","sizeTier":"SMB"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.create --json '{"legalName":"Acme Comércio Ltda","tradeName":"Acme","taxId":"12.345.678/0001-90","taxIdType":"CNPJ","sizeTier":"SMB"}'
```

MCP: ferramenta `companies_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.update

Editar empresa. Muda só o que vier; `null` (ou texto vazio) limpa um campo opcional. A razão social não pode ficar vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.update` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `companies_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `legalName` | string | não |  |
| `tradeName` | string \| null | não |  |
| `taxId` | string \| null | não |  |
| `taxIdType` | string \| null | não |  |
| `email` | string \| null | não |  |
| `phone` | string \| null | não |  |
| `website` | string \| null | não |  |
| `addressStreet` | string \| null | não |  |
| `addressCity` | string \| null | não |  |
| `addressState` | string \| null | não |  |
| `addressPostalCode` | string \| null | não |  |
| `countryCode` | string \| null | não |  |
| `industry` | string \| null | não |  |
| `sizeTier` | "SMB" \| "MID" \| "ENTERPRISE" \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","phone":"(11) 3456-7800"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.update --json '{"id":"00000000-0000-0000-0000-000000000000","phone":"(11) 3456-7800"}'
```

MCP: ferramenta `companies_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.delete

Excluir empresa. Remove a empresa e desfaz o vínculo com contatos e oportunidades (as oportunidades ficam sem empresa) e as ligações dos Objetos personalizados. Não dá para desfazer.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.delete` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `companies_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.contacts

Contatos de uma empresa. Contatos vinculados à empresa que o membro pode ver, do vínculo mais recente ao mais antigo. Sem a atualização do banco vem vazio. `temperatureStatus` sai nulo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.contacts` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `companies_contacts`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.contacts`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.contacts \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.contacts --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_contacts` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.contacts.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.contact_link

Vincular contato à empresa. `id` é a empresa. O contato precisa estar visível ao membro. Vincular de novo não faz nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.contact_link` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `companies_contact_link`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.contact_link`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.contact_link \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.contact_link --json '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_contact_link` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.contact_link.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.contact_unlink

Desvincular contato da empresa. `id` é a empresa. O contato continua existindo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.contact_unlink` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `companies_contact_unlink`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.contact_unlink`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `contactId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.contact_unlink \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.contact_unlink --json '{"id":"00000000-0000-0000-0000-000000000000","contactId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_contact_unlink` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.contact_unlink.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# companies.audit_list

Auditoria de uma empresa. Só administradores. Alterações registradas na atividade da conta que citam a empresa, da mais recente para a mais antiga. Paginação: `before` = `nextBefore` (id da linha).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/companies.audit_list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `activity:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `companies_audit_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `companies.audit_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `before` | integer | não |  |
| `limit` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/companies.audit_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs companies.audit_list --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `companies_audit_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/companies.audit_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.summary

Totais de visitantes. Totais dos cartões de Visitantes: visitantes, novos visitantes, sessões e contatos gerados. O Atomiks ainda não rastreia visitas às páginas, então devolve zeros.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `projectIds` | string[] | não |  |
| `excludeProjectIds` | string[] | não |  |
| `pageIds` | string[] | não |  |
| `excludePageIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `excludeFunnelIds` | string[] | não |  |
| `channels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `excludeChannels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `hasLead` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.summary --json '{}'
```

MCP: ferramenta `visitors_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.list

Lista de visitantes. Visitantes das páginas, do mais recente ao mais antigo, com `search` (ID do visitante ou IP), os filtros de projeto, página, funil, canal e contato (`hasLead`) e paginação (`page`, `perPage` até 100). Cada linha traz canal da primeira visita, sessões, última página e funil, dispositivo e o contato vinculado. Sem rastreio no Atomiks, a lista é vazia: `{data: [], meta: {countPages: 0, countItens: 0}}`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `projectIds` | string[] | não |  |
| `excludeProjectIds` | string[] | não |  |
| `pageIds` | string[] | não |  |
| `excludePageIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `excludeFunnelIds` | string[] | não |  |
| `channels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `excludeChannels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `hasLead` | boolean | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.list --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `visitors_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.get

Detalhe do visitante. Um visitante com as sessões (e as ações de cada uma), o primeiro toque (origem e UTMs), o último IP e o contato vinculado. `not_found` quando o visitante não existe; sem rastreio no Atomiks, nenhum existe.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"vis_00000000"}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.get --json '{"id":"vis_00000000"}'
```

MCP: ferramenta `visitors_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.analytics

Analytics de visitantes. Analytics do período (`startDate`..`endDate`, opcional `projectId` e `timeZone`): resumo (14 indicadores), tráfego por dia, sessões e conversão por canal, campanhas por canal, UTMs, sites que indicaram, páginas de entrada, projetos, páginas, funis e formulários mais vistos, ações, dispositivos, navegadores, sistemas, origem geográfica e visitas por hora e dia da semana. Sem rastreio no Atomiks, tudo em zero.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.analytics` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_analytics`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.analytics`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `startDate` | string (date-time) | sim |  |
| `endDate` | string (date-time) | sim |  |
| `projectId` | string | não |  |
| `timeZone` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.analytics \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01T00:00:00-03:00","endDate":"2026-10-31T23:59:59-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.analytics --json '{"startDate":"2026-10-01T00:00:00-03:00","endDate":"2026-10-31T23:59:59-03:00"}'
```

MCP: ferramenta `visitors_analytics` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.analytics.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.funnel

Funil de conversão dos visitantes. Quantos visitantes chegaram a cada etapa (página vista, formulário, checkout, compra) no período, com a taxa sobre a etapa anterior e sobre o topo. `channel` restringe a um canal. Sem rastreio no Atomiks, sem etapas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.funnel` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_funnel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.funnel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `startDate` | string (date-time) | sim |  |
| `endDate` | string (date-time) | sim |  |
| `projectId` | string | não |  |
| `timeZone` | string | não |  |
| `channel` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.funnel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"startDate":"2026-10-01T00:00:00-03:00","endDate":"2026-10-31T23:59:59-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.funnel --json '{"startDate":"2026-10-01T00:00:00-03:00","endDate":"2026-10-31T23:59:59-03:00"}'
```

MCP: ferramenta `visitors_funnel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.funnel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.live

Ações ao vivo. Ações dos visitantes nas últimas 24 horas (até 100, mais recentes primeiro) e a contagem da última hora (`lastHourCountCapped` quando passa do teto). Sem rastreio no Atomiks, vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.live` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_live`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.live`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.live \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.live --json '{}'
```

MCP: ferramenta `visitors_live` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.live.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.filter_options

Opções dos filtros de visitantes. Valores que os filtros Projeto, Página e Funil aceitam (`kind`), com busca por nome. O Atomiks não tem páginas, funis nem projetos próprios, então a lista é vazia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.filter_options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_filter_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.filter_options`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "project" \| "page" \| "funnel" | sim |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.filter_options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"page"}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.filter_options --json '{"kind":"page"}'
```

MCP: ferramenta `visitors_filter_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.filter_options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# visitors.export

Exportar visitantes em CSV. CSV com um visitante por linha dos que batem com a busca e os filtros (mesmos de `visitors.list`): ID, acessos, sessões, canal, dispositivo, última página e funil, e o contato vinculado. Devolve `filename`, `csv` (texto) e `count`. Sem rastreio no Atomiks, só o cabeçalho.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/visitors.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `contacts:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `visitors_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `visitors.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `projectIds` | string[] | não |  |
| `excludeProjectIds` | string[] | não |  |
| `pageIds` | string[] | não |  |
| `excludePageIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `excludeFunnelIds` | string[] | não |  |
| `channels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `excludeChannels` | "google" \| "facebook" \| "instagram" \| "tiktok" \| "youtube" \| "linkedin" \| "whatsapp" \| "email" \| "referral" \| "direct" \| "other"[] | não |  |
| `hasLead` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/visitors.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs visitors.export --json '{}'
```

MCP: ferramenta `visitors_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/visitors.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# external_recovery.overview

Cartões da recuperação de vendas externas. Quantidade e valor (na moeda `currency`, ou a mais frequente) dos pedidos de plataformas externas recusados, com chargeback, reembolsados e cancelados, e a quantidade de carrinhos abandonados. `currency` vem nulo sem pedidos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/external_recovery.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `external_recovery_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `external_recovery.overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `currency` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/external_recovery.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs external_recovery.overview --json '{}'
```

MCP: ferramenta `external_recovery_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/external_recovery.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# external_recovery.list

Listar pedidos externos para recuperar. Pedidos de plataformas externas da sub-aba (`failed`: recusados; `chargeback`; `refunded`; `canceled`), mais novos primeiro, com comprador, produto, código da oferta, valor, plataforma e método. `searchText` busca em nome, e-mail, produto, oferta e código.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/external_recovery.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `external_recovery_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `external_recovery.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `subTab` | "failed" \| "chargeback" \| "refunded" \| "canceled" | sim |  |
| `searchText` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/external_recovery.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subTab":"failed","page":1,"perPage":50}'
```

CLI:

```bash
node cli/atomiks.mjs external_recovery.list --json '{"subTab":"failed","page":1,"perPage":50}'
```

MCP: ferramenta `external_recovery_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/external_recovery.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# external_recovery.abandonment_list

Listar carrinhos abandonados das plataformas externas. Carrinhos abandonados avisados pelas plataformas (`cart.abandoned.v1`), mais novos primeiro, com contato, produto, oferta, valor (0 quando a plataforma não manda) e plataforma. `searchText` busca em contato, e-mail, produto e oferta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/external_recovery.abandonment_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `external_recovery_abandonment_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `external_recovery.abandonment_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `searchText` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/external_recovery.abandonment_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs external_recovery.abandonment_list --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `external_recovery_abandonment_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/external_recovery.abandonment_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# external_recovery.export_csv

Exportar a recuperação externa em CSV. Texto CSV (separador ";") da sub-aba da recuperação externa. A tela baixa como `external-recovery-<sub-aba>.csv`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/external_recovery.export_csv` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `external_recovery_export_csv`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `external_recovery.export_csv`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `subTab` | "failed" \| "chargeback" \| "refunded" \| "canceled" \| "cartAbandonment" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/external_recovery.export_csv \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subTab":"failed"}'
```

CLI:

```bash
node cli/atomiks.mjs external_recovery.export_csv --json '{"subTab":"failed"}'
```

MCP: ferramenta `external_recovery_export_csv` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/external_recovery.export_csv.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# external_recovery.create_list

Criar lista de contatos para recuperação. Cria a lista manual `name` (se já existe uma com esse nome, usa a existente) e põe nela os contatos dos itens dos status escolhidos (`statuses`). Itens sem contato vinculado ficam de fora e são contados em `withoutContact`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/external_recovery.create_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `external_recovery_create_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `external_recovery.create_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `statuses` | "failed" \| "chargeback" \| "refunded" \| "canceled" \| "cartAbandonment"[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/external_recovery.create_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Recuperação externa","statuses":["failed","cartAbandonment"]}'
```

CLI:

```bash
node cli/atomiks.mjs external_recovery.create_list --json '{"name":"Recuperação externa","statuses":["failed","cartAbandonment"]}'
```

MCP: ferramenta `external_recovery_create_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/external_recovery.create_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.list

Listar assinaturas. Assinaturas das plataformas integradas (Hotmart, Kiwify...), uma por código de assinatura, com assinante, plano, valor, periodicidade, última e próxima cobrança. `status`: `active_paid` ou `canceled` (trial e encerrada não têm fonte). Ordenação por `column` (activationDate, offerName, frequency, price, buyerName ou status) e `order`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |
| `column` | "activationDate" \| "offerName" \| "frequency" \| "price" \| "buyerName" \| "status" | não |  |
| `order` | "asc" \| "desc" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":50}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.list --json '{"page":1,"perPage":50}'
```

MCP: ferramenta `subscriptions_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.overview

Cartões das assinaturas. Receita das assinaturas (compras aprovadas), assinantes únicos, ticket médio por assinante, ativas, receita recorrente mensal, total, trial (sempre 0: sem fonte), cancelamentos, taxa de churn (cancelamentos sobre o total, em %) e inadimplentes (assinatura com cobrança atrasada) com os valores.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.overview --json '{}'
```

MCP: ferramenta `subscriptions_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.chart

Gráfico das assinaturas. Receita (centavos) e número de compras aprovadas das assinaturas por dia, semana ISO ou mês (`period`), no fuso da conta, entre `from` e `to`. Só vêm os períodos com compra; o período de ativação dos filtros não vale aqui.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.chart` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_chart`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.chart`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `period` | "daily" \| "weekly" \| "monthly" | sim |  |
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.chart \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.chart --json '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

MCP: ferramenta `subscriptions_chart` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.chart.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.get

Detalhe da assinatura. Assinatura (`id` = `plataforma:código`): situação, plano, valor, periodicidade, compras (a venda original e as faturas), LTV e os dados do assinante. `not_found` se não existir.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"hotmart:00000000"}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.get --json '{"id":"hotmart:00000000"}'
```

MCP: ferramenta `subscriptions_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.cohort

Coortes de assinaturas. Quanto de cada safra (semana ou mês de ativação) segue assinando ao longo do tempo: `retentionPercentage` de 0 a 1 por coluna (a coluna 0 é a safra; vem `null` onde a safra ainda não chegou). Filtra por entrada na base, UTMs, produto, oferta e método de pagamento; `funnelIds` com valor deixa a matriz vazia (sem fonte).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.cohort` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_cohort`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.cohort`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `bucket` | "week" \| "month" | não |  |
| `enteredFrom` | string | não |  |
| `enteredTo` | string | não |  |
| `utmSources` | string[] | não |  |
| `utmMediums` | string[] | não |  |
| `utmCampaigns` | string[] | não |  |
| `utmTerms` | string[] | não |  |
| `productIds` | string[] | não |  |
| `offerIds` | string[] | não |  |
| `funnelIds` | string[] | não |  |
| `paymentMethods` | "credit" \| "pix" \| "boleto"[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.cohort \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bucket":"week"}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.cohort --json '{"bucket":"week"}'
```

MCP: ferramenta `subscriptions_cohort` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.cohort.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.filter_options

Opções dos filtros de assinaturas. UTMs (source, medium, campaign, term), produtos e ofertas vistos nas assinaturas, para os filtros da aba Coortes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.filter_options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_filter_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.filter_options`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.filter_options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.filter_options --json '{}'
```

MCP: ferramenta `subscriptions_filter_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.filter_options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# subscriptions.export_csv

Exportar assinaturas em CSV. Texto CSV (separador ";") das assinaturas com os filtros da tela, na ordem de `column`/`order`. A tela baixa como `subscriptions.csv`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/subscriptions.export_csv` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `subscriptions_export_csv`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `subscriptions.export_csv`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |
| `column` | "activationDate" \| "offerName" \| "frequency" \| "price" \| "buyerName" \| "status" | não |  |
| `order` | "asc" \| "desc" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/subscriptions.export_csv \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs subscriptions.export_csv --json '{}'
```

MCP: ferramenta `subscriptions_export_csv` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/subscriptions.export_csv.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales_recovery.overview

Cartões da recuperação de vendas. Valor total e itens para recuperação (várias tentativas do mesmo comprador na mesma oferta contam uma vez) e, por tipo, a quantidade e o valor: carrinho abandonado, Pix e boleto em aberto, recusados, vendas canceladas e reembolsos. Os motivos (`*ReasonBreakdown`) e a etapa do abandono vêm vazios nas plataformas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales_recovery.overview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_recovery_overview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales_recovery.overview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales_recovery.overview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs sales_recovery.overview --json '{}'
```

MCP: ferramenta `sales_recovery_overview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales_recovery.overview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales_recovery.chart

Gráfico das falhas de vendas. Número de transações perdidas (`purchasesData.purchases`) e valor perdido em centavos (`revenueData.revenue`) por dia, semana ISO ou mês, no fuso da conta, entre `from` e `to`. Só vêm os períodos com perda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales_recovery.chart` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_recovery_chart`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales_recovery.chart`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `period` | "daily" \| "weekly" \| "monthly" | sim |  |
| `filters` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales_recovery.chart \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

CLI:

```bash
node cli/atomiks.mjs sales_recovery.chart --json '{"from":"2026-10-01T00:00:00.000Z","to":"2026-10-26T23:59:59.999Z","period":"daily"}'
```

MCP: ferramenta `sales_recovery_chart` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales_recovery.chart.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales_recovery.list

Listar transações para recuperar. Transações da sub-aba (`failed`: recusadas e chargeback; `canceled`; `pixExpired`: Pix em aberto; `bankSlipExpired`: boleto em aberto; `refunded`), mais novas primeiro, com comprador, produto, oferta, valor e método. `searchText` busca em nome, e-mail, produto, oferta e código.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales_recovery.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_recovery_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales_recovery.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `subTab` | "failed" \| "canceled" \| "pixExpired" \| "bankSlipExpired" \| "refunded" | sim |  |
| `filters` | object | não |  |
| `searchText` | string | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales_recovery.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subTab":"failed","page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs sales_recovery.list --json '{"subTab":"failed","page":1,"perPage":20}'
```

MCP: ferramenta `sales_recovery_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales_recovery.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales_recovery.abandonment_list

Listar carrinhos abandonados. Carrinhos abandonados avisados pelas plataformas (`cart.abandoned.v1`), mais novos primeiro, com lead, produto, oferta, valor (0 quando a plataforma não manda) e data. `recurrent` separa os de oferta recorrente.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales_recovery.abandonment_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_recovery_abandonment_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales_recovery.abandonment_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `recurrent` | boolean | não |  |
| `filters` | object | não |  |
| `page` | integer | não |  |
| `perPage` | integer | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales_recovery.abandonment_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs sales_recovery.abandonment_list --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `sales_recovery_abandonment_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales_recovery.abandonment_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# sales_recovery.export_csv

Exportar a recuperação em CSV. Texto CSV (separador ";") da sub-aba de recuperação com os filtros da tela. A tela baixa como `recovery-<sub-aba>.csv`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/sales_recovery.export_csv` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `sales_recovery_export_csv`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `sales_recovery.export_csv`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `subTab` | "failed" \| "canceled" \| "pixExpired" \| "bankSlipExpired" \| "refunded" \| "cartAbandonment" | sim |  |
| `recurrent` | boolean | não |  |
| `filters` | object | não |  |
| `searchText` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/sales_recovery.export_csv \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subTab":"failed"}'
```

CLI:

```bash
node cli/atomiks.mjs sales_recovery.export_csv --json '{"subTab":"failed"}'
```

MCP: ferramenta `sales_recovery_export_csv` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/sales_recovery.export_csv.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# broadcasts.list

Listar envios em massa de um canal. Lista "Meus envios de …" de Mensagens > Broadcasts, do mais recente ao mais antigo. Só `whatsapp` tem envios (os de `contacts.bulk_send`); `email`, `sms` e `voice` ainda não existem e voltam vazios com `available: false` e o `reason`. `name` busca no nome (modelo ou começo do texto) e `status` filtra (`sending`, `sent`, `failed`…). Cada item traz `sent`, `failed` e `skipped` (contatos), `processed` (os três somados) e `total`. Detalhes e falhas de um envio: `contacts.bulk_send_get`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/broadcasts.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `broadcasts_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `broadcasts.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channel` | "whatsapp" \| "email" \| "sms" \| "voice" | não | padrão "whatsapp" |
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 20 |
| `name` | string | não |  |
| `status` | "draft" \| "scheduled" \| "sending" \| "sent" \| "failed" \| "insufficient_credits" \| "suppressed"[] | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/broadcasts.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channel":"whatsapp","page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs broadcasts.list --json '{"channel":"whatsapp","page":1,"perPage":20}'
```

MCP: ferramenta `broadcasts_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/broadcasts.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.list

Histórico de envio: mensagens enviadas. Aba Mensagens do Histórico de envio: cada mensagem enviada (atendente, automação, disparo em massa ou o celular), da mais recente, com `status` (queued, sent, delivered, visualized, failed; `sending` não existe aqui e filtra para vazio), `messagePlatform` (whatsapp, evolution, instagram), `lead` e `channel` (endereço do destinatário), `messageService` (`workflows`, `broadcast` ou `individual`), `error`. Filtros: `search` (nome, e-mail ou telefone do contato, ou o texto), `status`, `platform`, `broadcastIds` (envios de `broadcasts.list`), `workflowIds` (automações), `from`/`to` e `leadId`. `webhookLogsCount` é sempre 0 e `creditCost` nulo: o Atomiks não guarda os dois por mensagem. Automação vem de `sent_by` nulo; o filtro por automação considera as conversas em que ela rodou.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `status` | "queued" \| "sending" \| "sent" \| "delivered" \| "failed" \| "visualized" | não |  |
| `platform` | string | não |  |
| `broadcastIds` | string (uuid)[] | não |  |
| `workflowIds` | string (uuid)[] | não |  |
| `from` | string | não |  |
| `to` | string | não |  |
| `leadId` | string (uuid) | não |  |
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 20 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.list --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `message_history_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.export

Exportar o histórico de envio em CSV. CSV com uma mensagem por linha das que batem com os filtros de `message_history.list` (até 5 000, as mais recentes): ID, data e hora (fuso de São Paulo), canal, status, erro, destinatário, endereço, categoria de envio e custo de créditos. Devolve `filename`, `csv` (texto) e `count`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.export` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_export`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.export`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `search` | string | não |  |
| `status` | "queued" \| "sending" \| "sent" \| "delivered" \| "failed" \| "visualized" | não |  |
| `platform` | string | não |  |
| `broadcastIds` | string (uuid)[] | não |  |
| `workflowIds` | string (uuid)[] | não |  |
| `from` | string | não |  |
| `to` | string | não |  |
| `leadId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.export \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.export --json '{}'
```

MCP: ferramenta `message_history_export` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.export.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.options

Opções dos filtros Broadcast e Automação. Lista para os filtros do Histórico de envio: `kind: broadcast` traz os envios em massa (nome do modelo ou começo do texto), `kind: workflow` as automações, com `id` e `name`. `search` filtra pelo nome. Até 100 itens, os mais recentes.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.options` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_options`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.options`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `kind` | "broadcast" \| "workflow" | sim |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.options \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"workflow"}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.options --json '{"kind":"workflow"}'
```

MCP: ferramenta `message_history_options` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.options.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.detail

Detalhe de uma mensagem do histórico de envio. Detalhe da instância: a mensagem (`instance`, com os horários das etapas: fila, enviado, entregue, visualizado, falha; entregue e visualizado valem o horário da própria mensagem, o Atomiks não guarda o de cada etapa) e, na automação, `flow` (a mais recente que rodou na conversa até então); `messages` (outras mensagens enviadas ao mesmo contato, até 12), `webhookLogs` (sempre vazio) e `opportunities` (oportunidades abertas do contato).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.detail` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_detail`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.detail`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.detail \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.detail --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `message_history_detail` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.detail.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.webhooks

Histórico de envio: entregas de webhook. Aba Webhooks do Histórico de envio: as entregas de webhook de saída da conta (`webhook_deliveries`), da mais recente: `provider` (conector da integração), `event`, `httpStatus` da última tentativa, `newStatus` (queued, sending, sent ou failed), `externalMessageId` (id do evento de origem), `processingError` e `receivedAt` (quando entrou na fila). `provider` filtra pelo conector; `search` aceita o id da entrega ou do evento, ou parte do nome do evento. `providers` traz os conectores que a conta usa, para o filtro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.webhooks` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_webhooks`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.webhooks`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `page` | integer | não | padrão 1 |
| `perPage` | integer | não | padrão 20 |
| `provider` | string | não |  |
| `search` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.webhooks \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"page":1,"perPage":20}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.webhooks --json '{"page":1,"perPage":20}'
```

MCP: ferramenta `message_history_webhooks` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.webhooks.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# message_history.webhook_detail

Detalhe de uma entrega de webhook. Uma entrega de `message_history.webhooks` com o corpo enviado (`payload`, montado do evento de origem; traz dados pessoais do contato), as tentativas e o envio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/message_history.webhook_detail` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `messages:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `message_history_webhook_detail`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `message_history.webhook_detail`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/message_history.webhook_detail \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs message_history.webhook_detail --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `message_history_webhook_detail` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/message_history.webhook_detail.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# workspaces.list

Listar os workspaces (contas) do usuário. Contas de que o usuário logado participa, com nome, plano, se ele é o dono (`isOwner`) e a data de criação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/workspaces.list` (corpo JSON)
- Quem pode chamar: qualquer usuário autenticado
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `workspaces_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `workspaces.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/workspaces.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs workspaces.list --json '{}'
```

MCP: ferramenta `workspaces_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/workspaces.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# workspaces.rename

Renomear o workspace atual. Troca o nome da conta atual (1 a 100 caracteres). Só administrador da conta.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/workspaces.rename` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: nenhum (qualquer chave serve)
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `workspaces_rename`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `workspaces.rename`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/workspaces.rename \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Minha empresa"}'
```

CLI:

```bash
node cli/atomiks.mjs workspaces.rename --json '{"name":"Minha empresa"}'
```

MCP: ferramenta `workspaces_rename` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/workspaces.rename.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pixels.list

Listar pixels (datasets da Meta). Pixels da API de Conversões da Meta: o dataset de cada número oficial. `items` traz os que já têm ID guardado; `channels` traz todos os números oficiais, para escolher onde cadastrar um ID.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pixels.list` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `pixels_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pixels.list`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pixels.list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs pixels.list --json '{}'
```

MCP: ferramenta `pixels_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pixels.list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# pixels.add

Cadastrar o ID do pixel de um número. Guarda o ID do pixel (dataset) da Meta no número oficial escolhido. Substitui o ID anterior, se houver. Só dígitos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/pixels.add` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `conversions:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `pixels_add`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `pixels.add`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `datasetId` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/pixels.add \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","datasetId":"123456789012345"}'
```

CLI:

```bash
node cli/atomiks.mjs pixels.add --json '{"channelId":"00000000-0000-0000-0000-000000000000","datasetId":"123456789012345"}'
```

MCP: ferramenta `pixels_add` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/pixels.add.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# overview.summary

Contagens da visão geral. Contatos criados entre `from` e `to` (por `first_seen_at`, fora da lixeira), contatos totais, produtos ativos e os criados desde `todayFrom` (início do dia do chamador), automações (Instagram) e fluxos não arquivados e ativos da conta. O que o membro não vê pela RLS não entra.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/overview.summary` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `crm:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `overview_summary`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `overview.summary`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `todayFrom` | string (date-time) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/overview.summary \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-09-27T00:00:00-03:00","to":"2026-10-26T23:59:59-03:00","todayFrom":"2026-10-26T00:00:00-03:00"}'
```

CLI:

```bash
node cli/atomiks.mjs overview.summary --json '{"from":"2026-09-27T00:00:00-03:00","to":"2026-10-26T23:59:59-03:00","todayFrom":"2026-10-26T00:00:00-03:00"}'
```

MCP: ferramenta `overview_summary` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/overview.summary.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaigns_list

Listar campanhas de grupos. Campanhas de grupos da conta, da mais nova para a mais antiga. Paginação por `cursor` (devolvido em `nextCursor`); `status` filtra. Cada item traz `numbers` (canais vinculados: `channelId`, `name`, `phone`, `status`) e `groups` (`total`, `capturing`, `full` = lotados entre os que captam: membros + reservas >= capacidade).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaigns_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaigns_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaigns_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `cursor` | string | não |  |
| `limit` | integer | não | padrão 50 |
| `status` | "active" \| "attention" \| "paused" \| "ended" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaigns_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaigns_list --json '{"limit":50}'
```

MCP: ferramenta `groups_campaigns_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaigns_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_get

Ver uma campanha de grupos. Campanha com os números (canais) vinculados e a contagem de grupos: total, captando e lotados entre os que captam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_campaign_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_create

Criar campanha de grupos. Cria a campanha com o link principal (`shortCode`, 8 caracteres). Padrões: capacidade 1024, rotação sequencial, cookie desligado (0 dias), reserva de vaga de 10 minutos, fuso America/Sao_Paulo. `fallbackUrl` (https) recebe o clique quando não há vaga.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `capacity` | integer | não | padrão 1024 |
| `rotationPolicy` | "sequential" \| "weighted" \| "round_robin" | não | padrão "sequential" |
| `cookieDays` | integer | não | padrão 0 |
| `reservationMinutes` | integer | não | padrão 10 |
| `timezone` | string | não | padrão "America/Sao_Paulo" |
| `fallbackUrl` | string \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Lançamento Out","capacity":1024,"rotationPolicy":"sequential","cookieDays":0,"reservationMinutes":10,"timezone":"America/Sao_Paulo"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_create --json '{"name":"Lançamento Out","capacity":1024,"rotationPolicy":"sequential","cookieDays":0,"reservationMinutes":10,"timezone":"America/Sao_Paulo"}'
```

MCP: ferramenta `groups_campaign_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_update

Alterar campanha de grupos. Altera os campos informados; os omitidos não mudam. `status: "ended"` encerra a campanha e grava `ended_at`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `capacity` | integer | não |  |
| `rotationPolicy` | "sequential" \| "weighted" \| "round_robin" | não |  |
| `cookieDays` | integer | não |  |
| `reservationMinutes` | integer | não |  |
| `timezone` | string | não |  |
| `fallbackUrl` | string \| null | não |  |
| `status` | "active" \| "attention" \| "paused" \| "ended" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","cookieDays":7}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_update --json '{"id":"00000000-0000-0000-0000-000000000000","cookieDays":7}'
```

MCP: ferramenta `groups_campaign_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_connect

Conectar um número dedicado a Grupos (QR ou código de pareamento). Cria o número de Grupos: sessão no servidor do WhatsApp por QR com o webhook do Atomiks e canal `whatsapp_web` com `usage = groups`, em `connecting`. Devolve o QR code e, se `pairingPhone` (só dígitos com DDI, 12 a 13) vier, também o código de pareamento para digitar no celular. Use um chip exclusivo: o número de atendimento nunca entra em Grupos. Só pela interface.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_connect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_connect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `name` | string | sim |  |
| `pairingPhone` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_connect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Lançamento","pairingPhone":"5511999990000"}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_connect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_status

Estado, QR e saúde de um número de Grupos. Consulta a sessão do número (reinicia a que caiu); ao conectar o canal vira `ready`. Se ainda não conectou, devolve QR e código de pareamento novos. Inclui o estado do governador: pausa, suspeita de banimento e estágio de aquecimento.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_status` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_number_status`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_status`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_status \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.number_status --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_number_status` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_status.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_disconnect

Desconectar um número de Grupos. Sai e apaga a sessão do número e marca o canal como desconectado. Só número de Grupos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_disconnect` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_number_disconnect`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_disconnect`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_disconnect \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.number_disconnect --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_number_disconnect` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_disconnect.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_number_attach

Vincular um número de Grupos a uma campanha. Liga um número `usage = groups` ou `both` (atendimento compartilhado com Grupos) à campanha. Número só de atendimento é recusado. Repetir o vínculo não faz nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_number_attach` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_number_attach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_number_attach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_number_attach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_number_attach --json '{"campaignId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_campaign_number_attach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_number_attach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_number_detach

Desvincular um número de Grupos de uma campanha. Remove o vínculo entre o número e a campanha. Sem vínculo, não faz nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_number_detach` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_number_detach`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_number_detach`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_number_detach \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_number_detach --json '{"campaignId":"00000000-0000-0000-0000-000000000000","channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_campaign_number_detach` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_number_detach.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.numbers_shareable

Números de atendimento que podem também servir a Grupos. Canais `whatsapp_web` da conta com `usage = inbox` e não desconectados (`usage: "inbox"`: podem ser compartilhados). Com `campaignId`, inclui também os `usage = both` ainda não vinculados àquela campanha (`usage: "both"`: já compartilhados, prontos para vincular). Número da API oficial (Cloud API) não aparece: não serve a Grupos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.numbers_shareable` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_numbers_shareable`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.numbers_shareable`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.numbers_shareable \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs groups.numbers_shareable --json '{}'
```

MCP: ferramenta `groups_numbers_shareable` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.numbers_shareable.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_share

Usar um número de atendimento também em Grupos. Marca o número `whatsapp_web` de atendimento como `usage = both` (atendimento + Grupos), liga `receive_groups` e libera as mensagens de grupo no servidor do número. O número continua no atendimento. Exige `acceptRisk: true`. Risco: Um bloqueio do WhatsApp neste número derruba também o atendimento e os anúncios de clique para WhatsApp desse número. Número da API oficial (Cloud API) é recusado: não serve a Grupos. Só pela interface, só admin.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_share` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: não (só pela interface)
- Ferramenta MCP: não
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_share`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `acceptRisk` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_share \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000","acceptRisk":true}'
```

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_share.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_unshare

Tirar um número compartilhado de Grupos. Volta o número `both` para só atendimento (`usage = inbox`): desvincula de todas as campanhas e cancela os jobs `queued` ou `running` desse número com o motivo "Número saiu de Grupos". O atendimento não muda. Funciona também com o número desconectado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_unshare` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_number_unshare`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_unshare`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_unshare \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.number_unshare --json '{"channelId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_number_unshare` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_unshare.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.governor_status

Saúde e limites de um número de Grupos. Perfil de segurança, estágio efetivo, pausa, suspeita de banimento e uso por ação na última hora e no último dia, com os tetos vigentes (maior versão da tabela de limites).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.governor_status` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_governor_status`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.governor_status`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.governor_status \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.governor_status --json '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_governor_status` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.governor_status.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_profile_get

Perfil de segurança de um número de Grupos, com recomendação e limites dos presets. Devolve o perfil (`auto`, `maximum`, `moderate`, `light` ou `custom`), os limites personalizados gravados, o estágio efetivo (Máxima = 0, Moderada = 2, Leve e Personalizada = 3, Automático pela idade), os dias desde a primeira conexão no Atomiks, a recomendação (menos de 3 dias: Máxima; menos de 14: Moderada; senão Leve — número antigo e usado no WhatsApp pode ir para Moderada ou Leve) e os limites por ação de cada preset (maior versão da tabela de limites).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_profile_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_number_profile_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_profile_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_profile_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.number_profile_get --json '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_number_profile_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_profile_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.number_profile_set

Definir o perfil de segurança de um número de Grupos. Grava o perfil do número; vale já no próximo item de um disparo em andamento. Em `custom`, `customLimits` traz por ação `{perHour, perDay, minGapMs}`; o servidor recusa `perHour` ou `perDay` acima de 2 vezes o valor da Leve, `minGapMs` abaixo de 500 e qualquer valor acima de 0 em `add_participant`. Ações não informadas usam os valores da Leve. Em outros perfis `customLimits` é ignorado e os limites personalizados já gravados ficam guardados.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.number_profile_set` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_number_profile_set`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.number_profile_set`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |
| `profile` | "auto" \| "maximum" \| "moderate" \| "light" \| "custom" | sim |  |
| `customLimits` | object | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.number_profile_set \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-4000-8000-000000000001","profile":"moderate"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.number_profile_set --json '{"channelId":"00000000-0000-4000-8000-000000000001","profile":"moderate"}'
```

MCP: ferramenta `groups_number_profile_set` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.number_profile_set.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.governor_clear_ban

Limpar a suspeita de banimento de um número de Grupos. Zera `suspected_ban_at` depois que alguém confirmou que o número está saudável. Não mexe na pausa nem nos limites.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.governor_clear_ban` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_governor_clear_ban`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.governor_clear_ban`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.governor_clear_ban \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.governor_clear_ban --json '{"channelId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_governor_clear_ban` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.governor_clear_ban.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.member_events_list

Eventos recentes de entrada e saída de uma campanha. Eventos de participantes (entrou, saiu, promovido, rebaixado) do mais recente ao mais antigo; o participante vem mascarado com os 4 últimos dígitos. Paginação por `cursor` (id do último evento recebido).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.member_events_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_member_events_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.member_events_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `cursor` | integer | não |  |
| `limit` | integer | não | padrão 50 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.member_events_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":50}'
```

CLI:

```bash
node cli/atomiks.mjs groups.member_events_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":50}'
```

MCP: ferramenta `groups_member_events_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.member_events_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_list

Listar grupos de uma campanha. Grupos vivos da campanha por `position`, 50 por página (até 100). Paginação por `cursor` (devolvido em `nextCursor`), busca por nome e filtros rodam no servidor: `capturing`, `paused`, `full` (membros + reservas >= capacidade), `invalid_link`, `issues` (sem acesso ou link inválido). `folderId` aceita `none`; `linkId` aceita `main` (link principal). Cada grupo traz a ocupação real.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `cursor` | string | não |  |
| `limit` | integer | não | padrão 50 |
| `search` | string | não |  |
| `filter` | "all" \| "capturing" \| "paused" \| "full" \| "invalid_link" \| "issues" | não | padrão "all" |
| `folderId` | "none" \| string (uuid) | não |  |
| `linkId` | "main" \| string (uuid) | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":50,"filter":"all"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":50,"filter":"all"}'
```

MCP: ferramenta `groups_groups_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_update_bulk

Alterar vários grupos de uma vez. Liga/desliga a captação (`captureActive`), move para uma pasta (`folderId`, `null` tira da pasta) ou para um link de captação (`linkId`, `null` = link principal). Só grupos vivos da campanha; pasta e link têm que ser da campanha. Devolve quantos mudaram.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_update_bulk` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_update_bulk`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_update_bulk`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `groupIds` | string (uuid)[] | sim |  |
| `set` | object | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_update_bulk \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"],"set":{"captureActive":false}}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_update_bulk --json '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"],"set":{"captureActive":false}}'
```

MCP: ferramenta `groups_groups_update_bulk` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_update_bulk.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_remove_bulk

Remover grupos da campanha. Tira os grupos da rotação (`deleted_at`). O número NÃO sai do grupo no WhatsApp e o grupo continua existindo lá; ele só deixa de aparecer e de receber captação aqui.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_remove_bulk` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_remove_bulk`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_remove_bulk`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `groupIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_remove_bulk \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"]}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_remove_bulk --json '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"]}'
```

MCP: ferramenta `groups_groups_remove_bulk` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_remove_bulk.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_reorder

Reordenar grupos. Grava `position` = posição na lista (a partir de 1) para os grupos informados, na ordem dada. Os não informados não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_reorder` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_reorder`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_reorder`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `groupIds` | string (uuid)[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_reorder \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"]}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_reorder --json '{"campaignId":"00000000-0000-4000-8000-000000000001","groupIds":["00000000-0000-4000-8000-000000000001"]}'
```

MCP: ferramenta `groups_groups_reorder` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_reorder.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.whatsapp_groups

Listar os grupos que o número já tem no WhatsApp. Consulta a Evolution API (passa pelo governador, ação `fetch_group`) e devolve os grupos do número com `description` (nula quando não há), marcando os que já estão na campanha (`alreadyInCampaign`). Só admin: gasta o orçamento do número e alimenta a importação. O número precisa estar vinculado à campanha e o usuário precisa poder usá-lo. Se o governador negar, responde `limit_reached` com a espera.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.whatsapp_groups` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_whatsapp_groups`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.whatsapp_groups`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.whatsapp_groups \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.whatsapp_groups --json '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_whatsapp_groups` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.whatsapp_groups.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_import

Importar grupos do WhatsApp para a campanha. Grava até 500 grupos (a ordem dada vira a ordem de `position`) e enfileira a busca do convite e do acesso do número em cada grupo novo ou sem convite válido. Importar de novo não duplica: os existentes só atualizam nome, descrição e tipo de envio e mantêm posição, contadores e captação. O número precisa estar vinculado à campanha e conectado. `jobId` é nulo quando não há nada a buscar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_import` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_import`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_import`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |
| `groups` | object[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_import \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","groups":[{"jid":"120363000000000001@g.us","name":"Lançamento #001","size":12}]}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_import --json '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","groups":[{"jid":"120363000000000001@g.us","name":"Lançamento #001","size":12}]}'
```

MCP: ferramenta `groups_groups_import` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_import.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_create_preview

Estimar quanto leva criar grupos em lote. Conta o tempo mínimo para criar `count` grupos com os limites vigentes da ação `create_group` no estágio do número e o que ele já usou hoje. `minutes` é nulo se o limite atual não permite criar. `fitsToday`: cabe no teto do dia.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_create_preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_create_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_create_preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |
| `count` | integer | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_create_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","count":30}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_create_preview --json '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","count":30}'
```

MCP: ferramenta `groups_groups_create_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_create_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.groups_create

Criar grupos numerados em lote. Enfileira a criação de `count` (1 a 100) grupos chamados "<baseName> #NNN" (3 dígitos). `startNumber` padrão = maior número já usado com essa base na campanha (inclusive em jobs ainda na fila) + 1. A criação roda pelo governador, um por vez; o número precisa estar vinculado à campanha. `adminPhones` (1 a 5, só dígitos com DDI, 12 a 13) é obrigatório: a Evolution não cria grupo sem participante, então os números da equipe do lançador entram na criação e viram admins. `onlyAdminsSend` (padrão ligado) deixa só admins enviarem. `pictureUrl` precisa ser https.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.groups_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_groups_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.groups_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `channelId` | string (uuid) | sim |  |
| `baseName` | string | sim |  |
| `startNumber` | integer | não |  |
| `count` | integer | sim |  |
| `description` | string | não |  |
| `pictureUrl` | string | não |  |
| `onlyAdminsSend` | boolean | não | padrão true |
| `adminPhones` | string[] | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.groups_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","baseName":"Lançamento","count":3,"onlyAdminsSend":true,"adminPhones":["5511999990000"]}'
```

CLI:

```bash
node cli/atomiks.mjs groups.groups_create --json '{"campaignId":"00000000-0000-4000-8000-000000000001","channelId":"00000000-0000-4000-8000-000000000001","baseName":"Lançamento","count":3,"onlyAdminsSend":true,"adminPhones":["5511999990000"]}'
```

MCP: ferramenta `groups_groups_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.groups_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.access_check

Conferir se o número participa e é admin dos grupos. Enfileira um job por número que confere, em cada grupo vivo da campanha, se o número participa, se é admin e se o link de convite vale. Grupos sem número vão para o primeiro número vinculado. Recusa se já há uma conferência em andamento. `jobId` é o primeiro job; `jobIds` traz todos.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.access_check` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_access_check`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.access_check`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.access_check \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.access_check --json '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_access_check` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.access_check.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.jobs_list

Listar jobs de grupos da campanha. Jobs de importar, criar e conferir acesso (os internos de conferência de tamanho não aparecem), do mais novo ao mais antigo, com progresso (`done`/`total`/`failed`), próxima tentativa (`nextAt`) e o motivo da espera (`lastReason`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.jobs_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_jobs_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.jobs_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `limit` | integer | não | padrão 20 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.jobs_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":20}'
```

CLI:

```bash
node cli/atomiks.mjs groups.jobs_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":20}'
```

MCP: ferramenta `groups_jobs_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.jobs_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.job_get

Ver um job de grupos. O job com os 200 primeiros itens (posição, estado, erro e nome do grupo quando há).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.job_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_job_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.job_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.job_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.job_get --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_job_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.job_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.job_cancel

Cancelar um job de grupos. Cancela um job `queued` ou `running`: nenhum item novo roda. O que já foi feito no WhatsApp fica. Job que já terminou responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.job_cancel` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_job_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.job_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.job_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.job_cancel --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_job_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.job_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.folders_list

Listar pastas de grupos da campanha. Pastas da campanha por nome, com quantos grupos vivos há em cada uma.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.folders_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_folders_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.folders_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.folders_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.folders_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_folders_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.folders_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.folder_create

Criar pasta de grupos. Cria uma pasta na campanha. Nome repetido (sem diferenciar maiúsculas) responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.folder_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_folder_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.folder_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.folder_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","name":"Turma 1"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.folder_create --json '{"campaignId":"00000000-0000-4000-8000-000000000001","name":"Turma 1"}'
```

MCP: ferramenta `groups_folder_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.folder_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.folder_rename

Renomear pasta de grupos. Troca o nome da pasta. Nome repetido na campanha responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.folder_rename` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_folder_rename`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.folder_rename`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.folder_rename \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001","name":"Turma 2"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.folder_rename --json '{"id":"00000000-0000-4000-8000-000000000001","name":"Turma 2"}'
```

MCP: ferramenta `groups_folder_rename` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.folder_rename.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.folder_delete

Excluir pasta de grupos. Apaga a pasta. Os grupos que estavam nela ficam sem pasta; nenhum grupo é removido.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.folder_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_folder_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.folder_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.folder_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.folder_delete --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_folder_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.folder_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.links_list

Listar links de captação da campanha. Link principal da campanha (`main`: código, URL pública `/g/<código>` e quantos grupos usam o link principal) e links extras vivos (`extras`, com política de rotação própria, grupos e cliques dos últimos 7 dias).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.links_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_links_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.links_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.links_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.links_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_links_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.links_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.link_create

Criar link extra de captação. Cria um link extra para a campanha (`/g/<código>`, código único entre campanhas e links). `rotationPolicy` nulo usa a política da campanha. Depois associe grupos ao link com `groups.groups_update_bulk` (`linkId`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.link_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_link_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.link_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `name` | string | sim |  |
| `rotationPolicy` | "sequential" \| "weighted" \| "round_robin" \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.link_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","name":"Instagram"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.link_create --json '{"campaignId":"00000000-0000-4000-8000-000000000001","name":"Instagram"}'
```

MCP: ferramenta `groups_link_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.link_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.link_update

Alterar link extra de captação. Renomeia o link extra e/ou muda a política de rotação (`null` volta a usar a da campanha).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.link_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_link_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.link_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `name` | string | não |  |
| `rotationPolicy` | "sequential" \| "weighted" \| "round_robin" \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.link_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001","name":"Instagram stories"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.link_update --json '{"id":"00000000-0000-4000-8000-000000000001","name":"Instagram stories"}'
```

MCP: ferramenta `groups_link_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.link_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.link_delete

Excluir link extra de captação. Marca o link como excluído (o código deixa de funcionar) e devolve os grupos dele ao link principal da campanha.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.link_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_link_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.link_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.link_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.link_delete --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_link_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.link_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.rotation_now

Ver quem recebe agora na rotação. Grupo que a política escolheria agora e o seguinte (sem reservar vaga), para o link principal (`linkId` nulo) ou um link extra, mais a política em uso, as vagas livres e quantos grupos ainda têm vaga.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.rotation_now` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_rotation_now`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.rotation_now`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `linkId` | string (uuid) \| null | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.rotation_now \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.rotation_now --json '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_rotation_now` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.rotation_now.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.rotation_simulate

Simular a rotação antes de lançar. Simula `clicks` cliques (1 a 20000) na rotação do link principal (`linkId` nulo) ou de um link extra, com `joinRate` (0 a 1, padrão 0,8) de entradas. Nada é gravado. Devolve `{perGroup: [{groupId, name, clicks, joins, fullAtClick}], firstFullAt, noSeatAt, totalReserved}`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.rotation_simulate` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_rotation_simulate`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.rotation_simulate`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `linkId` | string (uuid) \| null | não |  |
| `clicks` | integer | sim |  |
| `joinRate` | number | não | padrão 0.8 |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.rotation_simulate \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","clicks":5000,"joinRate":0.8}'
```

CLI:

```bash
node cli/atomiks.mjs groups.rotation_simulate --json '{"campaignId":"00000000-0000-4000-8000-000000000001","clicks":5000,"joinRate":0.8}'
```

MCP: ferramenta `groups_rotation_simulate` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.rotation_simulate.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.click_stats

Estatísticas de cliques da campanha. Cliques e entradas no período (`from`/`to` em ISO 8601, no máximo 90 dias), agrupados por `hour` ou `day`: `{series: [{at, clicks, joins}], byDevice, byOrigin: [{host, clicks}], byUtmSource: [{source, clicks}], byGroup: [{groupId, name, clicks, joins}]}`. Entradas são eventos reais de entrada no período.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.click_stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_click_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.click_stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `bucket` | "hour" \| "day" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.click_stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","from":"2026-10-19T00:00:00Z","to":"2026-10-26T00:00:00Z","bucket":"day"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.click_stats --json '{"campaignId":"00000000-0000-4000-8000-000000000001","from":"2026-10-19T00:00:00Z","to":"2026-10-26T00:00:00Z","bucket":"day"}'
```

MCP: ferramenta `groups_click_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.click_stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.alerts_list

Listar alertas da campanha. Alertas da campanha (`no_seat`, `number_disconnected`, `invite_invalid`, `near_full`), os mais recentes primeiro. `open` (padrão verdadeiro) devolve só os não resolvidos. Cada alerta conta quantas vezes se repetiu (`count`).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.alerts_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_alerts_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.alerts_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `open` | boolean | não | padrão true |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.alerts_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","open":true}'
```

CLI:

```bash
node cli/atomiks.mjs groups.alerts_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","open":true}'
```

MCP: ferramenta `groups_alerts_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.alerts_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.alert_resolve

Resolver alerta da campanha. Marca o alerta como resolvido. Se o problema voltar, um novo alerta do mesmo tipo é aberto.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.alert_resolve` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_alert_resolve`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.alert_resolve`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.alert_resolve \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.alert_resolve --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_alert_resolve` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.alert_resolve.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.messages_list

Listar mensagens de grupos. Mensagens da biblioteca da campanha, da mais recente alterada para a mais antiga. `search` filtra por título ou texto; `kind` por tipo.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.messages_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_messages_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.messages_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `search` | string | não |  |
| `kind` | "text" \| "media" \| "link" \| "poll" \| "contact" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.messages_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.messages_list --json '{"campaignId":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_messages_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.messages_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.message_get

Ver uma mensagem de grupos. Mensagem da biblioteca com conteúdo, versão e se é a boas-vindas.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.message_get` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_message_get`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.message_get`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.message_get \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.message_get --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_message_get` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.message_get.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.message_create

Criar mensagem de grupos. Cria a mensagem. `kind`: `text` (texto obrigatório), `link` (texto com um endereço https://), `media` (`media` vem do upload em `/api/v1/grupos-media`; `body` é a legenda), `poll` (2 a 12 opções de até 100 caracteres), `contact` (telefone com 12 ou 13 dígitos). Texto até 4.096 caracteres e variação `{a|b}` válida. `isWelcome: true` desmarca a boas-vindas anterior da campanha.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.message_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_message_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.message_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `title` | string | sim |  |
| `kind` | "text" \| "media" \| "link" \| "poll" \| "contact" | sim |  |
| `body` | string | não |  |
| `media` | object | não |  |
| `poll` | object | não |  |
| `contact` | object | não |  |
| `mentionAll` | boolean | não | padrão false |
| `isWelcome` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.message_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-0000-0000-000000000000","title":"Boas-vindas","kind":"text","body":"{Oi|Olá}! Seja bem-vindo.","mentionAll":false,"isWelcome":true}'
```

CLI:

```bash
node cli/atomiks.mjs groups.message_create --json '{"campaignId":"00000000-0000-0000-0000-000000000000","title":"Boas-vindas","kind":"text","body":"{Oi|Olá}! Seja bem-vindo.","mentionAll":false,"isWelcome":true}'
```

MCP: ferramenta `groups_message_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.message_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.message_update

Alterar mensagem de grupos. Altera os campos informados e sobe a `version`; o conteúdo final é validado de novo por tipo. Agendamentos com conteúdo congelado não mudam.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.message_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_message_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.message_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `title` | string | não |  |
| `kind` | "text" \| "media" \| "link" \| "poll" \| "contact" | não |  |
| `body` | string \| null | não |  |
| `media` | object \| null | não |  |
| `poll` | object \| null | não |  |
| `contact` | object \| null | não |  |
| `mentionAll` | boolean | não |  |
| `isWelcome` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.message_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000","body":"Novo texto"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.message_update --json '{"id":"00000000-0000-0000-0000-000000000000","body":"Novo texto"}'
```

MCP: ferramenta `groups_message_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.message_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.message_delete

Apagar mensagem de grupos. Apaga a mensagem da biblioteca (some da lista; disparos e agendamentos congelados não mudam). Apagar a boas-vindas desliga o envio automático até haver outra.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.message_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_message_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.message_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.message_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-0000-0000-000000000000"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.message_delete --json '{"id":"00000000-0000-0000-0000-000000000000"}'
```

MCP: ferramenta `groups_message_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.message_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.message_preview

Prévia da variação de texto. Sorteia 3 variações do texto com `{a|b|c}` e diz se a sintaxe é válida (`valid`). Texto inválido devolve `samples` vazio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.message_preview` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_message_preview`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.message_preview`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `body` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.message_preview \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"{Oi|Olá}, tudo bem?"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.message_preview --json '{"body":"{Oi|Olá}, tudo bem?"}'
```

MCP: ferramenta `groups_message_preview` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.message_preview.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.welcome_settings

Boas-vindas da campanha. Sem campos além de `campaignId`, lê a configuração (qualquer membro). Com `enabled`, `windowMinutes` (1 a 60, agrupa quem entra) ou `hours` (`HH:MM-HH:MM` no fuso da campanha), grava (administrador, escopo marketing:write). `messageId` é a mensagem marcada como boas-vindas; sem ela, ligar não envia nada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.welcome_settings` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_welcome_settings`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.welcome_settings`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `enabled` | boolean | não |  |
| `windowMinutes` | integer | não |  |
| `hours` | string | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.welcome_settings \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-0000-0000-000000000000","enabled":true,"windowMinutes":5,"hours":"08:00-22:00"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.welcome_settings --json '{"campaignId":"00000000-0000-0000-0000-000000000000","enabled":true,"windowMinutes":5,"hours":"08:00-22:00"}'
```

MCP: ferramenta `groups_welcome_settings` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.welcome_settings.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.send_now

Enviar uma mensagem agora para os grupos. Enfileira o envio da mensagem para o alvo (`{all: true}`, `{folderId}`, `{linkId}` com `null` = link principal, ou `{groupIds}`), resolvido na hora, só grupos vivos com número. O conteúdo fica congelado no job. `speed`: `slow` 6 s, `normal` 2 s, `fast` 1,25 s entre grupos do mesmo número. Cria um job por número; `total` = grupos (0 = nada a enviar).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.send_now` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_send_now`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.send_now`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `messageId` | string (uuid) | sim |  |
| `target` | object | sim |  |
| `speed` | "slow" \| "normal" \| "fast" | não | padrão "normal" |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.send_now \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","messageId":"00000000-0000-4000-8000-000000000001","target":{"all":true},"speed":"normal"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.send_now --json '{"campaignId":"00000000-0000-4000-8000-000000000001","messageId":"00000000-0000-4000-8000-000000000001","target":{"all":true},"speed":"normal"}'
```

MCP: ferramenta `groups_send_now` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.send_now.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedules_list

Listar agendamentos de mensagens da campanha. Agendamentos da campanha (mais recentes primeiro), com as próximas 5 datas (`nextRuns`, no fuso da campanha) dos que estão `scheduled`. `state`: `scheduled`, `paused`, `done` ou `canceled`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedules_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedules_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedules_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `state` | "scheduled" \| "paused" \| "done" \| "canceled" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedules_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","state":"scheduled"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedules_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","state":"scheduled"}'
```

MCP: ferramenta `groups_schedules_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedules_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedule_create

Agendar o envio de uma mensagem. Agenda a mensagem para o alvo. `kind: once` exige `runAt` (ISO com fuso, pelo menos 2 minutos no futuro); `recurring` exige `weekdays` (0 = domingo a 6) e `timeOfDay` `HH:MM` no fuso da campanha. O conteúdo fica congelado, a menos que `useLatest` seja verdadeiro (usa a versão atual da mensagem na hora de enviar). Devolve `warnings`: outro agendamento a menos de 10 minutos do próximo disparo, ou alvo sem grupos hoje.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedule_create` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedule_create`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedule_create`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `messageId` | string (uuid) | sim |  |
| `target` | object | sim |  |
| `speed` | "slow" \| "normal" \| "fast" | não | padrão "normal" |
| `kind` | "once" \| "recurring" | sim |  |
| `runAt` | string (date-time) | não |  |
| `weekdays` | integer[] | não |  |
| `timeOfDay` | string | não |  |
| `useLatest` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedule_create \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","messageId":"00000000-0000-4000-8000-000000000001","target":{"all":true},"speed":"normal","kind":"recurring","weekdays":[1,3],"timeOfDay":"09:00","useLatest":false}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedule_create --json '{"campaignId":"00000000-0000-4000-8000-000000000001","messageId":"00000000-0000-4000-8000-000000000001","target":{"all":true},"speed":"normal","kind":"recurring","weekdays":[1,3],"timeOfDay":"09:00","useLatest":false}'
```

MCP: ferramenta `groups_schedule_create` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedule_create.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedule_update

Editar um agendamento. Edita no lugar um agendamento `scheduled` ou `paused` (sobe `version` e recalcula o próximo disparo). Informar `messageId` (mesmo o atual) congela de novo a versão atual da mensagem. O tipo (`once`/`recurring`) não muda: crie outro agendamento. Se outra pessoa editou antes, responde `invalid_input`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedule_update` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedule_update`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedule_update`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |
| `messageId` | string (uuid) | não |  |
| `target` | object | não |  |
| `speed` | "slow" \| "normal" \| "fast" | não |  |
| `runAt` | string (date-time) | não |  |
| `weekdays` | integer[] | não |  |
| `timeOfDay` | string | não |  |
| `useLatest` | boolean | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedule_update \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001","timeOfDay":"10:00"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedule_update --json '{"id":"00000000-0000-4000-8000-000000000001","timeOfDay":"10:00"}'
```

MCP: ferramenta `groups_schedule_update` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedule_update.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedule_pause

Pausar um agendamento. Pausa um agendamento `scheduled`: nada sai até retomar.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedule_pause` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedule_pause`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedule_pause`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedule_pause \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedule_pause --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_schedule_pause` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedule_pause.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedule_resume

Retomar um agendamento pausado. Volta um agendamento `paused` para `scheduled` e recalcula o próximo disparo. Envio único cujo horário já passou responde `invalid_input` (edite a data antes).

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedule_resume` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedule_resume`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedule_resume`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedule_resume \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedule_resume --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_schedule_resume` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedule_resume.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.schedule_cancel

Cancelar um agendamento. Cancela um agendamento `scheduled` ou `paused`. O que já foi enviado não muda.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.schedule_cancel` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_schedule_cancel`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.schedule_cancel`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `id` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.schedule_cancel \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.schedule_cancel --json '{"id":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_schedule_cancel` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.schedule_cancel.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.sends_list

Listar os disparos da campanha. Jobs de enviar, apagar e editar mensagem, do mais novo ao mais antigo, com progresso, título da mensagem e agendamento de origem (`scheduleId`). Apagar e editar trazem o disparo original em `sourceJobId`. Disparos de boas-vindas (`isWelcome`) ficam de fora, a menos que `includeWelcome` seja verdadeiro.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.sends_list` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_sends_list`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.sends_list`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `limit` | integer | não | padrão 20 |
| `includeWelcome` | boolean | não | padrão false |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.sends_list \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":20,"includeWelcome":false}'
```

CLI:

```bash
node cli/atomiks.mjs groups.sends_list --json '{"campaignId":"00000000-0000-4000-8000-000000000001","limit":20,"includeWelcome":false}'
```

MCP: ferramenta `groups_sends_list` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.sends_list.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.send_items

Ver os itens de um disparo, por grupo. Os primeiros 500 itens do disparo (posição, grupo, estado `pending`/`done`/`failed`/`skipped`, motivo da falha já traduzido e `waMessageId` quando enviado). `status` filtra.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.send_items` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_send_items`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.send_items`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |
| `status` | "pending" \| "done" \| "failed" \| "skipped" | não |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.send_items \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-4000-8000-000000000001","status":"failed"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.send_items --json '{"jobId":"00000000-0000-4000-8000-000000000001","status":"failed"}'
```

MCP: ferramenta `groups_send_items` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.send_items.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.send_retry_failed

Reenviar só o que falhou em um disparo. Cria um job novo só com os itens `failed` do disparo (mesmo conteúdo, mesmo número). Os já enviados não repetem. Sem falhas, ou se o reenvio já foi criado, responde `invalid_input`; para tentar de novo outra rodada, use o job do reenvio.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.send_retry_failed` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_send_retry_failed`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.send_retry_failed`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.send_retry_failed \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.send_retry_failed --json '{"jobId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_send_retry_failed` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.send_retry_failed.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.send_delete

Apagar para todos o que um disparo entregou. Cria um job `delete_message` com os itens `done` que têm `waMessageId` e saíram há menos de 48 h. O disparo precisa estar parado (`queued`/`running` responde `invalid_input`; `canceled` vale). Também responde `invalid_input` se nada foi entregue, nada está na janela ou o disparo já foi apagado.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.send_delete` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_send_delete`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.send_delete`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.send_delete \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.send_delete --json '{"jobId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_send_delete` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.send_delete.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.send_edit

Editar o texto do que um disparo entregou. Cria um job `edit_message` que troca o texto nos itens `done` com `waMessageId` enviados há menos de 15 min. O disparo precisa estar parado (`queued`/`running` responde `invalid_input`; `canceled` vale). Só vale para disparo de `text` ou `link` (mídia, enquete e contato não editam). Texto de até 4.096 caracteres, sem variação.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.send_edit` (corpo JSON)
- Quem pode chamar: administrador da conta
- Escopo da chave: `marketing:write`
- Grava dados: sim
- Pela chave de API: sim
- Ferramenta MCP: `groups_send_edit`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.send_edit`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `jobId` | string (uuid) | sim |  |
| `text` | string | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.send_edit \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"00000000-0000-4000-8000-000000000001","text":"Texto corrigido"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.send_edit --json '{"jobId":"00000000-0000-4000-8000-000000000001","text":"Texto corrigido"}'
```

MCP: ferramenta `groups_send_edit` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.send_edit.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.membership_stats

Entradas e saídas da campanha por período. Entradas, saídas e saldo no período (`from`/`to` em ISO 8601, no máximo 90 dias), por `hour` ou `day` no fuso da campanha: `{series: [{at, joins, leaves, net}], byGroup: [{groupId, name, joins, leaves, net, memberCount}], totals: {joins, leaves, net, leaveRate}}`.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.membership_stats` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_membership_stats`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.membership_stats`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |
| `from` | string (date-time) | sim |  |
| `to` | string (date-time) | sim |  |
| `bucket` | "hour" \| "day" | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.membership_stats \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001","from":"2026-10-19T00:00:00Z","to":"2026-10-26T00:00:00Z","bucket":"day"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.membership_stats --json '{"campaignId":"00000000-0000-4000-8000-000000000001","from":"2026-10-19T00:00:00Z","to":"2026-10-26T00:00:00Z","bucket":"day"}'
```

MCP: ferramenta `groups_membership_stats` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.membership_stats.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaign_health

Saúde da campanha de grupos. Nota de 0 a 100, nível (`ok`, `attention`, `critical`), os motivos em português e a próxima ação (`nextAction`: rótulo e aba onde resolver). Considera números, grupos, alertas abertos e a última entrada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaign_health` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaign_health`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaign_health`)

## Entrada

| Campo | Tipo | Obrigatório | Nota |
|---|---|---|---|
| `campaignId` | string (uuid) | sim |  |

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaign_health \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaign_health --json '{"campaignId":"00000000-0000-4000-8000-000000000001"}'
```

MCP: ferramenta `groups_campaign_health` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaign_health.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---

# groups.campaigns_health

Saúde de todas as campanhas de grupos. Para a lista de campanhas: `items` com `campaignId`, `score`, `level` e `nextAction` de cada campanha não encerrada.

- Endpoint: `POST https://app.atomiks.com.br/api/v1/groups.campaigns_health` (corpo JSON)
- Quem pode chamar: membro da conta
- Escopo da chave: `marketing:read`
- Grava dados: não
- Pela chave de API: sim
- Ferramenta MCP: `groups_campaigns_health`
- Ficha em JSON: `https://app.atomiks.com.br/api/v1/openapi.json` (operationId `groups.campaigns_health`)

## Entrada

Sem campos: envie `{}`.

## Exemplo

```bash
curl -X POST https://app.atomiks.com.br/api/v1/groups.campaigns_health \
  -H "Authorization: Bearer $ATOMIKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

CLI:

```bash
node cli/atomiks.mjs groups.campaigns_health --json '{}'
```

MCP: ferramenta `groups_campaigns_health` com a mesma entrada.

## Saída

Sucesso: `{"data": ...}`. Formato completo em `https://app.atomiks.com.br/docs/operacoes/groups.campaigns_health.md`.

## Erros

`{"error": {"code", "message", "requestId"}}`. Códigos: `invalid_input` (400), `unauthorized` (401), `forbidden` / `account_pending` / `scope_missing` (403), `not_found` (404), `limit_reached` (409), `internal` (500).

---
