# NimoChat Pro+ API: documentação completa > Versão em texto da documentação oficial (https://clientes.nimochat.com.br/documentacaoapiproplus.php), gerada da página publicada. Se algo aqui divergir da página, vale a página. ## O que é a API NimoChat Pro+ (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#sobre) A **API NimoChat Pro+** é uma interface REST que permite integrar a plataforma de atendimento com qualquer sistema externo: CRM, ERP, sistema de RH, plataformas de automação como **n8n**, **Make**, **Zapier**, ou aplicações sob medida. Com a API você pode automatizar tarefas repetitivas, sincronizar dados entre sistemas, criar fluxos personalizados e levar a inteligência do NimoChat Pro+ para fora dele. A API é organizada em torno de princípios REST: usa URLs previsíveis, recebe e devolve `JSON`, e usa códigos HTTP padrão. [Listar tickets Filtre atendimentos por status, fila ou atendente](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-tickets) [Enviar mensagens Texto, arquivos, áudio, botões e listas WABA](https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-texto) [Disparos segmentados Busque contatos por tag para campanhas de marketing](https://clientes.nimochat.com.br/documentacaoapiproplus.php#busca-contatos) [Webhooks em tempo real Receba eventos no seu sistema instantaneamente](https://clientes.nimochat.com.br/documentacaoapiproplus.php#webhooks-intro) ### Casos de uso comuns - **Disparo em massa segmentado** — Buscar contatos com determinada tag e disparar campanha via n8n. - **Sincronização com CRM** — Criar contatos automaticamente a partir de leads do seu CRM. - **Automação de RH** — Cadastrar usuários (atendentes) automaticamente quando um colaborador é admitido no ERP. - **Integração com BI** — Extrair dashboards de tickets, tempos de atendimento e evolução para Power BI / Looker. - **Humanização de bots** — Mostrar status "digitando..." antes de uma resposta automática. ## Começando (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#comecando) Para usar a API você precisa de **3 informações**: a URL base do seu painel, uma chave de API (token) e o ID da sua conexão WhatsApp. Tudo pode ser obtido em poucos cliques no painel administrativo. ### Passo 1 — Gerar sua chave de API 1. Faça login no seu painel NimoChat Pro+ como **Administrador**. 2. No menu lateral, acesse **API**. 3. Clique em **Nova API**, dê um nome e selecione a conexão WhatsApp. 4. Copie e guarde o **Token** e o **API ID**. O token só é exibido uma vez. > **Mantenha seu token seguro.** Ele dá acesso total à sua conta. Nunca exponha o token em código frontend, repositórios públicos ou logs. Se suspeitar que o token vazou, gere um novo imediatamente. ### Passo 2 — Identificar sua URL base Cada cliente NimoChat Pro+ tem sua própria URL de back-end. Ela aparece no painel administrativo e tem o formato: ``` https://gestor.nimochat.com.br // contas do Atende https://atende1admin.nimochat.com.br // contas do Atende1 ``` **Atenção: o endereço da API não é o mesmo que você usa para entrar no painel.** O painel é a tela em que você faz login; a API atende num endereço próprio. Se você usar o endereço do painel nas chamadas, elas serão redirecionadas para a tela de login e nada funcionará, sem uma mensagem de erro que explique o motivo. Para descobrir qual é o seu, veja por onde você acessa o painel: | Se você acessa o painel em | a URL base da sua API é | |---|---| | `atende.nimochat.com.br` ou `hub.nimochat.com.br` | `https://gestor.nimochat.com.br` | | `atende1.nimochat.com.br` ou `hub1.nimochat.com.br` | `https://atende1admin.nimochat.com.br` | Na dúvida, fale com o suporte antes de começar a integração: usar o endereço errado é o motivo mais comum de a primeira chamada não responder. ## Autenticação (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#autenticacao) A API NimoChat Pro+ usa o padrão **Bearer Token**. Toda requisição precisa incluir o token no cabeçalho HTTP `Authorization`: ``` Authorization: Bearer SEU_TOKEN_AQUI ``` O sistema valida o token em todas as chamadas e **isola os dados por empresa**: você só consegue acessar e modificar dados da sua própria conta. Tentar usar um token inválido, ou esquecer o cabeçalho, retorna `HTTP 403 Forbidden` com `{"error": "Invalid token."}` ou `{"error": "Token was not provided."}`. > **Boas práticas:** guarde o token em variáveis de ambiente (`.env`), nunca direto no código. Em ambientes de produção, use um cofre de secrets como AWS Secrets Manager, Doppler ou Vault. ## URL Base e formato dos endpoints (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#urlbase) Todos os endpoints da API seguem o mesmo padrão de URL: ``` https://SUA_URL_BASE/v2/api/external/{apiId}/{endpoint} ``` Onde: - `SUA_URL_BASE` — o endereço da API da sua conta (veja a tabela no Passo 2 acima; **não é o endereço do painel**) - `{apiId}` — o API ID gerado no Passo 1 - `{endpoint}` — o nome do endpoint que você quer chamar (ex: `listChannels`) ### Convenções da API #### Formato de datas Onde houver filtro por período (`startDate`, `endDate`), use o formato **ano-mês-dia**: `2026-08-21`. O formato brasileiro `21/08/2026` **não funciona** e provoca um erro `500`, que parece falha do servidor mas é só o formato errado. ``` ?startDate=2026-08-01&endDate=2026-08-21 // certo ?startDate=01/08/2026&endDate=21/08/2026 // erro 500 ``` #### Onde vem a lista nas listagens Toda resposta traz `success` e `data`, mas **o lugar da lista dentro de `data` muda conforme o endpoint**. Confira antes de programar o laço, para não escrever um código que funciona numa rota e quebra na outra: | Onde está a lista | Endpoints | |---|---| | `data` (a própria lista) | `listContacts`, `listTickets`, `listTags`, `listUsers`, `listQueues`, `todo/list`, `gallery/list` | | `data.campaigns` | `campaign/list` | | `data.data` | `pipeline/list`, `listOpportunities` | #### Paginação Quase toda listagem traz um bloco `pagination` ao lado de `data`. **O campo `total` está sempre presente**; os demais variam por endpoint, então não assuma que o bloco é igual em todos: | Campos do `pagination` | Endpoints | |---|---| | `total` | `listTags`, `listQueues`, `listSessions` | | `total`, `hasMore` | `listContacts`, `listTickets`, `listUsers`, `gallery/list` | | `total`, `page`, `limit`, `hasMore` | `appointment/list`, `bulkDispatch/list`, `searchMessages` | | `total`, `page`, `limit`, `totalPages` | `callLog/list`, `pipeline/list`, `listOpportunities` | | `page`, `limit`, `total`, `totalPages`, `hasMore` | `contacts/search` | | *não traz o bloco* | `listChatFlows`, `todo/list`, `campaign/list` | > **Duas pegadinhas.** Em `listContacts` o `total` vem como **texto** (`"3068"`) e não como número: converta antes de comparar ou somar. E em `pipeline/list` e `listOpportunities` o bloco `pagination` fica **dentro** de `data`, não ao lado dele. Nos três endpoints que não trazem o bloco, peça a próxima página (`pageNumber`, quando disponível) até vir uma lista vazia. #### Ritmo de chamadas Não publicamos um limite fixo de requisições por minuto, e em uso normal a API não bloqueia: em teste, 30 chamadas seguidas foram todas respondidas. Ainda assim, evite rajadas grandes em paralelo, principalmente em importações: prefira sequencial, ou poucas chamadas simultâneas. Se algum dia receber `429`, espere alguns segundos e repita a chamada. ### Códigos de resposta | Código | Significado | |---|---| | `200 OK` | Requisição bem-sucedida. O corpo contém os dados solicitados. | | `201 Created` | Registro criado. Algumas rotas de criação respondem 201 em vez de 200 (ex: `createNotes`). Trate os dois como sucesso. | | `400 Bad Request` | Parâmetros inválidos ou faltando. | | `403 Forbidden` | Token inválido, ausente, ou sem permissão para o recurso. O corpo traz `{"error": "Invalid token."}` ou `{"error": "Token was not provided."}`. | | `402 Payment Required` | O plano da conta não inclui o recurso (`ERR_FEATURE_NOT_IN_PLAN`) ou a conta está bloqueada por pagamento (`ERR_TENANT_PAYMENT_BLOCKED`). | | `404 Not Found` | Recurso não encontrado (ex: ID inexistente ou de outra conta). | | `409 Conflict` | A ação conflita com o estado atual. Ex: enviar para um ticket fechado sem pedir para reabrir (`ERR_TICKET_CLOSED`). | | `413 Payload Too Large` | Envio grande demais (ex: respostas de formulário acima de 32 KB, cota da galeria estourada). | | `422 Unprocessable Entity` | O número informado corresponde a mais de um contato (`ERR_NUMBER_AMBIGUOUS`). A resposta traz os candidatos: nas rotas que aceitam `contactId` (ex: `telegramInvite`), repita a chamada com ele. | | `424 Failed Dependency` | Um serviço externo não respondeu. Ex: `ERR_WAPP_CONTACT_UNVERIFIED` (número sem WhatsApp, ou a consulta ao WhatsApp falhou na hora). Pode tentar de novo. | | `429 Too Many Requests` | Chamadas demais em pouco tempo. Não há um limite fixo publicado (veja [Convenções](https://clientes.nimochat.com.br/documentacaoapiproplus.php#convencoes)). Se receber, aguarde alguns segundos e tente de novo. | | `500 Internal Server Error` | Erro no servidor. Reporte ao suporte se persistir. | > **Leia o campo `error`.** Quase todo erro traz um código como `{"error": "ERR_MISSING_FIELDS", "fields": ["userId"]}`. Quando vier `field` ou `fields`, eles dizem exatamente qual campo corrigir. Os códigos de cada rota estão no cartão dela. ## Exemplo rápido — sua primeira chamada (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#exemplo-rapido) Vamos listar todos os canais (conexões WhatsApp) da sua conta. Substitua `SEU_TOKEN`, `SUA_URL_BASE` e `SEU_API_ID` pelos valores reais: **cURL** ``` curl --request GET \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/listChannels' \ --header 'Authorization: Bearer SEU_TOKEN' ``` **Resposta esperada** ``` { "success": true, "data": [ { "id": 1, "name": "WhatsApp Principal", "type": "whatsapp", "status": "CONNECTED", "number": "5511999999999", "isActive": true } ] } ``` > **O formato das respostas.** Toda resposta de sucesso vem embrulhada em `success` e `data`: os dados que você quer estão sempre dentro de `data`, nunca na raiz. Em caso de erro, vem `{"error": "MENSAGEM"}`. Ao programar, leia `resposta.data` e não `resposta.channels` ou `resposta.contacts`. > **Recebeu uma resposta?** Você está pronto para usar a API. Agora explore os endpoints abaixo ou abra a [coleção do Postman](https://www.postman.com/nimochatproplus/nimochat-s-workspace/collection/51809267-8bb35fbd-6298-44be-955f-0b17bcf7c0e0) que tem todos os endpoints prontos para testar. ## 🤖 Usando a API com uma IA (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#usar-com-ia) Se você vai pedir para uma IA (ChatGPT, Claude, Gemini, Copilot ou outra) escrever a sua integração, entregue a ela o endereço desta página e o bloco abaixo. As IAs costumam completar o que não sabem com o que viram em outras plataformas parecidas, e erram justamente nos pontos listados, que conferimos no nosso servidor. 1. Copie o bloco **Regras para a IA** e cole no começo da conversa. 2. Se a IA consegue abrir links, passe também o endereço [`clientes.nimochat.com.br/llms-full.txt`](https://clientes.nimochat.com.br/llms-full.txt): é esta documentação inteira em texto, que a IA lê melhor do que a página. 3. Peça uma rota de cada vez e teste cada uma antes de seguir (o [Exemplo rápido](https://clientes.nimochat.com.br/documentacaoapiproplus.php#exemplo-rapido) serve de primeiro teste). 4. Quando der erro, cole na conversa a resposta inteira da API: o código em `error` diz o que corrigir. > **Não cole o seu token na conversa com a IA.** Peça o código com `SEU_TOKEN` e coloque o valor real só no seu servidor, numa variável de ambiente. Quem tem o token envia mensagens em nome da sua empresa. **Regras para a IA (copie e cole no começo da conversa)** ``` Você vai escrever uma integração com a API do NimoChat Pro+. Use SÓ as rotas e os campos da documentação oficial: https://clientes.nimochat.com.br/documentacaoapiproplus.php (a mesma documentação em texto: https://clientes.nimochat.com.br/llms-full.txt) Se precisar de algo que não está lá, pergunte. Não invente rota nem campo. Regras conferidas no nosso servidor (última conferência em 29/10/2026): 1. URL: https://SUA_URL_BASE/v2/api/external/{apiId}/{rota}. A URL base da API não é o endereço do painel (tabela no Passo 2 da documentação). 2. Autenticação: header "Authorization: Bearer SEU_TOKEN". Token errado ou ausente responde 403 (não 401). Exceção: no envio por GET (/params/) o token vai no parâmetro bearertoken da URL, e o header é ignorado. Nunca escreva o token no código: leia de uma variável de ambiente. 3. Rotas GET leem só a URL (caminho e query string). Filtro no corpo é ignorado sem erro. 4. Filtros de período (startDate, endDate) em AAAA-MM-DD. DD/MM/AAAA nesses filtros dá erro 500. Exceções: birthdayDate do contato é DD/MM/AAAA; datas de agendamento aceitam os dois; em tarefas (todo) use AAAA-MM-DD, porque com barra a data é lida como mês/dia (02/03 vira 3 de fevereiro). 5. Hora sem fuso vale o horário de Brasília (-03:00). Prefira mandar o fuso. 6. updateContact encontra o contato pelo campo number. Não existe contactId nessa rota; sem number a resposta é 500. 7. createTicket exige userId. sendLocation e sendVcard exigem ticketId. 8. Várias tags: campo tagIds (lista). Lista dentro de tagId dá erro. 9. updatetag SUBSTITUI todas as tags do contato. Para acrescentar, use addTag ou addTagContact. 10. createContact, updateContact, addTag e removeTag exigem um token criado com uma conexão (senão 400 ERR_API_REQUIRES_SESSION). 11. O lugar da lista na resposta muda por rota (data, data.campaigns, data.data) e o bloco pagination também. Confira em "Convenções da API". 12. Em erro, leia o campo error (ex: ERR_MISSING_FIELDS). Se vier field ou fields, é o campo a corrigir. 201 também é sucesso. 13. bulkIndividual e bulkFastMessage exigem whatsappType (tipo da conexão, como em listChannels). Sem ele a resposta é 200 com success:true e nada é enviado. 14. Antes de enviar para clientes, teste com o seu próprio número. ``` ## 📊 Listagens (GET) (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listagens) Endpoints de consulta. Use estas rotas para buscar informações da plataforma. Todas retornam `JSON`. ### GET `/v2/api/external/{apiId}/listChannels` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais) Lista todas as conexões (canais) da sua conta — WhatsApp, Instagram, Facebook, WebChat, Telegram, etc. **Exemplo** ``` curl --request GET \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/listChannels' \ --header 'Authorization: Bearer SEU_TOKEN' ``` ### GET `/v2/api/external/{apiId}/listSessions` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-sessoes) Lista todas as sessões (instâncias) ativas no seu sistema. ### GET `/v2/api/external/{apiId}/listTickets` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-tickets) Lista os tickets (atendimentos) com filtros avançados. Suporta paginação. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `pageNumber` | int | Número da página (começa em 1). | | `status` | string **obrigatório** | Filtra por status: `open`, `pending` ou `closed`. Se você não enviar este parâmetro, a chamada falha com `404` e `{"error": "ERR_NO_STATUS_SELECTED"}`. | | `searchParam` | string | Texto para buscar em nome, número ou conteúdo. | | `queuesIds` | array | IDs das filas para filtrar. | | `whatsappIds` | array | IDs das conexões WhatsApp. | | `selectedUser` | int | ID do atendente responsável. | **Exemplo — tickets abertos da fila 3** ``` curl --request GET \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/listTickets?status=open&queuesIds=3&pageNumber=1' \ --header 'Authorization: Bearer SEU_TOKEN' ``` ### GET `/v2/api/external/{apiId}/listContacts` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-contatos) Lista contatos cadastrados. Suporta filtros por nome, carteira (wallet) e tag. > **Os filtros vão na URL, não no corpo.** Esta rota é `GET` e lê só a query string, por exemplo `listContacts?pageNumber=1&searchParam=5511999999999`. Filtro enviado no corpo (Body) é ignorado sem erro e a resposta traz a lista sem filtro. A busca encontra o texto em qualquer parte do nome ou do número, então um pedaço do número pode trazer mais de um contato. As tags vêm só com nome e cor; para ter o `id` da tag, use a [busca avançada](https://clientes.nimochat.com.br/documentacaoapiproplus.php#busca-contatos). #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `pageNumber` | int | Número da página. | | `searchParam` | string | Busca por nome ou número. | | `walletId` | int | Filtra contatos da carteira de um vendedor. | | `tagId` | int | Filtra contatos com determinada tag. | > Cada contato da resposta traz também o endereço: `cep`, `logradouro`, `numeroEndereco`, `complemento`, `bairro`, `cidade` e `estado` (vazios vêm `null`). Para filtrar por endereço, use a [busca avançada](https://clientes.nimochat.com.br/documentacaoapiproplus.php#busca-contatos). ### GET `/v2/api/external/{apiId}/listUsers` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-usuarios) Lista todos os usuários (atendentes) cadastrados na sua conta. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `pageNumber` | int | Página de resultados. | | `searchParam` | string | Busca por nome ou e-mail. | ### GET `/v2/api/external/{apiId}/listTags` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-tags) Lista as tags (etiquetas) cadastradas para classificar contatos e tickets. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `isActive` | boolean | Filtrar apenas tags ativas (`true`) ou inativas (`false`). | ### GET `/v2/api/external/{apiId}/listQueues` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-filas) Lista as filas (departamentos) configuradas, como "Vendas", "Suporte", "Financeiro". ### GET `/v2/api/external/{apiId}/listOpportunities` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-oportunidades) Lista as oportunidades (cartões) do funil de vendas (Kanban). #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `page` | int | Página de resultados. | | `limit` | int | Itens por página. | | `status` | string | Status da oportunidade. | | `pipelineId` | int | ID do pipeline (funil). | | `stageId` | int | ID do estágio dentro do pipeline. | ### GET `/v2/api/external/{apiId}/getUserStatus` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#user-status) Verifica em tempo real se um atendente específico está **Online** ou **Offline**. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `userId` | int obrigatório | ID do atendente. | ### GET `/v2/api/external/{apiId}/listNotes` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-notas) Lista todas as notas internas registradas em um ticket específico. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | ### GET `/v2/api/external/{apiId}/getContactExtraInfo` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-extra-get) Retorna os campos personalizados (extraInfo) de um contato. #### Query Parameters | Parâmetro | Tipo | Descrição | |---|---|---| | `contactId` | int obrigatório | ID do contato. | ## 👤 Contatos (POST) (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos) Endpoints para criar, atualizar e gerenciar contatos. Todos os métodos POST recebem o corpo em `JSON` com header `Content-Type: application/json`. ### POST `/v2/api/external/{apiId}/createContact` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#criar-contato) Cria um novo contato no sistema. Os campos de endereço são opcionais; texto acima do limite é cortado, sem erro. #### Body | Campo | Tipo | Descrição | |---|---|---| | `name` | string obrigatório | Nome do contato. | | `number` | string obrigatório | Telefone com DDI + DDD (ex: 5511999999999). | | `email` | string opcional | E-mail do contato. | | `extraInfo` | array opcional | Campos personalizados `[{"name":"...","value":"..."}]`. | | `cpf` | string opcional | CPF do contato (ex: `012.345.678-90`). | | `firstName` | string opcional | Primeiro nome. | | `lastName` | string opcional | Sobrenome. | | `businessName` | string opcional | Nome da empresa do contato. | | `birthdayDate` | string opcional | Data de nascimento no formato **DD/MM/AAAA** (ex: `25/12/1990`). Atenção: é o contrário do formato `AAAA-MM-DD` usado nos filtros de data da API. | | `externalKey` | string opcional | Identificador do contato no seu sistema, para você cruzar os dados depois. Não pode se repetir. | | `validateNumber` | boolean opcional | Padrão `true`. Veja [validateNumber](https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-texto) no envio de texto. | | `cep` | string opcional | CEP (até 20 caracteres). | | `logradouro` | string opcional | Rua (até 255 caracteres). | | `numeroEndereco` | string opcional | Número do endereço (até 255). | | `complemento` | string opcional | Complemento (até 255). | | `bairro` | string opcional | Bairro (até 255). | | `cidade` | string opcional | Cidade (até 255). | | `estado` | string opcional | Estado (até 100), gravado como veio: `GO` ou `Goiás`. A busca por UF acha os dois. | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/createContact' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "name": "João Silva", "number": "5511999999999", "email": "joao@empresa.com.br" }' ``` > **Testado por nós em 29/10/2026.** Número já cadastrado responde `409 ERR_CONTACT_EXISTS` com `existingContactId`: use esse id para seguir com o contato que já existe, sem criar outro. Sem `number`: `400 ERR_MISSING_NUMBER_OR_BSUID`. Token de API sem canal vinculado: `400 ERR_API_REQUIRES_SESSION` (crie a API escolhendo uma conexão). ### POST `/v2/api/external/{apiId}/updateContact` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#atualizar-contato) Atualiza dados de um contato existente. Só mudam os campos enviados. #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número do contato que será atualizado. **É por ele que o contato é encontrado**: esta rota não tem `contactId`. Número sem cadastro: `404 ERR_CONTACT_NOT_FOUND`. | | `name` | string opcional | Novo nome. | | `email` | string opcional | Novo e-mail. | | `cpf` | string opcional | CPF do contato (ex: `012.345.678-90`). | | `firstName` | string opcional | Primeiro nome. | | `lastName` | string opcional | Sobrenome. | | `businessName` | string opcional | Nome da empresa do contato. | | `birthdayDate` | string opcional | Data de nascimento no formato **DD/MM/AAAA** (ex: `25/12/1990`). Atenção: é o contrário do formato `AAAA-MM-DD` usado nos filtros de data da API. | | `kanban` | int opcional | ID da coluna do kanban do contato. | | `cep` | string opcional | CEP (até 20 caracteres). `""` ou `null` apaga; campo ausente fica como está. | | `logradouro` | string opcional | Rua (até 255 caracteres). | | `numeroEndereco` | string opcional | Número do endereço (até 255). | | `complemento` | string opcional | Complemento (até 255). | | `bairro` | string opcional | Bairro (até 255). | | `cidade` | string opcional | Cidade (até 255). | | `estado` | string opcional | Estado (até 100), gravado como veio: `GO` ou `Goiás`. A busca por UF acha os dois. | > **Corrigido em 29/10/2026.** Esta página indicava `contactId` como campo obrigatório. O campo não existe nesta rota: a chamada sem `number` responde `500`. Se a sua integração usa `contactId` aqui, troque por `number`. **Exemplo: preencher o endereço e depois apagar só o complemento** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/updateContact' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "number": "5511999999999", "cep": "01310-100", "logradouro": "Avenida Paulista", "numeroEndereco": "1000", "bairro": "Bela Vista", "cidade": "São Paulo", "estado": "SP" }' # depois, apagar só o complemento (os outros campos ficam como estão) curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/updateContact' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "number": "5511999999999", "complemento": "" }' ``` > **Testado por nós em 29/10/2026.** Gravar o endereço, mudar só o bairro e apagar tudo com `""`/`null`: cada passo conferido na ficha do contato. ### POST `/v2/api/external/{apiId}/updateContactKanban` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-kanban) Move um contato para uma posição (kanban) específica do funil. #### Body | Campo | Tipo | Descrição | |---|---|---| | `contactId` | int obrigatório | ID do contato. | | `kanban` | int\|string obrigatório | ID ou nome do kanban de destino. | ### POST `/v2/api/external/{apiId}/updateContactWallet` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-wallet) Define a **carteira (wallet)** de um contato — vincula o contato a um vendedor responsável. Útil para distribuir leads automaticamente. #### Body | Campo | Tipo | Descrição | |---|---|---| | `contactId` | int obrigatório | ID do contato. | | `walletId` | int opcional | ID de **um** vendedor. Não aceita lista: um array aqui volta com `400` `ERR_INVALID_WALLET_ID`. | | `walletIds` | array opcional | Lista de IDs de vendedores. Envie `walletId` **ou** `walletIds`. | > **O que você envia substitui as carteiras atuais.** Não é um acréscimo: se o contato está com os vendedores 3 e 7 e você envia `"walletIds": [7]`, ele fica só com o 7. Isso vale também para o `walletId`. Para acrescentar um vendedor, envie a lista completa; para tirar todos, envie `"walletIds": []`. ### POST `/v2/api/external/{apiId}/blockContact` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-bloquear) Bloqueia ou desbloqueia o chatbot para um contato. Útil para evitar respostas automáticas para contatos VIP. #### Body | Campo | Tipo | Descrição | |---|---|---| | `contactId` | int obrigatório | ID do contato. | | `blocked` | boolean obrigatório | `true` para bloquear, `false` para desbloquear. | ### POST `/v2/api/external/{apiId}/findDuplicateContacts` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos-duplicados) Procura contatos repetidos na sua conta e devolve os pares encontrados, **sem alterar nada**. Útil antes de importar uma base ou ao integrar com um CRM, onde é comum o mesmo cliente entrar duas vezes com números diferentes. O corpo pode ir vazio (`{}`) ou com os filtros abaixo. #### Body | Campo | Tipo | Descrição | |---|---|---| | `limit` | int opcional | Quantos pares devolver, no máximo. Padrão `500`. | | `matchKinds` | array opcional | Critérios de busca: `"nine_digit_variant"` (mesmo número com e sem o nono dígito) e `"cross_collision"`. Sem o campo, usa os dois. | **Resposta** ``` { "success": true, "data": { "pairs": [ { "matchKind": "cross_collision", "confidence": "high", "primaryId": 3, "duplicateId": 47626, "primaryNumber": "5511999999999", "duplicateNumber": "5511988888888", "primaryName": "Maria Souza", "duplicateName": "Maria S.", "ticketsToMove": 0, "messagesToMove": 5, "conflictReason": null } ] } } ``` `ticketsToMove` e `messagesToMove` mostram quanto histórico seria transferido se você juntasse o par. `confidence` indica o quanto o sistema tem certeza de que são a mesma pessoa: confira antes de juntar. ### POST `/v2/api/external/{apiId}/mergeContacts` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos-juntar) Junta pares de contatos repetidos: o histórico do duplicado passa para o principal. Use os pares devolvidos por [findDuplicateContacts](https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos-duplicados). > **Confira antes de chamar.** Juntar contatos move conversas e mensagens de um para o outro. Revise os pares primeiro; não junte tudo automaticamente só porque veio na lista. #### Body | Campo | Tipo | Descrição | |---|---|---| | `pairs` | array obrigatório | Pares a juntar, no formato `[{"primaryId":3,"duplicateId":47626}]`. Cada par também aceita os **números** no lugar dos IDs, nos campos `primaryNumber` e `duplicateNumber`. Se um número corresponder a mais de um contato, aquele par volta com `ERR_NUMBER_AMBIGUOUS` e a lista dos candidatos. Até 150 pares por chamada; para mais, divida em lotes. Falha com `400` e `{"error":"ERR_PAIRS_REQUIRED"}` se o campo estiver ausente, vazio ou não for uma lista. | > **Status 200 não quer dizer que juntou.** A resposta é avaliada **par a par**: vem `200` com `success: true` mesmo quando todos os pares falharam. O que vale é `data.summary` (`total`, `consolidated`, `skipped`, `errors`) e `data.results`, com um item por par (`index`, `status`, `code`, `field`). Confira `summary.errors` antes de considerar a operação concluída. ### POST `/v2/api/external/{apiId}/unmergeContacts` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos-desfazer-juncao) Desfaz uma junção feita anteriormente, separando os contatos de novo. #### Body | Campo | Tipo | Descrição | |---|---|---| | `duplicateIds` | array opcional | IDs dos contatos **duplicados** que foram juntados (o `duplicateId` usado no [mergeContacts](https://clientes.nimochat.com.br/documentacaoapiproplus.php#contatos-juntar)). Use este campo **ou** o `mergeLogIds`. | | `mergeLogIds` | array opcional | IDs dos registros de junção, como alternativa ao `duplicateIds`. Até 150 IDs por chamada. As junções são desfeitas da mais recente para a mais antiga. | > **O campo se chama `duplicateIds` (ou `mergeLogIds`), não `ids`.** Um campo com outro nome é ignorado e a chamada falha com `400` e `{"error":"ERR_IDS_REQUIRED"}`, como se o corpo estivesse vazio. Com o campo certo, a resposta vem `200` e é avaliada **item a item**: confira `data.summary` (`total`, `reverted`, `errors`) e `data.results`. Um ID sem junção registrada aparece ali com `"code": "ERR_MERGE_LOG_NOT_FOUND"`, e o `success: true` não quer dizer que algo foi desfeito. ### POST `/v2/api/external/{apiId}/updateContactExtraInfo` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-extra) Atualiza os campos personalizados (extraInfo) de um contato. #### Body | Campo | Tipo | Descrição | |---|---|---| | `contactId` | int obrigatório | ID do contato. | | `extraInfo` | array obrigatório | Array no formato `[{"name":"campo","value":"valor"}]`. | ### POST `/v2/api/external/{apiId}/contacts/search` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#busca-contatos) **Busca paginada com filtros avançados**, por nome ou número (`searchParam`), tag, carteira e bloqueio. Devolve os dados de cadastro do contato e as tags com o `id` (`"tags": [{"id": 7, "name": "Cliente", "color": "#22c55e"}]`), o que a `listContacts` não traz. Os filtros vão no corpo (Body), em JSON. Cada contato da resposta traz o endereço (`cep`, `logradouro`, `numeroEndereco`, `complemento`, `bairro`, `cidade`, `estado`), as tags e as carteiras. #### Body | Campo | Tipo | Descrição | |---|---|---| | `tagId` | int opcional | ID de **uma** tag. | | `tagIds` | array opcional | Lista de IDs de tags: traz os contatos com qualquer uma delas. Envie `tagId` **ou** `tagIds`. | | `page` | int opcional | Página (padrão: 1). | | `limit` | int opcional | Itens por página (padrão: 40). | | `searchParam` | string opcional | Texto para buscar. | | `walletId` | int opcional | Filtra pela carteira de um vendedor. | | `blocked` | boolean opcional | Inclui (`false`) ou exclui (`true`) contatos bloqueados. | | `addressCidade` | string opcional | Cidade: busca por "contém", sem diferenciar acento nem maiúsculas (`goiania` acha `Goiânia`). | | `addressBairro` | string opcional | Bairro, com a mesma regra da cidade. | | `addressUfs` | string ou array opcional | Siglas de UF: `"SP,RJ"` ou `["SP","RJ"]`. Acha também o estado gravado por extenso (`GO` acha `Goiás`). Sigla que não existe devolve lista vazia, sem erro: confira a sigla. | **Exemplo — buscar todos contatos com a tag "Lead Quente"** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/contacts/search' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "tagId": 42, "page": 1, "limit": 100 }' ``` **Exemplo: contatos de São Paulo e do Rio de Janeiro com a tag 42** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/contacts/search' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "addressUfs": ["SP", "RJ"], "tagId": 42, "limit": 100 }' ``` > **Testado por nós em 29/10/2026.** Filtro de UF por sigla e por extenso, cidade sem acento, UF em lista e em texto, e o padrão de 40 por página. A resposta traz `meta.addressFilter`: `true` quer dizer que os filtros de endereço foram aplicados. ### POST `/v2/api/external/{apiId}/telegramInvite` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#contato-telegram) Gera o link de convite do Telegram para um contato que já existe. Quando a pessoa abre o link e toca em **Iniciar**, o Telegram dela fica ligado a esse contato e você passa a atendê-la por lá. O link vale 7 dias, é de uso único e só o mais recente funciona (gerar de novo cancela o anterior). | Campo | Tipo | Descrição | |---|---|---| | `contactId` | int opcional | ID do contato. Envie `contactId` **ou** `number`. | | `number` | string opcional | Telefone do contato, no lugar do `contactId`. Se o número pertencer a mais de um contato: `422 ERR_NUMBER_AMBIGUOUS` com a lista `candidates`. | | `whatsappId` | int opcional | ID do bot do Telegram. Dispensável quando o token já é de um canal do Telegram ou quando a conta tem um só bot conectado. | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/telegramInvite' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "contactId": 123 }' ``` **Resposta** ``` { "success": true, "data": { "link": "https://t.me/seu_bot?start=CODIGO", "expiresAt": "2026-11-05T11:23:35.842Z", "contactId": 123, "whatsappId": 7 } } ``` > Quem tiver o link consegue ligar o próprio Telegram ao contato. Envie o link só para a própria pessoa, por um canal em que você já fala com ela. | Erro | Quando acontece | |---|---| | `400 ERR_CONTACT_OR_NUMBER_REQUIRED` | Faltou `contactId` e `number`. | | `404 ERR_CONTACT_NOT_FOUND` | Contato não existe (ou foi juntado a outro). | | `409 ERR_TELEGRAM_ALREADY_LINKED` | O contato já tem Telegram. | | `400 ERR_TELEGRAM_INVITE_GROUP` | O contato é um grupo. | | `400 ERR_TELEGRAM_BOT_REQUIRED` | A conta tem mais de um bot: informe `whatsappId`. | | `409 ERR_TELEGRAM_BOT_NOT_FOUND` / `ERR_TELEGRAM_BOT_OFFLINE` | Nenhum bot do Telegram conectado, `whatsappId` que não é um bot do Telegram da sua conta, ou o bot está desconectado. | | `403 ERR_SESSION_NOT_AUTH_TOKEN` | O token é de um canal e o `whatsappId` enviado é de outro. | | `424 ERR_TELEGRAM_BOT_UNAVAILABLE` | O Telegram não respondeu. Tente de novo. | > **Testado por nós em 29/10/2026.** Geração do link para um contato da nossa conta, o erro sem contato e o `403` com o bot de outro canal. ## 📨 Mensagens (POST) (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#mensagens) Endpoints para envio de mensagens via WhatsApp através das suas conexões. Suporta texto, arquivos, áudio, localização, e os tipos interativos da API oficial WhatsApp Business (WABA). ### POST `/v2/api/external/{apiId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-texto) Envia uma mensagem de texto para um número WhatsApp. #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número com DDI + DDD (ex: 5511999999999). | | `body` | string obrigatório | Texto da mensagem. | | `ticketId` | int opcional | Ticket ao qual vincular a mensagem. | | `externalKey` | string opcional | Identificador da mensagem no seu sistema. Não pode se repetir. | | `isClosed` | boolean opcional | `true` fecha o ticket logo depois do envio. | | `validateNumber` | boolean opcional | Padrão `true`: o sistema ajusta o nono dígito de números brasileiros. Com `false`, usa o número exatamente como você enviou. | > **API Oficial: prefira `"validateNumber": false`** e envie o número exatamente como o cliente escreveu para você. O ajuste automático do nono dígito pode gerar um número diferente do que a Meta conhece e abrir um segundo ticket para a mesma pessoa. Em canais que não são WhatsApp, o `number` é o identificador do canal: IGSID no Instagram, PSID no Messenger e ID do Telegram. Para responder uma conversa que já existe, em qualquer canal, o mais simples é o [envio pelo ticket](https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-por-ticket). **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "number": "5511999999999", "body": "Olá! Esta é uma mensagem de teste." }' ``` | Erro comum no envio | O que fazer | |---|---| | `424 ERR_WAPP_CONTACT_UNVERIFIED` | O número não tem WhatsApp, ou a consulta ao WhatsApp falhou naquele momento. Confira o número; se estiver certo, tente de novo em alguns segundos. | | `400 ERR_CHANNEL_DISCONNECTED` | A conexão por QR Code está esperando a leitura do QR. Reconecte o canal no painel. | | `400 ERR_INVALID_BODY` | `body` veio como objeto ou lista. Mande texto (número é convertido para texto). | > A tabela vale também para o envio de arquivo, de áudio, em base64, por GET e para grupo. No envio para grupo, mensagem sem `body` e sem arquivo responde `400 ERR_MISSING_BODY_OR_MEDIA`. ### POST `/v2/api/external/{apiId}/url` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-arquivo) Envia um arquivo (imagem, PDF, áudio, vídeo) a partir de uma URL pública. #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número de destino. | | `mediaUrl` | string obrigatório | URL pública do arquivo. | | `body` | string opcional | Legenda / texto que acompanha a mídia. | ### POST `/v2/api/external/{apiId}/sendMessageByTicket` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-por-ticket) Envia uma mensagem para uma conversa que já existe, usando o **ID do ticket** em vez do número. Funciona em **qualquer canal** da sua conta (WhatsApp, API Oficial, Instagram, Messenger, Telegram, Webchat e e-mail): o canal é o do próprio ticket. É o caminho mais simples para responder, a partir do seu sistema, uma conversa que chegou por webhook. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket (conversa). | | `body` | string opcional | Texto da mensagem. Obrigatório quando não há mídia; com mídia, vira a legenda. | | `mediaUrl` | string opcional | Endereço público do arquivo (http ou https). Endereços internos são recusados com `ERR_BLOCKED_HOST`. | | `base64Data` | string opcional | Arquivo em base64. Exige `mimeType` (ex: `image/png`); aceita `fileName`. | | `media` | file opcional | Arquivo enviado como `multipart/form-data`, com os outros campos no mesmo formulário. | | `externalKey` | string opcional | Chave sua para evitar envio em dobro: repetir a mesma chave em até 2 minutos não envia de novo (veja abaixo). Recomendado. | | `reopen` | boolean opcional | `true` reabre o ticket se ele estiver fechado. Sem isso, ticket fechado volta com `409`. | | `isClosed` | boolean opcional | `true` fecha o ticket depois do envio. | Use **uma** fonte de mídia por chamada: `media`, `mediaUrl` ou `base64Data`. **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/sendMessageByTicket' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "ticketId": 1262, "body": "Olá! Recebemos seu pedido.", "externalKey": "pedido-8841-confirmacao" }' ``` **Resposta** ``` { "success": true, "data": { "message": "Message sent successfully", "ticketId": 1262, "messageId": null } } ``` Se a mesma `externalKey` chegar de novo em até 2 minutos, nada é enviado e a resposta é `{"success": true, "data": {"idempotent": true, "skipped": true, "ticketId": 1262}}`. Isso protege contra mensagem duplicada quando o seu sistema repete a chamada depois de um erro de rede. #### Erros | Código | Quando | |---|---| | `400` `ERR_INVALID_TICKET_ID` | `ticketId` ausente ou inválido. | | `400` `ERR_MISSING_BODY_OR_MEDIA` | Sem texto e sem mídia. | | `400` `ERR_BLOCKED_HOST` | `mediaUrl` aponta para um endereço interno. | | `409` `ERR_TICKET_CLOSED` | Ticket fechado. Envie `"reopen": true` para reabrir e enviar. | ### POST `/v2/api/external/{apiId}/sendPresence` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-presence) Envia indicadores de presença (estado) para o WhatsApp do contato — útil para humanizar bots mostrando "digitando..." antes de uma resposta automática. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | | `state` | string obrigatório | `typing`, `paused` ou `recording`. | > **API Oficial:** só `typing` funciona, e a Meta marca como lida a última mensagem recebida do contato. `paused` e `recording` respondem `400 ERR_PRESENCE_NOT_SUPPORTED` (`paused` testado em 29/10/2026). ### POST `/v2/api/external/{apiId}/sendButtonWABA` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#waba-botoes) Envia mensagem com até 3 botões interativos via WhatsApp Business API (WABA). > Disponível apenas em conexões WABA (API oficial). Não funciona em conexão por QR Code. #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número de destino. | | `message` | string obrigatório | Texto principal da mensagem. | | `button1` | string obrigatório | Texto do primeiro botão (máx 20 caracteres). | | `button2` | string opcional | Texto do segundo botão. | | `button3` | string opcional | Texto do terceiro botão. | | `ticketId` | int opcional | Vincular a um ticket existente. | > Só em conexão da API Oficial: os outros tipos de canal respondem `400 ERR_CHANNEL_WABA_REQUIRED`. ### POST `/v2/api/external/{apiId}/sendListWABA` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#waba-lista) Envia mensagem com lista interativa (menu suspenso) via WhatsApp Business API (WABA). #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número de destino. | | `header` | string obrigatório | Cabeçalho da lista. | | `body` | string obrigatório | Texto principal. | | `footer` | string opcional | Rodapé. | | `button_text` | string obrigatório | Texto do botão de abertura da lista. | | `sections` | array obrigatório | Seções com itens da lista. | | `ticketId` | int opcional | Vincular a um ticket existente. | > Só em conexão da API Oficial: os outros tipos de canal respondem `400 ERR_CHANNEL_WABA_REQUIRED`. Se a Meta recusar (número inválido, fora da janela de 24 h, lista fora do formato), a resposta é `400 ERR_WABA_SEND_FAILED` com `metaCode` e a mensagem da Meta: é ela que diz o motivo. Cada item de `sections` tem `title` e `rows`, e cada linha tem `id`, `title` e `description`. ## 🎫 Tickets & Tags (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#tickets-tags) ### POST `/v2/api/external/{apiId}/updateTicketChannel` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-channel) Altera o canal (conexão WhatsApp) de um ticket existente — útil quando você precisa migrar um atendimento de uma conexão para outra. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | | `whatsappId` | int obrigatório | ID da nova conexão WhatsApp. | | `channel` | string obrigatório | Continua obrigatório só por compatibilidade: o tipo gravado no ticket vem do canal do `whatsappId`. | > O `whatsappId` precisa ser um canal da sua conta (senão `404 ERR_NO_WAPP_FOUND`). A troca fica registrada no histórico do atendimento como mensagem de sistema, que não é enviada ao contato. ### POST `/v2/api/external/{apiId}/createNotes` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#criar-nota) Adiciona uma nota interna (visível apenas para atendentes) em um ticket. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | | `notes` | string obrigatório | Texto da nota. | | `userId` | int opcional | ID do atendente que aparece como autor. Precisa ser da sua conta (senão `404 ERR_USER_NOT_FOUND`). | | `idFront` | string opcional | Chave sua para não duplicar: uma segunda nota com o mesmo `idFront` é recusada com `409 ERR_NOTE_EXISTS`. Útil quando a sua integração pode repetir a chamada. | > **Testado por nós em 29/10/2026.** Nota criada responde `201` (não 200). Corpo sem `ticketId` e sem `notes`: `400 ERR_MISSING_FIELDS`. `idFront` repetido: `409 ERR_NOTE_EXISTS`. ### POST `/v2/api/external/{apiId}/updateNote` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#atualizar-nota) Atualiza o conteúdo de uma nota interna existente. #### Body | Campo | Tipo | Descrição | |---|---|---| | `noteId` | int obrigatório | ID da nota. | | `notes` | string obrigatório | Novo texto. | ### POST `/v2/api/external/{apiId}/addTag` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#add-tag) Adiciona uma ou mais tags ao contato do ticket **sem remover as existentes**. Ideal para classificar atendimentos durante automações sem perder histórico. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | | `tagId` | int opcional | ID de **uma** tag. | | `tagIds` | array opcional | Lista de IDs de tags, para adicionar várias de uma vez. Envie `tagId` **ou** `tagIds`. | > **Lista vai em `tagIds`.** Um array dentro de `tagId` volta com `500` (`ERR_ADD_TAG` ou `ERR_REMOVE_TAG`), que parece falha do servidor mas é o formato do campo. A tag fica no **contato** do ticket, então aparece em todas as conversas dele. O token usado precisa estar vinculado a uma conexão; sem isso a resposta é `400` `ERR_API_REQUIRES_SESSION`. ### POST `/v2/api/external/{apiId}/removeTag` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#remove-tag) Remove uma ou mais tags específicas do contato do ticket. #### Body | Campo | Tipo | Descrição | |---|---|---| | `ticketId` | int obrigatório | ID do ticket. | | `tagId` | int opcional | ID de **uma** tag. | | `tagIds` | array opcional | Lista de IDs de tags, para remover várias de uma vez. Envie `tagId` **ou** `tagIds`. | > **Lista vai em `tagIds`.** Um array dentro de `tagId` volta com `500` (`ERR_ADD_TAG` ou `ERR_REMOVE_TAG`), que parece falha do servidor mas é o formato do campo. A tag fica no **contato** do ticket, então aparece em todas as conversas dele. O token usado precisa estar vinculado a uma conexão; sem isso a resposta é `400` `ERR_API_REQUIRES_SESSION`. ## 👥 Usuários (Atendentes) (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#usuarios) ### POST `/v2/api/external/{apiId}/createUser` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#criar-usuario) Cria um novo usuário (atendente) na sua conta. #### Body | Campo | Tipo | Descrição | |---|---|---| | `name` | string obrigatório | Nome do atendente. | | `email` | string obrigatório | E-mail (será o login). | | `password` | string obrigatório | Senha inicial. | | `profile` | string obrigatório | `admin`, `super` ou `user`. | ### POST `/v2/api/external/{apiId}/updateUser` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#atualizar-usuario) Atualiza dados de um usuário existente. #### Body | Campo | Tipo | Descrição | |---|---|---| | `userId` | int obrigatório | ID do usuário. | | `name` | string opcional | Novo nome. | | `email` | string opcional | Novo e-mail. | ## 📣 Campanhas (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanhas) Crie e gerencie campanhas de envio programado via API: defina mensagens (com rotação de até 3 variações), data de início, conexão de envio e a lista de contatos. Ideal para integrar disparos a CRMs e automações. > **Boas práticas:** use o campo `delay` com valores adequados e evite enviar a mesma mensagem para muitos destinatários em janelas curtas — envios em massa sem intervalo podem causar restrições no número pelo WhatsApp/Meta. Prefira as 3 variações de mensagem. ### POST `/v2/api/external/{apiId}/campaign/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-criar) Cria uma campanha. Após criar, adicione os contatos e inicie com [campaign/start](https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-acoes). #### Body | Campo | Tipo | Descrição | |---|---|---| | `name` | string obrigatório | Nome da campanha. | | `start` | string obrigatório | Data/hora de início em ISO 8601 (ex: `2026-04-10T10:00:00.000Z`). | | `message1` | string obrigatório | Mensagem principal. Aceita placeholder `{nome}`. | | `message2` | string opcional | Variação 2 (rotação automática entre contatos). | | `message3` | string opcional | Variação 3. | | `sessionId` | int obrigatório | ID da conexão (canal) que fará os envios — veja [Listar Canais](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais). | | `delay` | string opcional | Intervalo (segundos) entre envios. | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/campaign/create' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "name": "Promoção Junho", "start": "2026-06-15T10:00:00.000Z", "message1": "Olá {nome}! Temos uma novidade para você.", "message2": "Oi {nome}, tudo bem? Confira nossa novidade.", "sessionId": 12, "delay": "5" }' ``` ### POST `/v2/api/external/{apiId}/campaign/update/{campaignId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-atualizar) Atualiza uma campanha existente (mesmos campos do create). Só é aceito com a campanha em `pending`, `scheduled`, `paused` ou `canceled`; em `processing` ou `finished` responde `404`. O texto vai em `message1`/`message2`/`message3` e a variável do nome é `{{name}}`. O status não muda por aqui: use [iniciar, pausar, retomar ou cancelar](https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-acoes). ### GET `/v2/api/external/{apiId}/campaign/list?page=1&limit=10` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-listar) Lista as campanhas do tenant com paginação. Retorna status, totais e configuração de cada campanha. ### GET `/v2/api/external/{apiId}/campaign/report/{campaignId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-relatorio) Relatório da campanha: contatos, status de entrega por contato e progresso geral. ### POST `/v2/api/external/{apiId}/campaign//{campaignId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-acoes) Ações de ciclo de vida da campanha. Todas são `POST` com body vazio (`{}`). #### Ações disponíveis | Rota | Efeito | |---|---| | `campaign/start/{campaignId}` | Inicia o disparo. | | `campaign/pause/{campaignId}` | Pausa o disparo em andamento. | | `campaign/resume/{campaignId}` | Retoma uma campanha pausada. | | `campaign/cancel/{campaignId}` | Cancela definitivamente. | | `campaign/skip/{campaignId}` | Pula o contato atual da fila. | | `campaign/duplicate/{campaignId}` | Duplica a campanha (nova cópia em rascunho). | | `campaign/delete/{campaignId}` | Exclui a campanha. | ### POST `/v2/api/external/{apiId}/campaign/contacts/add/{campaignId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#campanha-contatos) Gerencia os contatos de uma campanha. O `add` recebe um **array** de contatos no body. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `campaign/contacts/add/{campaignId}` | Adiciona contatos (array de `{name, number}`). | | `GET` | `campaign/contacts/{campaignId}` | Lista os contatos da campanha. | | `POST` | `campaign/contacts/remove/{campaignId}/{contactId}` | Remove um contato. | | `POST` | `campaign/contacts/removeAll/{campaignId}` | Remove todos os contatos. | **Exemplo (add)** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/campaign/contacts/add/123' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '[ { "name": "João", "number": "5511999990001" }, { "name": "Maria", "number": "5511999990002" } ]' ``` ## 📤 Envio em Lote (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#envio-lote) Endpoints para disparo direto a múltiplos números, sem criar uma campanha. Os campos `min` e `max` definem o intervalo aleatório (em segundos) entre cada envio — essencial para envios saudáveis. ### POST `/v2/api/external/{apiId}/bulkSendMessage` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lote-massa) Envia a mesma mensagem para uma lista de números. #### Body | Campo | Tipo | Descrição | |---|---|---| | `whatsappId` | int obrigatório | ID da conexão de envio. | | `arrayNumbers` | array obrigatório | Lista de números (DDI+DDD+número). | | `message` | string obrigatório | Texto a enviar. | | `min` / `max` | int opcional | Intervalo aleatório entre envios, em segundos (ex: 3 a 8). | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/bulkSendMessage' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "whatsappId": 12, "arrayNumbers": ["5511999990001", "5511999990002"], "message": "Olá, tudo bem?", "min": 3, "max": 8 }' ``` ### POST `/v2/api/external/{apiId}/bulkSendMessageWithVariable` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lote-variaveis) Envio em massa **personalizado por contato**: a mensagem usa placeholders e os valores vêm de uma lista CSV (uma linha por destinatário). #### Body | Campo | Tipo | Descrição | |---|---|---| | `whatsappId` | int obrigatório | ID da conexão de envio. | | `message` | string obrigatório | Mensagem com placeholders, ex: `Olá {nome}, seu código é {codigo}`. | | `dataInput` | string obrigatório | Linhas `numero,valor1,valor2` separadas por `\n` — os valores preenchem os placeholders na ordem. | | `min` / `max` | int opcional | Intervalo aleatório entre envios (segundos). | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/bulkSendMessageWithVariable' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "whatsappId": 12, "message": "Olá {nome}, seu código é {codigo}", "dataInput": "5511999990001,João,ABC123\n5511999990002,Maria,DEF456", "min": 3, "max": 8 }' ``` ### POST `/v2/api/external/{apiId}/bulkFastMessage` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lote-rapida) Variante do envio em massa que informa o tipo da conexão (`whatsappType`) — útil quando o tenant tem conexões de tipos diferentes. #### Body | Campo | Tipo | Descrição | |---|---|---| | `whatsappId` | int obrigatório | ID da conexão. | | `whatsappType` | string obrigatório | Tipo da conexão (conforme retornado em [Listar Canais](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais)). | | `arrayNumbers` | array obrigatório | Lista de números. | | `message` | string obrigatório | Texto a enviar. | | `min` / `max` | int opcional | Intervalo aleatório entre envios (segundos). | > Segundo o painel, esta rota só funciona em conexões do tipo `whatsapp` e `baileys`, e o `whatsappType` é obrigatório. Ela não cria atendimento. Para os outros tipos de conexão, use o `bulkIndividual` número a número. ### POST `/v2/api/external/{apiId}/bulkIndividual` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lote-individual) Envio individual pela mesma infraestrutura do lote — aceita `externalKey` para controle/idempotência do seu lado. #### Body | Campo | Tipo | Descrição | |---|---|---| | `whatsappId` | int obrigatório | ID da conexão. | | `whatsappType` | string obrigatório | Tipo da conexão, como vem em [Listar Canais](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais) (ex: `whatsapp`, `baileys`, `uazapi`, `waba`). **Sem ele a resposta é 200 com `success: true` e nada é enviado.** | | `number` | string obrigatório | Número de destino. | | `message` | string obrigatório | Texto a enviar. | | `externalKey` | string opcional | Chave externa para rastrear o envio. | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/bulkIndividual' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "whatsappId": 246, "whatsappType": "uazapi", "number": "5511999999999", "message": "Olá! Sua encomenda saiu para entrega." }' ``` > **Testado por nós em 29/10/2026.** Sem `whatsappType`: `200` com `success: true`, `ticketId: null` e nenhuma mensagem enviada. Com ele, em JSON ou em form-data: a mensagem chegou e a resposta trouxe o `ticketId` do atendimento. Até 29/10/2026 esta página não listava o `whatsappType` nesta rota. Confira sempre se veio `ticketId`. ### GET `/v2/api/external/{apiId}/bulkDispatch/list?page=1&limit=20` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lote-despachos) Acompanhe os despachos em lote criados pelos endpoints acima. #### Rotas | Método | Rota | Descrição | |---|---|---| | `GET` | `bulkDispatch/list` | Lista despachos (paginação `page`/`limit`). | | `GET` | `bulkDispatch/show/{dispatchId}` | Detalhe de um despacho (progresso, status). | | `POST` | `bulkDispatch/update/{dispatchId}` | Atualiza um despacho — ex: `{"status": "cancelled", "cancellationReason": "..."}`. | ## 👥 Grupos WhatsApp (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#grupos) Crie e administre grupos do WhatsApp via API: participantes, administradores, título, descrição, foto e link de convite. Em todas as rotas, `whatsappId` é o ID da conexão (veja [Listar Canais](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais)) e `groupId` é o identificador do grupo (formato `123456789@g.us`). ### POST `/v2/api/external/{apiId}/group/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#grupo-criar) Cria um ou mais grupos e adiciona o número informado como primeiro participante. **Body (exemplo)** ``` { "whatsappId": 12, "titles": ["Meu Grupo 1"], "number": "5511999990001" } ``` ### POST `/v2/api/external/{apiId}/group/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#grupo-gerenciar) Ações de administração. Todas recebem `whatsappId` + `groupIds` (array) e os campos específicos abaixo. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `group/addParticipant` | Adiciona participantes — body extra: `participants` (array de números). | | `POST` | `group/removeParticipant` | Remove participantes — `participants`. | | `POST` | `group/promote` | Promove participantes a admin — `participants`. | | `POST` | `group/demote` | Rebaixa admins a participante — `participants`. | | `POST` | `group/changeTitle` | Altera o título — `title`. | | `POST` | `group/changeDescription` | Altera a descrição — `description`. | | `POST` | `group/changePicture` | Altera a foto — `picture`: link público da imagem (em JSON) ou o próprio arquivo (em form-data). Testado em 29/10/2026 numa conexão por QR Code: a foto do grupo mudou. A resposta só diz `success` e não devolve a foto: confira no próprio grupo. | | `POST` | `group/setAdminsOnly` | Restringe mensagens a admins — `adminsOnly` (true/false). | | `POST` | `group/revokeInviteLink` | Invalida o link de convite atual. Recebe `whatsappId` e `groupId` (um grupo só, não lista). | | `POST` | `group/leave` | A conexão sai do grupo. Recebe `whatsappId` e `groupId`. **Só funciona em conexão da API Oficial**; nas outras volta `ERR_LEAVE_GROUP_WABA_ONLY`. | **Body (exemplo)** ``` { "whatsappId": 12, "groupIds": ["123456789@g.us"], "participants": ["5511999990001"] } ``` > **Leia a resposta número a número.** Em adicionar, remover, promover e rebaixar, a resposta traz um item por grupo (`groupId`, `status`, `reason`) e, nas conexões por QR Code, `participants` com o resultado de cada número. Motivos comuns: `invite_required` (a pessoa só entra por convite), `already_in_group`, `not_on_whatsapp`, `not_in_group`; no grupo, `not_admin` (a conexão não é administradora) e `session_not_connected`. Se todos os números forem recusados, vem `ERR_GROUP_PARTICIPANTS_REJECTED`; lista vazia, `ERR_GROUP_PARTICIPANTS_REQUIRED`. ### POST `/v2/api/external/{apiId}/group/list` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#grupo-consultar) Consultas de grupos da conexão. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `group/list` | Lista os grupos — body: `{whatsappId}`. | | `POST` | `group/listParticipants` | Participantes de grupos — `{whatsappId, groupIds}`. | | `POST` | `group/showById` | Detalhe de um grupo — `{whatsappId, groupId}`. | | `POST` | `group/getInviteLink` | Link de convite — `{whatsappId, groupId}`. | | `POST` | `listGroupInfo` | Listagem geral com participantes — `{listGroups: true, listParticipants: true}` (opcional `groupId`). | ### POST `/v2/api/external/{apiId}/group` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#grupo-mensagem) Envia mensagens para um grupo. No campo `number`, informe o ID numérico do grupo (sem o sufixo `@g.us`). #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `/v2/api/external/{apiId}/group` | Texto para grupo — body: `{body, number, externalKey, isClosed}`. | | `POST` | `/v2/api/external/{apiId}/groupMediaUrl` | Arquivo via URL — body: `{mediaUrl, body, number, externalKey, isClosed}`. | **Body (exemplo)** ``` { "body": "A mensagem desejada", "number": "123456789015189153", "externalKey": "SUA_CHAVE_EXTERNA", "isClosed": false } ``` ## 📨 Mensagens — Recursos Adicionais (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-extras) Complementos aos endpoints de [envio de texto](https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-texto) e [arquivo](https://clientes.nimochat.com.br/documentacaoapiproplus.php#enviar-arquivo): áudio como mensagem de voz, arquivo em base64, localização, cartão de contato (vCard), busca e consulta de mensagens. ### POST `/v2/api/external/{apiId}/voice` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-voz) Envia um áudio como **mensagem de voz** (PTT) a partir de uma URL pública. **Body (exemplo)** ``` { "audio": "https://exemplo.com/audio.ogg", "number": "5511999999999", "externalKey": "SUA_CHAVE_EXTERNA", "isClosed": false } ``` ### POST `/v2/api/external/{apiId}/base64` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-base64) Envia arquivo codificado em **base64** — útil quando o arquivo não tem URL pública. **Body (exemplo)** ``` { "body": "A mensagem desejada", "number": "5511999999999", "base64Data": "iVBORw0KGgoAAAANSUhEUgAA...", "mimeType": "image/png", "fileName": "exemplo_imagem", "isClosed": false } ``` ### GET `/v2/api/external/{apiId}/params/?body=...&number=...&externalKey=...&bearertoken=...` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-params) Envio de texto via **GET** (parâmetros na URL) — para integrações que só conseguem disparar GET. Informe `body`, `number`, `externalKey`, `bearertoken` e opcional `isClosed`. ### POST `/v2/api/external/{apiId}/sendLocation` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-localizacao) Envia uma localização (pin no mapa) com nome e endereço. O destino vem de `number` e o `ticketId` é **obrigatório**: é o atendimento em que a mensagem fica registrada. Ticket de outra conta: `404 ERR_TICKET_NOT_FOUND`. **Body (exemplo)** ``` { "number": "5511999990001", "latitude": -23.5505, "longitude": -46.6333, "name": "São Paulo", "address": "Av. Paulista, 1000", "ticketId": 1262, "externalKey": "SUA_CHAVE_EXTERNA" } ``` > **Testado por nós em 29/10/2026.** Sem `ticketId`: `400 ERR_MISSING_TICKET` e nada é enviado. Com o ticket, a localização chega normalmente. Até 29/10/2026 o exemplo desta página trazia `"ticketId": null`, que não funciona. ### POST `/v2/api/external/{apiId}/sendVcard` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-vcard) Envia um cartão de contato (vCard). O `ticketId` é **obrigatório**, como na localização. Dentro de `contact`, os campos `fullName`, `wuid` e `phoneNumber` são obrigatórios; `organization` e `email` são opcionais. **Body (exemplo)** ``` { "number": "5511999990001", "contact": [ { "fullName": "João Silva", "wuid": "5511999990002@s.whatsapp.net", "phoneNumber": "5511999990002" } ], "ticketId": 1262, "externalKey": "SUA_CHAVE_EXTERNA" } ``` > **Testado por nós em 29/10/2026.** `contact` aceito como lista (exemplo acima) e como objeto único (`"contact": {"fullName": "...", "wuid": "...", "phoneNumber": "..."}`). Sem `ticketId`: `400 ERR_MISSING_TICKET`. ### GET `/v2/api/external/{apiId}/searchMessages` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#msg-consultar) Consulta de mensagens. #### Rotas | Método | Rota | Descrição | |---|---|---| | `GET` | `searchMessages?ticketId=...&searchParam=...&page=1&limit=20` | Busca textual nas mensagens de um ticket. | | `GET` | `getMessageByMessageId?messageId=...` | Recupera uma mensagem pelo ID do WhatsApp. | ## 🧩 Mensagens Interativas (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#interativos) Botões, listas, enquetes e templates ricos. Os recursos disponíveis dependem do **tipo da conexão** do ticket. Todos os endpoints recebem `ticketId` e respondem dentro da conversa existente. ### POST `/v2/api/external/{apiId}/sendInteractive/baileys/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#interativo-padrao) Conexões padrão (não-oficiais). #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `sendInteractive/baileys/quickReply` | Botões de resposta rápida — `{ticketId, body:{text}, footer:{text}, buttons:[{display_text,id}]}`. | | `POST` | `sendInteractive/baileys/singleSelect` | Lista de seleção única — `{ticketId, body, footer, list:{title, sections:[{title, rows:[{id,title,description}]}]}}`. | | `POST` | `sendInteractive/baileys/pixButton` | Botão PIX — `{ticketId, pixType, pixKey, pixName, bodyText}`. | | `POST` | `sendInteractive/baileys/ctaCopy` | Botão copiar código — `{ticketId, body, footer, displayText, copyCode}`. | | `POST` | `sendInteractive/baileys/ctaUrl` | Botão abrir URL — `{ticketId, body, footer, displayText, url}`. | | `POST` | `sendInteractive/baileys/ctaCall` | Botão ligar — `{ticketId, body, footer, displayText, phoneNumber}`. | **Body (exemplo)** ``` { "ticketId": 1262, "body": { "text": "Escolha uma opção:" }, "footer": { "text": "Rodapé opcional" }, "buttons": [ { "display_text": "Opção 1", "id": "op1" }, { "display_text": "Opção 2", "id": "op2" } ] } ``` ### POST `/v2/api/external/{apiId}/sendInteractive/uazapi/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#interativo-uazapi) Conexões do tipo uazapi. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `sendInteractive/uazapi/button` | Botões — `{ticketId, text, choices:[...], footerText, imageButton}`. | | `POST` | `sendInteractive/uazapi/list` | Lista — `{ticketId, text, choices, listButton, footerText}`. | | `POST` | `sendInteractive/uazapi/poll` | Enquete — `{ticketId, text, choices, selectableCount}`. | | `POST` | `sendInteractive/uazapi/carousel` | Carrossel de cards — `{ticketId, text, carousel:[{text,image,buttons:[{text,type}]}]}`. | | `POST` | `sendInteractive/uazapi/pixButton` | Botão PIX — `{ticketId, pixType, pixKey, pixName}`. | | `POST` | `sendInteractive/uazapi/locationButton` | Solicitar localização — `{ticketId, text}`. | | `POST` | `sendInteractive/uazapi/requestPayment` | Solicitação de pagamento — `{ticketId, amount, title, text, footer, itemName, invoiceNumber, pixType, pixKey, pixName}`. Obrigatórios: `ticketId` e `amount`. Aceita também boleto (`boletoCode`), link de pagamento (`paymentLink`) e anexo (`fileUrl`, `fileName`). | **Body (exemplo)** ``` { "ticketId": 1262, "text": "Qual sua preferência?", "choices": ["Opção A", "Opção B", "Opção C"], "selectableCount": 1 } ``` ### POST `/v2/api/external/{apiId}/sendInteractive/instagram/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#interativo-instagram) Conexões Instagram Direct. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `sendInteractive/instagram/quickReply` | Respostas rápidas — `{ticketId, message, quickReplies:[{content_type,title,payload}]}`. | | `POST` | `sendInteractive/instagram/buttonTemplate` | Botões — `{ticketId, message, buttons:[{type,title,payload}]}`. | | `POST` | `sendInteractive/instagram/genericTemplate` | Cards — `{ticketId, elements:[{title,subtitle,image_url,buttons}]}`. | | `POST` | `instagram/iceBreakers` | Perguntas iniciais (get/set/delete) — `{action, iceBreakers:[{question,payload}]}`. | | `POST` | `instagram/persistentMenu` | Menu persistente (get/set/delete) — `{action, composerInputDisabled, menuItems}`. | ### POST `/v2/api/external/{apiId}/sendInteractive/messenger/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#interativo-messenger) Conexões Facebook Messenger. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `sendInteractive/messenger/quickReply` | Respostas rápidas — `{ticketId, message, quickReplies}`. | | `POST` | `sendInteractive/messenger/buttonTemplate` | Botões — `{ticketId, message, buttons}` (suporta `web_url`). | | `POST` | `sendInteractive/messenger/genericTemplate` | Cards — `{ticketId, elements}`. | | `POST` | `sendInteractive/messenger/mediaTemplate` | Mídia + botões — `{ticketId, mediaType, mediaUrl, buttons}`. | | `POST` | `sendInteractive/messenger/receiptTemplate` | Recibo de compra — `{ticketId, receipt:{recipient_name, order_number, currency, summary, elements}}`. | | `POST` | `sendInteractive/messenger/messageTag` | Mensagem fora da janela 24h com tag — `{ticketId, message, tag}` (ex: POST_PURCHASE_UPDATE). | | `POST` | `sendInteractive/messenger/customerFeedback` | Pesquisa NPS/CSAT — `{ticketId, title, subtitle, business_privacy_url, expires_in_days, feedback_screens}`. | | `POST` | `messenger/greeting` | Saudação da página (get/set/delete) — `{action, greetings:[{locale,text}]}`. | | `POST` | `messenger/personas` | Personas de atendente (list/create/delete) — `{action, name, profilePictureUrl}`. | ## 📋 Templates WABA (API Oficial) (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#templates-waba) Na API Oficial do WhatsApp, a primeira mensagem para um contato, ou qualquer mensagem depois de 24 horas sem resposta dele, só pode ser um **modelo (template) aprovado pela Meta**. > **O token precisa estar ligado à conexão da API Oficial.** O modelo sai pela conexão escolhida quando a chave foi criada (menu **API** > **Nova API**). Com a chave ligada a uma conexão por QR Code, o envio de modelo não funciona. Se você usa as duas conexões, crie uma chave para cada uma. ### POST `/v2/api/external/{apiId}/template` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#waba-template) Envia um modelo aprovado, com ou sem variáveis. Cria (ou usa) o atendimento do contato no painel. #### Qual rota usar | Rota | Quando | |---|---| | `template` | **Use esta.** Serve para modelo sem variáveis, com variáveis no corpo, com botão de link e com imagem, vídeo ou documento no cabeçalho. | | `templateBody` | Aceita o mesmo formato de corpo da rota `template`. | | `templateMarketingBody` | Mesmo corpo da rota `template`, com o caminho escolhido pela categoria do modelo: modelo de **Marketing** sai pela Marketing Messages API da Meta quando a conta já aceitou os termos dela (senão, pelo envio comum); **Utilidade** e **Autenticação** saem pelo envio comum, então a rota também aceita modelo de Utilidade. Testado em 30/10/2026: o modelo de Marketing foi cobrado pela Meta na categoria da Marketing Messages API (`marketing_lite`) e o de Utilidade foi aceito pela mesma rota. | #### Body | Campo | Tipo | Descrição | |---|---|---| | `number` | string obrigatório | Número do contato só com dígitos: DDI + DDD + número (ex.: `5511999999999`). | | `templateData` | object obrigatório | O objeto **completo** no formato da Meta: `messaging_product`, `type` e `template`. O campo `to` é opcional: o sistema usa o `number`. | | `isClosed` | boolean opcional | `true` fecha o atendimento logo depois do envio (aviso automático, sem conversa). `false` deixa aberto. | | `validateNumber` | boolean opcional | Padrão `true`: o sistema ajusta o número (9º dígito). Com `false`, usa o número exatamente como enviado. **Recomendado `false` na API Oficial**: evita contato e atendimento em dobro para a mesma pessoa. | #### Dentro de `template` | Campo | Descrição | |---|---| | `name` | Nome do modelo exatamente como aprovado na Meta (minúsculas e `_`). | | `language.code` | O idioma em que o modelo foi aprovado, ex.: `pt_BR`. Com outro idioma, a Meta recusa como se o modelo não existisse. | | `components` | Só quando o modelo tem variáveis, botão de link com final variável ou mídia no cabeçalho. Os valores vão na **ordem** das variáveis (`{{1}}`, `{{2}}`...) e na mesma quantidade. Modelo sem variáveis: não envie `components`, nem vazio. | **Exemplo 1: modelo sem variáveis** ``` { "number": "5511999999999", "isClosed": false, "validateNumber": false, "templateData": { "messaging_product": "whatsapp", "type": "template", "template": { "name": "boas_vindas", "language": { "code": "pt_BR" } } } } ``` **Exemplo 2: variáveis no corpo ({{1}} = nome, {{2}} = valor) e botão de link com final variável** ``` { "number": "5511999999999", "isClosed": true, "validateNumber": false, "templateData": { "messaging_product": "whatsapp", "type": "template", "template": { "name": "fatura_disponivel", "language": { "code": "pt_BR" }, "components": [ { "type": "body", "parameters": [ { "type": "text", "text": "Maria" }, { "type": "text", "text": "R$ 150,00" } ] }, { "type": "button", "sub_type": "url", "index": "0", "parameters": [ { "type": "text", "text": "abc123" } ] } ] } } } ``` **Exemplo 3: vídeo no cabeçalho, variáveis no corpo e botão de link com final variável** ``` { "number": "5511999999999", "isClosed": true, "validateNumber": false, "templateData": { "messaging_product": "whatsapp", "type": "template", "template": { "name": "reuniao_confirmada", "language": { "code": "pt_BR" }, "components": [ { "type": "header", "parameters": [ { "type": "video", "video": { "link": "https://seusite.com.br/video.mp4" } } ] }, { "type": "body", "parameters": [ { "type": "text", "text": "Maria" }, { "type": "text", "text": "29/10" }, { "type": "text", "text": "19:30" } ] }, { "type": "button", "sub_type": "url", "index": "0", "parameters": [ { "type": "text", "text": "abc123" } ] } ] } } } ``` O cabeçalho vai em `components`, antes do `body`. O modelo aprovado com mídia no cabeçalho pede a mídia em todo envio: sem ela, a Meta recusa com `(#132012)`. Para imagem ou documento, troque o item de `parameters` do cabeçalho por `{ "type": "image", "image": { "link": "https://..." } }` ou `{ "type": "document", "document": { "link": "https://...", "filename": "proposta.pdf" } }`. Quem baixa o arquivo é a Meta, pelo `link`, depois que a API já respondeu. O endereço precisa ser público, abrir o arquivo direto (página do YouTube ou do Google Drive não serve) e aceitar o acesso dos servidores da Meta: CDN ou proteção contra robôs no seu site podem barrar o download. Limites da Meta: vídeo MP4 com H.264 e áudio AAC, até 16 MB; imagem JPG ou PNG, até 5 MB; documento até 100 MB. **Resposta de sucesso** ``` { "success": true, "data": { "message": "Message sent successfully", "ticketId": 4521 } } ``` A resposta traz o `ticketId` do atendimento, não o código da mensagem na Meta. Confira sempre o `success`: há falhas que voltam com HTTP 200 e `"success": false`. #### Erros mais comuns | Resposta | O que conferir | |---|---| | `400` `ERR_SEND_UPSTREAM` | A Meta recusou o envio. O motivo vem no `error`, com o código da Meta entre parênteses: `(#132012)` é parâmetro em formato diferente do modelo (por exemplo, cabeçalho de vídeo sem o vídeo); `(#131008)` é variável vazia ou faltando. Versões anteriores respondiam `500` `ERR_SEND_TEMPLATE`, sem o motivo: trate os dois. Confira, nesta ordem: (1) a chave está ligada à conexão da API Oficial; (2) `templateData` tem `messaging_product`, `type` e `template` (só `name` e `language` soltos não funcionam); (3) `name` e `language.code` iguais aos do modelo aprovado; (4) a quantidade de variáveis bate com o modelo; (5) o modelo está aprovado, e não pausado ou em análise. Se tudo confere, fale com o suporte informando o número e a hora do envio. | | `200` e a mensagem não chega | Com mídia no cabeçalho, a Meta baixa o arquivo depois de aceitar o envio. Se o download falha (erro `131053` da Meta), ela descarta a mensagem e a resposta da API não muda. Abra o `link` numa janela anônima, confira o formato e o tamanho, e desligue a CDN ou a proteção contra robôs para o endereço do arquivo. Se tudo confere, fale com o suporte informando o número e a hora do envio. | > **Erros de formato** (as três rotas de modelo): sem `number`, `400 ERR_MISSING_NUMBER_OR_BSUID`; `templateData` que não é objeto, `400 ERR_INVALID_TEMPLATE_DATA` (texto com JSON também é aceito); `components` que não é lista, `400 ERR_INVALID_TEMPLATE_COMPONENTS`; objeto ou lista no `text` de um parâmetro, `400 ERR_INVALID_TEMPLATE_PARAMETER` (número vira texto). ## 🎫 Tickets — Gestão Completa (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#tickets-gestao) Criação de tickets, consulta por número ou ID, atualização de fila/status/integrações, tags por contato, pausa e compartilhamento. ### POST `/v2/api/external/{apiId}/createTicket` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-criar) Cria um ticket com mensagem inicial. **`userId` (o atendente do ticket) é obrigatório**: sem ele, `400 ERR_MISSING_FIELDS` com `"fields": ["userId"]`; usuário de outra conta, `404 ERR_USER_NOT_FOUND`. Para canais de e-mail (webmail), use `email` em vez de `number` e informe o `channelId` do canal webmail. Campos opcionais: `name`/`firstName`/`lastName` (criação do contato), `kanbanId`, `chatFlowId`, `queueId`, `reasonId`, `value`. **Body (exemplo)** ``` { "body": "A mensagem desejada", "number": "5511999999999", "externalKey": "SUA_CHAVE_EXTERNA", "userId": 3, "status": "pending" } ``` > **Testado por nós em 29/10/2026.** A chamada sem `userId` falha antes de enviar qualquer mensagem. ### POST `/v2/api/external/{apiId}/showticket` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-consultar) Consultas de tickets e mensagens. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `showticket` | Ticket ativo do contato — `{number}`. | | `POST` | `showallticket` | Todos os tickets do contato — `{number}`. | | `POST` | `showticketchatbot` | Ticket em atendimento por chatbot — `{number}`. | | `POST` | `showTicketById` | Ticket por ID — `{ticketId}`. | | `POST` | `showAllMessages` | Todas as mensagens de um ticket — `{ticket}` (também aceita `ticketId`). Sem ele: `400 ERR_MISSING_TICKET`. | > O `showAllMessages` traz também mensagens de sistema, que **nunca foram enviadas ao contato**: notas internas (`mediaType` `notes` ou `callNotes`) e marcas de transferência (`mediaType` `transfer`; nas novas, `dataJson` traz origem, destino e autor). Se você exporta a conversa ou manda para uma IA resumir, filtre por `mediaType` para não misturar nota interna com o que o cliente leu. ### POST `/v2/api/external/{apiId}/updateticketinfo` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-atualizar) Atualizações do ticket. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `updateticketinfo` | Status, fila e integrações — `{ticketId, userId, status, queueId, typebotStatus, chatgptStatus, dialogflowStatus, difyStatus, n8nStatus, chatFlowId}`. | | `POST` | `updatequeue` | Altera a fila — `{ticketId, queueId}`. Só esses dois campos são lidos; `null` tira a fila. Fila de outra conta: `404 ERR_QUEUE_NOT_FOUND`. | | `POST` | `updatetag` | **Substitui todas as tags do contato** pela tag informada: `{ticketId, tag}`. Para acrescentar sem apagar as outras, use [addTag](https://clientes.nimochat.com.br/documentacaoapiproplus.php#add-tag). | > **`updatetag` apaga as outras tags.** Num teste, um contato com 5 tags ficou só com a tag enviada, e o efeito vale para todos os tickets desse contato. Esta página dizia antes "define a tag principal", o que não descrevia isso. | Validação (`updateticketinfo`) | Resposta | |---|---| | `ticketId` que não é número | `400 ERR_INVALID_TICKET_ID` | | `status` fora de `open`, `pending`, `closed` | `400 ERR_INVALID_STATUS` | | Campos `*Status` (`typebotStatus`, `chatgptStatus`...) com valor que não seja `true`/`false`, `1`/`0` ou `enabled`/`disabled` | `400 ERR_INVALID_FIELD` com `field` | | `queueId`, `userId` ou `chatFlowId` de outra conta | `404 ERR_QUEUE_NOT_FOUND`, `ERR_USER_NOT_FOUND` ou `ERR_CHATFLOW_NOT_FOUND` | > Trocar fila, atendente, fluxo ou canal registra a transferência no histórico do atendimento como mensagem de sistema (`mediaType` `transfer`), que não é enviada ao contato. > **Testado por nós em 29/10/2026.** `status` e `typebotStatus` inválidos no `updateticketinfo`, `ticketId` que não é número e a troca de todas as tags no `updatetag`, fila inexistente no `updatequeue` (as tags do contato de teste foram restauradas depois). ### POST `/v2/api/external/{apiId}/addTagContact` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#tag-contato) Tags por **contato** (sem precisar de ticket). Localize por `contactId` ou `number`; aceita `tagId` ou `tagIds`. O `addTagContact` mantém as tags existentes. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `addTagContact` | Adiciona tag(s) ao contato. | | `POST` | `removeTagContact` | Remove tag(s) do contato. | **Body (exemplo)** ``` { "contactId": 123, "tagId": 1 } ``` ### POST `/v2/api/external/{apiId}/ticket/pause/start/{ticketId}` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-pausa) Pausa de atendimento com motivo e histórico. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `ticket/pause/start/{ticketId}` | Inicia pausa — body: `{pauseReason}`. | | `POST` | `ticket/pause/end/{ticketId}` | Encerra a pausa. | | `GET` | `ticket/pause/logs/{ticketId}` | Histórico de pausas do ticket. | > Iniciar pausa num ticket já pausado: `409 ERR_TICKET_ALREADY_PAUSED`. Encerrar sem pausa ativa: `409 ERR_TICKET_NOT_PAUSED`. Ticket inexistente: `404 ERR_NO_TICKET_FOUND`. ### POST `/v2/api/external/{apiId}/ticket/share` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#ticket-extras) Compartilhamento e avaliações. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `ticket/share` | Compartilha o ticket com outros usuários: `{ticketId, userIdArray: [2, 5]}`. Cada ticket aceita um compartilhamento só: repetir responde `400`. | | `GET` | `ticket/share/{ticketId}` | Consulta o compartilhamento. | | `GET` | `listTicketEvaluations?page=1&limit=20` | Lista avaliações de atendimento. Filtros: `startDate`, `endDate` (AAAA-MM-DD), `evaluation` e `search`. | | `POST` | `sendEvaluation` | Envia a pesquisa de avaliação no ticket. Recebe `ticketId`; aceita também `body`, `externalKey` e `force`. | ## 🏗️ CRM — Pipelines, Oportunidades e Cadastros (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#crm) Estruture o funil de vendas via API: pipelines e estágios, oportunidades vinculadas a contatos, e os cadastros de apoio (kanban, tags, motivos de encerramento e filas). ### POST `/v2/api/external/{apiId}/pipeline/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#crm-pipeline) CRUD de pipelines (funis) e estágios. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `pipeline/create` | Cria — `{name}`. O pipeline só tem nome: `description` é ignorado. | | `GET` | `pipeline/list?page=1&limit=20` | Lista. | | `GET` | `pipeline/show/{id}` | Detalhe. | | `POST` | `pipeline/update/{id}` | Atualiza — `{name}`. | | `POST` | `pipeline/delete/{id}` | Exclui. Só funciona com o pipeline vazio (sem etapas nem oportunidades); senão responde `500`. | | `POST` | `stage/create` | Cria estágio — `{name, pipelineId, order, color}`. Opcionais: `notifyUserId` e `notifyQueueId` (quem é avisado quando uma oportunidade entra na etapa). | | `GET` | `stage/list?pipelineId=...` | Lista estágios do pipeline. | | `GET` | `stage/show/{id}` | Detalhe do estágio. | | `POST` | `stage/update/{id}` | Atualiza estágio. | | `POST` | `stage/delete/{id}` | Exclui estágio. Só funciona sem oportunidades nele (mova-as antes); senão responde `500`. | > **Testado por nós em 29/10/2026.** Criar pipeline com `description`: o campo foi ignorado e o pipeline nasceu só com o nome. ### POST `/v2/api/external/{apiId}/createOpportunity` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#crm-oportunidade) Oportunidades de venda. `status`: `open`, `win` ou `lose`. Se o contato não existir, é criado a partir de `number`/`contactName`/`email`. Veja também [Listar Oportunidades](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-oportunidades). #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `createOpportunity` | Cria oportunidade. | | `POST` | `updateOpportunity` | Atualiza — `{opportunityId, ...}`. | | `POST` | `deleteOpportunity` | Exclui — `{opportunityId}`. | **Body (exemplo)** ``` { "number": "5511999990001", "contactName": "Nome do Contato", "email": "contato@email.com", "name": "Proposta Empresa X", "value": 10000.00, "status": "open", "pipelineId": 16, "stageId": 7, "responsibleId": 1, "closingForecast": "2026-12-31", "description": "Descrição da oportunidade" } ``` > **Obrigatórios:** `number`, `name` (até 255 caracteres), `pipelineId`, `stageId` (uma etapa desse pipeline) e `responsibleId`. `closingForecast` aceita AAAA-MM-DD, DD/MM/AAAA ou data e hora com fuso. Erros: `400 ERR_MISSING_FIELDS` (com `fields`), `ERR_INVALID_OPPORTUNITY_REFERENCE` (pipeline, etapa ou responsável de outra conta, com `field`) e `ERR_STAGE_NOT_IN_PIPELINE`. No `updateOpportunity` só `opportunityId` é obrigatório. ### POST `/v2/api/external/{apiId}/createTag` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#crm-cadastros) Cadastros de apoio: tags, colunas de kanban, motivos de encerramento e filas. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `createTag` | Cria tag — `{tag, color, isActive}` (`tag` e `color` obrigatórios). Nome repetido: `409 ERR_TAG_DUPLICATED`. | | `POST` | `updateTagData/{id}` | Atualiza tag — `{tag, color}`. | | `POST` | `deleteTag/{id}` | Exclui tag. | | `POST` | `createKanban` | Cria coluna kanban — `{name, position}`. | | `GET` | `listKanban` | Lista colunas. | | `POST` | `updateKanban/{id}` | Atualiza coluna. | | `POST` | `deleteKanban/{id}` | Exclui coluna. | | `POST` | `createReason` | Cria motivo — `{name}`. | | `GET` | `listReasons` | Lista motivos. | | `POST` | `updateReason/{id}` | Atualiza motivo. | | `POST` | `deleteReason/{id}` | Exclui motivo. | | `POST` | `createQueueData` | Cria fila — `{queue, isActive}`. Opcionais: `businessHours` e `messageBusinessHours` (mensagem fora do horário). A fila nasce sem cor. | | `POST` | `updateQueueData/{id}` | Atualiza fila. **Atenção: zera a cor da fila** e refaz o vínculo da fila com o usuário dono do token. Para manter a cor, edite pelo painel. | | `POST` | `deleteQueueData/{id}` | Exclui fila. | > As rotas de kanban e de fila não definem cor: a cor só é ajustada pelo painel. O nome da tag vai no campo `tag` (não `name`), e o da fila no campo `queue`. ## 📅 Agendamentos e Lembretes (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#agendamentos) Agende compromissos vinculados a contatos e configure lembretes automáticos por WhatsApp antes de cada evento. ### POST `/v2/api/external/{apiId}/appointment/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#agendamento-crud) Agendamentos ligados a contatos. Obrigatórios: `title` (até 255 caracteres) e `startAt`. `status`: `pending` (padrão), `confirmed`, `cancelled`, `completed` ou `no_show`. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `appointment/create` | Cria. | | `GET` | `appointment/list?page=1&limit=20&status=pending` | Lista em ordem de início. Filtros: `status`, `search`, `startFrom` e `startTo` (mesmos formatos de data do create). | | `GET` | `appointment/show/{id}` | Detalhe. | | `POST` | `appointment/update/{id}` | Atualiza só os campos enviados. Aceita também `checkInStatus`, `location` e `meetingLink`. | | `POST` | `appointment/delete/{id}` | Exclui. | **Body (exemplo)** ``` { "title": "Reunião de Vendas", "description": "Reunião sobre proposta comercial", "contactId": 123, "contactName": "João Silva", "contactPhone": "5511999999999", "whatsappId": 12, "userId": 3, "startAt": "15/06/2026 14:00", "endAt": "2026-06-15T15:00:00-03:00", "status": "pending", "notes": "Levar proposta impressa" } ``` | Campo | Tipo | Descrição | |---|---|---| | `startAt` | string obrigatório | Início. Aceita `2026-06-15`, `2026-06-15 14:00`, `2026-06-15T14:00:00-03:00` ou `15/06/2026 14:00`. Com barra é sempre dia/mês/ano. **Sem fuso, vale o horário de Brasília.** Só a data = 00:00. Número (timestamp) ou outro formato: `400 ERR_INVALID_START_AT`. | | `endAt` | string opcional | Fim, nos mesmos formatos. Antes do início: `400 ERR_END_AT_BEFORE_START_AT`. No update, `null` apaga o fim. | | `userId` | int opcional | Atendente responsável. Sem ele, o agendamento nasce sem atendente. | | `bookingProfessionalId` | int opcional | Profissional da página de agendamento. | | `contactId` | int opcional | Contato. `contactId`, `whatsappId`, `userId` e `bookingProfessionalId` precisam ser da sua conta (senão `404`). | | `checkInStatus` | string opcional | **Só no update.** `none`, `confirmed`, `on_the_way` ou `no_show`. Outro valor: `400 ERR_INVALID_FIELD` com `field`. | > **Testado por nós em 29/10/2026.** Criar com `15/11/2026 14:00` gravou 17:00 UTC (horário de Brasília). `checkInStatus` enviado no create foi ignorado (nasceu `none`); no update funcionou. Fim antes do início, timestamp numérico, check-in inválido e filtro de data inválido responderam com os códigos da tabela. ### POST `/v2/api/external/{apiId}/scheduleReminder/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#lembrete-crud) Regras de lembrete automático: a mensagem é enviada N horas antes do agendamento, pela conexão indicada. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `scheduleReminder/create` | Cria regra. | | `GET` | `scheduleReminder/list` | Lista regras. | | `POST` | `scheduleReminder/update/{id}` | Atualiza. | | `POST` | `scheduleReminder/toggle/{id}` | Ativa/desativa. | | `POST` | `scheduleReminder/delete/{id}` | Exclui. | **Body (exemplo)** ``` { "name": "Lembrete 24h antes", "description": "Envia mensagem ao contato 24h antes do agendamento", "hoursBeforeEvent": 24, "messageType": "message", "messageContent": "Olá {nome}, lembrete da sua reunião amanhã!", "whatsappId": 12, "active": true } ``` > O lembrete não tem data própria: dispara `hoursBeforeEvent` horas antes de cada agendamento. Obrigatórios: `hoursBeforeEvent` (número inteiro) e `messageType` (`message` ou `waba_template`); faltando, `400 ERR_MISSING_FIELDS`. `whatsappId` de outra conta: `404 ERR_NO_WAPP_FOUND`. No update, campo com outro nome é descartado sem erro. ## 📊 Dashboard e Relatórios (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#dashboard-api) Indicadores de atendimento para alimentar BI e relatórios externos. Todos os endpoints são `GET` e aceitam `startDate` e `endDate` (formato `AAAA-MM-DD`). ### GET `/v2/api/external/{apiId}/dash/?startDate=...&endDate=...` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#dash-rotas) Indicadores disponíveis: #### Rotas | Método | Rota | Descrição | |---|---|---| | `GET` | `dash/ticketsAndTimes` | Totais de tickets e tempos médios (espera/atendimento). | | `GET` | `dash/ticketsStatus` | Distribuição por status. | | `GET` | `dash/ticketsChannels` | Distribuição por canal. | | `GET` | `dash/ticketsQueue` | Distribuição por fila. | | `GET` | `dash/ticketsPerUser` | Volume por atendente. | | `GET` | `dash/ticketsUser` | Detalhe por atendente. | | `GET` | `dash/ticketsReasons` | Distribuição por motivo de encerramento. | | `GET` | `dash/ticketsEvolution` | Evolução diária de tickets. | | `GET` | `dash/ticketsEvolutionByValue` | Evolução por valor. | | `GET` | `dash/ticketsEvolutionChannelsName` | Evolução diária por canal. | > Os indicadores contam só conversas individuais. Para ver só os grupos, acrescente `&isGroup=true` (testado em 29/10/2026: os números mudam por completo). ## 🔌 Canais e Sessões (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#canais-sessoes) Gerencie as conexões WhatsApp do tenant via API: criar, iniciar, obter QR Code e consultar canais. Complementa [Listar Canais](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-canais) e [Listar Sessões](https://clientes.nimochat.com.br/documentacaoapiproplus.php#listar-sessoes). ### POST `/v2/api/external/{apiId}/` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#sessao-gerenciar) Ciclo de vida da sessão (conexão). #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `createtSession` | Cria sessão — `{name, status, type}`. *Atenção: a rota é `createtSession` mesmo (grafia da plataforma).* | | `POST` | `startSession` | Inicia — `{whatsappId}`. | | `POST` | `qrCodeSession` | Obtém o QR Code atual — `{whatsappId}`. | | `POST` | `requestNewQrCodeSession` | Força novo QR Code — `{whatsappId}`. | | `POST` | `deleteSession` | Exclui a sessão — `{whatsappId}`. | | `POST` | `showChannel` | Consulta canal pelo número — `{number}`. | | `POST` | `showChannelById` | Consulta canal por ID — `{id}`. | | `GET` | `getAllSessionApis` | Lista as configurações de API do tenant. | ## 🗂️ Utilitários (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#utilitarios) Galeria de arquivos, tarefas (to-do), logs de chamadas, consulta de contato por número e listagens auxiliares. ### POST `/v2/api/external/{apiId}/showcontact` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-showcontact) Consulta um contato pelo número de WhatsApp (retorna dados completos, incluindo tags e carteiras). **Body (exemplo)** ``` { "number": "5511999999999" } ``` ### POST `/v2/api/external/{apiId}/gallery/upload` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-galeria) Galeria de arquivos do tenant. O upload é `multipart/form-data` (campo de arquivo + `description`). #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `gallery/upload` | Envia até 10 arquivos (multipart, campo `files`, limite de 500 MB). Opcionais: `description` (vale para todos) e `folderId` (pasta). | | `GET` | `gallery/list?pageNumber=1&fileType=image` | Lista arquivos, 20 por página. Filtros: `fileType`, `searchParam` e `folderId` (`none` = só os sem pasta; o id = só os da pasta). | | `GET` | `gallery/folders` | Lista as pastas em ordem alfabética, com a quantidade de arquivos de cada uma. | | `POST` | `gallery/delete/{id}` | Exclui arquivo. | **Resposta do gallery/folders** ``` { "success": true, "data": { "available": true, "folders": [{ "id": 1, "name": "Produtos", "count": 12 }], "unfiledCount": 30, "totalCount": 42 } } ``` > `unfiledCount` = arquivos sem pasta; `totalCount` = todos. Pasta inexistente ou de outra conta: `400 ERR_GALLERY_FOLDER_NOT_FOUND`. Cota da galeria estourada no upload: `413 ERR_GALLERY_QUOTA_EXCEEDED`, e nenhum arquivo é salvo. As pastas são criadas pelo painel. > **Testado por nós em 29/10/2026.** `gallery/folders`, a lista com `folderId=none` (a resposta traz `folderFilter`) e a pasta inexistente. ### POST `/v2/api/external/{apiId}/todo/create` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-todo) Tarefas (to-do) por usuário. `priority`: low/medium/high; `status`: pending/finished. #### Rotas | Método | Rota | Descrição | |---|---|---| | `POST` | `todo/create` | Cria — `{name, description, owner, ownerId, status, priority, limitDate, reminderMinutes, contactId, ticketId}`. | | `GET` | `todo/list` | Lista. | | `POST` | `todo/update/{id}` | Atualiza só os campos enviados, ex: `{status: finished}`. Prazo novo ainda não vencido volta `delayed` para `pending`. | | `POST` | `todo/delete/{id}` | Exclui. | | `GET` | `todo/logs/{userId}` | Histórico de alterações por usuário. | | Campo | Tipo | Descrição | |---|---|---| | `limitDate` | string opcional | Prazo. `2026-06-15` = tarefa do dia (atrasa quando o dia acaba). `2026-06-15 14:30` = tarefa com horário (sem fuso, horário de Brasília). **Não use barra**: `02/03/2027` é lido como mês/dia e vira 3 de fevereiro. Data ilegível: `400 ERR_INVALID_FIELD`. | | `reminderMinutes` | int opcional | Lembrete ao responsável: `0`, `10`, `30` ou `60` minutos antes. Só vale para tarefa com horário e com `ownerId`. Outro valor: `400 ERR_INVALID_FIELD`. | | `ownerId` | int opcional | Responsável (id de usuário, veja `listUsers`): recebe o lembrete. Id que não é da sua conta cria a tarefa **sem responsável** e a resposta traz `"ownerIgnored": true`. Confira esse campo. | | `contactId` | int opcional | Liga a tarefa a um contato. Com `ticketId`, o ticket precisa ser do mesmo contato. | | `ticketId` | int opcional | Liga a tarefa a um atendimento (liga também o contato dele). | > **Testado por nós em 29/10/2026.** Prazo com e sem hora (a resposta traz `limitHasTime` e `reminderAt`), lembrete inválido, `ownerIgnored` com usuário inexistente e a data com barra lida como mês/dia. ### POST `/v2/api/external/{apiId}/formSubmit` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-formulario) Envia as respostas de um formulário da sua conta, como se a pessoa tivesse preenchido a página do formulário: acha ou cria o contato, aplica as etiquetas, abre o atendimento (ou entra no que já está aberto) e manda a confirmação, se o formulário tiver. Útil para levar ao Pro+ um formulário do seu site ou de outro sistema. Não passa pelas travas contra robôs da página pública. | Campo | Tipo | Descrição | |---|---|---| | `formId` | int opcional | Id do formulário (aba **Compartilhar** do formulário). Envie `formId` **ou** `slug`; com os dois, vale o `formId`. | | `slug` | string opcional | O endereço do formulário: o que vem depois de `/f/` no link. | | `answers` | object obrigatório | Respostas pela **chave** de cada campo (mostrada na aba Compartilhar). Telefone com `+` e o código do país; lista = id da opção; múltipla escolha = lista de ids; caixa de confirmação = `true`; data em AAAA-MM-DD. | | `ref` | string opcional | Página de onde veio o envio (guardada sem a query). | **Exemplo** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/formSubmit' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "formId": 12, "answers": { "f_nome": "Maria Souza", "f_telefone": "+5511999998888", "f_email": "maria@exemplo.com" }, "ref": "https://www.seusite.com.br/contato" }' ``` **Resposta** ``` { "ok": true, "submissionId": 87, "status": "processed", "ticketId": 1262, "contactId": 123, "errorCode": null } ``` > `status`: `processed` = atendimento aberto ou atualizado; `failed` = o envio ficou em Respostas sem atendimento (`errorCode` diz o motivo) e pode ser refeito pelo painel; `skipped` = contato bloqueado. | Erro | Quando acontece | |---|---| | `400 ERR_FORM_ID_OR_SLUG_REQUIRED` | Faltou `formId` e `slug`. | | `404 ERR_FORM_NOT_FOUND` | Formulário não existe, está desativado, é de outra conta ou não tem canal ativo. | | `400 ERR_FORM_INVALID` | `answers` fora do formato, ou campo inválido: `details.fields` traz um código por campo (`required`, `invalidPhone`, `invalidEmail`, `invalidOption`...). | | `400 ERR_FORM_CONTACT_REQUIRED` | Faltou o telefone ou o e-mail que o formulário usa para achar o contato. | | `402 ERR_FEATURE_NOT_IN_PLAN` | O plano da conta não tem Formulários. | | `413 ERR_FORM_TOO_LARGE` | Respostas acima de 32 KB. | > **Testado por nós em 29/10/2026.** Os erros `ERR_FORM_ID_OR_SLUG_REQUIRED` e `ERR_FORM_NOT_FOUND`. O envio completo depende de um formulário criado na sua conta: faça o primeiro teste com o seu próprio telefone. ### GET `/v2/api/external/{apiId}/callLog/list` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-chamadas) Logs de chamadas recebidas/realizadas. #### Rotas | Método | Rota | Descrição | |---|---|---| | `GET` | `callLog/list?page=1&limit=20` | Lista chamadas. Ordena com `orderBy` e `orderDirection`; não filtra por período. | | `GET` | `callLog/show/{id}` | Detalhe da chamada. | | `GET` | `wavoip/calls?page=1&limit=20` | Lista chamadas de voz IP. Filtros: `startDate`, `endDate`, `direction`, `callStatus`, `phone`, `contactId`, `ticketId`, `userId` e `queueId`. Use esta rota para recortar por data. | | `GET` | `wavoip/calls/{id}` | Detalhe da chamada de voz IP. | ### GET `/v2/api/external/{apiId}/listChatFlows` (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#util-listagens) Listagens auxiliares para montar integrações. #### Rotas | Método | Rota | Descrição | |---|---|---| | `GET` | `listChatFlows` | Fluxos de chatbot do tenant. | | `GET` | `listAutoReplies` | Respostas automáticas. | | `GET` | `listFastReplies` | Respostas rápidas. | ## 🪝 Webhooks (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#webhooks-intro) **Webhooks** são notificações que o NimoChat Pro+ envia automaticamente para uma URL do seu sistema sempre que algo acontece na plataforma — uma nova mensagem chega, um ticket é criado, um atendimento é finalizado. Em vez de seu sistema ficar perguntando à API "tem mensagem nova?" a cada minuto (*polling*), o NimoChat **avisa em tempo real** quando algo acontece. Isso é mais eficiente, mais rápido e consome menos recursos. > **Quando usar webhooks:** notificações em tempo real, automações que dependem de eventos (chegou mensagem → cria ticket no Zendesk), sincronização contínua entre sistemas, alertas para o time de plantão. ### Configurando o Webhook A configuração é feita no painel administrativo do NimoChat Pro+ em poucos cliques: 1. Faça login como **Administrador**. 2. Acesse **Integrações > Webhook** no menu. 3. Ative a opção **"Ativar webhook"**. 4. Informe a **URL do seu sistema** que vai receber as notificações (precisa ser HTTPS pública). 5. Opcionalmente, ative **"Receber eventos de mensagem"** para receber notificações também das mensagens individuais (não apenas dos tickets). 6. Salve as alterações. > **Sua URL precisa estar acessível pela internet** e responder com HTTP 200 em até 15 segundos. URLs locais (`localhost`, `192.168.x.x`) não funcionam. Use um servidor público, ngrok para testes ou um serviço como n8n/Make/Pipedream. ### Estrutura do payload Toda notificação é enviada como `POST` para sua URL com `Content-Type: application/json`. O corpo da requisição segue esta estrutura: ``` { "method": "...", // tipo do evento (opcional) "tenantId": 123, // ID da sua conta "ticketId": 98765, // ID do ticket relacionado "msg": { // dados da mensagem "body": "texto da mensagem", "fromMe": false, // true = atendente enviou, false = contato enviou "from": "5511999999999@s.whatsapp.net" }, "ticket": { // dados do ticket "id": 98765, "tenantId": 123, "userId": null, // null = não atribuído "queueId": 5, // ID da fila "createdAt": "2026-04-06T13:00:00.000Z", "contact": { "id": 456, "name": "João Silva", "number": "5511999999999", "wallets": [{ "id": 7 }] } } } ``` #### Campos principais | Campo | Tipo | Descrição | |---|---|---| | `method` | string | Tipo do evento. Quando ausente ou vazio, indica evento de entrada (mensagem recebida ou ticket criado). | | `tenantId` | int | ID da sua conta. **Sempre valide** para garantir que o webhook é da sua conta. | | `ticketId` | int | ID do ticket relacionado ao evento. | | `msg.body` | string | Texto da mensagem (em mensagens de texto). | | `msg.fromMe` | boolean | `true` se a mensagem foi enviada pelo atendente, `false` se foi recebida do contato. | | `ticket.userId` | int\|null | `null` indica ticket não atribuído (oportunidade de distribuição automática). | | `ticket.contact.number` | string | Telefone do contato (sem prefixos do WhatsApp). | ### Tipos de eventos O campo `method` identifica o tipo do evento. Os principais valores são: | Evento | Quando dispara | |---|---| | **(vazio) — Mensagem recebida** | O contato enviou uma mensagem. `msg.fromMe = false` e `method` ausente. Frequentemente acompanhado de criação de ticket novo. | | **(vazio) — Novo ticket** | Um novo ticket foi criado a partir de uma conversa de entrada. `ticket.userId = null`. | | `message_send` | O atendente enviou uma mensagem pelo painel. `msg.fromMe = true`. | | `message_send_uazapi` | Mensagem enviada por uma sessão WhatsApp via QR Code (não-oficial). | | `message_send_waba` / `message_sent_waba` | Mensagem enviada pela API oficial do WhatsApp Business (Cloud API). | | `ack` | Confirmação de leitura/entrega do WhatsApp (entregue, lido, ouvido). | | `presence` | Atualização de presença do contato (online, offline, digitando). | > **Foco no que importa:** a maioria das integrações filtra apenas eventos de entrada (sem `method` e com `fromMe = false`) e ignora os eventos `ack`, `presence` e os de envio. Isso evita ruído e processa só o que é acionável. ### Exemplos de payloads reais #### Mensagem de texto recebida ``` { "msg": { "fromMe": false, "body": "Olá, gostaria de saber sobre o produto X", "from": "5511999999999@s.whatsapp.net" }, "ticket": { "id": 12345, "tenantId": 2, "userId": null, "queueId": 3, "createdAt": "2026-04-06T13:00:00.000Z", "contact": { "id": 456, "name": "João Silva", "number": "5511999999999", "wallets": [] } } } ``` #### Mídia recebida (áudio, imagem, documento) ``` { "msg": { "fromMe": false, "content": [ { "type": "audio", "url": "https://media.../audio.ogg" } ] }, "ticket": { "id": 12346, "tenantId": 2, "contact": { "id": 456, "number": "5511999999999" } } } ``` > **Atenção com mídias:** em mensagens de mídia o campo `msg.body` pode estar vazio e o conteúdo vir em `msg.content` como **array**. Sempre faça *type checking* no seu código antes de processar. #### Mensagem enviada pelo atendente (filtrar) ``` { "method": "message_send_uazapi", "msg": { "fromMe": true, "body": "Olá! Em que posso ajudar?" }, "ticket": { "id": 12345, "tenantId": 2 } } ``` #### Confirmação de leitura (filtrar) ``` { "method": "ack", "ticketId": 12345 } ``` ### Exemplo de receiver (Node.js) Receiver simples em Node.js + Express que processa apenas mensagens recebidas: ``` const express = require('express'); const app = express(); app.use(express.json()); // Métodos a ignorar (saída + ruído) const IGNORE = ['message_send', 'message_send_uazapi', 'message_send_waba', 'message_sent_waba', 'ack', 'presence']; app.post('/webhook/nimochat', (req, res) => { const payload = req.body; // 1. Filtrar eventos que não interessam if (IGNORE.includes(payload.method)) return res.sendStatus(200); // 2. Validar tenant (segurança) if (payload.ticket?.tenantId !== SEU_TENANT_ID) return res.sendStatus(403); // 3. Processar apenas mensagens recebidas if (payload.msg?.fromMe === false) { const contact = payload.ticket?.contact; const body = typeof payload.msg.body === 'string' ? payload.msg.body : ''; console.log(`Nova mensagem de ${contact?.name}: ${body}`); // Aqui você integra com seu CRM, dispara alerta, etc. } res.sendStatus(200); }); app.listen(3000); ``` ### Segurança e boas práticas - **HTTPS obrigatório** — sempre use URLs com SSL válido. Webhooks com HTTP simples podem não funcionar. - **Valide o `tenantId`** — confira se o ID da conta no payload bate com o seu. Se não bater, rejeite com HTTP 403. - **Responda rápido (HTTP 200)** — o webhook tem timeout. Se sua lógica é demorada, responda 200 imediatamente e processe em background (fila). - **Idempotência** — use `ticket.id` + `msg.from` + timestamp para evitar processar a mesma mensagem 2x se houver retentativa. - **Type checking** — sempre verifique o tipo dos campos antes de usar (especialmente `msg.body` que pode ser string ou ausente). - **Logue tudo no início** — durante a integração, logue payloads completos. Eles são sua única fonte de verdade sobre o que chega. - **IP whitelist (opcional)** — se possível, restrinja o endpoint apenas a IPs conhecidos do servidor NimoChat. > **Dica de produção:** use plataformas como **n8n**, **Make** ou **Pipedream** para receber webhooks sem precisar manter um servidor. Elas oferecem URLs prontas, retry automático e logs visuais — ideal para começar. ## 💡 Casos de uso reais (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#casos-de-uso) ### 1. Disparo em massa segmentado por tag Você quer enviar uma promoção para todos os contatos com a tag **"Lead Quente"**. Em vez de exportar a lista manualmente, busque os contatos via API e dispare via n8n / Make. **Passo 1 — Buscar contatos com a tag** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/contacts/search' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "tagId": 42, "limit": 500 }' ``` **Passo 2 — Para cada contato, enviar a mensagem** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "number": "5511999999999", "body": "Oferta especial só para você! 30% OFF até hoje." }' ``` > **Cuidado com o WhatsApp:** respeite os limites do WhatsApp (não dispare 1000+ mensagens em segundos) e adicione delays entre as mensagens (ex: 5-10 segundos). Use também a tag de opt-in para evitar bloqueios. ### 2. Distribuição automática de leads para vendedores Quando um novo lead chega, atribua automaticamente para um vendedor disponível usando a função de carteirização (wallet). **Atribuir contato à carteira do vendedor** ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/updateContactWallet' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "contactId": 4567, "walletId": 12 }' ``` Combine com o webhook de novo ticket: quando o NimoChat avisar que um novo ticket foi criado, sua aplicação consulta qual vendedor está disponível (lógica round-robin, menor carga, especialidade) e atribui via API. ### 3. Sincronizar contatos do CRM com o NimoChat Toda vez que um novo contato é cadastrado no seu CRM, replique-o automaticamente para o NimoChat: ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/createContact' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "name": "Maria Oliveira", "number": "5511988887777", "email": "maria@empresa.com", "extraInfo": [ { "name": "empresa", "value": "ACME Ltda" }, { "name": "cargo", "value": "Diretora Comercial" } ] }' ``` ### 4. Cadastrar atendentes via integração com RH Quando um novo colaborador é admitido no seu sistema de RH, crie automaticamente o usuário (atendente) no NimoChat: ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/createUser' \ --header 'Authorization: Bearer SEU_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "name": "Carlos Santos", "email": "carlos.santos@empresa.com", "password": "SenhaTemp123!", "profile": "user" }' ``` ### 5. Humanizar bots — mostrar "digitando..." antes da resposta Antes do seu bot enviar uma resposta automática, envie um sinal de presence "typing" para humanizar a interação: ``` # 1. Envia "digitando..." (typing) curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/sendPresence' \ --header 'Authorization: Bearer SEU_TOKEN' \ --data '{ "ticketId": 12345, "state": "typing" }' # 2. Aguarda 2-4 segundos sleep 3 # 3. Envia a mensagem real curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID' \ --header 'Authorization: Bearer SEU_TOKEN' \ --data '{ "number": "5511999999999", "body": "Resposta do bot" }' ``` ### 6. Classificar tickets durante o atendimento Use `addTag` para classificar o ticket sem perder as tags anteriores. Por exemplo, ao detectar uma palavra-chave no texto da mensagem: ``` curl --request POST \ --url 'https://SUA_URL_BASE/v2/api/external/SEU_API_ID/addTag' \ --header 'Authorization: Bearer SEU_TOKEN' \ --data '{ "ticketId": 12345, "tagId": [42, 87] }' ``` ## 📚 Referência completa de endpoints (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#referencia-completa) A coleção do Postman é gerada a partir desta página: tem **todas as rotas daqui**, cada uma com corpo de exemplo, os campos, os avisos e o link para o cartão correspondente. O Postman monta o código em várias linguagens (cURL, Node.js, Python, PHP, Go, Java). Abra a coleção, clique em qualquer endpoint, e copie o snippet na linguagem desejada usando o painel "Code" (lateral direita). [Acessar coleção completa no Postman](https://www.postman.com/nimochatproplus/nimochat-s-workspace/collection/51809267-8bb35fbd-6298-44be-955f-0b17bcf7c0e0) ### Endpoints por categoria Resumo de tudo que está disponível na coleção: #### 📅 Agendamentos e Lembretes Crie e gerencie agendamentos e lembretes automáticos. - POST AppointmentCreate: Criar agendamento - POST AppointmentUpdate: Atualizar agendamento - POST AppointmentDelete: Deletar agendamento - GET AppointmentList: Listar agendamentos - GET AppointmentShow: Detalhes de um agendamento - POST ScheduleReminderCreate: Criar lembrete - POST ScheduleReminderUpdate: Atualizar lembrete - POST ScheduleReminderDelete: Deletar lembrete - POST ScheduleReminderToggle: Ativar/desativar lembrete - GET ScheduleReminderList: Listar lembretes #### 📣 Campanhas Crie, gerencie e dispare campanhas de marketing em massa. - POST CampaignCreate: Criar campanha - POST CampaignUpdate: Editar campanha - POST CampaignDelete: Deletar campanha - POST CampaignDuplicate: Duplicar campanha - POST CampaignStart: Iniciar disparo - POST CampaignPause: Pausar campanha - POST CampaignResume: Retomar campanha pausada - POST CampaignCancel: Cancelar campanha - POST CampaignSkip: Pular envio atual - GET CampaignList: Listar campanhas - GET CampaignReport: Relatório de envios - POST CampaignContactsAdd: Adicionar contatos - POST CampaignContactsRemove: Remover contato - POST CampaignContactsRemoveAll: Limpar todos os contatos - GET CampaignContactsList: Listar contatos da campanha #### 🔌 Canais e Sessões Gerencie conexões WhatsApp, escaneie QR Codes, inicie e finalize sessões. - POST CreateSession: Criar nova sessão - POST StartSession: Iniciar sessão - POST DeleteSession: Deletar sessão - POST ShowQrCode: Exibir QR Code atual - POST RequestNewQrCode: Solicitar novo QR Code - POST ShowChannelInformation: Informações do canal - POST ShowChannelInformationById: Informações por ID - POST ListGroupsInfo: Listar grupos do canal #### 👤 Contatos (avançado) - POST ShowContact: Detalhes do contato - POST TelegramInvite: Convite do Telegram - POST FormSubmit: Enviar respostas de formulário #### 🏗️ CRM - Pipeline Gerencie pipelines (funis) e estágios do CRM. - POST PipelineCreate: Criar funil - POST PipelineUpdate: Atualizar funil - POST PipelineDelete: Deletar funil - GET PipelineList: Listar funis - GET PipelineShow: Detalhes do funil - POST StageCreate: Criar estágio - POST StageUpdate: Atualizar estágio - POST StageDelete: Deletar estágio - GET StageList: Listar estágios - GET StageShow: Detalhes do estágio #### 📊 Dashboard Métricas e gráficos para BI / dashboards externos. - GET DashTicketsAndTimes: Tickets e tempos médios - GET DashTicketsChannels: Tickets por canal - GET DashTicketsEvolution: Evolução temporal - GET DashTicketsEvolutionByValue: Evolução por valor - GET DashTicketsEvolutionChannelsName: Evolução por canal - GET DashTicketsPerUser: Tickets por atendente - GET DashTicketsQueue: Tickets por fila - GET DashTicketsReasons: Tickets por motivo - GET DashTicketsStatus: Tickets por status - GET DashTicketsUser: Tickets de um usuário #### 📤 Envio em Lote (Bulk) Disparos em massa de mensagens com controle de progresso. - POST BulkSendMessage: Disparo simples em lote - POST BulkSendMessageWithVariable: Disparo com variáveis personalizadas - POST BulkFastMessage: Disparo rápido - POST BulkIndividual: Envio individual em lote - POST BulkDispatchUpdate: Atualizar disparo - POST BulkDispatchIncrementProgress: Incrementar progresso - GET BulkDispatchList: Listar disparos - GET BulkDispatchShow: Detalhes do disparo #### 📂 Galeria de mídias - POST GalleryUpload: Upload de arquivo - POST GalleryDelete: Deletar arquivo - GET GalleryList: Listar arquivos - GET GalleryFolders: Listar pastas #### 👥 Grupos WhatsApp Crie e gerencie grupos do WhatsApp. - POST GroupCreate: Criar novo grupo - POST GroupChangeTitle: Alterar título - POST GroupChangeDescription: Alterar descrição - POST GroupChangePicture: Alterar foto - POST GroupAddParticipant: Adicionar participante - POST GroupRemoveParticipant: Remover participante - POST GroupPromote: Promover a admin - POST GroupDemote: Rebaixar admin - POST GroupSetAdminsOnly: Restringir só admins - POST GroupGetInviteLink: Obter link de convite - POST GroupListParticipants: Listar participantes - POST GroupShowById: Detalhes do grupo - POST GroupList: Listar grupos #### 🏷️ Kanban / Tags / Motivos / Filas CRUD completo de objetos auxiliares. - POST CreateKanban: Criar coluna kanban - POST UpdateKanban: Atualizar kanban - POST DeleteKanban: Deletar kanban - GET ListKanban: Listar kanbans - POST CreateTag: Criar tag - POST UpdateTagData: Atualizar tag - POST DeleteTag: Deletar tag - POST CreateReason: Criar motivo - POST UpdateReason: Atualizar motivo - POST DeleteReason: Deletar motivo - GET ListReasons: Listar motivos - POST CreateQueueData: Criar fila - POST UpdateQueueData: Atualizar fila - POST DeleteQueueData: Deletar fila #### 🔍 Listagens utilitárias - GET ListAutoReplies: Auto-respostas - GET ListChatFlows: Fluxos de chatbot - GET ListFastReplies: Respostas rápidas - GET GetAllSessionApis: Todas as APIs de sessão #### 📞 Logs de Chamadas - GET CallLogList: Listar chamadas - GET CallLogShow: Detalhes da chamada - GET WavoipCallList: Listar chamadas Wavoip - GET WavoipCallShow: Detalhes Wavoip #### 📨 Mensagens (extras) - POST SendMessageAPIFile: Enviar arquivo (upload) - POST SendMessageAPITextBase64: Texto com mídia base64 - POST SendMessageAPIVoice: Enviar áudio (voice) - POST SendLocation: Enviar localização - POST SendVcard: Enviar contato (vCard) - GET GetMessageByMessageId: Buscar mensagem por ID - GET SearchMessages: Buscar mensagens - GET SendMessageParams: Parâmetros disponíveis #### 👥 Mensagens em Grupo - POST SendGroupMessageAPIText: Texto para grupo - POST SendGroupMessageAPIFile: Arquivo para grupo - POST SendMessageAPIFileURLGroup: Arquivo via URL para grupo #### 💼 Oportunidades (CRM) - POST CreateOpportunity: Criar oportunidade - POST UpdateOpportunity: Atualizar oportunidade - POST DeleteOpportunity: Deletar oportunidade #### 📋 Templates WABA (API Oficial) - POST SendTemplateWaba: Enviar template aprovado - POST SendTemplateWabaBody: Mesmo corpo do SendTemplateWaba - POST SendTemplateWabaMarketing: Mesmo corpo do SendTemplateWaba; marketing sai pela Marketing Messages API quando a conta aceitou os termos #### 🎫 Tickets (extras) - POST CreateTicket: Criar ticket manualmente - POST CreateTicketFile: Criar ticket com arquivo - POST CreateTicketWebmail: Criar ticket de webmail - POST SetTicketInfo: Atualizar info do ticket - POST SetQueue: Mover ticket para fila - POST SetTag: Definir tags (substitui) - POST ShowTicketById: Detalhes por ID - POST ShowTicketInformation: Informações do ticket - POST ShowAllTicketInformation: Todas as informações - POST ShowAllMessages: Todas as mensagens - POST StartTicketPause: Pausar ticket - POST EndTicketPause: Despausar ticket - GET ListTicketPauseLogs: Logs de pausas - GET ListTicketEvaluations: Avaliações - POST TicketShareCreate: Compartilhar ticket - GET TicketShareShow: Detalhes do compartilhamento #### ✅ To-Do List - POST TodoCreate: Criar tarefa - POST TodoUpdate: Atualizar tarefa - POST TodoDelete: Deletar tarefa - GET TodoList: Listar tarefas - GET TodoLogs: Logs de tarefas ## ❓ FAQ — Perguntas frequentes (link: https://clientes.nimochat.com.br/documentacaoapiproplus.php#faq) ### Posso testar sem código? Sim. Acesse a [coleção do Postman](https://www.postman.com/nimochatproplus/nimochat-s-workspace/collection/51809267-8bb35fbd-6298-44be-955f-0b17bcf7c0e0), clique em qualquer endpoint, preencha as variáveis (token, URL base, API ID) e clique em "Send". É a forma mais rápida de testar. ### Como gerar exemplos de código em outras linguagens? No Postman, abra o endpoint, clique no ícone **{ }** (Code Snippets) na lateral direita e escolha a linguagem: cURL, Node.js, Python, PHP, Java, Go, C#, Ruby, etc. ### Existe limite de requisições (rate limit)? Sim. Use a API com bom senso — picos muito altos podem ser bloqueados. Para disparos em massa, use os endpoints específicos de Bulk com delay entre mensagens (recomendado: 5-10 segundos). ### Como funciona a autenticação Bearer? Você gera um token no painel admin (menu API) e envia ele em todas as requisições no header `Authorization: Bearer SEU_TOKEN`. O token é específico da sua conta e isola seus dados. ### O que é o `apiId` no URL? É o identificador único da sua chave de API. É gerado junto com o token quando você cria uma nova API no painel. Cada chave pode estar associada a uma conexão WhatsApp específica. ### Por que minhas mensagens não chegam ao destino? Possíveis causas: (1) número formatado errado — sempre use DDI+DDD+número (ex: 5511999999999), (2) conexão WhatsApp desconectada — verifique no painel, (3) número do destinatário não tem WhatsApp, (4) o WhatsApp pode ter bloqueado por excesso de mensagens. ### O webhook não está chegando, o que fazer? Confira: (1) URL configurada está correta e é HTTPS pública, (2) seu servidor responde com HTTP 200 em até 15 segundos, (3) a opção "Receber eventos de mensagem" está ativada se você quer receber mensagens individuais, (4) seu firewall não está bloqueando os IPs do NimoChat. ### Onde reportar bugs ou sugerir novos endpoints? Entre em contato pelo nosso [canal de suporte](https://nimochat.com.br/contato) — vamos avaliar e priorizar. Atualizações da API são notificadas via **release notes** no Postman. > **Pronto para integrar?** Comece pela [coleção do Postman](https://www.postman.com/nimochatproplus/nimochat-s-workspace/collection/51809267-8bb35fbd-6298-44be-955f-0b17bcf7c0e0). Tem dúvidas técnicas? [Fale com nosso time](https://nimochat.com.br/contato).