WhatsConverte

v1 · estável · atualizado em outubro de 2026

WhatsConverte API

Envie mensagens de WhatsApp pelos números conectados na sua conta, cadastre contatos e acompanhe a entrega. Funciona por API REST ou por um servidor MCP para agentes de IA. Cada mensagem enviada custa 1 crédito.

Base URL: https://whatsconverte.com.br/api/v1MCP: https://whatsconverte.com.br/api/v1/mcpllms.txt

Início rápido

  1. Conecte pelo menos um número em Instâncias e confira se ele aparece como conectado.
  2. Gere um token em API & docs com o escopo send (e read para consultar status).
  3. Envie a primeira mensagem:
curl https://whatsconverte.com.br/api/v1/messages \
  -H 'Authorization: Bearer mkt_SEU_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000' \
  -d '{"to":"11984134029","type":"text","text":"Olá {{nome}}!","variables":{"nome":"Paulo"}}'

Autenticação e escopos

Todas as chamadas levam o token no cabeçalho:

Authorization: Bearer mkt_<32 caracteres hexadecimais>
EscopoPermite
readGET /me, /credits, /instances, /messages/:id, /contacts e as ferramentas de consulta do MCP
sendPOST /messages e POST /contacts, e as ferramentas enviar_mensagem e salvar_contato do MCP

O token aparece uma única vez, na criação. Guardamos só o hash SHA-256: ninguém, nem o suporte, consegue recuperá-lo. Se perder, gere outro e revogue o antigo. A revogação vale na hora.

Segurança

O que a plataforma faz

  • Tráfego só por HTTPS, com HSTS.
  • Tokens guardados como hash SHA-256, com escopo e limite por minuto próprios. O último uso de cada token fica visível no painel.
  • Cada token só enxerga os dados da própria conta; recursos de outra conta respondem 404.
  • Opt-out automático: quem responde PARAR, SAIR, CANCELAR, STOP ou "não quero mais" deixa de receber, inclusive pela API (409 contact_opted_out).
  • O número é verificado no WhatsApp antes da cobrança (números conectados por QR Code). Número inexistente não cobra.
  • mediaUrl só aceita https em endereço público, para impedir que a API seja usada para acessar redes internas.
  • Cada envio pela API fica no registro de auditoria da conta, com o prefixo do token que enviou.
  • As credenciais da Meta Cloud API dos seus números são guardadas cifradas (AES-256-GCM).

O que você deve fazer

  • Chame a API só do seu servidor. Nunca coloque o token em front-end, app móvel, planilha ou repositório.
  • Guarde o token em variável de ambiente ou cofre de segredos.
  • Use um token por integração, com o menor escopo possível (só read para painéis e relatórios).
  • Revogue tokens sem uso e troque-os periodicamente. Se um token vazar, revogue imediatamente.
  • Use Idempotency-Key em todo envio, para que repetições de rede não dupliquem mensagens nem cobranças.
  • Envie só para quem autorizou o contato (LGPD) e respeite os pedidos de saída.

Limites e regras de envio

RegraValor
Requisições por token60 por minuto por padrão, configurável de 10 a 600 na criação do token. Janela deslizante de 60 s
Custo1 crédito por mensagem enfileirada. Mensagem que termina em failed devolve o crédito
Créditos grátis10 por mês. No dia 1 o saldo volta para 10 (créditos comprados não acumulam para o mês seguinte)
TextoAté 4096 caracteres; legenda até 1024
Mídiaimage, video, document ou audio por URL https pública
EnvioImediato. A janela de horário (09:00–20:00) e o limite diário por número valem para campanhas do painel, não para a API
LoteUma mensagem por chamada. Para disparos em massa use Campanhas no painel

Toda resposta traz:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1761350400

Ao passar do limite a resposta é 429 rate_limit_exceeded. Aguarde até X-RateLimit-Reset (unix epoch, em segundos).

Idempotência

Em POST /messages, envie um identificador único no cabeçalho Idempotency-Key (8 a 128 caracteres [A-Za-z0-9._:-]; recomendamos um UUID v4). Se a mesma chave for enviada de novo, a API devolve a mensagem original com "idempotent": true, sem enviar nem cobrar outra vez, inclusive em chamadas simultâneas.

Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

A chave vale para sempre dentro da conta: não reutilize a mesma chave para mensagens diferentes.

Formato das respostas

// sucesso
{ "data": { ... } }

// erro
{ "error": { "code": "insufficient_credits", "message": "Saldo insuficiente...", "details": { ... } } }

Erros

HTTPerror.codeQuando acontece
400validation_errorCampos com tipo ou tamanho errado. Veja error.details
400invalid_jsonBody não é JSON válido
400invalid_phoneNúmero fora do formato aceito
400invalid_whatsapp_numberO número não existe no WhatsApp. Não cobra
400invalid_media_urlmediaUrl não é https público (IP privado, localhost, porta ≠ 443, usuário/senha na URL)
400invalid_idempotency_keyIdempotency-Key fora de 8 a 128 caracteres [A-Za-z0-9._:-]
401missing_authorizationCabeçalho Authorization: Bearer ausente
401invalid_tokenToken inexistente ou com formato errado
401token_revokedToken revogado no painel
402insufficient_creditsSaldo zerado. Recarregue para continuar
403insufficient_scopeO token não tem o escopo exigido pelo endpoint
404not_foundRecurso não existe ou é de outra conta
409no_connected_instanceNenhum número de WhatsApp conectado (ou o instanceId informado não está conectado)
409contact_opted_outO contato pediu para não receber mensagens. Não cobra
429rate_limit_exceededPassou do limite por minuto do token
500internal_errorErro inesperado. Repita com a mesma Idempotency-Key

GET /me

Conta dona do token, saldo e escopos. Escopo: read.

curl -H 'Authorization: Bearer mkt_SEU_TOKEN' https://whatsconverte.com.br/api/v1/me
{
  "data": {
    "tenant": {
      "id": "cm...",
      "name": "Star Consulting",
      "slug": "star-abc123",
      "timezone": "America/Sao_Paulo",
      "credits": 142,
      "freeCreditsResetAt": "2026-11-01T03:00:00.000Z"
    },
    "token": { "scopes": ["read", "send"], "rateLimit": 60 }
  }
}

GET /credits

Saldo atual. Escopo: read.

{ "data": { "balance": 142, "freeCreditsResetAt": "2026-11-01T03:00:00.000Z" } }

GET /instances

Todos os números de WhatsApp da conta, com status. Só os CONNECTED enviam. Escopo: read.

{
  "data": {
    "instances": [
      {
        "id": "cm...",
        "provider": "EVOLUTION",          // EVOLUTION (QR Code) ou META_CLOUD (API oficial)
        "evoInstanceName": "mkt_xyz_abc",
        "phone": "5511936209286",
        "displayName": "Star Consulting",
        "status": "CONNECTED",            // CREATED | CONNECTING | CONNECTED | DISCONNECTED | ERROR
        "dailyCap": 50,
        "lastConnectedAt": "2026-10-24T12:00:00.000Z"
      }
    ]
  }
}

POST /messages

Enfileira uma mensagem e cobra 1 crédito. Responde 202; o envio acontece em segundos. Escopo: send.

Body

{
  "to": "11984134029",                // obrigatório. 10-11 dígitos recebem +55; 12-15 = DDI explícito
  "type": "text",                     // text (padrão) | image | video | document | audio
  "text": "Olá {{nome}}, tudo bem?",  // obrigatório se type=text. Aceita spintax {oi|olá}
  "mediaUrl": "https://...",          // obrigatório se type != text. https público
  "caption": "Legenda da mídia",      // opcional
  "fileName": "proposta.pdf",         // opcional, recomendado para document
  "variables": { "nome": "Paulo" },   // substitui {{nome}} ou {nome} no text/caption
  "instanceId": "cm..."               // opcional. Padrão: o primeiro número conectado
}

Ordem das verificações

Nada é cobrado se a chamada parar antes do passo 6:

  1. Token, escopo send e limite por minuto.
  2. Formato do payload, da mídia e da Idempotency-Key.
  3. Chave de idempotência já usada → devolve a mensagem original.
  4. Contato em opt-out → 409 contact_opted_out.
  5. Número conectado disponível e destinatário existente no WhatsApp.
  6. Débito de 1 crédito → 402 se o saldo estiver zerado.
  7. Mensagem enfileirada → 202.

Resposta 202

{
  "data": {
    "id": "cm...",
    "status": "queued",
    "to": "5511984134029",
    "instanceId": "cm...",
    "type": "text",
    "creditsCharged": 1,
    "creditsRemaining": 141
  }
}

GET /messages/:id

Status atual da mensagem. Escopo: read.

curl -H 'Authorization: Bearer mkt_SEU_TOKEN' https://whatsconverte.com.br/api/v1/messages/cm...
{
  "data": {
    "message": {
      "id": "cm...", "to": "5511984134029", "type": "text", "status": "delivered",
      "instanceId": "cm...", "evoMessageId": "3EB0...",
      "sentAt": "...", "deliveredAt": "...", "readAt": null,
      "errorMsg": null, "createdAt": "..."
    }
  }
}
StatusSignificado
queuedNa fila, crédito reservado
sentEntregue ao WhatsApp
deliveredChegou ao aparelho do destinatário
readLida (se o destinatário mostra confirmação de leitura)
failedNão foi enviada; veja errorMsg. O crédito é devolvido

O status só avança (queued → sent → delivered → read). Não há webhook de status para clientes: consulte este endpoint, com intervalo de alguns segundos, até chegar ao status que você precisa.

Contatos

POST /contacts

Cria o contato ou atualiza nome e atributos se o telefone já existir. Não envia mensagem e não cobra. Escopo: send. Responde 201.

curl https://whatsconverte.com.br/api/v1/contacts \
  -H 'Authorization: Bearer mkt_SEU_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"phone":"11984134029","name":"Paulo","attributes":{"empresa":"Star","cidade":"Campinas"}}'

Até 50 atributos, cada valor com até 500 caracteres. Os atributos ficam disponíveis como variáveis nos templates.

GET /contacts?phone=

Consulta um contato pelo telefone. Útil para checar o opt-out antes de enviar: se optOutAt estiver preenchido, o envio será recusado. Escopo: read.

curl -H 'Authorization: Bearer mkt_SEU_TOKEN' 'https://whatsconverte.com.br/api/v1/contacts?phone=11984134029'
{ "data": { "contact": { "id": "cm...", "phoneE164": "5511984134029", "name": "Paulo", "optOutAt": null, "source": "api", "createdAt": "..." } } }

Servidor MCP

Para usar o WhatsConverte em agentes de IA (Claude, Cursor, VS Code e outros clientes MCP). Transporte Streamable HTTP, respostas em JSON e sem sessão. Usa o mesmo token da API; cada ferramenta exige o seu escopo.

Endereço: https://whatsconverte.com.br/api/v1/mcp
Cabeçalho: Authorization: Bearer mkt_SEU_TOKEN

Configuração

# Claude Code
claude mcp add --transport http whatsconverte https://whatsconverte.com.br/api/v1/mcp \
  --header "Authorization: Bearer mkt_SEU_TOKEN"

# Cursor (~/.cursor/mcp.json)
{ "mcpServers": { "whatsconverte": {
  "url": "https://whatsconverte.com.br/api/v1/mcp",
  "headers": { "Authorization": "Bearer mkt_SEU_TOKEN" } } } }

# VS Code (.vscode/mcp.json)
{ "servers": { "whatsconverte": {
  "type": "http", "url": "https://whatsconverte.com.br/api/v1/mcp",
  "headers": { "Authorization": "Bearer mkt_SEU_TOKEN" } } } }

# Claude Desktop (claude_desktop_config.json), via mcp-remote
{ "mcpServers": { "whatsconverte": {
  "command": "npx",
  "args": ["-y", "mcp-remote", "https://whatsconverte.com.br/api/v1/mcp", "--header", "Authorization:${WC_TOKEN}"],
  "env": { "WC_TOKEN": "Bearer mkt_SEU_TOKEN" } } } }

Ferramentas

FerramentaEscopoO que faz
conta_resumoreadConta, saldo, renovação dos créditos grátis e escopos do token
listar_numerosreadNúmeros de WhatsApp e status
consultar_contatoreadContato pelo telefone, com opt-out
salvar_contatosendCria ou atualiza contato. Não cobra
enviar_mensagemsendEnvia uma mensagem e cobra 1 crédito. Aceita idempotencyKey
consultar_mensagemreadStatus de uma mensagem enviada

As ferramentas seguem exatamente as mesmas regras da API REST: mesmas validações, opt-out, cobrança e limite por minuto. O agente é orientado a confirmar destinatário e texto com você antes de enviar.

llms.txt

Um resumo desta documentação em Markdown, pensado para agentes de IA e LLMs, está em https://whatsconverte.com.br/llms.txt. Ele traz autenticação, ferramentas MCP, endpoints, regras de envio e erros.

Mudanças

  • Outubro de 2026: servidor MCP e llms.txt; GET /contacts?phone=; campo provider em /instances; envio para contato em opt-out recusado (409 contact_opted_out); mediaUrl só https público (invalid_media_url); validação da Idempotency-Key e proteção contra chamadas simultâneas com a mesma chave; status das mensagens não regride mais.