Documentação Técnica

API NimoChat Pro+

Integre o NimoChat Pro+ ao seu CRM, ERP, n8n, Make ou qualquer plataforma. Automatize disparos, sincronize contatos, gerencie tickets e construa fluxos personalizados via API REST.

O que é a API NimoChat Pro+

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.

Casos de uso comuns

Começando

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://seudominio.nimochat.com.br

Todas as chamadas à API são feitas a partir dessa URL. Se você não souber a sua, pergunte ao administrador da conta ou consulte o painel em Configurações > Domínios.

Autenticação

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 retorna HTTP 401 Unauthorized.

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

Todos os endpoints da API seguem o mesmo padrão de URL:

https://seudominio.nimochat.com.br/v2/api/external/{apiId}/{endpoint}

Onde:

Códigos de resposta

CódigoSignificado
200 OKRequisição bem-sucedida. O corpo contém os dados solicitados.
400 Bad RequestParâmetros inválidos ou faltando.
401 UnauthorizedToken inválido ou ausente.
403 ForbiddenToken válido, mas sem permissão para o recurso.
404 Not FoundRecurso não encontrado (ex: ID inexistente).
429 Too Many RequestsRate limit excedido. Aguarde antes de tentar novamente.
500 Internal Server ErrorErro no servidor. Reporte ao suporte se persistir.

Exemplo rápido — sua primeira chamada

Vamos listar todos os canais (conexões WhatsApp) da sua conta. Substitua SEU_TOKEN, SEU_DOMINIO e SEU_API_ID pelos valores reais:

cURL

curl --request GET \
  --url 'https://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/listChannels' \
  --header 'Authorization: Bearer SEU_TOKEN'

Resposta esperada

{
  "channels": [
    {
      "id": 1,
      "name": "WhatsApp Principal",
      "status": "CONNECTED",
      "number": "5511999999999"
    }
  ]
}
Recebeu uma resposta? Você está pronto para usar a API. Agora explore os endpoints abaixo ou abra a coleção do Postman que tem todos os endpoints prontos para testar.

📊 Listagens (GET)

Endpoints de consulta. Use estas rotas para buscar informações da plataforma. Todas retornam JSON.

GET /v2/api/external/{apiId}/listChannels

Lista todas as conexões (canais) da sua conta — WhatsApp, Instagram, Facebook, WebChat, Telegram, etc.

Exemplo

curl --request GET \
  --url 'https://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/listChannels' \
  --header 'Authorization: Bearer SEU_TOKEN'
GET /v2/api/external/{apiId}/listSessions

Lista todas as sessões (instâncias) ativas no seu sistema.

GET /v2/api/external/{apiId}/listTickets

Lista os tickets (atendimentos) com filtros avançados. Suporta paginação.

Query Parameters

ParâmetroTipoDescrição
pageNumberintNúmero da página (começa em 1).
statusstringFiltra por status: open, pending, closed.
searchParamstringTexto para buscar em nome, número ou conteúdo.
queuesIdsarrayIDs das filas para filtrar.
whatsappIdsarrayIDs das conexões WhatsApp.
selectedUserintID do atendente responsável.

Exemplo — tickets abertos da fila 3

curl --request GET \
  --url 'https://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/listTickets?status=open&queuesIds=3&pageNumber=1' \
  --header 'Authorization: Bearer SEU_TOKEN'
GET /v2/api/external/{apiId}/listContacts

Lista contatos cadastrados. Suporta filtros por nome, carteira (wallet) e tag.

Query Parameters

ParâmetroTipoDescrição
pageNumberintNúmero da página.
searchParamstringBusca por nome ou número.
walletIdintFiltra contatos da carteira de um vendedor.
tagIdintFiltra contatos com determinada tag.
GET /v2/api/external/{apiId}/listUsers

Lista todos os usuários (atendentes) cadastrados na sua conta.

Query Parameters

ParâmetroTipoDescrição
pageNumberintPágina de resultados.
searchParamstringBusca por nome ou e-mail.
GET /v2/api/external/{apiId}/listTags

Lista as tags (etiquetas) cadastradas para classificar contatos e tickets.

Query Parameters

ParâmetroTipoDescrição
isActivebooleanFiltrar apenas tags ativas (true) ou inativas (false).
GET /v2/api/external/{apiId}/listQueues

Lista as filas (departamentos) configuradas, como "Vendas", "Suporte", "Financeiro".

GET /v2/api/external/{apiId}/listOpportunities

Lista as oportunidades (cartões) do funil de vendas (Kanban).

Query Parameters

ParâmetroTipoDescrição
pageintPágina de resultados.
limitintItens por página.
statusstringStatus da oportunidade.
pipelineIdintID do pipeline (funil).
stageIdintID do estágio dentro do pipeline.
GET /v2/api/external/{apiId}/getUserStatus

Verifica em tempo real se um atendente específico está Online ou Offline.

Query Parameters

ParâmetroTipoDescrição
userIdintobrigatórioID do atendente.
GET /v2/api/external/{apiId}/listNotes

Lista todas as notas internas registradas em um ticket específico.

Query Parameters

ParâmetroTipoDescrição
ticketIdintobrigatórioID do ticket.
GET /v2/api/external/{apiId}/getContactExtraInfo

Retorna os campos personalizados (extraInfo) de um contato.

Query Parameters

ParâmetroTipoDescrição
contactIdintobrigatórioID do contato.

👤 Contatos (POST)

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

Cria um novo contato no sistema.

Body

CampoTipoDescrição
namestringobrigatórioNome do contato.
numberstringobrigatórioTelefone com DDI + DDD (ex: 5511999999999).
emailstringopcionalE-mail do contato.
extraInfoarrayopcionalCampos personalizados [{"name":"...","value":"..."}].

Exemplo

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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"
  }'
POST /v2/api/external/{apiId}/updateContact

Atualiza dados de um contato existente.

Body

CampoTipoDescrição
contactIdintobrigatórioID do contato.
namestringopcionalNovo nome.
emailstringopcionalNovo e-mail.
POST /v2/api/external/{apiId}/updateContactKanban

Move um contato para uma posição (kanban) específica do funil.

Body

CampoTipoDescrição
contactIdintobrigatórioID do contato.
kanbanint|stringobrigatórioID ou nome do kanban de destino.
POST /v2/api/external/{apiId}/updateContactWallet

Define a carteira (wallet) de um contato — vincula o contato a um vendedor responsável. Útil para distribuir leads automaticamente.

Body

CampoTipoDescrição
contactIdintobrigatórioID do contato.
walletIdint|arrayobrigatórioID do vendedor (ou array de IDs).
POST /v2/api/external/{apiId}/blockContact

Bloqueia ou desbloqueia o chatbot para um contato. Útil para evitar respostas automáticas para contatos VIP.

Body

CampoTipoDescrição
contactIdintobrigatórioID do contato.
blockedbooleanobrigatóriotrue para bloquear, false para desbloquear.
POST /v2/api/external/{apiId}/updateContactExtraInfo

Atualiza os campos personalizados (extraInfo) de um contato.

Body

CampoTipoDescrição
contactIdintobrigatórioID do contato.
extraInfoarrayobrigatórioArray no formato [{"name":"campo","value":"valor"}].
POST /v2/api/external/{apiId}/contacts/search

Busca paginada com filtros avançados — ideal para disparos em massa. Retorna apenas dados essenciais (id, nome, número) para performance, evitando trafegar dados desnecessários.

Body

CampoTipoDescrição
tagIdint|arrayopcionalID(s) das tags. Buscar contatos com qualquer uma das tags.
pageintopcionalPágina (padrão: 1).
limitintopcionalItens por página (padrão: 50).
searchParamstringopcionalTexto para buscar.
walletIdintopcionalFiltra pela carteira de um vendedor.
blockedbooleanopcionalInclui (false) ou exclui (true) contatos bloqueados.

Exemplo — buscar todos contatos com a tag "Lead Quente"

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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
  }'

📨 Mensagens (POST)

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}/sendMessageAPIText

Envia uma mensagem de texto para um número WhatsApp.

Body

CampoTipoDescrição
numberstringobrigatórioNúmero com DDI + DDD (ex: 5511999999999).
messagestringobrigatórioTexto da mensagem.
ticketIdintopcionalTicket ao qual vincular a mensagem.

Exemplo

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/sendMessageAPIText' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "number": "5511999999999",
    "message": "Olá! Esta é uma mensagem de teste."
  }'
POST /v2/api/external/{apiId}/sendMessageAPIFileURL

Envia um arquivo (imagem, PDF, áudio, vídeo) a partir de uma URL pública.

Body

CampoTipoDescrição
numberstringobrigatórioNúmero de destino.
urlstringobrigatórioURL pública do arquivo.
captionstringopcionalLegenda (apenas imagens e vídeos).
POST /v2/api/external/{apiId}/sendPresence

Envia indicadores de presença (estado) para o WhatsApp do contato — útil para humanizar bots mostrando "digitando..." antes de uma resposta automática.

Body

CampoTipoDescrição
ticketIdintobrigatórioID do ticket.
statestringobrigatóriotyping, paused ou recording.
POST /v2/api/external/{apiId}/sendButtonWABA

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 com QR Code (whatsmeow/uazapi).

Body

CampoTipoDescrição
numberstringobrigatórioNúmero de destino.
messagestringobrigatórioTexto principal da mensagem.
button1stringobrigatórioTexto do primeiro botão (máx 20 caracteres).
button2stringopcionalTexto do segundo botão.
button3stringopcionalTexto do terceiro botão.
ticketIdintopcionalVincular a um ticket existente.
POST /v2/api/external/{apiId}/sendListWABA

Envia mensagem com lista interativa (menu suspenso) via WhatsApp Business API (WABA).

Body

CampoTipoDescrição
numberstringobrigatórioNúmero de destino.
headerstringobrigatórioCabeçalho da lista.
bodystringobrigatórioTexto principal.
footerstringopcionalRodapé.
button_textstringobrigatórioTexto do botão de abertura da lista.
sectionsarrayobrigatórioSeções com itens da lista.
ticketIdintopcionalVincular a um ticket existente.

🎫 Tickets & Tags

POST /v2/api/external/{apiId}/updateTicketChannel

Altera o canal (conexão WhatsApp) de um ticket existente — útil quando você precisa migrar um atendimento de uma conexão para outra.

Body

CampoTipoDescrição
ticketIdintobrigatórioID do ticket.
whatsappIdintobrigatórioID da nova conexão WhatsApp.
channelstringobrigatórioTipo do canal (ex: whatsapp, instagram).
POST /v2/api/external/{apiId}/createNotes

Adiciona uma nota interna (visível apenas para atendentes) em um ticket.

Body

CampoTipoDescrição
ticketIdintobrigatórioID do ticket.
notesstringobrigatórioTexto da nota.
POST /v2/api/external/{apiId}/updateNote

Atualiza o conteúdo de uma nota interna existente.

Body

CampoTipoDescrição
noteIdintobrigatórioID da nota.
notesstringobrigatórioNovo texto.
POST /v2/api/external/{apiId}/addTag

Adiciona uma ou mais tags a um ticket sem remover as existentes. Ideal para classificar atendimentos durante automações sem perder histórico.

Body

CampoTipoDescrição
ticketIdintobrigatórioID do ticket.
tagIdint|arrayobrigatórioID da tag (ou array de IDs).
POST /v2/api/external/{apiId}/removeTag

Remove uma ou mais tags específicas de um ticket.

Body

CampoTipoDescrição
ticketIdintobrigatórioID do ticket.
tagIdint|arrayobrigatórioID da tag (ou array de IDs).

👥 Usuários (Atendentes)

POST /v2/api/external/{apiId}/createUser

Cria um novo usuário (atendente) na sua conta.

Body

CampoTipoDescrição
namestringobrigatórioNome do atendente.
emailstringobrigatórioE-mail (será o login).
passwordstringobrigatórioSenha inicial.
profilestringobrigatórioadmin, super ou user.
POST /v2/api/external/{apiId}/updateUser

Atualiza dados de um usuário existente.

Body

CampoTipoDescrição
userIdintobrigatórioID do usuário.
namestringopcionalNovo nome.
emailstringopcionalNovo e-mail.

📣 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

Cria uma campanha. Após criar, adicione os contatos e inicie com campaign/start.

Body

CampoTipoDescrição
namestringobrigatórioNome da campanha.
startstringobrigatórioData/hora de início em ISO 8601 (ex: 2026-04-10T10:00:00.000Z).
message1stringobrigatórioMensagem principal. Aceita placeholder {nome}.
message2stringopcionalVariação 2 (rotação automática entre contatos).
message3stringopcionalVariação 3.
sessionIdintobrigatórioID da conexão (canal) que fará os envios — veja Listar Canais.
delaystringopcionalIntervalo (segundos) entre envios.

Exemplo

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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}

Atualiza uma campanha existente (mesmos campos do create). Disponível enquanto a campanha não estiver em andamento.

GET /v2/api/external/{apiId}/campaign/list?page=1&limit=10

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}

Relatório da campanha: contatos, status de entrega por contato e progresso geral.

POST /v2/api/external/{apiId}/campaign/<ação>/{campaignId}

Ações de ciclo de vida da campanha. Todas são POST com body vazio ({}).

Ações disponíveis

RotaEfeito
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}

Gerencia os contatos de uma campanha. O add recebe um array de contatos no body.

Rotas

MétodoRotaDescrição
POSTcampaign/contacts/add/{campaignId}Adiciona contatos (array de {name, number}).
GETcampaign/contacts/{campaignId}Lista os contatos da campanha.
POSTcampaign/contacts/remove/{campaignId}/{contactId}Remove um contato.
POSTcampaign/contacts/removeAll/{campaignId}Remove todos os contatos.

Exemplo (add)

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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

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

Envia a mesma mensagem para uma lista de números.

Body

CampoTipoDescrição
whatsappIdintobrigatórioID da conexão de envio.
arrayNumbersarrayobrigatórioLista de números (DDI+DDD+número).
messagestringobrigatórioTexto a enviar.
min / maxintopcionalIntervalo aleatório entre envios, em segundos (ex: 3 a 8).

Exemplo

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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

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

CampoTipoDescrição
whatsappIdintobrigatórioID da conexão de envio.
messagestringobrigatórioMensagem com placeholders, ex: Olá {nome}, seu código é {codigo}.
dataInputstringobrigatórioLinhas numero,valor1,valor2 separadas por \n — os valores preenchem os placeholders na ordem.
min / maxintopcionalIntervalo aleatório entre envios (segundos).

Exemplo

curl --request POST \
  --url 'https://SEU_DOMINIO.nimochat.com.br/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

Variante do envio em massa que informa o tipo da conexão (whatsappType) — útil quando o tenant tem conexões de tipos diferentes.

Body

CampoTipoDescrição
whatsappIdintobrigatórioID da conexão.
whatsappTypestringobrigatórioTipo da conexão (conforme retornado em Listar Canais).
arrayNumbersarrayobrigatórioLista de números.
messagestringobrigatórioTexto a enviar.
min / maxintopcionalIntervalo aleatório entre envios (segundos).
POST /v2/api/external/{apiId}/bulkIndividual

Envio individual pela mesma infraestrutura do lote — aceita externalKey para controle/idempotência do seu lado.

Body

CampoTipoDescrição
whatsappIdintobrigatórioID da conexão.
numberstringobrigatórioNúmero de destino.
messagestringobrigatórioTexto a enviar.
externalKeystringopcionalChave externa para rastrear o envio.
GET /v2/api/external/{apiId}/bulkDispatch/list?page=1&limit=20

Acompanhe os despachos em lote criados pelos endpoints acima.

Rotas

MétodoRotaDescrição
GETbulkDispatch/listLista despachos (paginação page/limit).
GETbulkDispatch/show/{dispatchId}Detalhe de um despacho (progresso, status).
POSTbulkDispatch/update/{dispatchId}Atualiza um despacho — ex: {"status": "cancelled", "cancellationReason": "..."}.

👥 Grupos WhatsApp

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) e groupId é o identificador do grupo (formato 123456789@g.us).

POST /v2/api/external/{apiId}/group/create

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/<ação>

Ações de administração. Todas recebem whatsappId + groupIds (array) e os campos específicos abaixo.

Rotas

MétodoRotaDescrição
POSTgroup/addParticipantAdiciona participantes — body extra: participants (array de números).
POSTgroup/removeParticipantRemove participantes — participants.
POSTgroup/promotePromove participantes a admin — participants.
POSTgroup/demoteRebaixa admins a participante — participants.
POSTgroup/changeTitleAltera o título — title.
POSTgroup/changeDescriptionAltera a descrição — description.
POSTgroup/changePictureAltera a foto — picture (URL pública).
POSTgroup/setAdminsOnlyRestringe mensagens a admins — adminsOnly (true/false).

Body (exemplo)

{
  "whatsappId": 12,
  "groupIds": ["123456789@g.us"],
  "participants": ["5511999990001"]
}
POST /v2/api/external/{apiId}/group/list

Consultas de grupos da conexão.

Rotas

MétodoRotaDescrição
POSTgroup/listLista os grupos — body: {whatsappId}.
POSTgroup/listParticipantsParticipantes de grupos — {whatsappId, groupIds}.
POSTgroup/showByIdDetalhe de um grupo — {whatsappId, groupId}.
POSTgroup/getInviteLinkLink de convite — {whatsappId, groupId}.
POSTlistGroupInfoListagem geral com participantes — {listGroups: true, listParticipants: true} (opcional groupId).
POST /v2/api/external/{apiId}/group

Envia mensagens para um grupo. No campo number, informe o ID numérico do grupo (sem o sufixo @g.us).

Rotas

MétodoRotaDescrição
POST/v2/api/external/{apiId}/groupTexto para grupo — body: {body, number, externalKey, isClosed}.
POST/v2/api/external/{apiId}/groupMediaUrlArquivo 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

Complementos aos endpoints de envio de texto e 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

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

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=...

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

Envia uma localização (pin no mapa) com nome e endereço.

Body (exemplo)

{
  "number": "5511999990001",
  "latitude": -23.5505,
  "longitude": -46.6333,
  "name": "São Paulo",
  "address": "Av. Paulista, 1000",
  "ticketId": null,
  "externalKey": "SUA_CHAVE_EXTERNA"
}
POST /v2/api/external/{apiId}/sendVcard

Envia um cartão de contato (vCard).

Body (exemplo)

{
  "number": "5511999990001",
  "contact": [
    {
      "fullName": "João Silva",
      "wuid": "5511999990002@s.whatsapp.net",
      "phoneNumber": "5511999990002"
    }
  ],
  "ticketId": null,
  "externalKey": "SUA_CHAVE_EXTERNA"
}
GET /v2/api/external/{apiId}/searchMessages

Consulta de mensagens.

Rotas

MétodoRotaDescrição
GETsearchMessages?ticketId=...&searchParam=...&page=1&limit=20Busca textual nas mensagens de um ticket.
GETgetMessageByMessageId?messageId=...Recupera uma mensagem pelo ID do WhatsApp.

🧩 Mensagens Interativas

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/<tipo>

Conexões padrão (não-oficiais).

Rotas

MétodoRotaDescrição
POSTsendInteractive/baileys/quickReplyBotões de resposta rápida — {ticketId, body:{text}, footer:{text}, buttons:[{display_text,id}]}.
POSTsendInteractive/baileys/singleSelectLista de seleção única — {ticketId, body, footer, list:{title, sections:[{title, rows:[{id,title,description}]}]}}.
POSTsendInteractive/baileys/pixButtonBotão PIX — {ticketId, pixType, pixKey, pixName, bodyText}.
POSTsendInteractive/baileys/ctaCopyBotão copiar código — {ticketId, body, footer, displayText, copyCode}.
POSTsendInteractive/baileys/ctaUrlBotão abrir URL — {ticketId, body, footer, displayText, url}.
POSTsendInteractive/baileys/ctaCallBotã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/<tipo>

Conexões do tipo uazapi.

Rotas

MétodoRotaDescrição
POSTsendInteractive/uazapi/buttonBotões — {ticketId, text, choices:[...], footerText, imageButton}.
POSTsendInteractive/uazapi/listLista — {ticketId, text, choices, listButton, footerText}.
POSTsendInteractive/uazapi/pollEnquete — {ticketId, text, choices, selectableCount}.
POSTsendInteractive/uazapi/carouselCarrossel de cards — {ticketId, text, carousel:[{text,image,buttons:[{text,type}]}]}.
POSTsendInteractive/uazapi/pixButtonBotão PIX — {ticketId, pixType, pixKey, pixName}.
POSTsendInteractive/uazapi/locationButtonSolicitar localização — {ticketId, text}.
POSTsendInteractive/uazapi/requestPaymentSolicitação de pagamento — {ticketId, amount, title, text, footer, itemName, invoiceNumber, pixType, pixKey, pixName}.

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/<tipo>

Conexões Instagram Direct.

Rotas

MétodoRotaDescrição
POSTsendInteractive/instagram/quickReplyRespostas rápidas — {ticketId, message, quickReplies:[{content_type,title,payload}]}.
POSTsendInteractive/instagram/buttonTemplateBotões — {ticketId, message, buttons:[{type,title,payload}]}.
POSTsendInteractive/instagram/genericTemplateCards — {ticketId, elements:[{title,subtitle,image_url,buttons}]}.
POSTinstagram/iceBreakersPerguntas iniciais (get/set/delete) — {action, iceBreakers:[{question,payload}]}.
POSTinstagram/persistentMenuMenu persistente (get/set/delete) — {action, composerInputDisabled, menuItems}.
POST /v2/api/external/{apiId}/sendInteractive/messenger/<tipo>

Conexões Facebook Messenger.

Rotas

MétodoRotaDescrição
POSTsendInteractive/messenger/quickReplyRespostas rápidas — {ticketId, message, quickReplies}.
POSTsendInteractive/messenger/buttonTemplateBotões — {ticketId, message, buttons} (suporta web_url).
POSTsendInteractive/messenger/genericTemplateCards — {ticketId, elements}.
POSTsendInteractive/messenger/mediaTemplateMídia + botões — {ticketId, mediaType, mediaUrl, buttons}.
POSTsendInteractive/messenger/receiptTemplateRecibo de compra — {ticketId, receipt:{recipient_name, order_number, currency, summary, elements}}.
POSTsendInteractive/messenger/messageTagMensagem fora da janela 24h com tag — {ticketId, message, tag} (ex: POST_PURCHASE_UPDATE).
POSTsendInteractive/messenger/customerFeedbackPesquisa NPS/CSAT — {ticketId, title, subtitle, business_privacy_url, expires_in_days, feedback_screens}.
POSTmessenger/greetingSaudação da página (get/set/delete) — {action, greetings:[{locale,text}]}.
POSTmessenger/personasPersonas de atendente (list/create/delete) — {action, name, profilePictureUrl}.

📋 Templates WABA (API Oficial)

Para conexões da API oficial do WhatsApp Business, mensagens fora da janela de 24h exigem templates aprovados. O campo templateData segue o formato oficial da Meta.

POST /v2/api/external/{apiId}/template

Envia um template aprovado.

Rotas

MétodoRotaDescrição
POSTtemplateTemplate simples (sem variáveis).
POSTtemplateBodyTemplate com variáveis no corpo (components/parameters).
POSTtemplateMarketingBodyTemplate de marketing com variáveis.

Body (exemplo)

{
  "number": "5511999999999",
  "isClosed": false,
  "templateData": {
    "messaging_product": "whatsapp",
    "to": "5511999999999",
    "type": "template",
    "template": {
      "name": "hello_world",
      "language": { "code": "en_US" }
    }
  }
}

🎫 Tickets — Gestão Completa

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

Cria um ticket com mensagem inicial. 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"
}
POST /v2/api/external/{apiId}/showticket

Consultas de tickets e mensagens.

Rotas

MétodoRotaDescrição
POSTshowticketTicket ativo do contato — {number}.
POSTshowallticketTodos os tickets do contato — {number}.
POSTshowticketchatbotTicket em atendimento por chatbot — {number}.
POSTshowTicketByIdTicket por ID — {ticketId}.
POSTshowAllMessagesTodas as mensagens de um ticket — {ticket}.
POST /v2/api/external/{apiId}/updateticketinfo

Atualizações do ticket.

Rotas

MétodoRotaDescrição
POSTupdateticketinfoStatus, fila e integrações — {ticketId, userId, status, queueId, typebotStatus, chatgptStatus, dialogflowStatus, difyStatus, n8nStatus, chatFlowId}.
POSTupdatequeueAltera a fila — {ticketId, queueId}.
POSTupdatetagDefine a tag principal — {ticketId, tag}.
POST /v2/api/external/{apiId}/addTagContact

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étodoRotaDescrição
POSTaddTagContactAdiciona tag(s) ao contato.
POSTremoveTagContactRemove tag(s) do contato.

Body (exemplo)

{
  "contactId": 123,
  "tagId": 1
}
POST /v2/api/external/{apiId}/ticket/pause/start/{ticketId}

Pausa de atendimento com motivo e histórico.

Rotas

MétodoRotaDescrição
POSTticket/pause/start/{ticketId}Inicia pausa — body: {pauseReason}.
POSTticket/pause/end/{ticketId}Encerra a pausa.
GETticket/pause/logs/{ticketId}Histórico de pausas do ticket.
POST /v2/api/external/{apiId}/ticket/share

Compartilhamento e avaliações.

Rotas

MétodoRotaDescrição
POSTticket/shareCria link de compartilhamento — {ticketId, inviteUrl}.
GETticket/share/{ticketId}Consulta o compartilhamento.
GETlistTicketEvaluations?page=1&limit=20Lista avaliações de atendimento.

🏗️ CRM — Pipelines, Oportunidades e Cadastros

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

CRUD de pipelines (funis) e estágios.

Rotas

MétodoRotaDescrição
POSTpipeline/createCria — {name, description}.
GETpipeline/list?page=1&limit=20Lista.
GETpipeline/show/{id}Detalhe.
POSTpipeline/update/{id}Atualiza — {name}.
POSTpipeline/delete/{id}Exclui.
POSTstage/createCria estágio — {name, pipelineId, order, color}.
GETstage/list?pipelineId=...Lista estágios do pipeline.
GETstage/show/{id}Detalhe do estágio.
POSTstage/update/{id}Atualiza estágio.
POSTstage/delete/{id}Exclui estágio.
POST /v2/api/external/{apiId}/createOpportunity

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.

Rotas

MétodoRotaDescrição
POSTcreateOpportunityCria oportunidade.
POSTupdateOpportunityAtualiza — {opportunityId, ...}.
POSTdeleteOpportunityExclui — {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"
}
POST /v2/api/external/{apiId}/createTag

Cadastros de apoio: tags, colunas de kanban, motivos de encerramento e filas.

Rotas

MétodoRotaDescrição
POSTcreateTagCria tag — {tag, color, isActive}.
POSTupdateTagData/{id}Atualiza tag — {tag, color}.
POSTdeleteTag/{id}Exclui tag.
POSTcreateKanbanCria coluna kanban — {name}.
GETlistKanbanLista colunas.
POSTupdateKanban/{id}Atualiza coluna.
POSTdeleteKanban/{id}Exclui coluna.
POSTcreateReasonCria motivo — {name}.
GETlistReasonsLista motivos.
POSTupdateReason/{id}Atualiza motivo.
POSTdeleteReason/{id}Exclui motivo.
POSTcreateQueueDataCria fila — {queue, isActive}.
POSTupdateQueueData/{id}Atualiza fila.
POSTdeleteQueueData/{id}Exclui fila.

📅 Agendamentos e Lembretes

Agende compromissos vinculados a contatos e configure lembretes automáticos por WhatsApp antes de cada evento.

POST /v2/api/external/{apiId}/appointment/create

CRUD de agendamentos. status: pending, confirmed, etc.

Rotas

MétodoRotaDescrição
POSTappointment/createCria.
GETappointment/list?page=1&limit=20&status=pendingLista (filtro por status).
GETappointment/show/{id}Detalhe.
POSTappointment/update/{id}Atualiza.
POSTappointment/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,
  "startAt": "2026-06-15T14:00:00.000Z",
  "endAt": "2026-06-15T15:00:00.000Z",
  "status": "pending",
  "notes": "Levar proposta impressa"
}
POST /v2/api/external/{apiId}/scheduleReminder/create

Regras de lembrete automático: a mensagem é enviada N horas antes do agendamento, pela conexão indicada.

Rotas

MétodoRotaDescrição
POSTscheduleReminder/createCria regra.
GETscheduleReminder/listLista regras.
POSTscheduleReminder/update/{id}Atualiza.
POSTscheduleReminder/toggle/{id}Ativa/desativa.
POSTscheduleReminder/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
}

📊 Dashboard e Relatórios

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/<indicador>?startDate=...&endDate=...

Indicadores disponíveis:

Rotas

MétodoRotaDescrição
GETdash/ticketsAndTimesTotais de tickets e tempos médios (espera/atendimento).
GETdash/ticketsStatusDistribuição por status.
GETdash/ticketsChannelsDistribuição por canal.
GETdash/ticketsQueueDistribuição por fila.
GETdash/ticketsPerUserVolume por atendente.
GETdash/ticketsUserDetalhe por atendente.
GETdash/ticketsReasonsDistribuição por motivo de encerramento.
GETdash/ticketsEvolutionEvolução diária de tickets.
GETdash/ticketsEvolutionByValueEvolução por valor.
GETdash/ticketsEvolutionChannelsNameEvolução diária por canal.

🔌 Canais e Sessões

Gerencie as conexões WhatsApp do tenant via API: criar, iniciar, obter QR Code e consultar canais. Complementa Listar Canais e Listar Sessões.

POST /v2/api/external/{apiId}/<ação>

Ciclo de vida da sessão (conexão).

Rotas

MétodoRotaDescrição
POSTcreatetSessionCria sessão — {name, status, type}. Atenção: a rota é createtSession mesmo (grafia da plataforma).
POSTstartSessionInicia — {whatsappId}.
POSTqrCodeSessionObtém o QR Code atual — {whatsappId}.
POSTrequestNewQrCodeSessionForça novo QR Code — {whatsappId}.
POSTdeleteSessionExclui a sessão — {whatsappId}.
POSTshowChannelConsulta canal pelo número — {number}.
POSTshowChannelByIdConsulta canal por ID — {id}.
GETgetAllSessionApisLista as configurações de API do tenant.

🗂️ Utilitários

Galeria de arquivos, tarefas (to-do), logs de chamadas, consulta de contato por número e listagens auxiliares.

POST /v2/api/external/{apiId}/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

Galeria de arquivos do tenant. O upload é multipart/form-data (campo de arquivo + description).

Rotas

MétodoRotaDescrição
POSTgallery/uploadEnvia arquivo (multipart) — campo description opcional.
GETgallery/list?pageNumber=1&fileType=imageLista arquivos (filtro por tipo).
POSTgallery/delete/{id}Exclui arquivo.
POST /v2/api/external/{apiId}/todo/create

Tarefas (to-do) por usuário. priority: low/medium/high; status: pending/finished.

Rotas

MétodoRotaDescrição
POSTtodo/createCria — {name, description, owner, ownerId, status, priority}.
GETtodo/listLista.
POSTtodo/update/{id}Atualiza — ex: {status: finished}.
POSTtodo/delete/{id}Exclui.
GETtodo/logs/{userId}Histórico de alterações por usuário.
GET /v2/api/external/{apiId}/callLog/list

Logs de chamadas recebidas/realizadas.

Rotas

MétodoRotaDescrição
GETcallLog/list?page=1&limit=20Lista chamadas.
GETcallLog/show/{id}Detalhe da chamada.
GETwavoip/calls?page=1&limit=20Lista chamadas de voz IP.
GETwavoip/calls/{id}Detalhe da chamada de voz IP.
GET /v2/api/external/{apiId}/listChatFlows

Listagens auxiliares para montar integrações.

Rotas

MétodoRotaDescrição
GETlistChatFlowsFluxos de chatbot do tenant.
GETlistAutoRepliesRespostas automáticas.
GETlistFastRepliesRespostas rápidas.

🪝 Webhooks

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

CampoTipoDescrição
methodstringTipo do evento. Quando ausente ou vazio, indica evento de entrada (mensagem recebida ou ticket criado).
tenantIdintID da sua conta. Sempre valide para garantir que o webhook é da sua conta.
ticketIdintID do ticket relacionado ao evento.
msg.bodystringTexto da mensagem (em mensagens de texto).
msg.fromMebooleantrue se a mensagem foi enviada pelo atendente, false se foi recebida do contato.
ticket.userIdint|nullnull indica ticket não atribuído (oportunidade de distribuição automática).
ticket.contact.numberstringTelefone do contato (sem prefixos do WhatsApp).

Tipos de eventos

O campo method identifica o tipo do evento. Os principais valores são:

EventoQuando dispara
(vazio) — Mensagem recebidaO contato enviou uma mensagem. msg.fromMe = false e method ausente. Frequentemente acompanhado de criação de ticket novo.
(vazio) — Novo ticketUm novo ticket foi criado a partir de uma conversa de entrada. ticket.userId = null.
message_sendO atendente enviou uma mensagem pelo painel. msg.fromMe = true.
message_send_uazapiMensagem enviada por uma sessão WhatsApp via QR Code (não-oficial).
message_send_waba / message_sent_wabaMensagem enviada pela API oficial do WhatsApp Business (Cloud API).
ackConfirmação de leitura/entrega do WhatsApp (entregue, lido, ouvido).
presenceAtualizaçã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

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

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://SEU_DOMINIO.nimochat.com.br/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://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/sendMessageAPIText' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "number": "5511999999999",
    "message": "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://SEU_DOMINIO.nimochat.com.br/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://SEU_DOMINIO.nimochat.com.br/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://SEU_DOMINIO.nimochat.com.br/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://SEU_DOMINIO.nimochat.com.br/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://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/sendMessageAPIText' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --data '{ "number": "5511999999999", "message": "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://SEU_DOMINIO.nimochat.com.br/v2/api/external/SEU_API_ID/addTag' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --data '{ "ticketId": 12345, "tagId": [42, 87] }'

📚 Referência completa de endpoints

A coleção do Postman tem mais de 205 endpoints documentados com exemplos prontos de request e response 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

Endpoints por categoria

Resumo de tudo que está disponível na coleção:

📅 Agendamentos e Lembretes

Crie e gerencie agendamentos e lembretes automáticos.

POSTAppointmentCreateCriar agendamento
POSTAppointmentUpdateAtualizar agendamento
POSTAppointmentDeleteDeletar agendamento
GETAppointmentListListar agendamentos
GETAppointmentShowDetalhes de um agendamento
POSTScheduleReminderCreateCriar lembrete
POSTScheduleReminderUpdateAtualizar lembrete
POSTScheduleReminderDeleteDeletar lembrete
POSTScheduleReminderToggleAtivar/desativar lembrete
GETScheduleReminderListListar lembretes

📣 Campanhas

Crie, gerencie e dispare campanhas de marketing em massa.

POSTCampaignCreateCriar campanha
POSTCampaignUpdateEditar campanha
POSTCampaignDeleteDeletar campanha
POSTCampaignDuplicateDuplicar campanha
POSTCampaignStartIniciar disparo
POSTCampaignPausePausar campanha
POSTCampaignResumeRetomar campanha pausada
POSTCampaignCancelCancelar campanha
POSTCampaignSkipPular envio atual
GETCampaignListListar campanhas
GETCampaignReportRelatório de envios
POSTCampaignContactsAddAdicionar contatos
POSTCampaignContactsRemoveRemover contato
POSTCampaignContactsRemoveAllLimpar todos os contatos
GETCampaignContactsListListar contatos da campanha

🔌 Canais e Sessões

Gerencie conexões WhatsApp, escaneie QR Codes, inicie e finalize sessões.

POSTCreateSessionCriar nova sessão
POSTStartSessionIniciar sessão
POSTDeleteSessionDeletar sessão
POSTShowQrCodeExibir QR Code atual
POSTRequestNewQrCodeSolicitar novo QR Code
POSTShowChannelInformationInformações do canal
POSTShowChannelInformationByIdInformações por ID
POSTListGroupsInfoListar grupos do canal

👤 Contatos (avançado)

POSTShowContactDetalhes do contato

🏗️ CRM - Pipeline

Gerencie pipelines (funis) e estágios do CRM.

POSTPipelineCreateCriar funil
POSTPipelineUpdateAtualizar funil
POSTPipelineDeleteDeletar funil
GETPipelineListListar funis
GETPipelineShowDetalhes do funil
POSTStageCreateCriar estágio
POSTStageUpdateAtualizar estágio
POSTStageDeleteDeletar estágio
GETStageListListar estágios
GETStageShowDetalhes do estágio

📊 Dashboard

Métricas e gráficos para BI / dashboards externos.

GETDashTicketsAndTimesTickets e tempos médios
GETDashTicketsChannelsTickets por canal
GETDashTicketsEvolutionEvolução temporal
GETDashTicketsEvolutionByValueEvolução por valor
GETDashTicketsEvolutionChannelsNameEvolução por canal
GETDashTicketsPerUserTickets por atendente
GETDashTicketsQueueTickets por fila
GETDashTicketsReasonsTickets por motivo
GETDashTicketsStatusTickets por status
GETDashTicketsUserTickets de um usuário

📤 Envio em Lote (Bulk)

Disparos em massa de mensagens com controle de progresso.

POSTBulkSendMessageDisparo simples em lote
POSTBulkSendMessageWithVariableDisparo com variáveis personalizadas
POSTBulkFastMessageDisparo rápido
POSTBulkIndividualEnvio individual em lote
POSTBulkDispatchUpdateAtualizar disparo
POSTBulkDispatchIncrementProgressIncrementar progresso
GETBulkDispatchListListar disparos
GETBulkDispatchShowDetalhes do disparo

📂 Galeria de mídias

POSTGalleryUploadUpload de arquivo
POSTGalleryDeleteDeletar arquivo
GETGalleryListListar arquivos

👥 Grupos WhatsApp

Crie e gerencie grupos do WhatsApp.

POSTGroupCreateCriar novo grupo
POSTGroupChangeTitleAlterar título
POSTGroupChangeDescriptionAlterar descrição
POSTGroupChangePictureAlterar foto
POSTGroupAddParticipantAdicionar participante
POSTGroupRemoveParticipantRemover participante
POSTGroupPromotePromover a admin
POSTGroupDemoteRebaixar admin
POSTGroupSetAdminsOnlyRestringir só admins
POSTGroupGetInviteLinkObter link de convite
POSTGroupListParticipantsListar participantes
POSTGroupShowByIdDetalhes do grupo
POSTGroupListListar grupos

🏷️ Kanban / Tags / Motivos / Filas

CRUD completo de objetos auxiliares.

POSTCreateKanbanCriar coluna kanban
POSTUpdateKanbanAtualizar kanban
POSTDeleteKanbanDeletar kanban
GETListKanbanListar kanbans
POSTCreateTagCriar tag
POSTUpdateTagDataAtualizar tag
POSTDeleteTagDeletar tag
POSTCreateReasonCriar motivo
POSTUpdateReasonAtualizar motivo
POSTDeleteReasonDeletar motivo
GETListReasonsListar motivos
POSTCreateQueueDataCriar fila
POSTUpdateQueueDataAtualizar fila
POSTDeleteQueueDataDeletar fila

🔍 Listagens utilitárias

GETListAutoRepliesAuto-respostas
GETListChatFlowsFluxos de chatbot
GETListFastRepliesRespostas rápidas
GETGetAllSessionApisTodas as APIs de sessão

📞 Logs de Chamadas

GETCallLogListListar chamadas
GETCallLogShowDetalhes da chamada
GETWavoipCallListListar chamadas Wavoip
GETWavoipCallShowDetalhes Wavoip

📨 Mensagens (extras)

POSTSendMessageAPIFileEnviar arquivo (upload)
POSTSendMessageAPITextBase64Texto com mídia base64
POSTSendMessageAPIVoiceEnviar áudio (voice)
POSTSendLocationEnviar localização
POSTSendVcardEnviar contato (vCard)
GETGetMessageByMessageIdBuscar mensagem por ID
GETSearchMessagesBuscar mensagens
GETSendMessageParamsParâmetros disponíveis

👥 Mensagens em Grupo

POSTSendGroupMessageAPITextTexto para grupo
POSTSendGroupMessageAPIFileArquivo para grupo
POSTSendMessageAPIFileURLGroupArquivo via URL para grupo

💼 Oportunidades (CRM)

POSTCreateOpportunityCriar oportunidade
POSTUpdateOpportunityAtualizar oportunidade
POSTDeleteOpportunityDeletar oportunidade

📋 Templates WABA (API Oficial)

POSTSendTemplateWabaEnviar template aprovado
POSTSendTemplateWabaBodyTemplate com variáveis no corpo
POSTSendTemplateWabaMarketingTemplate de marketing

🎫 Tickets (extras)

POSTCreateTicketCriar ticket manualmente
POSTCreateTicketFileCriar ticket com arquivo
POSTCreateTicketWebmailCriar ticket de webmail
POSTSetTicketInfoAtualizar info do ticket
POSTSetQueueMover ticket para fila
POSTSetTagDefinir tags (substitui)
POSTShowTicketByIdDetalhes por ID
POSTShowTicketInformationInformações do ticket
POSTShowAllTicketInformationTodas as informações
POSTShowAllMessagesTodas as mensagens
POSTStartTicketPausePausar ticket
POSTEndTicketPauseDespausar ticket
GETListTicketPauseLogsLogs de pausas
GETListTicketEvaluationsAvaliações
POSTTicketShareCreateCompartilhar ticket
GETTicketShareShowDetalhes do compartilhamento

✅ To-Do List

POSTTodoCreateCriar tarefa
POSTTodoUpdateAtualizar tarefa
POSTTodoDeleteDeletar tarefa
GETTodoListListar tarefas
GETTodoLogsLogs de tarefas

❓ FAQ — Perguntas frequentes

Posso testar sem código?

Sim. Acesse a coleção do Postman, 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 — 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. Tem dúvidas técnicas? Fale com nosso time.