Crie sua conta e escolha um plano
A conta precisa estar ativa para liberar a área do usuário e permitir a criação da primeira instância. Abrir meu plano
Documentação da API
Esta página foi pensada para quem não vive programação no dia a dia. A ideia é seguir uma ordem natural: preparar a conta, descobrir a instância certa e só então enviar a mensagem.
Caminho natural
A conta precisa estar ativa para liberar a área do usuário e permitir a criação da primeira instância. Abrir meu plano
A instância é o identificador operacional que representa o WhatsApp que fará os envios. Abrir instâncias
Sem a instância conectada, o endpoint de envio não libera a mensagem e retorna conflito. Ir para o painel
Na tela de API Key, crie a chave da conta e guarde o valor completo no mesmo momento em que ele aparecer. Abrir API Key
Isso confirma se a chave está correta antes de você gastar tempo tentando enviar mensagens.
O envio sempre precisa de uma instância específica, então este é o passo natural antes do `send-message`.
Referência do contrato
Use sempre `POST /api/integration/instances/:instanceId/send-message`. O campo `type` define o contrato; apenas integrações antigas de texto podem omiti-lo.
`text` aceita até 65.536 caracteres. O campo `type` pode ser omitido apenas por compatibilidade.
`caption` aceita até 4.096 caracteres. No multipart, remova `url` e envie o arquivo em `file`.
`fileName` e `mimeType` são opcionais, mas quando informados são validados contra o conteúdo real.
Envie `to` em formato internacional, com DDI e DDD. Para grupos, use o JID completo terminado em `@g.us` — descubra o JID com `GET /instances/:instanceId/groups`.
Envie exatamente um campo `file` e um campo `message`. O limite padrão é 15 MiB e o JSON de `message` não deve conter `url`. Abrir Uso da API
A URL deve ser pública e válida. O serviço protege contra SSRF, limita redirects, tamanho e tempo de download e inspeciona o conteúdo real.
Use URL em JSON ou arquivo em multipart. Enviar as duas fontes na mesma requisição é inválido.
O objeto `result` vem do serviço do WhatsApp e contém o `messageId`. Para mídia, também inclui o resultado da inspeção do arquivo.
{
"instanceId": "INSTANCE_ID",
"message": {
"type": "image",
"to": "5511999999999",
"caption": "Imagem do pedido",
"source": "upload"
},
"ok": true,
"result": {
"instanceId": "INSTANCE_ID",
"to": "5511999999999",
"jid": "5511999999999@s.whatsapp.net",
"messageId": "IDENTIFICADOR_WHATSAPP",
"media": {
"filename": "foto.jpg",
"mimeType": "image/jpeg",
"extension": "jpg",
"contentTypeDetected": true
}
},
"sentAt": "2026-06-19T12:00:00.000Z"
}O payload legado { "to": "...", "text": "..." } continua aceito. Para novas integrações, use { "type": "text", "to": "...", "text": "..." }. A rota pública permanece a mesma.
Primeiros testes
Use este primeiro teste para confirmar que a API Key está correta e que a conta foi reconhecida.
curl -H "x-api-key: SUA_API_KEY" "https://snodr.com/api/integration/me"Depois de validar a chave, liste as instâncias disponíveis e copie o valor de id da instância conectada que vai enviar mensagens.
curl -H "x-api-key: SUA_API_KEY" "https://snodr.com/api/integration/instances"Com a instância conectada e o id em mãos, envie uma mensagem do tipo text. Integrações existentes sem o campo type continuam compatíveis.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"type\":\"text\",\"to\":\"5511999999999\",\"text\":\"Olá! Esta é uma mensagem de teste.\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"Envie uma imagem disponível em URL pública. O serviço valida endereço, redirects, tamanho e conteúdo real antes do envio.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"type\":\"image\",\"to\":\"5511999999999\",\"caption\":\"Imagem do pedido\",\"url\":\"https://cdn.example.com/order.jpg\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"Para documentos, você pode declarar o nome e o MIME. Eles serão comparados com o conteúdo baixado antes do envio.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"type\":\"document\",\"to\":\"5511999999999\",\"caption\":\"Contrato\",\"fileName\":\"contrato.pdf\",\"mimeType\":\"application/pdf\",\"url\":\"https://cdn.example.com/contract.pdf\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"No upload, envie somente os campos file e message. O campo message contém o mesmo contrato JSON, mas sem url.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-F "file=@foto.jpg;type=image/jpeg" \
-F "message={\"type\":\"image\",\"to\":\"5511999999999\",\"caption\":\"Imagem do pedido\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"O conteúdo real, o MIME e a extensão do documento são validados pelo serviço antes do envio.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-F "file=@contrato.pdf;type=application/pdf" \
-F "message={\"type\":\"document\",\"to\":\"5511999999999\",\"caption\":\"Contrato\",\"fileName\":\"contrato.pdf\",\"mimeType\":\"application/pdf\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"Use texto com opções numeradas quando precisar de um fluxo confiável de escolha. O cliente responde com 1, 2 ou com o nome da opção.
curl -X POST \
-H "x-api-key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"type\":\"text\",\"to\":\"5511999999999\",\"text\":\"Olá! Como podemos ajudar?\\n\\nResponda com uma das opções:\\n1 - Financeiro\\n2 - Suporte\\n\\nVocê também pode responder Financeiro ou Suporte.\"}" \
"https://snodr.com/api/integration/instances/INSTANCE_ID/send-message"Liste os grupos em que a instância participa e copie o jid (termina em @g.us) para usar no campo to de uma mensagem de grupo.
curl -H "x-api-key: SUA_API_KEY" "https://snodr.com/api/integration/instances/INSTANCE_ID/groups"Como pensar
Confirma que a API Key é válida e mostra os dados básicos da conta reconhecida.
Lista apenas as instâncias vinculadas à conta da API Key, para você descobrir qual id usar.
Envia texto, imagem ou documento usando a instância informada. Mídias aceitam URL pública em JSON ou upload multipart; payloads antigos apenas com `to` e `text` continuam aceitos.
Lista os grupos do WhatsApp em que a instância participa, retornando o `jid`, o nome (`subject`) e a quantidade de participantes de cada grupo — use o `jid` no campo `to` para enviar mensagens a esse grupo.
Se preferir Postman, copie o comando `curl`, importe na ferramenta e ajuste a API Key, o `INSTANCE_ID`, o número `to` e os campos específicos do tipo escolhido.
O envio depende de uma instância conectada. Se você ainda não conectou o WhatsApp pelo QR Code no painel, Abrir instâncias e conclua isso antes.
A tela Uso da API registra status, tipo, origem da mídia, MIME, tamanho, código do erro e `messageId`, sem armazenar o conteúdo da mensagem ou a URL completa. Abrir Uso da API
Erros padronizados
As rotas `/api/integration/*` retornam erros com um código estável para facilitar tratamento automático.
{
"error": {
"code": "INSTANCE_NOT_CONNECTED",
"message": "A mensagem só pode ser enviada quando a instância estiver conectada.",
"details": {
"instanceId": "INSTANCE_ID"
}
}
}A requisição chegou sem credencial.
Envie a chave em `x-api-key` ou `Authorization: Bearer <key>`.Adicione a API Key no header da requisição.
curl -H "x-api-key: SUA_API_KEY" /api/integration/meA API Key não existe, está errada ou foi excluída.
Gere uma nova chave no painel ou confira se a chave usada não foi revogada.Confira se copiou a chave completa ou gere uma nova API Key no painel.
Authorization: Bearer wapp_live_...A conta vinculada à API Key está inativa.
Regularize a conta antes de tentar novas chamadas.Ative ou regularize a conta antes de chamar a API novamente.
Acesse Minha área > Meu plano para revisar o estado da conta.O envio foi chamado sem telefone de destino.
Informe o telefone de destino em formato internacional no campo `to`.Envie o campo `to` com DDI e DDD, apenas números.
{ "type": "text", "to": "5511999999999", "text": "Olá!" }O envio foi chamado sem texto.
Informe o conteúdo da mensagem no campo `text`.Envie o campo `text` com o conteúdo da mensagem.
{ "type": "text", "to": "5511999999999", "text": "Pedido confirmado." }O campo `type` contém um valor não suportado.
O tipo informado ainda não faz parte do contrato público.Use `text`, `image` ou `document` no campo `type`.
{ "type": "image", "to": "5511999999999", "url": "https://cdn.exemplo.com/foto.jpg" }Uma mensagem de mídia foi enviada como JSON sem URL.
Imagem e documento enviados como JSON precisam do campo `url`.Informe uma URL pública ou envie os campos `file` e `message` como multipart.
{ "type": "document", "to": "5511999999999", "url": "https://cdn.exemplo.com/arquivo.pdf" }O upload contém campos extras, partes demais ou estrutura inválida.
O formulário aceita somente um arquivo e um campo de metadados.Envie exatamente um arquivo no campo `file` e o JSON no campo `message`.
-F "file=@foto.jpg" -F "message={\"type\":\"image\",\"to\":\"5511999999999\"}"O upload excede `INTEGRATION_MEDIA_MAX_FILE_SIZE_BYTES`.
O arquivo ultrapassou o limite de upload da integração.Reduza o arquivo ou use mídia por URL dentro do limite configurado.
Limite padrão: 15 MiBO envio por URL remota está desabilitado no serviço.
O ambiente do WhatsApp não está autorizado a baixar mídia por URL.Habilite mídia remota no serviço ou utilize upload quando ele estiver disponível.
MEDIA_REMOTE_URL_ENABLED=trueA URL aponta ou redireciona para um endereço não permitido.
A proteção contra SSRF bloqueou o endereço resolvido pela URL.Use uma URL pública HTTPS que não resolva para rede local ou privada.
Evite localhost, 127.0.0.1 e endereços de rede privada.A inspeção do arquivo detecta divergência de MIME.
O tipo declarado não corresponde ao conteúdo real do arquivo.Confira o MIME e a extensão declarados ou remova declarações incorretas.
Um PNG não deve ser declarado como application/pdf.O campo `fileName` tenta incluir diretórios.
O nome do documento não pode conter caminho.Use um nome simples, sem diretórios ou caminhos relativos.
Use contrato.pdf, não ../contrato.pdf.O roteamento não alcança a réplica líder do runtime.
A requisição atingiu uma réplica que não lidera a sessão do WhatsApp.Tente novamente; se persistir, acione o suporte com horário e instância.
Consulte Uso da API e informe o messageId ou código do erro.A instância informada não pertence à conta autenticada.
Liste `/instances` novamente e use uma instância vinculada à conta da API Key.Liste as instâncias novamente e use o `id` retornado por `/instances`.
GET /api/integration/instancesA instância existe, mas não está conectada.
Conecte o WhatsApp pelo QR Code antes de enviar mensagens.Volte ao painel, abra a instância e conecte o WhatsApp pelo QR Code.
Depois de conectar, repita o POST /send-message.A API Key excedeu o limite de chamadas por minuto.
Aguarde o tempo indicado em `Retry-After` antes de tentar novamente.Aguarde o tempo indicado pelo header `Retry-After` e tente novamente.
Retry-After: 23O serviço interno de WhatsApp não conseguiu concluir a operação.
Tente novamente. Se persistir, use o log de uso da API para acionar suporte.Tente novamente depois de alguns segundos e confira o log de uso da API.
Use Uso da API para copiar horário, instância e código do erro.