API REST — Referência

Referência completa dos endpoints públicos da API REST do Dexter. Todos os exemplos usam curl; adapte para a linguagem do seu projeto.

Visão geral

Base URLhttps://app.dexteragents.com
Content-Typeapplication/json
AutenticaçãoBearer token no header Authorization
Rate limitsO Dexter aplica limites automáticos de envio por número e por instância. Mensagens duplicadas dentro de 3 minutos são bloqueadas.
HumanizaçãoToda mensagem enviada pela API passa por um delay de digitação (3–10 s por padrão) para simular comportamento humano.

Autenticação

Os endpoints /api/v1/* usam autenticação via API Key no header Authorization.

Como obter sua API Key

1
Acesse o Dashboard da sua instância Dexter.
2
Navegue até Configurações → Integrações.
3
Na seção API Keys, crie uma nova chave. Copie o valor — ele não será exibido novamente.

Inclua a chave em todas as requisições:

Authorization: Bearer YOUR_API_KEY
Segurança: nunca exponha sua API Key em código frontend, repositórios públicos ou logs. Trate-a como uma senha.

Erros de autenticação

CódigoErroCausa
401missing_bearer_tokenHeader Authorization ausente ou sem prefixo Bearer .
401invalid_api_keyChave inválida, expirada ou revogada.
503instance_not_configuredA instância associada à chave não está configurada (sem credenciais Z-API/Evolution).

Enviar mensagem — POST /api/v1/messages

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

Pré-requisito: a permissão API de Envio deve estar habilitada nas Integrações do dashboard (send_api.enabled).

Parâmetros (body JSON)

ParâmetroTipoObrigatórioDescrição
phone string Sim Número do destinatário com DDI, sem símbolos. Ex.: "5511999999999"
message string Sim Texto da mensagem a enviar.
delay_typing integer Não Delay de digitação em segundos antes do envio. Se omitido, um valor aleatório entre 3 e 10 s é usado. Valores informados são limitados ao intervalo 3–15 s.
delay_send integer Não Agendar o envio para daqui a N minutos (1–1440, ou seja, até 24 h). O envio fica em memória — um restart do servidor descarta envios pendentes.

Exemplo — envio imediato

curl -X POST https://app.dexteragents.com/api/v1/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "message": "Ola! Como posso ajudar?"
  }'

Resposta de sucesso

{
  "ok": true,
  "status": 200,
  "typing_sec": 5,
  "response": "..."
}

Exemplo — envio agendado

curl -X POST https://app.dexteragents.com/api/v1/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "message": "Lembrete: sua reuniao e amanha as 14h.",
    "delay_send": 60
  }'

Resposta (agendado)

{
  "ok": true,
  "scheduled": true,
  "dispatch_at": "2026-09-25T15:30:00",
  "delay_send_min": 60,
  "typing_sec": 7,
  "note": "scheduled in-memory; a server restart drops pending sends"
}

Erros específicos

CódigoErroCausa
400invalid_jsonBody não é JSON válido.
400phone_and_message_requiredphone ou message ausente/vazio.
400invalid_delay_senddelay_send não é um número válido.
403send_api_disabledA permissão de envio via API não está habilitada na instância.
409suppressedNúmero bloqueado pelo Dexter Data Intelligence (supressão automática).
502—Falha na comunicação com o provedor WhatsApp (Z-API/Evolution).

Gerenciar leads — POST /api/v1/leads

Cria ou atualiza um lead (contato) e, opcionalmente, envia uma primeira mensagem. Ideal para integrações com formulários, landing pages e CRMs externos.

Pré-requisito: a permissão Lead Intake deve estar habilitada nas Integrações do dashboard (lead_intake.enabled).

Parâmetros (body JSON)

ParâmetroTipoObrigatórioDescrição
phone string Sim Número do lead com DDI. Ex.: "5511999999999"
name string Não Nome do contato.
message string Não Mensagem inicial a enviar ao lead (requer send_first_message habilitado na config).
definir_agente string Não Agente que atenderá o lead (ex.: "sdr", "cs"). Se omitido ou inválido, usa o agente padrão da configuração.
lock_agent boolean Não Se true, trava o agente definido (impede roteamento automático). Padrão: true.
delay_typing integer Não Delay de digitação (3–15 s). Padrão: aleatório 3–10 s.
delay_send integer Não Agendar envio da mensagem inicial em N minutos (1–1440).
campos extras qualquer Não Qualquer campo adicional no body é salvo como customData no contato. Use para armazenar origem, campanha, utm, etc.

Exemplo

curl -X POST https://app.dexteragents.com/api/v1/leads \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "5511999999999",
    "name": "Maria Silva",
    "definir_agente": "sdr",
    "message": "Oi Maria! Vi que voce se cadastrou. Como posso ajudar?",
    "origem": "landing-page",
    "utm_source": "google"
  }'

Resposta de sucesso

{
  "ok": true,
  "contact": "5511999999999",
  "agent": "sdr",
  "locked": true,
  "sent": true,
  "send_status": 200
}

Resposta (com envio agendado)

{
  "ok": true,
  "contact": "5511999999999",
  "agent": "sdr",
  "locked": true,
  "sent": false,
  "scheduled": true,
  "dispatch_at": "2026-09-25T16:00:00",
  "delay_send_min": 30,
  "typing_sec": 5
}

Erros específicos

CódigoErroCausa
400invalid_jsonBody não é JSON válido.
400phone_requiredphone ausente ou vazio.
400invalid_delay_senddelay_send não é um número válido.
403lead_intake_disabledLead Intake não está habilitado na instância.
500contact_upsert_failedErro ao salvar o contato no banco de dados.

Webhook de mensagens recebidas — POST /zapi/webhook

Endpoint que recebe notificações do provedor WhatsApp (Z-API ou Evolution) quando uma mensagem chega ao seu número. Você não chama este endpoint — ele é chamado pelo provedor.

URL do webhook

Configure no painel do seu provedor WhatsApp a URL:

https://app.dexteragents.com/zapi/webhook?instance=SEU_INSTANCE_ID
O instance identifica qual instância Dexter receberá as mensagens. Você encontra o ID da instância no Dashboard, em Configurações.

Validação de secret (opcional, recomendado)

Se a variável WEBHOOK_SECRET estiver configurada, o Dexter valida o secret em cada requisição. Envie de uma das formas:

MétodoExemplo
Query parameter /zapi/webhook?instance=123&secret=YOUR_WEBHOOK_SECRET
Header X-Webhook-Secret: YOUR_WEBHOOK_SECRET

Payload recebido (exemplo Z-API)

{
  "phone": "5511999999999",
  "chatName": "Maria Silva",
  "messageId": "ABCDEF1234567890",
  "fromMe": false,
  "senderName": "Maria Silva",
  "type": "ReceivedCallback",
  "body": {
    "text": "Oi, quero saber mais sobre o servico"
  }
}

Tipos de callback aceitos

O Dexter processa apenas os tipos:

Todos os outros tipos (DeliveryCallback, MessageStatusCallback, etc.) são ignorados com 200 OK.

Deduplicação

O Dexter mantém um buffer de até 5.000 messageIds por instância, persistido em disco. Se o provedor entregar a mesma mensagem mais de uma vez, a segunda chamada recebe:

{
  "ok": true,
  "received": true,
  "dedup": true,
  "messageId": "ABCDEF1234567890"
}

Resposta esperada

Retorne 200 OK ao provedor. O Dexter sempre responde com JSON:

{
  "ok": true,
  "received": true
}

Comportamento com campanhas ativas

Se o contato que enviou a mensagem é destinatário de uma campanha ativa, o Dexter marca automaticamente que o contato respondeu e interrompe o envio de novas mensagens da campanha para esse número.

MCP — POST /api/v1/mcp

Endpoint do Model Context Protocol (MCP) para integração com agentes de IA, como Claude, GPT e outros que suportam MCP.

TransporteStreamable HTTP (JSON-RPC 2.0)
MétodoPOST
AutenticaçãoBearer API Key (mesmo header dos endpoints v1)
Versões de protocolo2025-06-18, 2025-03-26, 2024-11-05

Níveis de permissão

As tools MCP são agrupadas por nível de acesso, configurável no dashboard:

NívelPermissãoDescrição
Leitura mcp.enabled Consultar contatos, conversas, campanhas, agentes, métricas.
Escrita mcp.enabled + mcp.allow_write Criar/editar contatos, tags e campanhas.
Envio mcp.enabled + mcp.allow_send Enviar mensagens WhatsApp via MCP.

Exemplo — requisição JSON-RPC

curl -X POST https://app.dexteragents.com/api/v1/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": {"name": "meu-agente", "version": "1.0"}
    }
  }'

Resposta

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": {"tools": {}},
    "serverInfo": {"name": "dexter-mcp", "version": "1.0.0"},
    "instructions": "..."
  }
}
Para a lista completa de tools MCP disponíveis, consulte a Referência de Tools MCP.

Códigos de erro

Tabela geral de códigos HTTP retornados pela API:

CódigoSignificadoAção recomendada
200 Sucesso —
202 Aceito (MCP: notificação processada) —
400 Request inválido Verifique os parâmetros enviados. O campo error na resposta indica o problema específico.
401 Não autenticado Verifique se o header Authorization: Bearer YOUR_API_KEY está presente e correto.
403 Sem permissão O recurso existe, mas a permissão necessária não está habilitada. Verifique as Integrações no dashboard.
404 Não encontrado Verifique a URL do endpoint.
405 Método não permitido O endpoint MCP aceita apenas POST. Requisições GET retornam 405.
409 Conflito / Suprimido O número está na lista de supressão do Data Intelligence. O envio foi bloqueado por proteção automática.
429 Rate limited Limite de requisições atingido. Aguarde e tente novamente com backoff exponencial.
500 Erro interno Erro inesperado no servidor. Se persistir, entre em contato com o suporte.
502 Erro no provedor Falha na comunicação com Z-API/Evolution. Verifique a conexão do WhatsApp no dashboard.
503 Instância não configurada A instância associada à API Key não possui credenciais do provedor WhatsApp configuradas.

Todas as respostas de erro incluem um body JSON com o campo error:

{
  "ok": false,
  "error": "phone_and_message_required"
}

Boas práticas

1
Implemente retry com backoff exponencial. Em caso de erro 429 ou 5xx, aguarde 1 s, depois 2 s, 4 s, 8 s antes de tentar novamente. Não faça retry imediato — isso pode amplificar o problema.
2
Use HTTPS sempre. Todas as requisições devem ser feitas via HTTPS. Requisições HTTP simples não são aceitas.
3
Não exponha API Keys no frontend. Faça as chamadas à API a partir do seu backend. Nunca inclua a chave em código JavaScript do lado do cliente.
4
Valide o Webhook Secret. Se você configurou um WEBHOOK_SECRET, valide-o em cada requisição recebida para garantir que os payloads são legítimos.
5
Respeite os limites de envio. O Dexter bloqueia automaticamente mensagens duplicadas (mesmo texto para o mesmo número dentro de 3 minutos) e não permite dois envios para o mesmo número no mesmo segundo.
6
Use campos customizados no Lead Intake. Envie metadados (UTM, origem, ID externo) como campos extras no body de /api/v1/leads. Eles são salvos no contato e ficam disponíveis no CRM.