Evolua Chat · API

API do Evolua Chat

Conecte o Evolua Chat às suas ferramentas: crie contatos, abra conversas, envie mensagens no WhatsApp e movimente cards do funil a partir de qualquer sistema, site ou automação.

URL base https://app.evoluachat.com.br/api
Versãov1
FormatoJSON
AutenticaçãoBearer token
ProtocoloHTTPS

Introdução

A API REST do Evolua Chat expõe as mesmas funcionalidades que você usa no painel. Toda requisição é feita por HTTPS, envia e recebe JSON e é autenticada com um token criado dentro da sua própria conta.

Os dados retornados são sempre os da sua conta: contatos, conversas, etiquetas, funis e usuários que pertencem a ela. Não é possível acessar dados de outras contas com o seu token.

O que dá para fazer

  • Cadastrar contatos vindos do seu site, formulário ou checkout.
  • Abrir uma conversa e disparar a primeira mensagem no WhatsApp.
  • Marcar contatos com etiquetas conforme o comportamento deles.
  • Criar e mover cards no funil quando um negócio avança.
  • Distribuir conversas entre atendentes e equipes automaticamente.

Como ler os exemplos

Todos os exemplos usam cURL. Substitua tk_seu_token_aqui pelo token gerado na sua conta e troque os IDs de exemplo pelos seus. Onde aparece :id no caminho, envie o número diretamente — por exemplo /api/contacts/123.

Autenticação

Toda requisição precisa do token no cabeçalho Authorization. Sem ele, a API responde 401 Unauthorized.

Header
Authorization: Bearer tk_seu_token_aqui

Criar seu token

  1. Entre no painel do Evolua Chat com um usuário administrador.
  2. Abra o menu Integração.
  3. Clique em criar um novo token da API.
  4. Copie o token na hora — ele aparece uma única vez.
  5. Guarde o token no gerenciador de segredos da sua automação.

Guarde o token com cuidado. Ele dá acesso aos dados da sua conta e não pode ser recuperado depois de fechado. Se perder ou vazar, crie um novo e apague o antigo.

  • Você pode manter vários tokens ativos, um para cada integração — assim é possível revogar um sem derrubar os outros.
  • O token pode ser permanente ou ter validade de 12, 24 ou 48 meses.
  • O token carrega as permissões do usuário que o criou. Alguns endpoints exigem perfil ADMIN.
  • Nunca coloque o token em código de frontend, HTML público ou repositório aberto.

Testando a conexão

Este é o teste mais rápido para saber se o token está válido. Se responder 200, está tudo certo.

cURL
curl -X GET https://app.evoluachat.com.br/api/contacts \
  -H "Authorization: Bearer tk_seu_token_aqui"

Integração com n8n

No n8n você não precisa de node específico: use o node HTTP Request apontando para os endpoints desta página. A configuração abaixo serve para qualquer chamada.

Criar a credencial de autenticação

  1. Em Credentials, crie uma credencial do tipo Header Auth.
  2. No campo Name, escreva Authorization.
  3. No campo Value, escreva Bearer tk_seu_token_aqui.
  4. Salve com um nome que identifique a conta, por exemplo “Evolua Chat — produção”.

Configurar o node HTTP Request

CampoValor
MethodGET, POST, PUT ou DELETE, conforme o endpoint
URLhttps://app.evoluachat.com.br/api/...
AuthenticationGeneric Credential Type → Header Auth → sua credencial
Send BodyAtivado nas chamadas POST e PUT
Body Content TypeJSON
Send Query ParametersAtivado quando o endpoint aceita filtros

Fluxo pronto: lead do formulário vira conversa

Um encadeamento comum, usando três nodes HTTP Request em sequência:

  1. POST /api/contacts — cria o contato com nome e telefone recebidos do formulário.
  2. POST /api/conversations/start — abre a conversa na inbox escolhida e devolve o conversation_id.
  3. POST /api/conversations/:id/messages — envia a mensagem de boas-vindas usando o ID do passo anterior.

Para reaproveitar contatos que já existem, chame antes GET /api/contacts/number/:phone e siga direto para o passo 2 quando encontrar alguém.

Exemplo de corpo com dados dinâmicos

Nos campos do body, use expressões do n8n para puxar valores do node anterior.

JSON — body do node HTTP Request
{
  "name": "{{ $json.nome }}",
  "phone": "{{ $json.telefone }}",
  "email": "{{ $json.email }}"
}

Antes de disparar em massa, confira o limite de requisições e ative “Retry On Fail” no node para tratar erros temporários sem perder o lead.

Outras ferramentas

A mesma lógica vale para Make, Zapier, Pipedream ou qualquer linguagem: um cabeçalho Authorization, corpo em JSON e a URL base acima.

Listar contatos

GET/api/contacts

Retorna os contatos da conta com busca, filtros e paginação.

Parâmetros de consulta

ParâmetroTipoObrigatórioDescrição
searchstringNãoBusca por nome, telefone ou e-mail ao mesmo tempo
archivedbooleanNãoFiltra arquivados (true ou false)
blockedbooleanNãoFiltra bloqueados (true ou false)
genderstringNãoM ou F
date_filterstringNãothis_month, last_month, last_30_days, last_90_days, this_year ou custom
date_fromstringNãoData inicial (AAAA-MM-DD), com date_filter=custom
date_tostringNãoData final (AAAA-MM-DD), com date_filter=custom
include_labelsarrayNãoIDs de etiquetas separados por vírgula
exclude_labelsarrayNãoIDs de etiquetas a excluir do resultado
pageintegerNãoPágina desejada (padrão 1)
limitintegerNãoItens por página (máximo e padrão 50)
cURL
curl -X GET "https://app.evoluachat.com.br/api/contacts?search=joão&page=1&limit=50" \
  -H "Authorization: Bearer tk_seu_token_aqui"
JavaScript
const res = await fetch(
  "https://app.evoluachat.com.br/api/contacts?page=1&limit=50",
  { headers: { Authorization: "Bearer tk_seu_token_aqui" } }
);
const { data, pagination } = await res.json();
Python
import requests

url = "https://app.evoluachat.com.br/api/contacts"
headers = {"Authorization": "Bearer tk_seu_token_aqui"}
resposta = requests.get(url, headers=headers, params={"page": 1, "limit": 50})
print(resposta.json())

Resposta 200

JSON
{
  "data": [
    {
      "id": 1,
      "name": "João Silva",
      "phone": "+5511999999999",
      "email": "joao@example.com",
      "created_at": "2025-01-15T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 100,
    "totalPages": 2
  }
}

Para percorrer todos os contatos, repita a chamada aumentando page até alcançar pagination.totalPages.

Criar contato

POST/api/contacts

Cadastra um contato novo na conta.

Campos do corpo

CampoTipoObrigatórioDescrição
namestringSimNome do contato
phonestringSimTelefone com código do país
emailstringNãoE-mail do contato
cURL
curl -X POST https://app.evoluachat.com.br/api/contacts \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Maria Santos",
    "phone_e164": "+5511888888888",
    "email": "maria@example.com"
  }'

Envie o telefone no padrão internacional, com o + e o código do país: +5511999999999. Números sem DDI podem não encontrar a conversa correta no WhatsApp.

Buscar contato por número

GET/api/contacts/number/:phone

Encontra um contato pelo telefone. Use antes de criar um cadastro para não duplicar a base.

Parâmetro do caminho

ParâmetroTipoDescrição
phonestringTelefone apenas com números, com ou sem DDI
cURL
curl -X GET "https://app.evoluachat.com.br/api/contacts/number/5511999999999" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "id": 123,
  "name": "João Silva",
  "last_name": "Silva",
  "phone_e164": "5511999999999",
  "email": "joao@email.com",
  "country_code": "+55",
  "gender": "M",
  "data_nascimento": "1990-01-15",
  "blocked": false,
  "archived": false,
  "created_at": "2026-01-08T10:00:00.000Z",
  "labels": [
    { "id": 1, "name": "VIP", "color": "#ff0000" }
  ],
  "custom_fields": {
    "empresa": "Acme Corp",
    "cargo": "Gerente"
  },
  "last_conversation_id": 456
}

Erros

CódigoMensagemO que fazer
400Telefone é obrigatórioInforme o número no caminho da URL
404Contato não encontradoNenhum contato com esse número — crie o cadastro

Buscar contato por ID

GET/api/contacts/:id

Retorna o cadastro completo do contato, incluindo etiquetas, campos personalizados e o ID da conversa mais recente.

cURL
curl -X GET "https://app.evoluachat.com.br/api/contacts/123" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "id": 123,
  "name": "João Silva",
  "last_name": "Silva",
  "phone_e164": "5511999999999",
  "email": "joao@email.com",
  "country_code": "+55",
  "gender": "M",
  "data_nascimento": "1990-01-15",
  "blocked": false,
  "archived": false,
  "created_at": "2026-01-08T10:00:00.000Z",
  "labels": [
    { "id": 1, "name": "VIP", "color": "#ff0000" }
  ],
  "custom_fields": {
    "empresa": "Acme Corp"
  },
  "last_conversation_id": 456
}

O campo last_conversation_id traz a conversa mais recente do contato, ou null quando ainda não houve nenhuma. Use esse número para enviar mensagens sem precisar abrir uma conversa nova.

Listar tags do contato

GET/api/contacts/:id/labels

Retorna todas as etiquetas associadas a um contato.

cURL
curl -X GET "https://app.evoluachat.com.br/api/contacts/42/labels" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "contact_id": 42,
  "tags": [
    { "id": 1, "name": "VIP", "color": "#4CAF50" },
    { "id": 2, "name": "Lead", "color": "#2196F3" }
  ]
}

Erros

CódigoMensagemO que fazer
404Contato não encontradoConfira o ID do contato
500Erro interno do servidorTente novamente em alguns instantes

Adicionar tag ao contato

POST/api/contacts/:id/labels

Associa uma etiqueta ao contato. Se a etiqueta já estiver aplicada, a resposta continua sendo 200 e nada é duplicado — dá para repetir a chamada com segurança.

Campos do corpo

CampoTipoObrigatórioDescrição
label_idintegerSimID da etiqueta
cURL
curl -X POST "https://app.evoluachat.com.br/api/contacts/42/labels" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "label_id": 5 }'

Resposta 200 — etiqueta aplicada

JSON
{
  "id": 42,
  "name": "João Silva",
  "last_name": "Santos",
  "email": "joao@email.com",
  "phone_e164": "5511999999999",
  "labels": [
    { "id": 5, "name": "Cliente", "color": "#FF9800" }
  ]
}

Resposta 200 — etiqueta já estava aplicada

JSON
{
  "id": 42,
  "name": "João Silva",
  "labels": [],
  "message": "Tag já cadastrada neste contato",
  "already_added": true
}

Erros

CódigoMensagemO que fazer
400label_id não enviadoInclua o campo no corpo da requisição
404Contato ou etiqueta não encontradoConfira os dois IDs
500Erro interno do servidorTente novamente em alguns instantes

Remover tag do contato

DELETE/api/contacts/:id/labels/:labelId

Tira a etiqueta do contato. Se ela não estava aplicada, a resposta também é 200.

cURL
curl -X DELETE "https://app.evoluachat.com.br/api/contacts/42/labels/5" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200 — etiqueta removida

JSON
{
  "id": 42,
  "name": "João Silva",
  "labels": []
}

Resposta 200 — etiqueta não estava no contato

JSON
{
  "id": 42,
  "name": "João Silva",
  "labels": [],
  "message": "Tag não está cadastrada naquele contato",
  "not_found_on_contact": true
}

Listar conversas

GET/api/conversations

Lista as conversas da conta com filtros de status, inbox e responsável.

Parâmetros de consulta

ParâmetroTipoObrigatórioDescrição
statusstringNãoopen, pending, resolved ou all
filterstringNãoall, mine, unassigned ou groups
inbox_idinteger ou arrayNãoUm ID ou vários IDs de inbox
assignee_idinteger ou arrayNãoAtendente responsável
pageintegerNãoPágina desejada (padrão 1)
limitintegerNãoItens por página (máximo 50)
cURL
curl -X GET "https://app.evoluachat.com.br/api/conversations?status=open&page=1" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Buscar conversa por ID

GET/api/conversations/:id

Traz a conversa com as mensagens, as mensagens fixadas e quem está responsável pelo atendimento.

cURL
curl -X GET "https://app.evoluachat.com.br/api/conversations/456" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "conversation": {
    "id": 456,
    "status": "open",
    "contact_id": 123,
    "contact_name": "João Silva",
    "phone_e164": "5511999999999",
    "profile_picture": "https://...",
    "is_group": false,
    "inbox_id": 1,
    "inbox_name": "WhatsApp Principal",
    "inbox_type": "whatsapp",
    "connection_id": 1,
    "connection_status": "connected",
    "assignee_id": 5,
    "assignee_name": "Maria Atendente",
    "team_id": 2,
    "team_name": "Suporte Técnico",
    "created_at": "2026-01-08T10:00:00.000Z"
  },
  "messages": [],
  "pinnedMessages": [],
  "has_more": false
}

Campos de atribuição

CampoTipoDescrição
assignee_idinteger ou nullID do atendente responsável
assignee_namestring ou nullNome do atendente responsável
team_idinteger ou nullID da equipe responsável
team_namestring ou nullNome da equipe responsável

Quando a conversa ainda não tem responsável, esses quatro campos voltam como null.

Janela de 24 horas (WhatsApp Oficial)

GET/api/conversations/:id/session

Informa se a conversa ainda está dentro da janela de 24 horas do WhatsApp Oficial. A janela abre a cada mensagem que o cliente envia; dentro dela você pode responder com texto e mídia livremente.

Vale apenas para conversas em inbox do tipo whatsapp_cloud.

Resposta 200

JSON
{
  "conversation_id": 123,
  "inbox_id": 12,
  "inbox_type": "whatsapp_cloud",
  "last_customer_message_at": "2026-01-17T12:34:56.000Z",
  "session_open": true,
  "session_expires_at": "2026-01-18T12:34:56.000Z",
  "seconds_remaining": 86399,
  "now": "2026-01-17T12:35:00.000Z"
}
cURL
curl -X GET "https://app.evoluachat.com.br/api/conversations/123/session" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Como usar o resultado

  • session_open: true — envie a mensagem normalmente por POST /api/conversations/:id/messages.
  • session_open: false — a janela fechou. Para retomar o contato, envie um template aprovado.

Erros

CódigoMensagemO que fazer
400ID inválidoEnvie o ID numérico da conversa
400Disponível apenas para inbox WhatsApp OficialA conversa não é de uma inbox whatsapp_cloud
401UnauthorizedToken ausente ou inválido
403Acesso negadoA conversa pertence a outro atendente
404Conversa não encontradaConfira o ID da conversa

Iniciar conversa por número

POST/api/conversations/start

Abre uma conversa a partir de um telefone. Se já existir conversa do mesmo contato naquela inbox, ela é reaproveitada ou reaberta em vez de duplicar.

Campos do corpo

CampoTipoObrigatórioDescrição
phonestringSimTelefone do contato com DDI e DDD. Caracteres não numéricos são removidos e, sem o +, ele é adicionado — o país não é assumido automaticamente
inbox_idnumberSimInbox onde a conversa será aberta
cURL
curl -X POST "https://app.evoluachat.com.br/api/conversations/start" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+5511999999999",
    "inbox_id": 12
  }'

Resposta 200

JSON
{
  "conversation_id": 123,
  "contact_id": 456,
  "is_new": true,
  "is_new_contact": true,
  "session_open": true,
  "templates": [],
  "inbox_type": "whatsapp"
}

O que o endpoint faz

  1. Confere se a inbox pertence à conta e normaliza o telefone.
  2. Localiza o contato ou cria um novo.
  3. Cria a conversa, ou reabre a que já existia para aquele contato e inbox.
  4. No WhatsApp Oficial, ainda devolve session_open e os templates disponíveis.

Onde encontrar o inbox_id

Use GET /api/inboxes para listar as inboxes da conta e copiar o ID.

Erros

CódigoMensagemO que fazer
400phone e inbox_id são obrigatóriosPreencha os dois campos
401UnauthorizedToken ausente ou inválido
404Caixa de entrada não encontradaA inbox não existe ou não é da sua conta
409conversation_assigned_to_anotherO contato já está em atendimento com outro usuário
JSON — exemplo do erro 409
{
  "error": "conversation_assigned_to_another",
  "message": "Este contato já possui uma conversa em andamento com Maria Atendente",
  "assignee_id": 99,
  "assignee_name": "Maria Atendente",
  "conversation_id": 123
}

Enviar mensagem na conversa

POST/api/conversations/:id/messages

Envia uma mensagem de texto ou mídia em uma conversa já aberta.

Campos do corpo

CampoTipoObrigatórioDescrição
contentstringSimTexto da mensagem, ou legenda quando envia mídia
typestringNãotext, image, video, document ou audio (padrão text)
media_urlstringNãoURL pública do arquivo quando type não é text
cURL — texto
curl -X POST https://app.evoluachat.com.br/api/conversations/123/messages \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Olá! Como posso ajudar?",
    "type": "text"
  }'
cURL — imagem
curl -X POST https://app.evoluachat.com.br/api/conversations/123/messages \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Segue o catálogo de setembro",
    "type": "image",
    "media_url": "https://seusite.com.br/catalogo.jpg"
  }'

Em inbox do WhatsApp Oficial, confira a janela de 24 horas antes de enviar. Fora dela, só passam templates aprovados.

Atribuir conversa

POST/api/conversations/:id/assign

Define quem cuida da conversa: um atendente, uma equipe ou os dois. Envie ao menos um dos campos.

Campos do corpo

CampoTipoDescrição
assignee_idinteger ou nullAtendente que assume a conversa
team_idinteger ou nullEquipe que assume a conversa
cURL — atendente
curl -X POST "https://app.evoluachat.com.br/api/conversations/456/assign" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{"assignee_id": 5}'
cURL — equipe
curl -X POST "https://app.evoluachat.com.br/api/conversations/456/assign" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{"team_id": 2}'
cURL — tirar a atribuição
curl -X POST "https://app.evoluachat.com.br/api/conversations/456/assign" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{"assignee_id": null, "team_id": null}'

Resposta 200

JSON
{
  "success": true,
  "conversation": {
    "id": 456,
    "assignee_id": 5,
    "assignee_name": "Maria Atendente",
    "team_id": 2,
    "team_name": "Suporte Técnico",
    "status": "open"
  }
}

Erros

CódigoMensagemO que fazer
400assignee_id ou team_id é obrigatórioEnvie ao menos um dos dois
400Atendente não encontradoConfira o ID em /api/users
400Equipe não encontradaConfira o ID em /api/teams
404Conversa não encontradaConfira o ID da conversa

Enviar template no WhatsApp Oficial

POST/api/whatsapp-cloud/inboxes/:inbox_id/send-template

Dispara uma mensagem de template aprovado pela Meta. É o caminho para iniciar contato ou retomar conversas fora da janela de 24 horas.

Requer perfil ADMIN. Crie o token com um usuário administrador e use uma inbox do tipo WhatsApp Oficial.

Campos obrigatórios

CampoTipoDescrição
tostringTelefone do destinatário. Máscaras são removidas: +55 (11) 99999-9999 vira 5511999999999
template_namestringNome do template cadastrado na Meta
languagestringIdioma do template, como pt_BR, pt_PT ou en_US

Variáveis do template

Há duas formas de preencher os campos entre chaves do template. A primeira é a recomendada.

CampoTipoDescrição
body_paramsstring[]Valores do corpo, na ordem {{1}}, {{2}}, ...
header_paramsstring[]Valores do cabeçalho, na mesma lógica de ordem
variablesobjectAlternativa com chaves var_1, var_2, ... ordenadas pelo número

A quantidade de variáveis é conferida antes do envio. Se faltar algum valor, a resposta é 400 indicando quantas variáveis o template espera.

cURL — variáveis no corpo
curl -X POST "https://app.evoluachat.com.br/api/whatsapp-cloud/inboxes/12/send-template" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5511999999999",
    "template_name": "boas_vindas2",
    "language": "pt_BR",
    "body_params": ["João", "Evolua Chat", "123"]
  }'
cURL — formato var_1, var_2
curl -X POST "https://app.evoluachat.com.br/api/whatsapp-cloud/inboxes/12/send-template" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+55 (11) 99999-9999",
    "template_name": "boas_vindas2",
    "language": "pt_BR",
    "variables": {
      "var_1": "João",
      "var_2": "Evolua Chat",
      "var_3": "123"
    }
  }'
cURL — cabeçalho e corpo
curl -X POST "https://app.evoluachat.com.br/api/whatsapp-cloud/inboxes/12/send-template" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5511999999999",
    "template_name": "confirmacao_agendamento",
    "language": "pt_BR",
    "header_params": ["Evolua Chat"],
    "body_params": ["João", "15/01", "14:30"]
  }'

Resposta 200

JSON
{
  "ok": true,
  "message_id": "wamid.HBgL..."
}

Erros

CódigoMensagemO que fazer
400id inválidoO inbox_id precisa ser numérico
400to é obrigatórioInforme o telefone com DDI e DDD
400template_name e language são obrigatóriosPreencha os dois campos
400Template requer X variável(eis)Complete os valores de body_params ou header_params
401UnauthorizedToken ausente ou inválido
403ForbiddenO usuário do token precisa ser ADMIN
404Inbox não encontradaA inbox não existe, não é sua ou não é WhatsApp Oficial
500Erro ao enviar templateFalha na comunicação com a Meta — tente novamente

Listar etiquetas

GET/api/labels

Retorna todas as etiquetas da conta, com nome e cor.

cURL
curl -X GET "https://app.evoluachat.com.br/api/labels" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
[
  {
    "id": 1,
    "name": "VIP",
    "color": "#ff0000",
    "created_at": "2026-01-08T10:00:00.000Z"
  },
  {
    "id": 2,
    "name": "Novo Cliente",
    "color": "#00ff00",
    "created_at": "2026-01-08T10:00:00.000Z"
  }
]

Criar etiqueta

POST/api/labels

Campos do corpo

CampoTipoObrigatórioDescrição
namestringSimNome da etiqueta
colorstringNãoCor em hexadecimal (padrão #3498db)
cURL
curl -X POST "https://app.evoluachat.com.br/api/labels" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{"name": "Urgente", "color": "#e74c3c"}'

Resposta 201

JSON
{
  "id": 3,
  "name": "Urgente",
  "color": "#e74c3c",
  "created_at": "2026-01-08T10:00:00.000Z"
}

Atualizar etiqueta

PUT/api/labels/:id

Altera nome, cor ou os dois. Envie apenas o que quiser mudar.

cURL
curl -X PUT "https://app.evoluachat.com.br/api/labels/3" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{"name": "Super Urgente", "color": "#c0392b"}'

Resposta 200

JSON
{
  "id": 3,
  "name": "Super Urgente",
  "color": "#c0392b",
  "created_at": "2026-01-08T10:00:00.000Z"
}

Se o ID não existir, a resposta é 404 Etiqueta não encontrada.

Excluir etiqueta

DELETE/api/labels/:id

Apaga a etiqueta e a remove de todos os contatos que a tinham.

cURL
curl -X DELETE "https://app.evoluachat.com.br/api/labels/3" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "ok": true,
  "deleted": {
    "id": 3,
    "name": "Super Urgente",
    "color": "#c0392b",
    "created_at": "2026-01-08T10:00:00.000Z"
  }
}

Listar pipelines

GET/api/kanban/boards

Lista os funis a que o usuário do token tem acesso, com a contagem de etapas e cards.

cURL
curl -X GET "https://app.evoluachat.com.br/api/kanban/boards" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
[
  {
    "id": 1,
    "name": "Vendas",
    "description": "Pipeline de vendas",
    "visibility": "all",
    "team_access": [],
    "managed_by": [],
    "is_archived": false,
    "created_by": 5,
    "created_by_name": "Admin",
    "stages_count": "4",
    "cards_count": "12",
    "created_at": "2025-10-01T14:00:00.000Z",
    "updated_at": "2025-10-15T09:30:00.000Z"
  }
]

Pipeline com etapas e cards

GET/api/kanban/boards/:id

Traz o funil completo: cada etapa com os seus cards, já ordenados por posição.

cURL
curl -X GET "https://app.evoluachat.com.br/api/kanban/boards/1" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "id": 1,
  "name": "Vendas",
  "description": "Pipeline de vendas",
  "visibility": "all",
  "is_archived": false,
  "created_by": 5,
  "created_by_name": "Admin",
  "stages": [
    {
      "id": 10,
      "board_id": 1,
      "name": "Novo",
      "color": "#EAF4FF",
      "position": 0,
      "cards": [
        {
          "id": 100,
          "board_id": 1,
          "stage_id": 10,
          "title": "Lead - Site",
          "description": "Interesse em plano empresarial",
          "contact_id": 42,
          "contact_name": "João Silva",
          "contact_phone_e164": "5511999999999",
          "assigned_to": 5,
          "assigned_to_name": "Carlos",
          "value_amount": "1500.00",
          "priority": "high",
          "tags": ["importante"],
          "position": 0,
          "attachments_count": 2,
          "conversation_id": 300,
          "created_by": 5,
          "created_at": "2025-10-05T12:00:00.000Z"
        }
      ]
    }
  ]
}

Erros

CódigoMensagemO que fazer
403Sem permissão para acessar este funilO usuário do token não tem acesso ao pipeline
404Pipeline não encontradoConfira o ID em /api/kanban/boards

Buscar card por ID

GET/api/kanban/cards/:id

Retorna o card com os dados do contato, do responsável, do pipeline, da etapa atual e da conversa mais recente.

cURL
curl -X GET "https://app.evoluachat.com.br/api/kanban/cards/100" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "id": 100,
  "board_id": 1,
  "board_name": "Vendas",
  "stage_id": 10,
  "stage_name": "Novo",
  "stage_color": "#EAF4FF",
  "title": "Lead - Site",
  "description": "Interesse em plano empresarial",
  "contact_id": 42,
  "contact_name": "João",
  "contact_last_name": "Silva",
  "contact_phone_e164": "5511999999999",
  "contact_email": "joao@email.com",
  "assigned_to": 5,
  "assigned_to_name": "Carlos",
  "value_amount": "1500.00",
  "phone": "11999999999",
  "priority": "high",
  "tags": ["importante", "site"],
  "position": 0,
  "attachments_count": 2,
  "conversation_id": 300,
  "created_by": 5,
  "created_at": "2025-10-05T12:00:00.000Z",
  "updated_at": "2025-10-15T09:30:00.000Z"
}

Campos retornados

CampoTipoDescrição
board_namestringNome do pipeline
stage_namestringNome da etapa atual
stage_colorstringCor da etapa em hexadecimal
contact_idnumber ou nullContato vinculado ao card
assigned_tonumber ou nullUsuário responsável
value_amountstring ou nullValor da oportunidade
prioritystringlow, normal ou high
tagsarrayTags do card
positionnumberPosição dentro da etapa
attachments_countnumberQuantidade de anexos
conversation_idnumber ou nullConversa mais recente do contato

Criar card

POST/api/kanban/boards/:boardId/cards

Adiciona um card em uma etapa do funil.

Campos do corpo

CampoTipoObrigatórioDescrição
stage_idintegerSimEtapa onde o card entra
titlestringSimTítulo do card
contact_idintegerNãoContato vinculado
descriptionstringNãoDescrição
value_amountnumberNãoValor da oportunidade
phonestringNãoTelefone do card
assigned_tointegerNãoUsuário responsável
prioritystringNãolow, normal ou high
tagsarrayNãoLista de tags
cURL
curl -X POST "https://app.evoluachat.com.br/api/kanban/boards/1/cards" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "stage_id": 10,
    "title": "Novo lead - Site",
    "contact_id": 42,
    "description": "Interesse em plano empresarial",
    "value_amount": 1500,
    "priority": "high"
  }'

Resposta 201

JSON
{
  "id": 100,
  "board_id": 1,
  "stage_id": 10,
  "title": "Novo lead - Site",
  "position": 0,
  "created_at": "2025-10-05T12:00:00.000Z"
}

A etapa precisa pertencer ao pipeline informado, senão a resposta é 400.

Editar card

PUT/api/kanban/cards/:id

Atualiza um ou mais campos. Envie apenas o que muda; o resto continua como está.

cURL
curl -X PUT "https://app.evoluachat.com.br/api/kanban/cards/100" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Lead qualificado",
    "assigned_to": 5,
    "priority": "high"
  }'

Resposta 200

JSON
{
  "id": 100,
  "board_id": 1,
  "stage_id": 10,
  "title": "Lead qualificado",
  "assigned_to": 5,
  "priority": "high"
}

Corpo vazio retorna 400 Nenhum campo para atualizar.

Remover card

DELETE/api/kanban/cards/:id

Exclui o card definitivamente. Não há desfazer.

cURL
curl -X DELETE "https://app.evoluachat.com.br/api/kanban/cards/100" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{ "message": "Card deletado com sucesso" }

Mover card entre pipelines

POST/api/kanban/cards/:id/move

Move o card para outro pipeline e outra etapa. Serve também para avançar etapas dentro do mesmo funil.

Campos do corpo

CampoTipoObrigatórioDescrição
board_idintegerSimPipeline de destino
stage_idintegerSimEtapa de destino, dentro desse pipeline
cURL
curl -X POST "https://app.evoluachat.com.br/api/kanban/cards/100/move" \
  -H "Authorization: Bearer tk_seu_token_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "board_id": 2,
    "stage_id": 15
  }'

Resposta 200

JSON
{
  "id": 100,
  "board_id": 2,
  "stage_id": 15
}

Se o card já estiver nesse destino, a resposta continua 200 e traz "message": "Card já está neste pipeline e etapa".

Listar usuários

GET/api/users

Lista os atendentes da conta. Use para descobrir o assignee_id na hora de distribuir conversas ou cards.

cURL
curl -X GET "https://app.evoluachat.com.br/api/users" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
[
  {
    "id": 1,
    "name": "João Admin",
    "nickname": "joao",
    "email": "joao@empresa.com",
    "phone": "11999999999",
    "role": "ADMIN",
    "created_at": "2026-01-08T10:00:00.000Z"
  },
  {
    "id": 2,
    "name": "Maria Atendente",
    "nickname": "maria",
    "email": "maria@empresa.com",
    "phone": "11988888888",
    "role": "AGENT",
    "created_at": "2026-01-08T10:00:00.000Z"
  }
]

O campo role vem como ADMIN ou AGENT.

Buscar usuário por ID

GET/api/users/:id
cURL
curl -X GET "https://app.evoluachat.com.br/api/users/2" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
{
  "id": 2,
  "name": "Maria Atendente",
  "nickname": "maria",
  "email": "maria@empresa.com",
  "phone": "11988888888",
  "role": "AGENT",
  "created_at": "2026-01-08T10:00:00.000Z"
}

Listar inboxes

GET/api/inboxes

Lista as caixas de entrada da conta, tanto as conectadas por QR Code quanto as do WhatsApp Oficial. É daqui que sai o inbox_id usado para abrir conversas e enviar templates.

cURL
curl -X GET "https://app.evoluachat.com.br/api/inboxes" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
[
  {
    "id": 1,
    "name": "WhatsApp Principal",
    "type": "whatsapp",
    "created_at": "2026-01-08T10:00:00.000Z"
  },
  {
    "id": 2,
    "name": "WhatsApp Oficial",
    "type": "whatsapp_cloud",
    "created_at": "2026-01-08T10:00:00.000Z"
  }
]

Tipos de inbox

TipoDescrição
whatsappWhatsApp conectado por QR Code
whatsapp_cloudWhatsApp Oficial (API da Meta)

Buscar inbox por ID

GET/api/inboxes/:id

Traz a inbox com os dados da conexão — útil para monitorar se um número caiu.

cURL
curl -X GET "https://app.evoluachat.com.br/api/inboxes/1" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200 — conexão por QR Code

JSON
{
  "id": 1,
  "name": "WhatsApp Principal",
  "type": "whatsapp",
  "created_at": "2026-01-08T10:00:00.000Z",
  "connection": {
    "id": 1,
    "name": "WhatsApp Principal",
    "phone_number": "+5511999999999",
    "status": "connected",
    "instance_id": "abc123",
    "created_at": "2026-01-08T10:00:00.000Z",
    "updated_at": "2026-01-08T12:00:00.000Z"
  }
}

Resposta 200 — WhatsApp Oficial

JSON
{
  "id": 2,
  "name": "WhatsApp Oficial",
  "type": "whatsapp_cloud",
  "created_at": "2026-01-08T10:00:00.000Z",
  "connection": {
    "id": 1,
    "phone_number_id": "123456789",
    "waba_id": "987654321",
    "display_phone_number": "+5511988888888",
    "verified_name": "Minha Empresa",
    "quality_rating": "GREEN",
    "created_at": "2026-01-08T10:00:00.000Z",
    "updated_at": "2026-01-08T12:00:00.000Z"
  }
}

Campos da conexão

CampoOnde apareceDescrição
statusQR Codeconnected, disconnected ou connecting
phone_numberQR CodeNúmero conectado
instance_idQR CodeIdentificador da instância
phone_number_idWhatsApp OficialID do número na Meta
waba_idWhatsApp OficialID da conta WhatsApp Business
verified_nameWhatsApp OficialNome verificado da empresa
quality_ratingWhatsApp OficialQualidade do número: GREEN, YELLOW ou RED

Listar equipes

GET/api/teams

Retorna as equipes da conta, com os IDs usados para atribuir conversas.

cURL
curl -X GET "https://app.evoluachat.com.br/api/teams" \
  -H "Authorization: Bearer tk_seu_token_aqui"

Resposta 200

JSON
[
  {
    "id": 1,
    "name": "Suporte Técnico",
    "description": "Equipe de suporte",
    "created_at": "2026-01-08T10:00:00.000Z"
  },
  {
    "id": 2,
    "name": "Vendas",
    "description": "Equipe comercial",
    "created_at": "2026-01-08T10:00:00.000Z"
  }
]

Códigos de status

CódigoSignificadoDescrição
200OKRequisição concluída
201CreatedRegistro criado
400Bad RequestParâmetros inválidos ou faltando
401UnauthorizedToken ausente, expirado ou inválido
403ForbiddenToken válido, mas sem permissão para o recurso
404Not FoundRegistro não encontrado
409ConflictA operação conflita com o estado atual do registro
429Too Many RequestsLimite de requisições atingido
500Internal Server ErrorErro no servidor

Limite de requisições

A API limita a quantidade de chamadas por minuto para manter o sistema estável para todos.

PlanoLimite
Free60 requisições por minuto
Pro300 requisições por minuto

Ao ultrapassar o limite, a resposta é 429 Too Many Requests. Em disparos grandes, distribua as chamadas ao longo do tempo e repita a requisição alguns segundos depois quando receber esse código.

Erros comuns

SituaçãoCausa provávelComo resolver
401 em todas as chamadasCabeçalho errado ou token expiradoConfira se o valor começa com Bearer e gere um token novo se preciso
403 em um endpoint específicoO usuário do token não tem o perfil exigidoGere o token com um usuário ADMIN
Mensagem não chega no WhatsApp OficialJanela de 24 horas fechadaConsulte a janela da conversa e envie um template
Contatos duplicadosCadastro criado sem consultar antesBusque por número antes de criar
Conversa abre na inbox erradainbox_id incorretoListe as inboxes e confirme o ID
Telefone não encontradoNúmero sem DDIEnvie sempre no padrão +55DDNNNNNNNNN

Precisa de um endpoint que não está aqui? Fale com o suporte do Evolua Chat com o caso de uso e o volume esperado.