Dispositivo
Um número de WhatsApp conectado à DROPE. Você conecta lendo um QR Code, como no WhatsApp Web, e pode ter vários.
Documentação da API 160 rotas
Um token, uma chamada HTTP e a mensagem chega. Comece pelo passo a passo; a referência completa, com exemplos prontos em cURL, JavaScript, PHP e Python, vem logo depois.
https://dropestore.com/wp-json/wdm/v1
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/text ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "text": "Olá {{first_name}}! Seu pedido #1234 foi confirmado e sai para entrega amanhã.", "delay": 1200, "readchat": true, "track_source": "crm", "track_id": "pedido-1234"}'
"success": true
Mensagem enviada
Comece aqui
Três passos, nenhuma instalação. Se você nunca usou uma API, tudo bem: cada passo diz exatamente o que fazer.
O token é a senha do seu número para a API: é ele que prova que a chamada é sua. Cada número conectado (aqui chamamos de dispositivo) tem o próprio token.
dwa_.Preencha os campos e o código se ajusta sozinho. Depois é só copiar e rodar: o cURL roda direto no terminal; as outras linguagens, no seu projeto.
Com DDI e DDD, só números: 55 + 11 + o número.
O que você digita aqui fica só nesta aba: não é salvo nem enviado a lugar nenhum. Todos os exemplos da página passam a usar o seu token e o seu número.
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/text ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "text": "Olá {{first_name}}! Seu pedido #1234 foi confirmado e sai para entrega amanhã.", "delay": 1200, "readchat": true, "track_source": "crm", "track_id": "pedido-1234"}'Deu certo quando a API responde 200 com success: true. A mensagem chega no WhatsApp do número que você escolheu em poucos segundos.
successtrue quando deu certo, false quando não.data.messageiddata.chatiddata.messageTypetext.{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"messageType": "text",
"messageTimestamp": 1792500000000,
"status": "success",
"wasSentByApi": true
}
}A resposta traz success: false e um code que diz o motivo. Os quatro mais comuns no começo:
TOKEN_INVALID
Token errado ou trocado
O token não existe ou foi substituído por um novo. Copie o token atual do dispositivo no painel.
Número desconectado
O número não está conectado. Leia o QR Code no painel ou use o código de pareamento.
VALIDATION
Parâmetro inválido
Parâmetro faltando, com tipo errado, fora da lista de valores ou do tamanho permitido. Veja a lista errors com cada campo.
RATE_LIMITED
Muitas chamadas seguidas
Você passou do limite de requisições do plano. Espere os segundos indicados em Retry-After.
Comece aqui
Seis palavras que aparecem em toda a documentação. Leia uma vez e o resto fica fácil.
Um número de WhatsApp conectado à DROPE. Você conecta lendo um QR Code, como no WhatsApp Web, e pode ter vários.
A senha de um dispositivo para a API. Vai no header token de toda chamada e começa com dwa_.
Uma senha da conta inteira, só para criar e gerenciar dispositivos pela API. Vai em Authorization: Bearer e começa com dwk_.
Para quem a mensagem vai, no campo number. JID é o endereço completo de uma conversa no WhatsApp.
5511999999999120363000000000000@g.us120363000000000000@newsletterUm endereço do seu sistema que a DROPE chama quando algo acontece: mensagem recebida, entregue ou lida. É assim que você recebe mensagens, sem ficar perguntando.
Sempre JSON com success. Deu certo: os dados vêm em data. Deu errado: code diz o motivo e error explica em português.
Guias
Escolha o que você quer fazer. Cada guia é curto, tem o código pronto e aponta a rota certa na referência.
Guia
Texto você já enviou no Comece aqui. Para imagem, vídeo, áudio ou documento, use POST/send/media: o mesmo number, mais o type da mídia e o file, que pode ser uma URL pública ou o arquivo em base64.
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/media ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "type": "image", "file": "https://seusite.com.br/img/promo-outubro.jpg" , "text": "Promoção válida até domingo. Responda QUERO para garantir a sua."}'typeimagevideovideoplaydocumentaudiomyaudiopttptvstickerPrefira URL a base64. A chamada fica menor e mais rápida, e não esbarra no tamanho máximo do corpo. A URL precisa ser pública: o servidor da API baixa o arquivo dela.
Botões, listas, enquetes, contato, localização e PIX têm rota própria, com o mesmo number:
Guia
A API não fica de conversa aberta com o seu sistema: quando algo acontece no número, ela chama o seu webhook com um POST em JSON.
Uma rota do seu sistema que aceite POST, em https:// e acessível pela internet, como https://seu-sistema.com/webhook. Endereços de rede interna são recusados.
Com POST/webhook, escolha a url e os events que quer receber. Inclua wasSentByApi em excludeMessages para não receber de volta o que o seu sistema enviou.
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/webhook ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "enabled": true, "url": "https://seusite.com.br/webhooks/whatsapp" , "events": [ "messages", "messages_update", "connection" ], "excludeMessages": [ "wasSentByApi" ], "addUrlEvents": false, "addUrlTypesMessages": false}'A resposta traz o segredo de assinatura do webhook. Ele aparece só nessa hora: guarde no servidor.
Toda entrega vem com o header X-DROPE-Signature. Calcule o HMAC-SHA256 do corpo cru com o segredo e compare: se não bater, recuse. Responda 200 primeiro e processe depois.
const crypto = require('node:crypto');const http = require('node:http');const SECRET = process.env.DROPE_WEBHOOK_SECRET;function assinaturaValida(raw, recebida) { const esperada = 'sha256=' + crypto.createHmac('sha256', SECRET).update(raw).digest('hex'); const a = Buffer.from(esperada); const b = Buffer.from(recebida || ''); return a.length === b.length && crypto.timingSafeEqual(a, b);}http.createServer((req, res) => { const partes = []; req.on('data', (c) => partes.push(c)); req.on('end', () => { const raw = Buffer.concat(partes); // corpo cru, antes de qualquer JSON.parse if (!assinaturaValida(raw, req.headers['x-drope-signature'])) { res.writeHead(401); return res.end(); } res.writeHead(200); res.end('ok'); // responda primeiro const evento = JSON.parse(raw.toString('utf8')); setImmediate(() => processar(evento)); // processe depois });}).listen(3000);<?php$secret = getenv('DROPE_WEBHOOK_SECRET');$raw = file_get_contents('php://input' ); // corpo cru $esperada = 'sha256=' . hash_hmac('sha256', $raw, $secret);$recebida = $_SERVER['HTTP_X_DROPE_SIGNATURE'] ?? '';if (!hash_equals($esperada, $recebida)) { http_response_code(401); exit;}http_response_code(200);echo 'ok';if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); // libera a resposta antes de processar }$evento = json_decode($raw, true);// processe o evento aqui ou coloque numa fila import hashlibimport hmacimport osfrom flask import Flask, requestapp = Flask(__name__)SECRET = os.environ['DROPE_WEBHOOK_SECRET'].encode()@app.post('/webhook' )def webhook(): raw = request.get_data() # corpo cru esperada = 'sha256=' + hmac.new(SECRET, raw, hashlib.sha256).hexdigest() recebida = request.headers.get('X-DROPE-Signature', '') if not hmac.compare_digest(esperada, recebida): return '', 401 fila.put(request.get_json()) # processe fora da requisição return 'ok', 200Guia
Para mandar a mesma mensagem a uma lista, não faça um laço chamando o envio contato por contato. Crie uma campanha: ela entra numa fila, espera um intervalo sorteado entre cada envio (delayMin e delayMax, em segundos) e pode ser pausada e acompanhada. Isso protege o seu número.
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/simple ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "numbers": [ "5511999999999", "5521988887777", "5531977776666" ], "type": "text", "folder": "Black Friday 2026", "info": "Aviso de abertura da Black Friday", "delayMin": 10, "delayMax": 30, "scheduled_for": 1795780800000, "text": "Oi! A Black Friday da loja começou. Veja as ofertas: https://seusite.com.br/black-friday" , "linkPreview": true}'Variações de texto. Escreva {Olá|Oi} e cada pessoa recebe uma das opções. Mensagens menos repetidas ajudam a manter o número saudável. Cada destinatário conta 1 mensagem.
Guia
Todo grupo tem um JID terminado em @g.us. É com ele que você envia mensagens para o grupo (no mesmo campo number) e administra participantes.
Crie com POST/group/create ou encontre um existente com POST/group/list. As duas respostas trazem o JID.
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/create ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Equipe de Vendas", "participants": [ "5511999999999", "5521987654321" ]}'Use qualquer rota de envio, como POST/send/text, com o JID do grupo em number.
{
"number": "120363000000000000@g.us",
"text": "Bom dia, pessoal!"
}Com POST/group/updateParticipants você adiciona, remove, promove a administrador e aprova pedidos de entrada. O número conectado precisa ser administrador do grupo.
Valores de actionaddremovepromotedemoteapprovereject
Fundamentos
Há duas credenciais. Cada rota diz qual usa, no selo de autenticação.
Começa com dwa_
token: SEU_TOKENComeça com dwk_
Authorization: Bearer SUA_CHAVE/devices.Guarde as credenciais no servidor. Nunca coloque token ou chave em código que roda no navegador ou no aplicativo do cliente: quem tem o token envia mensagens pelo seu número. Se vazar, gere um novo no painel; o anterior para de funcionar na hora.
Fundamentos
Toda resposta tem o mesmo envelope, então o seu código trata sucesso e erro de um jeito só.
Em caso de sucesso, success é true e o conteúdo vem em data. Em caso de erro, success é false, error traz uma mensagem em português para mostrar ou registrar e code traz um código estável para o seu programa decidir o que fazer.
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"messageType": "text",
"messageTimestamp": 1792500000000,
"status": "success",
"wasSentByApi": true
}
}{
"success": false,
"error": "O campo number é obrigatório.",
"code": "VALIDATION",
"request_id": "9f2c4e1a7b3d5f60",
"errors": [
{
"field": "number",
"message": "Obrigatório."
}
]
}O request_id identifica a chamada. Ele vem no corpo dos erros e no header X-Request-Id de toda resposta: registre esse valor e informe ao suporte quando precisar de ajuda com uma chamada específica.
reasonSe quem recusou o pedido foi o WhatsApp, a resposta pode trazer também reason: a chave estável do motivo informada por ele (só letras minúsculas, números e _), como instance_not_paired. Decida primeiro pelo code do nosso catálogo; use o reason quando precisar do detalhe. Ele só aparece quando existe.
{
"success": false,
"error": "O dispositivo não está conectado ao WhatsApp. Conecte pelo QR Code e tente de novo.",
"code": "DEVICE_DISCONNECTED",
"reason": "instance_not_paired",
"request_id": "5d1e8a0f3c27b946"
}Algumas rotas antigas de gerenciamento mantêm o formato que já tinham, para não quebrar integrações existentes. O exemplo de resposta de cada rota mostra o formato exato.
X-Request-IdSemprerequest_id.X-RateLimit-LimitRotas com limiteX-RateLimit-RemainingRotas com limiteX-RateLimit-ResetRotas com limiteRetry-AfterRespostas 429retry_after no corpo.Cache-Control: no-storeSempreFundamentos
O limite vale por dispositivo e funciona como um balde: cabem algumas chamadas seguidas (a rajada) e o balde volta a encher no ritmo de chamadas por segundo do plano.
Teste grátis
1chamadas por segundo
1 dia, todas as rotas, até 100 mensagens.
Beginner
3chamadas por segundo
Sem limite de mensagens.
Growth
6chamadas por segundo
Sem limite de mensagens.
Business
10chamadas por segundo
Sem limite de mensagens.
Teste grátis de 1 dia com todas as rotas liberadas e até 100 mensagens. Se você não assinar um plano até o fim do teste, os dispositivos são desconectados e excluídos automaticamente.
As rotas de gerenciamento da conta (/devices, com a chave da conta) têm um limite à parte: 60 chamadas por minuto por conta.
Passou do limite, a API responde 429 com o código RATE_LIMITED e o header Retry-After. Espere esse tempo antes de repetir. Para enviar para muitos contatos, use campanhas: elas entram numa fila e respeitam os intervalos sozinhas.
{
"success": false,
"error": "Muitas chamadas em pouco tempo. Tente de novo em 1 segundo.",
"code": "RATE_LIMITED",
"request_id": "0b7e91c2d4a85f13",
"retry_after": 1
}Fundamentos
TRIAL_LIMIT, sem enviar parte dela.Cada rota mostra no selo de mensagens se conta ou não.
Fundamentos
Cada rota aceita um corpo de até um certo tamanho. Acima dele, a resposta é 413 com PAYLOAD_TOO_LARGE, antes de qualquer processamento.
Para mídia, prefira enviar a URL pública do arquivo em vez do conteúdo em base64: a chamada fica menor e mais rápida.
Fundamentos
Decida pelo code do corpo, não só pelo status: o mesmo status pode ter causas diferentes (um 429 pode ser o limite do plano ou o limite do teste).
Fundamentos
Todos os códigos que a API devolve no campo code, com o que significam e o que fazer. Os códigos são estáveis; o texto em error pode mudar. Quando o erro vem do WhatsApp, a resposta pode trazer também reason, a chave do motivo informada por ele (veja como usar).
TOKEN_MISSING
401
Faltou o token
O header token (ou a chave da conta, nas rotas de conta) não foi enviado. Envie o token do dispositivo no header token.
Mensagem padrãoInforme o token do dispositivo no header token.
TOKEN_INVALID
401
Token errado ou trocado
O token não existe ou foi substituído por um novo. Copie o token atual do dispositivo no painel.
Mensagem padrãoToken inválido.
API_KEY_INVALID
401
Chave da conta errada
A chave enviada em Authorization: Bearer não existe ou foi trocada. Gere ou copie a chave atual no painel.
Mensagem padrãoChave da conta inválida.
SESSION_REQUIRED
401
Só pelo painel
Rota exclusiva do painel: exige estar logado e o nonce da sessão.
Mensagem padrãoEntre na sua conta para continuar.
PLAN_INACTIVE
403
Plano inativo
A conta não tem plano ativo com WhatsApp. Assine ou renove um plano para voltar a usar a API.
Mensagem padrãoSeu plano não inclui a API de WhatsApp ou está vencido.
TRIAL_EXPIRED
403
Teste grátis encerrado
O período de 24 horas do teste grátis acabou. Assine um plano para continuar usando a API.
Mensagem padrãoO teste grátis de 24 horas terminou. Assine um plano para continuar.
DEVICE_SUSPENDED
403
Dispositivo suspenso
A conta tem mais dispositivos do que o plano permite; os mais recentes ficam suspensos. Apague um dispositivo ou aumente o limite com dispositivos extras.
Mensagem padrãoEste dispositivo está suspenso porque a conta passou do limite do plano.
DEVICE_LIMIT
403
Limite de dispositivos
Não é possível criar outro dispositivo no plano atual. Apague um dispositivo ou adicione dispositivos extras.
Mensagem padrãoLimite de dispositivos do plano atingido.
FORBIDDEN
403
Sem permissão
O recurso pertence a outra conta ou a ação não é permitida para este acesso.
Mensagem padrãoVocê não tem permissão para esta ação.
NOT_FOUND
404
Não encontrado
A rota ou o recurso pedido não existe.
Mensagem padrãoRecurso não encontrado.
DEVICE_NOT_FOUND
404
Dispositivo não encontrado
Nenhum dispositivo da conta tem esse identificador ou nome.
Mensagem padrãoDispositivo não encontrado.
METHOD_NOT_ALLOWED
405
Método errado
A rota existe, mas não aceita esse método HTTP.
Mensagem padrãoMétodo não permitido nesta rota.
CONFLICT
409
Conflito
Nome repetido ou outra operação igual em andamento. Confira os dados ou tente de novo em instantes.
Mensagem padrãoConflito com o estado atual.
PAYLOAD_TOO_LARGE
413
Corpo grande demais
Reduza o tamanho do corpo ou envie a mídia por URL.
Mensagem padrãoO corpo da requisição passou do tamanho máximo desta rota.
VALIDATION
422
Parâmetro inválido
Parâmetro faltando, com tipo errado, fora da lista de valores ou do tamanho permitido. Veja a lista errors com cada campo.
Mensagem padrãoAlguns parâmetros não estão corretos.
INVALID_JSON
400
JSON inválido
Envie um objeto JSON válido com Content-Type: application/json.
Mensagem padrãoO corpo enviado não é um JSON válido.
RATE_LIMITED
429
Muitas chamadas seguidas
Você passou do limite de requisições do plano. Espere os segundos indicados em Retry-After.
Mensagem padrãoMuitas requisições. Aguarde um instante e tente de novo.
TRIAL_LIMIT
429
Mensagens do teste esgotadas
O teste grátis tem teto de 100 mensagens por conta. Assine um plano para continuar enviando.
Mensagem padrãoO teste grátis permite 100 mensagens e o limite foi atingido. Assine um plano para continuar enviando.
WHATSAPP_REJECTED
400
Recusado pelo WhatsApp
O WhatsApp não aceitou o pedido. A mensagem explica o motivo; corrija os dados e tente de novo.
Mensagem padrãoO WhatsApp recusou o pedido.
WHATSAPP_NOT_FOUND
404
Não existe no WhatsApp
O contato, grupo, mensagem ou recurso pedido não existe no WhatsApp.
Mensagem padrãoNão encontrado no WhatsApp.
WHATSAPP_CONFLICT
409
Conflito no WhatsApp
O pedido conflita com o estado atual no WhatsApp (ex.: já existe, já foi feito).
Mensagem padrãoO WhatsApp informou um conflito com o estado atual.
WHATSAPP_FORBIDDEN
403
WhatsApp não permitiu
Falta permissão no WhatsApp (ex.: o número não é administrador do grupo).
Mensagem padrãoO WhatsApp não permitiu esta ação.
DEVICE_DISCONNECTED
409
Número desconectado
O número não está conectado. Leia o QR Code no painel ou use o código de pareamento.
Mensagem padrãoO dispositivo não está conectado ao WhatsApp. Conecte pelo QR Code e tente de novo.
PROVIDER_BUSY
429
WhatsApp ocupado
Limite temporário do serviço de WhatsApp. Espere os segundos indicados em Retry-After.
Mensagem padrãoO serviço do WhatsApp está ocupado. Tente de novo em instantes.
PROVIDER_ERROR
502
Falha temporária
Falha temporária do serviço de WhatsApp. Tente de novo em instantes; se persistir, fale com o suporte informando o request_id.
Mensagem padrãoO serviço do WhatsApp não respondeu como esperado. Tente de novo em instantes.
PROVIDER_TIMEOUT
504
Tempo esgotado
Tempo de resposta esgotado. Tente de novo; para envios grandes, prefira campanhas.
Mensagem padrãoO serviço do WhatsApp demorou demais para responder. Tente de novo em instantes.
INTERNAL
500
Erro interno
Erro inesperado do nosso lado. Se persistir, fale com o suporte informando o request_id.
Mensagem padrãoErro interno. Tente de novo em instantes.
Fundamentos
Tudo o que acontece no número chega pelo webhook. O passo a passo está no guia Receber mensagens; aqui ficam os detalhes.
O WhatsApp avisa a DROPE do evento.
A DROPE organiza o evento, coloca numa fila e entrega à sua URL com um POST em JSON.
Seu sistema responde 2xx. Qualquer outra resposta, ou nenhuma em 8 segundos, conta como falha e a entrega é repetida.
Você pode ter mais de um webhook por dispositivo, cada um com seus eventos e filtros.
Escolha os eventos em events. Só os escolhidos são entregues.
connectionhistorymessagesmessages_updatenewsletter_messagesstatus_postscallcontactspresencegroupslabelschatschat_labelssenderUse excludeMessages para não receber certos tipos de mensagem. O mais comum é wasSentByApi, que evita receber de volta o que o seu próprio sistema enviou (e cair num laço de respostas automáticas).
wasSentByApiwasNotSentByApifromMeYesfromMeNoisGroupYesisGroupNoCom addUrlEvents ligado, o nome do evento é acrescentado ao fim da sua URL. Com addUrlTypesMessages, o tipo da mensagem também. Isso ajuda a separar rotas no seu sistema sem ler o corpo.
https://seu-sistema.com/webhookaddUrlEventshttps://seu-sistema.com/webhook/messagesaddUrlEvents e addUrlTypesMessageshttps://seu-sistema.com/webhook/messages/conversationUser-AgentDROPE-Webhook/2.0X-DROPE-Eventmessages.X-DROPE-DeliveryX-DROPE-Signaturesha256= seguido do HMAC-SHA256 do corpo, em hexadecimal, calculado com o segredo de assinatura do webhook. Veja como conferir a assinatura.Se a entrega falhar, ela é repetida nestes intervalos. Depois da última, a entrega é descartada e registrada; consulte as falhas recentes com GET/webhook/errors.
Responda 200 rápido. Confirme o recebimento primeiro e processe depois, numa fila ou em segundo plano. Um webhook que demora a responder acumula repetições e atrasa os próximos eventos.
Fundamentos
429, espere o tempo indicado. Em 502 e 504, tente de novo com espera crescente (1 s, 2 s, 4 s), no máximo algumas vezes.messages ou pela busca de mensagens, usando o track_id que você mandou no envio.X-DROPE-Delivery para ignorar entregas repetidas.request_id das respostas com erro. Com ele o suporte encontra a chamada em segundos.Fundamentos
Os dispositivos criados antes da versão 2.0 da API tinham outro formato de token. Esse token antigo continua funcionando em todas as rotas, sem nenhuma mudança na sua integração, até você gerar um token novo.
No painel, abra o cartão do dispositivo e clique em Gerar novo token
. Pela API, use POST/devices/{id}/token/rotate.
Troque o token na sua integração. O novo começa com dwa_.
A partir desse momento o token antigo para de funcionar e passa a receber TOKEN_INVALID.
Os caminhos das rotas, o header token e o envelope success/data não mudaram. A chave da conta pode ser trocada pelo painel ou por POST/token/refresh; a anterior deixa de valer na hora.
Referência
160 rotas em 20 grupos, na ordem em que uma integração costuma precisar delas. Cada rota tem parâmetros, exemplo pronto em quatro linguagens e a resposta esperada.
Referência 13
Texto, mídia, botões, listas, enquetes, localização, PIX e mais.
Rotas para enviar mensagens de vários tipos (texto, mídia, contato, localização, menus interativos, carrossel, status, cobranças e eventos), mostrar "Digitando..." no chat e atualizar pedidos cobrados. O destino vai em number: telefone no formato internacional (5511999999999), contato (@s.whatsapp.net ou @lid), grupo (@g.us) ou, onde a rota indica, canal (@newsletter).
As rotas de envio aceitam os campos opcionais comuns listados neste grupo. Cada rota mostra, na própria lista de parâmetros, quais ela aceita: forward, por exemplo, não existe nos menus, no botão de localização, no botão PIX, na cobrança nem no evento. O status, a presença e a atualização de pedido não usam esses campos (na presença, delay é a duração).
Use em number o ID do grupo, que termina em @g.us (ex.: 120363012345678901@g.us). Para descobrir o ID, use o chatid recebido no webhook quando alguém escreve no grupo ou liste os grupos com GET /group/list.
mentions recebe números separados por vírgula e só vale em grupos. Para mencionar todos, inclua @all ou @todos no próprio texto (@todos vira @all antes do envio); "all" em mentions também menciona todos, por compatibilidade.
Os campos de texto que indicam esse recurso aceitam variáveis, trocados pelos dados do chat no envio:
{{name}}: nome do chat, na primeira opção disponível entre nome do lead (lead_name), nome completo do lead (lead_fullName), nome do contato no WhatsApp (wa_contactName) e nome do perfil (wa_name);{{first_name}}: primeira palavra válida desse nome (com pelo menos 2 caracteres);{{wa_name}} e {{wa_contactName}}: nome do perfil e nome do contato salvo no WhatsApp;{{lead_name}}, {{lead_fullName}}, {{lead_personalid}} (CPF, CNPJ etc.), {{lead_email}}, {{lead_status}}, {{lead_notes}} e {{lead_assignedAttendant_id}} (ID do atendente designado): dados do lead;{{lead_field01}} a {{lead_field20}}: os 20 campos personalizados.O rótulo de um campo personalizado, definido em POST /instance/updateFieldsMap, não cria outro variável: mesmo que lead_field01 se chame "empresa", use {{lead_field01}}, não {{empresa}}. Exemplo: Olá {{first_name}}! Empresa: {{lead_field01}}. Para ver os dados de um chat antes de enviar, use POST /chat/find.
O WhatsApp pode recusar novas conversas por regras próprias de volume, qualidade ou limitação temporária. Nesse caso, o envio é recusado e a mensagem de erro explica o motivo. Para ver o estado atual desses limites na conta conectada, use GET /instance/wa_messages_limits.
Valem nas rotas deste grupo que os listam nos próprios parâmetros.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalNúmeros a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade. Só em grupos (number terminando em @g.us).
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
/send/text
/send/media
/send/contact
/send/location
/message/presence
/send/status
/send/menu
/send/carousel
/send/location-button
/send/request-payment
/message/payment/status
/send/pix-button
/send/event
/send/text
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Envia uma mensagem de texto para um contato, grupo ou canal/newsletter.
Para enviar texto para um canal, use o mesmo campo number, mas informe o JID completo do canal:
120363123456789012@newsletter{
"number": "120363123456789012@newsletter",
"text": "Post publicado no canal"
}Use este mesma rota para responder uma mensagem interativa que esteja salva no histórico local do dispositivo. Envie:
number: chat onde a mensagem original foi recebida ou enviada;replyid: ID da mensagem interativa original;text: seleção iniciada por >.O marcador > é obrigatório para gerar uma resposta interativa. Sem ele, a API envia apenas uma mensagem de texto citando a original.
Use a posição da opção, começando em 1. Nesta documentação pública, responda somente uma opção por requisição.
{
"number": "5511999999999",
"replyid": "3EB0ID_DA_ENQUETE",
"text": ">1"
}Prefira o rowId configurado ao criar a lista. Também são aceitos o texto exato do item ou sua posição (>1).
{
"number": "5511999999999",
"replyid": "3EB0ID_DA_LISTA",
"text": ">plano_pro"
}Prefira o ID do botão de resposta rápida. Também são aceitos o texto exato exibido ou sua posição (>1). Isso vale para botões rápidos legados, templates, native flow e carrossel. Botões de URL, ligação ou cópia executam a própria ação e não são respondidos por este fluxo.
{
"number": "5511999999999",
"replyid": "3EB0ID_DOS_BOTOES",
"text": ">confirmar"
}A API devolve erro quando a mensagem original não está disponível ou a opção informada não existe.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id e async. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
{
"number": "5511999999999",
"text": "Confira: https://exemplo.com",
"linkPreview": true
}{
"number": "5511999999999",
"text": "Confira nosso site! https://exemplo.com",
"linkPreview": true,
"linkPreviewTitle": "Título Personalizado",
"linkPreviewDescription": "Uma descrição personalizada do link",
"linkPreviewImage": "https://exemplo.com/imagem.jpg",
"linkPreviewLarge": true
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioTelefone no formato internacional, @s.whatsapp.net, @lid, grupo @g.us ou canal @newsletter.
ID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid) ou um ID de canal/newsletter (@newsletter).
texttextoobrigatórioPara responder enquete, lista ou botão: comece com ">" (">1", ">plano_pro") e informe replyid. Sem ">", sai só uma mensagem citando a original.
Texto da mensagem. Para responder enquete, lista ou botão, use uma seleção iniciada por > junto com replyid. Aceita variáveis em mensagens de texto comuns.
linkPreviewbooleanoopcionalAtiva a prévia de links. Com true, gera a prévia do primeiro link do texto. Com linkPreviewTitle, linkPreviewDescription ou linkPreviewImage, usa esses valores, e os que faltarem vêm do próprio link. Título ou descrição só com espaço saem da prévia, sem buscar no link.
linkPreviewTitletextoopcionalSó tem efeito com linkPreview=true. Vazio usa o título do link; " " (um espaço) tira o título.
Define um título personalizado para o prévia do link. Vazio usa o título do link; só com espaço (" "), o prévia sai sem título.
linkPreviewDescriptiontextoopcionalSó tem efeito com linkPreview=true. Vazia usa a descrição do link; " " (um espaço) tira a descrição.
Define uma descrição personalizada para o prévia do link. Vazia usa a descrição do link; só com espaço (" "), o prévia sai sem descrição.
linkPreviewImagetextoopcionalSó tem efeito com linkPreview=true.
URL ou Base64 da imagem para usar no prévia do link
linkPreviewLargebooleanoopcionalSó tem efeito com linkPreview=true.
Se true, gera um prévia grande com upload da imagem. Se false, gera um prévia pequeno sem upload
replyidtextocondicionalObrigatório para responder enquete, lista ou botão (text começando com ">").
ID da mensagem a responder, que precisa estar no histórico do dispositivo. Com text iniciado por ">", gera a resposta nativa de enquete, lista ou botão quando o tipo original é suportado.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de requisições excedido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/text ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "text": "Olá {{first_name}}! Seu pedido #1234 foi confirmado e sai para entrega amanhã.", "delay": 1200, "readchat": true, "track_source": "crm", "track_id": "pedido-1234"}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Message sent successfully"
}
}
}/send/media
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Envia imagem, vídeo, áudio, documento ou figurinha para um contato, grupo ou canal. O arquivo vai em file, por URL ou base64.
type)image: imagem (de preferência JPG)video: vídeo (só MP4)videoplay: vídeo com reprodução automática em loop no WhatsAppdocument: documento (PDF, DOCX, XLSX etc.)audio: áudio comum (MP3 ou OGG)myaudio: mensagem de voz (alternativa ao ptt)ptt: mensagem de vozptv: mensagem de vídeosticker: figurinhaA compressão é ajustada conforme o tipo.
text é a legenda e aceita variáveis.docName dá nome ao arquivo e só vale em document.thumbnail vale em image, video, videoplay, ptv e document: URL HTTP/HTTPS, Data URL ou base64 de imagem com até 1 MiB e 4096 px por lado. A API converte para JPEG e usa essa imagem no lugar da miniatura automática.thumbnail recebem miniatura automática; documentos sem thumbnail ficam sem miniatura. Para documentos, use uma imagem de pelo menos 480 px, para uma prévia nítida no WhatsApp Web. Ao reenviar o mesmo documento, reutilize a mesma miniatura: o WhatsApp pode associar a prévia ao conteúdo do arquivo também em mensagens antigas.viewOnce (visualização única) tem efeito em image, video, videoplay, ptv, audio, myaudio e ptt; em document e sticker é ignorado sem erro.mimetype é opcional: o tipo do arquivo é detectado automaticamente.Nesta rota, o corpo da requisição aceita até 20 MB, com o base64 incluído; acima disso, a resposta é 413. Com URL, só o endereço conta nesse limite.
Para publicar num canal, informe em number o ID completo do canal, como 120363123456789012@newsletter.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id e async. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioTelefone no formato internacional, @s.whatsapp.net, @lid, grupo @g.us ou canal @newsletter.
ID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid) ou um ID de canal/newsletter (@newsletter).
typetextoobrigatórioImage (de preferência JPG), video (só MP4), videoplay (vídeo em loop), document (PDF, DOCX, XLSX...), audio (MP3 ou OGG), myaudio e ptt (mensagem de voz), ptv (mensagem de vídeo) ou sticker (figurinha).
Tipo de mídia (image, video, videoplay, document, audio, myaudio, ptt, ptv, sticker)
filetextoobrigatórioObrigatório em qualquer type. URL pública (a API precisa conseguir baixar o arquivo) ou base64; o corpo inteiro aceita até 20 MB.
URL ou base64 do arquivo
texttextoopcionalLegenda da mídia; aceita variáveis.
Texto descritivo (caption) - aceita variáveis
docNametextoopcionalSó em type=document.
Nome do arquivo (apenas para documents)
thumbnailtextoopcionalSó em image, video, videoplay, ptv e document. URL HTTP/HTTPS, Data URL ou base64 de até 1 MiB e 4096 px por lado, convertida para JPEG. Em document, sem thumbnail não há miniatura; use pelo menos 480 px.
URL HTTP/HTTPS, Data URL ou base64 de imagem para image, video, videoplay, ptv e document. Até 1 MiB e 4096 px por dimensão. Tem prioridade sobre a miniatura automática; documentos sem este campo não recebem miniatura automática.
mimetypetextoopcionalOpcional; detectado automaticamente.
MIME type do arquivo (opcional, detectado automaticamente)
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
viewOncebooleanoopcionalSó tem efeito em image, video, videoplay, ptv, audio, myaudio e ptt; em document e sticker é ignorado.
Recomendado para mídia com visualização única em tipos compatíveis (image, video, videoplay, ptv, audio, myaudio, ptt). Em tipos não compatíveis, o campo é ignorado silenciosamente.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE). Caso do WhatsApp (413): Arquivo muito grande.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/media ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "type": "image", "file": "https://seusite.com.br/img/promo-outubro.jpg" , "text": "Promoção válida até domingo. Responda QUERO para garantir a sua."}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Media sent successfully",
"fileUrl": "https://mmg.whatsapp.net/..."
}
}
}/send/contact
No teste grátis, entra no limite de mensagens.
Envia um cartão de contato (vCard) para um contato ou grupo.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id e async. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
{
"number": "5511999999999",
"fullName": "João Silva",
"phoneNumber": "5511999999999,5511888888888",
"organization": "Empresa XYZ",
"email": "joao.silva@empresa.com",
"url": "https://empresa.com/joao"
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioTelefone no formato internacional, @s.whatsapp.net, @lid ou grupo @g.us.
ID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
fullNametextoobrigatórioNome completo do contato
phoneNumbertextoobrigatórioUm ou mais números, separados por vírgula.
Números de telefone (separados por vírgula)
organizationtextoopcionalNome da organização/empresa
emailtextoopcionalEndereço de email
urltextoopcionalURL pessoal ou da empresa
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de requisições excedido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/contact ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "fullName": "Mariana Souza", "phoneNumber": "5511987654321,551133334444", "organization": "Souza Contabilidade", "email": "mariana@souzacontabil.com.br", "url": "https://seusite.com.br/contato" }'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Contact card sent successfully"
}
}
}/send/location
No teste grátis, entra no limite de mensagens.
Envia uma localização geográfica para um contato ou grupo.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id e async. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
{
"number": "5511999999999",
"name": "Maracanã",
"address": "Av. Pres. Castelo Branco - Maracanã, Rio de Janeiro - RJ",
"latitude": -22.912982815767986,
"longitude": -43.23028153499254
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
latitudenúmeroobrigatórioDe -90 a 90.
Latitude (-90 a 90)
longitudenúmeroobrigatórioDe -180 a 180.
Longitude (-180 a 180)
nametextoopcionalNome do local
addresstextoopcionalEndereço do local
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de requisições excedido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/location ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "name": "Loja Paulista", "address": "Av. Paulista, 1578, Bela Vista, São Paulo, SP", "latitude": -23.5616, "longitude": -46.6562}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Location sent successfully"
}
}
}/message/presence
Envia uma atualização de presença para um contato ou grupo de forma assíncrona.
{
"number": "5511999999999",
"presence": "composing",
"delay": 30000
}{
"number": "5511999999999",
"presence": "recording",
"delay": 60000
}{
"number": "5511999999999",
"presence": "paused"
}{
"number": "5511999999999",
"presence": "composing"
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero do destinatário no formato internacional (ex: 5511999999999)
presencetextoobrigatórioComposing (digitando), recording (gravando áudio) ou paused (cancela a presença atual). Enviar uma mensagem ao mesmo chat também cancela.
Tipo de presença a ser enviada
delayinteiroopcionalMáximo 300000 (5 minutos).
Duração da presença em milissegundos (aqui não é atraso de envio). Até 300000 (5 minutos); sem o campo, a presença dura 5 minutos. Durante o período, ela é reenviada a cada 10 segundos.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/presence ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "presence": "composing", "delay": 30000}'Resposta
{
"success": true,
"data": {
"response": "Chat presence sent successfully"
}
}/send/status
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Publica um status (stories) do WhatsApp com texto, imagem, vídeo ou áudio.
recipients, max_recipients nem group.recipients. A API aproveita os válidos e descarta os inválidos, com o motivo em debug.max_recipients para limitar a audiência ou para pôr um teto sobre recipients.group com o ID do grupo (@g.us).recipients)@s.whatsapp.net e IDs @lid.@lid é convertido para o número (@s.whatsapp.net) pelos vínculos que o dispositivo conhece; se não der, o item é descartado com o motivo lid_unresolved.@lid de um mesmo contato contam como o mesmo destinatário quando o vínculo é conhecido.debug.discarded_recipients, com motivos como invalid_format, lid_unresolved, not_on_whatsapp, outside_status_audience e duplicate.400 quando não sobra nenhum destinatário válido.max_recipients)Há casos em que o WhatsApp bloqueia na hora o envio de status para audiências muito grandes (agendas com milhares de contatos, como cerca de 3.000). A causa exata ainda não é conhecida: comece com limites menores e aumente aos poucos. Com recipients, o valor vira um teto sobre a lista já validada. Não pode ser negativo.
Com group, o status é publicado no grupo e aparece para os membros na aba Status, no lugar do status da conta. A conta precisa participar do grupo.
audio, ptt e myaudio) retorna 400.recipients nem com max_recipients (retorna 400).Id, content, messageTimestamp e status, sem debug.text: texto com cor de fundo (background_color) e fonte (font), com até 656 caracteres.image e video: legenda opcional em text.audio: áudio comum; myaudio e ptt: áudio enviado como voz.image, video, audio, myaudio e ptt), file é obrigatório.background_color)Informe um valor de 1 a 19; a API converte o índice para a cor usada pelo WhatsApp.
1: amarelo esverdeado suave2: amarelo pálido3: amarelo alaranjado vibrante4: verde vibrante5: verde musgo6: verde claro7: azul piscina8: azul intenso9: azul claro acinzentado10: lilás claro11: lilás quente12: roxo azulado13: magenta profundo14: rosa suave15: salmão rosado16: marrom claro17: cinza claro azulado18: cinza médio19: cinza profundo (padrão)font)Só em type=text. Valores aceitos: 0, 1, 2, 6, 7, 8, 9 e 10.
Um objeto JSON com Content-Type: application/json.
typetextoobrigatórioText, image, video, audio, myaudio ou ptt. Em status de grupo (group), áudio (audio, myaudio e ptt) retorna 400.
Tipo do status.
texttextoopcionalEm type=text é o texto do status (até 656 caracteres); em image e video é a legenda.
Texto principal ou legenda.
background_colorinteiroopcionalSó em type=text. De 1 a 19 (19, cinza profundo, é o padrão).
Índice da cor de fundo para status em texto.
fontinteiroopcionalSó em type=text. Valores 0, 1, 2, 6, 7, 8, 9 ou 10.
Fonte aceita para type=text.
filetextocondicionalObrigatório quando type é image, video, audio, myaudio ou ptt.
URL ou base64 do arquivo de mídia.
thumbnailtextoopcionalAceito, mas a miniatura é gerada automaticamente quando necessário.
Campo aceito no corpo; a API gera a miniatura automaticamente quando necessário.
mimetypetextoopcionalMIME type do arquivo, quando necessário.
recipientslista de textosopcionalNão combina com group (400). Itens inválidos são descartados com o motivo em debug.discarded_recipients; 400 só se não sobrar nenhum.
Lista explícita de destinatários. Aceita números em formato WhatsApp, JIDs @s.whatsapp.net e JIDs @lid. A API valida item a item, descarta os inválidos com motivo no debug e envia para o subconjunto válido restante. Entradas @lid dependem de resolução conhecida para PN.
max_recipientsinteiroopcionalNão pode ser negativo. Não combina com group (400). Com recipients, vira um teto sobre a lista válida.
Limita o envio a um subconjunto determinístico da audiência. Quando recipients for informado, funciona como cap de segurança sobre a lista explícita já validada.
grouptextoopcionalID @g.us de um grupo do qual a conta participa. Não combina com recipients nem max_recipients; só text, image e video.
JID do grupo (@g.us). Publica o status no grupo, para os membros, em vez do status da conta. Não combina com recipients nem max_recipients. Só texto, imagem e vídeo: áudio retorna 400.
file é obrigatório quando type é image, video, audio, myaudio ou ptt.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/status ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "type": "text", "text": "Hoje tem frete grátis em todo o site. Aproveite!", "background_color": 7, "font": 1}'Resposta
{
"success": true,
"data": {
"Id": "ABCD1234",
"content": [],
"messageTimestamp": 1672531200000,
"status": "Pending",
"debug": {
"status_privacy_type": "contacts",
"audience_recipient_count": 245,
"total_contacts_in_store": 300,
"contacts_with_full_name": 245,
"contacts_with_push_name_only": 32,
"contacts_with_business_name_only": 23,
"used_default_privacy_fallback": false,
"privacy_lookup_error": "privacy unavailable",
"explicit_recipients": true,
"requested_recipient_count": 25,
"resolved_recipient_count": 20,
"discarded_recipient_count": 5,
"discarded_recipients": [
{
"input": "144637553594388@lid",
"reason": "lid_unresolved"
}
],
"max_recipients": 100,
"selected_recipient_count": 100,
"partial_send": true
}
}
}/send/menu
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Envia uma mensagem interativa. Uma só rota cobre os tipos em type:
button: botões de ação rápida (resposta, link, ligação e cópia), com mídia opcional no topo;button_legacy: botões de resposta no formato anterior;list: menu organizado em seções;poll: enquete;carousel: carrossel de cartões com imagem e botões.O conteúdo das opções vai em choices, e o formato de cada item depende do type.
type: "button")Cada item de choices vira um botão. Separe o texto da ação com | (barra vertical) ou \n (quebra de linha):
"texto|id", "texto\nid" ou só "texto" (o ID fica igual ao texto);"texto|copy:código" ou "texto\ncopy:código";"texto|call:+5511999999999" ou "texto\ncall:+5511999999999";"texto|https://exemplo.com" ou "texto|url:https://exemplo.com".footerText é o rodapé opcional, exibido abaixo do texto.
Não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem.
O topo dos botões pode levar uma imagem, um vídeo ou um documento em file, por URL ou base64, como no POST /send/media. O tipo sai do próprio arquivo; para forçar, mande mimetype: image, video, document ou o MIME type do arquivo (por exemplo, video/mp4). O documento usa o nome de docName; sem ele, o nome do arquivo.
Áudio não vai no botão: o WhatsApp não tem áudio no topo, e a API responde 400. Envie o áudio antes, pelo POST /send/media. Sem mimetype, a API reconhece o áudio pela extensão da URL ou pelo início do base64; numa URL sem extensão, informe o mimetype.
Se a mídia não baixar ou não subir para o WhatsApp, o botão sai sem ela.
type: "button_legacy")Use só quando precisar dos botões de resposta do formato anterior. Formatos de choices: "texto|id", "texto\nid", "texto|reply:id" ou "texto" (o próprio texto vira o ID). Este modo cria apenas botões de resposta: ações de link, ligação e cópia e a mídia em file ficam no type: "button".
type: "list")listButton: texto do botão que abre a lista;footerText: rodapé opcional;choices: "[Título da seção]" abre uma seção, e "texto|id|descrição" é um item (o ID e a descrição são opcionais).type: "poll")choices: uma opção de voto por item;selectableCount: quantas opções cada pessoa pode marcar (padrão 1).type: "carousel")Em choices, cada cartão segue esta ordem: "[Texto do cartão]", depois "{URL ou base64 da imagem}" e depois os botões do cartão, um por item: "texto|copy:código" (copiar), "texto|https://url" (link) ou "texto|call:+número" (ligação). Repita a sequência para cada cartão.
O POST /send/carousel monta o mesmo carrossel com outro formato de corpo, em JSON estruturado; use o que for mais prático.
Guarde o ID devolvido no envio. Para responder a uma opção pela API, use esse ID em replyid no POST /send/text, com a seleção iniciada por >.
Os botões interativos e as listas podem ser descontinuados a qualquer momento, sem aviso prévio. Monte os fluxos de forma flexível: para trocar entre botões, listas e enquetes, basta mudar o type e manter a estrutura de choices.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, track_source, track_id e async. Esta rota não aceita forward. Para enviar a um grupo, use em number o ID terminado em @g.us.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
typetextoobrigatórioButton (formato atual: resposta, link, ligação, cópia e mídia no topo), button_legacy (só botões de resposta, formato anterior, sem mídia), list (seções e itens), poll (enquete) ou carousel (cartões em choices).
Tipo do menu. Use button para o formato atual e button_legacy apenas para botões de resposta no formato anterior.
texttextoobrigatórioAceita variáveis.
Texto principal (aceita variáveis)
choiceslista de textosobrigatórioO formato depende de type. button: "texto|id", "texto\nid", "texto" (ID igual ao texto), "texto|copy:código", "texto|call:+5511999999999", "texto|https://..." ou "texto|url:https://...". button_legacy: "texto|id", "texto\nid", "texto|reply:id" ou "texto". list: "[Título da seção]" abre uma seção e "texto|id|descrição" é um item (ID e descrição opcionais). poll: uma opção por item. carousel: "[Texto do cartão]", depois "{URL ou base64 da imagem}" e depois os botões do cartão ("texto|copy:código", "texto|https://url" ou "texto|call:+número"), repetindo por cartão.
Lista de opções. Use [Título] para seções em listas
footerTexttextoopcionalUsado em button, button_legacy e list.
Texto do rodapé (opcional)
listButtontextoopcionalUsado em type=list (texto do botão que abre a lista).
Texto do botão principal
selectableCountinteiroopcionalSó em type=poll. Padrão 1.
Número máximo de opções selecionáveis (para enquetes)
filetextoopcionalSó em type=button. Imagem, vídeo ou documento, por URL ou base64; áudio retorna 400. Se a mídia não baixar, o botão sai sem ela.
Mídia do cabeçalho (type: button): imagem, vídeo ou documento, por URL ou base64, como no /send/media. Áudio retorna 400.
mimetypetextoopcionalSó com file. image, video, document ou um MIME type (ex.: video/mp4); outro valor retorna 400. Informe quando a URL não tiver extensão.
Força o tipo do file (opcional): image, video, document ou o MIME type do arquivo, como video/mp4. Sem ele, o tipo sai do arquivo; outro valor responde 400.
docNametextoopcionalSó quando file é um documento. Sem ele, vale o nome do arquivo.
Nome do arquivo quando o file é documento. Sem ele, o nome do arquivo.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de requisições excedido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/menu ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "type": "button", "text": "Olá {{first_name}}! Como podemos ajudar?", "file": "https://seusite.com.br/img/banner-atendimento.jpg" , "choices": [ "Fazer pedido|pedido", "Falar com atendente|atendente", "Ver horários|horarios" ], "footerText": "Atendimento de seg a sáb, 9h às 18h"}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Menu sent successfully"
}
}
}/send/carousel
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Esta rota envia um carrossel: uma mensagem com vários cartões lado a lado, cada um com mídia, texto e botões. O resultado é o mesmo de POST /send/menu com type: "carousel", com outro formato de corpo.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id e async. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
carousel é a lista de cartões. Cada cartão tem text (o texto do cartão), uma mídia e buttons (os botões do cartão).
Cada cartão leva uma mídia: image (imagem), video (vídeo) ou document (documento, com o nome em filename). Use uma delas por cartão.
REPLY: botão de resposta rápida. Ao tocar, o id é enviado como resposta na conversa.URL: abre um link. O id é a URL completa (ex.: https://exemplo.com).COPY: copia um texto para a área de transferência. O id é o texto copiado.CALL: inicia uma ligação. O id é o número de telefone.Num carrossel, use o mesmo tipo de botão em todos os cartões: só botões de resposta ou só botões de ação (link, ligação, cópia). Não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem.
Veja os exemplos de requisição para o formato completo.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
carousellista de objetosobrigatórioArray de cartões do carrossel
carouseltexttextoobrigatórioObrigatório em cada cartão.
Texto do cartão
buttonslista de objetosobrigatórioObrigatório em cada cartão.
Array de botões do cartão
buttonsidtextoobrigatórioREPLY: texto devolvido como resposta. URL: endereço completo. COPY: texto copiado. CALL: número de telefone.
ID do botão
texttextoobrigatórioTexto exibido no botão
typetextoobrigatórioTipo do botão: REPLY (o id é enviado como resposta no chat), URL (o id é o endereço completo que será aberto), COPY (o id é o texto copiado) ou CALL (o id é o número de telefone da ligação).
imagetextoopcionalMídia do cartão: use image, video ou document (uma delas).
URL da imagem (opcional)
videotextoopcionalAlternativa a image.
URL do vídeo (alternativa à imagem)
documenttextoopcionalAlternativa a image; o nome do arquivo vai em filename.
URL do documento (alternativa à imagem)
filenametextoopcionalSó com document.
Nome do arquivo para documentos
texttextoopcionalOpcional: texto acima dos cartões.
Texto principal da mensagem
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
forwardbooleanoopcionalMarca a mensagem como encaminhada (indicador "Encaminhada" no WhatsApp).
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/carousel ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "text": "Ofertas da semana", "carousel": [ { "text": "Fone Bluetooth X200\nDe R$ 199 por R$ 129", "image": "https://seusite.com.br/img/fone-x200.jpg" , "buttons": [ { "id": "https://seusite.com.br/p/fone-x200" , "text": "Ver na loja", "type": "URL" }, { "id": "FONE30", "text": "Copiar cupom", "type": "COPY" } ] }, { "text": "Smartwatch Fit 3\nCupom de 30% na primeira compra", "image": "https://seusite.com.br/img/fit3.jpg" , "buttons": [ { "id": "5511999999999", "text": "Falar com vendedor", "type": "CALL" }, { "id": "https://seusite.com.br/p/fit3" , "text": "Ver na loja", "type": "URL" } ] } ]}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Carousel sent successfully"
}
}
}/send/location-button
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Esta rota envia uma mensagem com um botão que solicita a localização do usuário. Quando o usuário clica no botão, o WhatsApp abre a interface para compartilhar a localização atual.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, track_source, track_id e async. Esta rota não aceita forward. Os textos aceitam variáveis (como {{first_name}}). Para enviar a um grupo, use em number o ID terminado em @g.us.
{
"number": "5511999999999",
"text": "Por favor, compartilhe sua localização",
"delay": 0,
"readchat": true
}{
"number": "5511999999999",
"text": "Para continuar o atendimento, clique no botão abaixo e compartilhe sua localização"
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
texttextoobrigatórioO botão de enviar localização é adicionado automaticamente.
Texto da mensagem que será exibida
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/location-button ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "text": "Para calcular a taxa de entrega, toque no botão abaixo e envie sua localização.", "delay": 1000, "readchat": true}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Location sent successfully"
}
}
}/send/request-payment
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Envia uma solicitação de pagamento com o botão nativo "Revisar e pagar" do WhatsApp. Numa única mensagem interativa, o contato vê o valor e os meios de pagamento informados: PIX (chave em pixKey), boleto (boletoCode, com o PDF em fileUrl) e link de pagamento externo (paymentLink).
amount (valor decimal, em reais por padrão, ex.: 199.9) ou orderMessageId. Sem nenhum dos dois, a API responde 422.pixKey) é exigida. pixType indica o tipo da chave (CPF, CNPJ, PHONE, EMAIL ou EVP; padrão EVP), e pixName, o nome do recebedor (padrão: o nome do perfil do dispositivo).boletoCode (linha digitável) habilita o boleto automaticamente.fileUrl anexa um documento, como o boleto ou a fatura em PDF; fileName é o nome exibido.paymentLink habilita o botão de pagamento externo (só domínios homologados).title, text, footer, itemName, invoiceNumber e additionalNote personalizam a mensagem.Para cobrar um pedido feito pelo WhatsApp, informe orderMessageId com o ID da mensagem OrderMessage desse mesmo contato. A API obtém itens, moeda e total do pedido, e amount não é necessário. Ainda é preciso informar um meio de pagamento.
Para avisar o contato do andamento (pagamento confirmado, pedido enviado, entregue), use POST /message/payment/status com o id ou o messageid devolvido aqui.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, track_source, track_id e async. Esta rota não aceita forward. Para enviar a um grupo, use em number o ID terminado em @g.us.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
orderMessageIdtextocondicionalObrigatório se amount não for informado. ID de uma OrderMessage recebida do mesmo contato; itens, moeda e total vêm do pedido.
ID de uma OrderMessage recebida do mesmo contato. Vincula a cobrança ao pedido real.
titletextoopcionalTítulo que aparece no cabeçalho do fluxo
texttextoopcionalMensagem exibida no corpo do fluxo
footertextoopcionalTexto do rodapé da mensagem
itemNametextoopcionalNome do item principal listado no fluxo
invoiceNumbertextoopcionalIdentificador ou número da fatura
amountnúmerodecimalcondicionalObrigatório se orderMessageId não for informado.
Valor da cobrança, decimal (ex.: 199.9), em reais por padrão.
pixKeytextoopcionalExigida por padrão. Mesmo com orderMessageId, é preciso informar um meio de pagamento.
Chave PIX estático (CPF/CNPJ/telefone/email/EVP)
pixTypetextoopcionalCPF, CNPJ, PHONE, EMAIL ou EVP. Padrão EVP.
Tipo da chave PIX (CPF, CNPJ, PHONE, EMAIL, EVP). Padrão EVP
pixNametextoopcionalPadrão: o nome do perfil do dispositivo.
Nome do recebedor exibido no fluxo (padrão usa o nome do perfil do dispositivo)
paymentLinktextoopcionalURL externa de pagamento. Habilita o botão de pagamento externo; só domínios homologados são aceitos.
fileUrltextoopcionalAnexa um documento (boleto ou fatura em PDF), por URL ou base64.
URL ou caminho (base64) do documento a ser anexado (ex.: boleto PDF)
fileNametextoopcionalSó com fileUrl.
Nome do arquivo exibido no WhatsApp ao anexar fileUrl
boletoCodetextoopcionalHabilita o boleto automaticamente.
Linha digitável do boleto (habilita o método boleto automaticamente)
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
additionalNotetextoopcionalNota adicional exibida na cobrança.
amount e orderMessageId.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/request-payment ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "amount": 199.9, "title": "Pedido #1234", "text": "Seu pedido está pronto para pagamento", "itemName": "Kit Skincare Completo", "invoiceNumber": "PED-1234", "pixKey": "12345678000190", "pixType": "CNPJ", "pixName": "Loja Bella Pele LTDA", "footer": "Loja Bella Pele"}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "Payment request sent successfully"
}
}
}/message/payment/status
Envia ao contato uma atualização de um pedido criado por POST /send/request-payment. No campo id, envie o id ou o messageid devolvido pela solicitação.
status é o novo estado do pedido: payment_requested (pagamento solicitado), preparing_to_ship (preparando o envio), shipped (enviado), delivered (entregue), completed (concluído) ou canceled (cancelado).paid é opcional: true confirma o pagamento e false marca como pendente. Sem ele, só o estado do pedido é enviado.note aparece na atualização do pedido (até 500 caracteres).Na resposta, orderStatus é o estado do pedido aplicado e status é o estado da mensagem de atualização (por exemplo, Pending); paymentStatusMessageID e paid vêm quando paid foi informado.
Uma falha no envio pode ser parcial: o pagamento pode ter sido atualizado sem que a mensagem do pedido saísse. Confira o chat antes de tentar de novo.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioID ou messageid devolvido por POST /send/request-payment.
Aceita o id ou o messageid da solicitação de pagamento enviada.
statustextoobrigatórioNovo estado do pedido: payment_requested (pagamento solicitado), preparing_to_ship (preparando o envio), shipped (enviado), delivered (entregue), completed (concluído) ou canceled (cancelado).
paidbooleanoopcionalSem ele, só o estado do pedido é enviado.
true confirma o pagamento; false marca como pendente. Omitir para não alterar.
notetextoopcionalAté 500 caracteres.
Texto que aparece na atualização do pedido.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Nesta rota a falha pode ser parcial: o pagamento pode ter sido atualizado sem que a mensagem do pedido fosse enviada. Confira o chat antes de tentar de novo, para não repetir a atualização. Caso do WhatsApp (503): WhatsApp desconectado.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/payment/status ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "3EB0A1B2C3D4E5F6A7B8C9", "status": "shipped", "paid": true, "note": "Seu pedido saiu para entrega. Código de rastreio: BR123456789BR."}'Resposta
{
"success": true,
"data": {
"status": "success",
"referenceId": "",
"orderStatus": "success",
"paymentChanged": true,
"paymentStatusMessageID": "3EB0538DA65A59F6D8A251",
"paid": true,
"manual": true
}
}/send/pix-button
No teste grátis, entra no limite de mensagens.
Envia um botão nativo do WhatsApp que abre para pagamento PIX com a chave informada. O usuário visualiza o detalhe do recebedor, nome e chave.
pixType aceita: CPF, CNPJ, PHONE, EMAIL, EVP (sem diferenciar maiúsculas de minúsculas)pixName padrão: "Pix" quando não informado; é o nome de quem recebe o pagamentoAceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem (esta rota não aceita forward): delay, readchat, readmessages, replyid, mentions, track_source, track_id e async.
{
"number": "5511999999999",
"pixType": "EVP",
"pixKey": "123e4567-e89b-12d3-a456-426614174000",
"pixName": "Loja Exemplo"
}Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioID do chat para o qual a mensagem será enviada. Pode ser um número de telefone em formato internacional, um ID de grupo (@g.us), um ID de usuário (com @s.whatsapp.net ou @lid).
pixTypetextoobrigatórioCPF, CNPJ, PHONE, EMAIL ou EVP, sem diferenciar maiúsculas de minúsculas.
Tipo da chave PIX. Valores aceitos: CPF, CNPJ, PHONE, EMAIL ou EVP
pixKeytextoobrigatórioNo formato do pixType.
Valor da chave PIX (CPF/CNPJ/telefone/email/EVP)
pixNametextoopcionalPadrão "Pix" quando vazio.
Nome exibido como recebedor do PIX (padrão "Pix" se vazio)
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/pix-button ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "pixType": "EVP", "pixKey": "123e4567-e89b-12d3-a456-426614174000", "pixName": "Loja Bella Pele"}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg",
"response": {
"status": "success",
"message": "PIX button sent successfully"
}
}
}/send/event
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Envia um convite de evento para um contato ou grupo. Informe name e startTime (início, em segundos ou milissegundos Unix); endTime é opcional e não pode ser anterior ao início.
description traz os detalhes do evento.location traz o local presencial: nome, endereço, latitude e longitude.isScheduleCall: true com joinLink, um link HTTPS; sem o link, a API responde 422.hasReminder ativa o lembrete, com a antecedência em segundos em reminderOffsetSec.extraGuestsAllowed permite acompanhantes, e isCanceled marca o evento como cancelado.A resposta do convidado chega como mensagem do tipo EventResponseMessage, com a escolha em vote.
Aceita os campos opcionais comuns de envio, explicados na introdução do grupo Enviar mensagem: delay, readchat, readmessages, replyid, mentions, track_source, track_id e async. Esta rota não aceita forward. Para enviar a um grupo, use em number o ID terminado em @g.us.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioTelefone no formato internacional, @s.whatsapp.net, @lid ou grupo @g.us.
Contato ou grupo que recebe o convite.
nametextoobrigatórioNome do evento.
startTimeinteirointeiro de 64 bitsobrigatórioUnix em segundos ou milissegundos.
Início em segundos ou milissegundos Unix.
descriptiontextoopcionalDescrição do evento.
endTimeinteirointeiro de 64 bitsopcionalUnix em segundos ou milissegundos; não pode ser anterior a startTime.
Fim em segundos ou milissegundos Unix; não pode preceder o início.
locationobjetoopcionalLocal presencial do evento (opcional).
locationnametextoopcionalNome do local.
addresstextoopcionalEndereço do local.
latitudenúmeroopcionalDe -90 a 90.
Latitude do local.
longitudenúmeroopcionalDe -180 a 180.
Longitude do local.
joinLinktextoURLopcionalLink HTTPS. Obrigatório quando isScheduleCall=true.
Link HTTPS obrigatório se isScheduleCall=true.
extraGuestsAllowedbooleanoopcionalPermite que o convidado leve acompanhantes.
isScheduleCallbooleanoopcionalCom true, exige joinLink.
Indica que o evento é uma chamada agendada.
isCanceledbooleanoopcionalMarca o evento como cancelado.
hasReminderbooleanoopcionalAtiva o lembrete do evento.
reminderOffsetSecinteirointeiro de 64 bitsopcionalMínimo 0. Use com hasReminder=true.
Antecedência do lembrete, em segundos.
replyidtextoopcionalID da mensagem a responder: cria uma resposta vinculada à original, que precisa estar no histórico do dispositivo. O suporte varia por tipo de mensagem.
mentionstextoopcionalSó em grupos (number terminando em @g.us).
Números a mencionar, separados por vírgula (ex.: "5511999999999,5511888888888"). Para mencionar todos, use @all ou @todos no próprio texto; "all" neste campo também menciona todos, por compatibilidade.
delayinteiroopcionalAtraso em milissegundos antes do envio. Durante o atraso, o contato vê "Digitando..." (ou "Gravando áudio...", conforme o tipo). Exemplo: 5000 (5 segundos).
readchatbooleanoopcionalMarca o chat como lido após o envio (zera o contador de não lidas).
readmessagesbooleanoopcionalMarca como lidas as últimas 10 mensagens recebidas do chat (não as enviadas por você). Útil para confirmar a leitura antes de responder; o readchat só zera o contador.
asyncbooleanoopcionalSe true, envia pela fila interna sem segurar a requisição. A resposta 200 indica só que a mensagem entrou na fila; o envio pode falhar depois. Acompanhe pelo id em POST /message/find ou pelo evento messages_update.
track_sourcetextoopcionalOrigem do rastreamento: o sistema que envia a mensagem (ex.: "crm", "chatbot"). Dá para filtrar por ela em POST /message/find.
track_idtextoopcionalID livre para acompanhar a mensagem no seu sistema. Aceita valores repetidos (não há validação de unicidade), então não serve como chave de idempotência.
joinLink é obrigatório quando isScheduleCall é true.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/send/event ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "120363012345678901@g.us", "name": "Workshop de vendas no WhatsApp", "description": "Encontro presencial com café. Traga seu notebook.", "startTime": 1792836000, "endTime": 1792846800, "location": { "name": "Espaço Paulista", "address": "Av. Paulista, 1578, Bela Vista, São Paulo, SP", "latitude": -23.5616, "longitude": -46.6562 }, "extraGuestsAllowed": true, "hasReminder": true, "reminderOffsetSec": 3600}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg"
}
}Referência 3
Receba mensagens e outros eventos no seu sistema assim que acontecem.
/webhook
/webhook
/webhook/errors
/webhook
Lista os webhooks configurados no dispositivo. A resposta é sempre uma lista, mesmo com um só webhook.
Cada item traz id, enabled, url (o seu endereço de destino), events, excludeMessages, addUrlEvents, addUrlTypesMessages e signing_secret, o segredo usado para assinar as entregas no cabeçalho X-DROPE-Signature (veja a seção Webhooks da documentação).
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/webhook ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"enabled": true,
"url": "https://example.com/webhook",
"events": [
"messages",
"messages_update"
],
"excludeMessages": [
"wasSentByApi",
"isGroupNo"
],
"addUrlEvents": true,
"addUrlTypesMessages": true
},
{
"id": "987fcdeb-51k3-09j8-x543-864297539100",
"enabled": true,
"url": "https://outro-endpoint.com/webhook",
"events": [
"connection",
"presence"
],
"excludeMessages": [],
"addUrlEvents": false,
"addUrlTypesMessages": false
}
]/webhook
Configura os webhooks do dispositivo para receber eventos em tempo real.
Os eventos saem do WhatsApp, passam pela DROPE e são entregues ao seu endereço com novas tentativas automáticas quando o seu sistema falha (10 s, 30 s, 2 min, 10 min e 30 min). Cada entrega leva os cabeçalhos X-DROPE-Event (evento), X-DROPE-Delivery (identificador da entrega) e X-DROPE-Signature (sha256= seguido do HMAC SHA-256 do corpo com o signing_secret do webhook). Responda 200 rápido e processe depois. As falhas de entrega ficam em GET /webhook/errors.
Regra da DROPE: a URL precisa usar https:// e apontar para um endereço público (nada de rede interna ou endereço local).
Não envie action nem id. O dispositivo passa a ter um único webhook, criado ou atualizado automaticamente. Se a sua automação responde mensagens, use sempre "excludeMessages": ["wasSentByApi"] para não criar laços.
action: "add", sem id. O identificador é gerado e devolvido.action: "update" com o id. Todos os campos são substituídos: envie a configuração completa, com a url.action: "delete" com o id. Em delete, basta o id; os outros campos são ignorados.Muitas vezes um webhook só resolve: com addUrlEvents, cada tipo de evento chega num caminho diferente da mesma URL.
connection: mudanças no estado da conexãohistory: recebimento do histórico de mensagensmessages: novas mensagensmessages_update: atualizações de mensagens (entregue, lida, editada, apagada)newsletter_messages: novas publicações de canais (só chega se for pedido pelo nome em events)status_posts: publicações de Status de contatos e de grupos (só chega se for pedido pelo nome em events)call: chamadas de voz e vídeocontacts: mudanças na agenda de contatospresence: mudanças de presença (digitando, online)groups: mudanças em gruposlabels: etiquetaschats: eventos de conversaschat_labels: etiquetas aplicadas a conversassender: campanhas (início e fim)Com events vazio (ou ["All"]), o webhook recebe todos os eventos, menos newsletter_messages e status_posts, que só chegam se pedidos pelo nome.
excludeMessages)wasSentByApi: mensagens enviadas pela API. Use sempre se a sua automação responde mensagens, para não criar laços infinitos.wasNotSentByApi: mensagens que não saíram pela APIfromMeYes: mensagens enviadas pelo próprio númerofromMeNo: mensagens recebidas de terceirosisGroupYes: mensagens em gruposisGroupNo: mensagens em conversas individuaisOs filtros valem para messages, messages_update, status_posts e newsletter_messages. isGroupYes e isGroupNo não valem para status_posts e newsletter_messages: separe pelo campo isGroup do evento.
addUrlEvents e addUrlTypesMessages acrescentam segmentos ao caminho da URL (não à query string), sempre na ordem evento e depois tipo da mensagem. O seu receptor precisa aceitar esses caminhos.
addUrlEvents: https://seusite.com.br/webhook/messagesaddUrlTypesMessages: https://seusite.com.br/webhook/conversationhttps://seusite.com.br/webhook/messages/conversationUm objeto JSON com Content-Type: application/json.
urltextoobrigatórioInclusive em update (que substitui todos os campos). Em delete, basta o id. Regra da DROPE: https:// e endereço público.
Endereço que recebe os eventos.
idtextocondicionalObrigatório com action: "update" e action: "delete". Não envie com action: "add" nem no modo simples.
ID do webhook (devolvido em GET /webhook).
enabledbooleanoopcionalLiga ou desliga o webhook.
eventslista de textosopcionalLista vazia ou ["All"] = todos os eventos, menos newsletter_messages e status_posts, que só chegam se pedidos pelo nome.
Eventos assinados.
excludeMessageslista de textosopcionalValem para messages, messages_update, status_posts e newsletter_messages; isGroupYes e isGroupNo não valem para status_posts e newsletter_messages.
Filtros que tiram mensagens da entrega. Use wasSentByApi em automações para evitar laço.
addUrlEventsbooleanoopcionalAcrescenta o evento como segmento do caminho da URL (ex.: /webhook/messages), não como query string.
addUrlTypesMessagesbooleanoopcionalAcrescenta o tipo da mensagem como segmento do caminho da URL (ex.: /webhook/conversation), depois do evento quando os dois estão ligados.
actiontextoopcionalSem action, vale o modo simples (um único webhook, criado ou atualizado). update e delete exigem id.
Operação no modo avançado: add cria, update substitui todos os campos de um webhook, delete remove.
url é obrigatório, exceto quando action é delete.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/webhook ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "enabled": true, "url": "https://seusite.com.br/webhooks/whatsapp" , "events": [ "messages", "messages_update", "connection" ], "excludeMessages": [ "wasSentByApi" ], "addUrlEvents": false, "addUrlTypesMessages": false}'Resposta
[
{
"id": "wh_9a8b7c6d5e",
"enabled": true,
"url": "https://seusite.com.br/webhook",
"events": [
"messages",
"newsletter_messages",
"connection"
],
"addUrlTypesMessages": false,
"addUrlEvents": false,
"excludeMessages": []
}
]/webhook/errors
Lista as últimas falhas de entrega dos webhooks do dispositivo (até 50), da mais recente para a mais antiga. São as falhas da entrega da DROPE ao seu endereço.
Cada item traz:
created: data e hora da falha (UTC, ISO 8601)webhook_id: o id do webhook (o mesmo de GET /webhook)url: o endereço de destino da entregaevent: o evento que estava sendo entreguestatus_code: o status HTTP que o seu sistema devolveu; null quando não houve respostaattempts: quantas tentativas foram feitas (0 em queue_full)error: a mensagem de errostage: onde a entrega parou (veja abaixo)dropped: quantos eventos foram descartados nessa ocorrência (só em queue_full; nos outros casos, 0)Valores de stage:
http: o seu sistema respondeu com erro ou não respondeu, e as novas tentativas automáticas (10 s, 30 s, 2 min, 10 min e 30 min) se esgotaram;config: a URL de destino é inválida; a entrega desiste sem novas tentativas;blocked: a URL aponta para uma rede interna, para onde a DROPE não entrega; sem novas tentativas;queue_full: a fila de entregas pendentes do dispositivo encheu e os eventos novos foram descartados até ela baixar. Fica no máximo um registro por minuto, com a contagem em dropped. Muitos queue_full indicam receptor lento: responda 200 antes de processar.Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/webhook/errors ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
[
{
"created": "2026-10-20T12:00:00Z",
"webhook_id": "w8k2m4p6q1r3s5t7",
"url": "https://seusite.com.br/webhook/messages",
"event": "messages",
"status_code": 500,
"attempts": 6,
"error": "O destino respondeu HTTP 500.",
"stage": "http",
"dropped": 0
}
]Referência 8
Envie para muitos contatos com fila, intervalos, agendamento e acompanhamento.
/sender/simple
/sender/advanced
/sender/edit
/sender/cleardone
/sender/clearall
/sender/listfolders
/sender/listmessages
/sender/stats
/sender/simple
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Cria uma campanha para enviar a mesma mensagem a vários destinatários, com intervalo controlado entre os envios. Acompanhe a execução em GET /sender/stats.
type é obrigatório e define quais outros campos a mensagem usa (veja "Campos por tipo").
Início: scheduled_for aceita um timestamp em milissegundos (por exemplo 1795780800000) ou minutos a partir de agora (1 começa em 1 minuto). delayMin e delayMax são o intervalo, em segundos, entre uma mensagem e outra.
Resposta: traz folder_id, count (mensagens agendadas) e status. Guarde o folder_id: ele identifica a campanha em POST /sender/edit e POST /sender/listmessages. Se a resposta demorar, confira em GET /sender/listfolders se a campanha já existe antes de criar outra.
Status de grupo: com groupStatus: true, a campanha publica a mensagem no status de cada grupo da lista, como o POST /send/status com group, em vez de mandar no chat. Todos os numbers precisam ser grupos (@g.us): se houver algum que não é, a campanha não é criada e o 400 lista quais são. Só text, image e video; em texto, background_color e font escolhem a cor e a fonte. Áudio e outros tipos retornam 400. Agendamento, pausa, cancelamento, POST /sender/listmessages e GET /sender/stats funcionam como numa campanha comum. Cada status fica registrado na conversa do grupo com messageType: "GroupStatusMessage" (no celular ele não aparece na conversa, só no status): não dá para reagir, editar, fixar nem responder a ele.
text: text obrigatório. Com linkPreview: true, a prévia sai da URL contida no texto.image, video, videoplay, audio e document: file obrigatório (URL do arquivo). Em imagem, vídeo e documento, text é a legenda; no documento, docName é o nome exibido.contact: fullName e phoneNumber obrigatórios; organization, email e url opcionais.location: latitude e longitude obrigatórios; name e address opcionais.list, button, poll e carousel: text e choices obrigatórios. footerText é o rodapé, listButton o botão que abre a lista, selectableCount quantas opções cada pessoa marca na enquete, e file a mídia opcional do cabeçalho do botão.Formatos de choices:
"Texto|id" (resposta), "Texto|https://seusite.com.br" (link), "Texto|copy:CODIGO" (copiar) ou "Texto|call:+5511999999999" (ligar). Não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem."[Nome da seção]" abre uma seção e "Item|id|descrição" cria um item dela."[Texto do cartão]", "{URL da imagem}" e os botões do cartão, no formato do button.O texto aceita variações no formato {Olá|Oi|Bom dia}: cada destinatário recebe uma combinação sorteada (também aninhada, como {Oi|Olá {amigo|cliente}}). Quando o texto tem variações, a campanha é criada no formato avançado, com uma mensagem por número; a resposta é a mesma.
No teste grátis, a campanha conta uma mensagem por número, o texto leva a assinatura do teste e a campanha é recusada com 429 TRIAL_LIMIT se passar da cota restante.
Versões antigas aceitavam a campanha sem type (valia text) e o formato antigo do painel, com media: {type, file, docName} no lugar de type, file e docName. Os dois continuam aceitos para integrações antigas não pararem; nas novas, envie sempre type, com file e docName na raiz.
Um objeto JSON com Content-Type: application/json.
numberslista de textosobrigatórioPelo menos 1 número. Com groupStatus=true, todos precisam ser grupos (@g.us).
Destinatários: número com DDI, JID de usuário (@s.whatsapp.net) ou ID de grupo (@g.us).
typetextoobrigatórioCom groupStatus=true, só text, image ou video.
Tipo da mensagem. Define quais outros campos a mensagem usa.
delayMininteiroobrigatórioIntervalo mínimo entre mensagens, em segundos.
delayMaxinteiroobrigatórioIntervalo máximo entre mensagens, em segundos.
scheduled_forinteiroobrigatórioInício da campanha: timestamp em milissegundos, ou minutos a partir de agora (1 começa em 1 minuto).
foldertextoopcionalNome da campanha.
infotextoopcionalInformações adicionais sobre a campanha.
delayinteiroopcionalIntervalo fixo entre mensagens (opcional).
mentionstextoopcionalMenções na mensagem, em formato JSON.
texttextocondicionalObrigatório quando type=text e nos tipos list, button, poll e carousel (texto principal da mensagem interativa). Opcional como legenda em image, video, videoplay e document. Com groupStatus e type=text, é o texto do status.
Texto da mensagem, ou legenda quando o tipo é mídia.
linkPreviewbooleanoopcionalSó vale para type=text.
Gera a prévia do link a partir da URL contida no texto.
linkPreviewTitletextoopcionalSó com linkPreview=true.
Título próprio da prévia. Vazio usa o título do link; só com um espaço (" "), a prévia sai sem título.
linkPreviewDescriptiontextoopcionalSó com linkPreview=true.
Descrição própria da prévia. Vazia usa a descrição do link; só com um espaço (" "), a prévia sai sem descrição.
linkPreviewImagetextoopcionalSó com linkPreview=true.
URL ou base64 da imagem da prévia.
linkPreviewLargebooleanoopcionalSó com linkPreview=true.
true usa a prévia grande; false (padrão), a pequena.
filetextocondicionalObrigatório quando type é image, video, videoplay, audio, document. Opcional em button: mídia do cabeçalho (imagem, vídeo ou documento; áudio não é aceito no botão).
URL da mídia ou do arquivo. Com type button, a mídia do cabeçalho.
docNametextoopcionalUsado quando type=document, ou quando o cabeçalho de um button é um documento. Sem ele, vale o nome do arquivo.
Nome do arquivo exibido para quem recebe.
fullNametextocondicionalObrigatório quando type=contact.
Nome completo do contato compartilhado.
phoneNumbertextocondicionalObrigatório quando type=contact.
Telefone do contato compartilhado; vários números separados por vírgula.
organizationtextoopcionalSó com type=contact.
Empresa do contato.
emailtextoopcionalSó com type=contact.
E-mail do contato.
urltextoopcionalSó com type=contact.
Site do contato.
latitudenúmerocondicionalObrigatório quando type=location.
Latitude do local.
longitudenúmerocondicionalObrigatório quando type=location.
Longitude do local.
nametextoopcionalSó com type=location.
Nome do local.
addresstextoopcionalSó com type=location.
Endereço do local.
footerTexttextoopcionalSó com type list, button, poll ou carousel.
Texto do rodapé.
buttonTexttextoopcionalSó com type list, button, poll ou carousel.
Texto do botão.
listButtontextoopcionalUsado com type=list.
Texto do botão que abre a lista.
selectableCountinteiroopcionalSó com type=poll.
Quantas opções cada pessoa pode marcar na enquete.
choiceslista de textoscondicionalObrigatório quando type é list, button, poll ou carousel. Formatos: button "Texto|id", "Texto|https://site", "Texto|copy:CODIGO" ou "Texto|call:+5511999999999" (não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem); list "[Seção]" abre uma seção e "Item|id|descrição" cria um item; poll uma opção por item; carousel "[Texto do cartão]", "{URL da imagem}" e os botões do cartão, repetindo o bloco a cada cartão.
Opções da mensagem interativa.
groupStatusbooleanoopcionalTodos os numbers precisam ser grupos (@g.us) e type só text, image ou video; caso contrário a campanha não é criada (o 400 lista os números inválidos).
Publica no status do grupo em vez de mandar no chat.
background_colorinteiroopcionalSó com groupStatus=true e type=text.
Índice da cor de fundo do status em texto.
fontinteiroopcionalSó com groupStatus=true e type=text.
Fonte do status em texto.
folder_id, count (mensagens agendadas) e status.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).GET /sender/listfolders antes de criar outra.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/simple ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "numbers": [ "5511999999999", "5521988887777", "5531977776666" ], "type": "text", "folder": "Black Friday 2026", "info": "Aviso de abertura da Black Friday", "delayMin": 10, "delayMax": 30, "scheduled_for": 1795780800000, "text": "Oi! A Black Friday da loja começou. Veja as ofertas: https://seusite.com.br/black-friday" , "linkPreview": true}'Resposta
{
"success": true,
"data": {
"folder_id": "f3a9c2b1",
"count": 10,
"status": "queued"
}
}/sender/advanced
No teste grátis, entra no limite de mensagens e recebe a assinatura DROPE.
Cria um envio em massa em que cada item de messages tem o seu destinatário (number), o seu tipo (type) e o seu conteúdo. Use quando o conteúdo muda de um destinatário para outro; para a mesma mensagem a todos, prefira POST /sender/simple.
Início e intervalo: scheduled_for aceita um timestamp em milissegundos ou minutos a partir de agora (1 começa em 1 minuto). delayMin e delayMax são o intervalo, em segundos, entre uma mensagem e outra.
Resposta: traz folder_id, count e status. Guarde o folder_id: ele identifica o envio em POST /sender/edit e POST /sender/listmessages.
Status de grupo: com groupStatus: true numa mensagem, ela é publicada no status do grupo (number com @g.us), como o POST /send/status com group, em vez de ir para o chat. As outras mensagens do envio seguem normais. Só text, image e video; em texto, background_color e font escolhem a cor e a fonte. Se alguma mensagem com groupStatus não for para um grupo ou tiver outro tipo, o envio não é criado e o 400 diz qual (messages[índice]). Cada status fica registrado na conversa do grupo com messageType: "GroupStatusMessage" (no celular ele não aparece na conversa, só no status): não dá para reagir, editar, fixar nem responder a ele.
messages)text: text obrigatório. Com linkPreview: true, a prévia sai da URL contida no texto.image, video, videoplay, audio, ptt (mensagem de voz), myaudio, sticker (figurinha) e document: file obrigatório (URL do arquivo). Em imagem, vídeo e documento, text é a legenda; no documento, docName é o nome exibido.contact: fullName e phoneNumber obrigatórios; organization, email e url opcionais.location: latitude e longitude obrigatórios; name e address opcionais.list, button, poll e carousel: text e choices obrigatórios. footerText é o rodapé, listButton o botão que abre a lista, selectableCount quantas opções cada pessoa marca na enquete, e file a mídia opcional do cabeçalho do botão.Formatos de choices:
"Texto|id" (resposta), "Texto|https://seusite.com.br" (link), "Texto|copy:CODIGO" (copiar) ou "Texto|call:+5511999999999" (ligar). Não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem."[Nome da seção]" abre uma seção e "Item|id|descrição" cria um item dela."[Texto do cartão]", "{URL da imagem}" e os botões do cartão, no formato do button.Os campos de texto de cada mensagem (text, que também é a legenda das mídias, footerText, docName e os rótulos de choices, inclusive os textos dos cartões do carrossel) aceitam variações no formato {Olá|Oi|Bom dia}. Aspas retas são trocadas por aspas tipográficas e a barra invertida por /, para o texto chegar íntegro ao WhatsApp.
No teste grátis, a campanha conta uma mensagem por item de messages, o texto leva a assinatura do teste e a campanha é recusada com 429 TRIAL_LIMIT se passar da cota restante.
Um objeto JSON com Content-Type: application/json.
messageslista de objetosobrigatórioPelo menos 1 mensagem.
Mensagens do envio, uma por item, cada uma com o seu destinatário e tipo.
messagesnumbertextoobrigatórioDestinatário: número com DDI, JID de usuário (@s.whatsapp.net) ou ID de grupo (@g.us).
typetextoobrigatórioCom groupStatus=true nesta mensagem, só text, image ou video.
Tipo da mensagem: text, image, document, audio, ptt (mensagem de voz), myaudio (áudio, opção alternativa), sticker (figurinha), video, videoplay (vídeo com reprodução automática), contact, location, poll, list, button ou carousel.
texttextocondicionalObrigatório quando type=text e nos tipos list, button, poll e carousel (texto principal da mensagem interativa). Opcional como legenda em image, video, videoplay e document. Com groupStatus e type=text, é o texto do status.
Texto da mensagem, ou legenda quando o tipo é mídia.
filetextocondicionalObrigatório quando type é image, video, videoplay, audio, ptt, myaudio, sticker, document. Opcional em button: mídia do cabeçalho (imagem, vídeo ou documento; áudio não é aceito no botão).
URL da mídia ou do arquivo. Com type button, a mídia do cabeçalho.
docNametextoopcionalUsado quando type=document, ou quando o cabeçalho de um button é um documento. Sem ele, vale o nome do arquivo.
Nome do arquivo exibido para quem recebe.
linkPreviewbooleanoopcionalSó vale para type=text.
Gera a prévia do link a partir da URL contida no texto.
linkPreviewTitletextoopcionalSó com linkPreview=true.
Título próprio da prévia. Vazio usa o título do link; só com um espaço (" "), a prévia sai sem título.
linkPreviewDescriptiontextoopcionalSó com linkPreview=true.
Descrição própria da prévia. Vazia usa a descrição do link; só com um espaço (" "), a prévia sai sem descrição.
linkPreviewImagetextoopcionalSó com linkPreview=true.
URL ou base64 da imagem da prévia.
linkPreviewLargebooleanoopcionalSó com linkPreview=true.
true usa a prévia grande; false (padrão), a pequena.
fullNametextocondicionalObrigatório quando type=contact.
Nome completo do contato compartilhado.
phoneNumbertextocondicionalObrigatório quando type=contact.
Telefone do contato compartilhado; vários números separados por vírgula.
organizationtextoopcionalSó com type=contact.
Empresa do contato.
emailtextoopcionalSó com type=contact.
E-mail do contato.
urltextoopcionalSó com type=contact.
Site do contato.
latitudenúmerocondicionalObrigatório quando type=location.
Latitude do local.
longitudenúmerocondicionalObrigatório quando type=location.
Longitude do local.
nametextoopcionalSó com type=location.
Nome do local.
addresstextoopcionalSó com type=location.
Endereço do local.
footerTexttextoopcionalSó com type list, button, poll ou carousel.
Texto do rodapé.
buttonTexttextoopcionalSó com type list, button, poll ou carousel.
Texto do botão.
listButtontextoopcionalUsado com type=list.
Texto do botão que abre a lista.
selectableCountinteiroopcionalSó com type=poll.
Quantas opções cada pessoa pode marcar na enquete.
choiceslista de textoscondicionalObrigatório quando type é list, button, poll ou carousel. Formatos: button "Texto|id", "Texto|https://site", "Texto|copy:CODIGO" ou "Texto|call:+5511999999999" (não misture botão de resposta com link, ligação ou cópia na mesma mensagem: o WhatsApp não exibe a mensagem); list "[Seção]" abre uma seção e "Item|id|descrição" cria um item; poll uma opção por item; carousel "[Texto do cartão]", "{URL da imagem}" e os botões do cartão, repetindo o bloco a cada cartão.
Opções da mensagem interativa.
groupStatusbooleanoopcionalnumber precisa ser grupo (@g.us) e type text, image ou video; caso contrário o envio inteiro é recusado com 400 indicando messages[índice].
Publica esta mensagem no status do grupo em vez de mandar no chat.
background_colorinteiroopcionalSó com groupStatus=true e type=text.
Índice da cor de fundo do status em texto.
fontinteiroopcionalSó com groupStatus=true e type=text.
Fonte do status em texto.
delayMininteiroopcionalIntervalo mínimo entre mensagens, em segundos.
delayMaxinteiroopcionalIntervalo máximo entre mensagens, em segundos.
infotextoopcionalDescrição do envio em massa (aparece em GET /sender/listfolders).
scheduled_forinteiroopcionalInício do envio: timestamp em milissegundos, ou minutos a partir de agora (1 começa em 1 minuto).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/advanced ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "delayMin": 3, "delayMax": 6, "info": "Promoção de novembro", "scheduled_for": 1, "messages": [ { "number": "5511999999999", "type": "text", "text": "{Olá|Oi}, Ana! Seu cupom de aniversário é NIVER10." }, { "number": "5521988887777", "type": "image", "file": "https://seusite.com.br/campanhas/banner-novembro.jpg" , "text": "Bruno, separamos estas ofertas para você." } ]}'Resposta
{
"success": true,
"data": {
"folder_id": "f3a9c2b1",
"count": 10,
"status": "queued"
}
}/sender/edit
No teste grátis, entra no limite de mensagens.
Controla uma campanha pelo folder_id (devolvido na criação e em GET /sender/listfolders).
stop: pausa a campanha
pausedcontinue: retoma a campanha
scheduleddone)delete: apaga a campanha
scheduled)deletingreschedule: muda o horário
scheduledscheduled_for, no mesmo formato da criação: timestamp em milissegundos ou em segundos, ou minutos a partir de agora (até 10.080)scheduled_for + 1 ms, como na criaçãosend_now: envia agora
scheduledreschedule e send_now respondem com status, scheduled_for e messages_updated. Numa campanha que não está scheduled, respondem 409. Campanha que não existe no dispositivo responde 404.
scheduled: agendada para enviosending: enviando mensagenspaused: pausadadone: concluída (não pode ser alterada)deleting: sendo apagadaUm objeto JSON com Content-Type: application/json.
folder_idtextoobrigatórioID da campanha (o folder_id devolvido na criação, ou o id de GET /sender/listfolders).
actiontextoobrigatórioReschedule e send_now só valem para campanha com status scheduled (senão 409). continue não vale para campanha concluída (done).
stop pausa (status paused); continue retoma (status scheduled); delete apaga a campanha e as mensagens ainda não enviadas, em segundo plano; reschedule muda o horário; send_now antecipa para agora.
scheduled_forinteirointeiro de 64 bitscondicionalObrigatório quando action=reschedule. Ignorado nas outras ações.
Novo horário: timestamp em milissegundos ou em segundos, ou minutos a partir de agora (até 10.080).
scheduled_for é obrigatório quando action é reschedule.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).reschedule ou send_now foi pedida para uma campanha que não está agendada (status diferente de "scheduled")PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "folder_id": "f3a9c2b1", "action": "stop"}'Resposta
{
"success": true,
"data": []
}/sender/cleardone
Inicia, em segundo plano, a limpeza das mensagens de campanha já enviadas com sucesso. Mantém as enviadas nas últimas hours horas e remove as mais antigas; sem hours, mantém os últimos 7 dias (168 horas). A resposta não espera a limpeza terminar.
Para apagar tudo, inclusive o que ainda não foi enviado, use DELETE /sender/clearall.
Um objeto JSON com Content-Type: application/json.
hoursinteiroopcionalMantém as mensagens enviadas nas últimas N horas e remove as mais antigas. Padrão: 168 (7 dias).
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/cleardone ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "hours": 24}'Resposta
{
"success": true,
"data": {
"status": "cleanup started"
}
}/sender/clearall
Apaga todas as mensagens de campanha do dispositivo, pendentes e já enviadas, junto com as campanhas. É uma operação irreversível. A resposta traz messages_deleted e folders_deleted.
Para apagar só as mensagens já enviadas, use POST /sender/cleardone; para apagar uma campanha só, POST /sender/edit com action: "delete".
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/clearall ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"status": "processed",
"messages_deleted": 150,
"folders_deleted": 3
}
}/sender/listfolders
Retorna as campanhas de envio em massa do dispositivo atual, ordenadas das mais recentes para as mais antigas.
Use esta operação para montar o histórico de campanhas e escolher qual abrir em POST /sender/listmessages. Uma lista vazia indica que ainda não existem campanhas disponíveis para o dispositivo.
Cada item traz id (o folder_id usado em POST /sender/edit e POST /sender/listmessages), info, status, scheduled_for, delayMin e delayMax (em milissegundos), os contadores log_total, log_sucess, log_delivered, log_read, log_played e log_failed, e as datas created e updated.
Vão depois do ? no endereço, como nome=valor.
statustextoopcionalFiltro reservado para compatibilidade: a resposta pode trazer todas as campanhas mesmo com ele.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/listfolders ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": [
{
"id": "3EB0538DA65A59F6D8A251",
"info": "Olá! Tudo certo por aqui.",
"status": "ativo",
"scheduled_for": 1,
"delayMax": 10,
"delayMin": 30,
"log_delivered": 1,
"log_failed": 1,
"log_played": 1,
"log_read": 1,
"log_sucess": 1,
"log_total": 10,
"owner": "5511999999999",
"created": "2026-10-20T12:00:00Z",
"updated": "2026-10-20T12:00:00Z"
}
]
}/sender/listmessages
Lista as mensagens de uma campanha, com filtro por status e paginação, para acompanhar o andamento e encontrar falhas.
A resposta traz messages e pagination com totalRecords, limit, offset, hasMore e nextOffset. Enquanto hasMore for true, peça a próxima página com offset igual a nextOffset.
Um objeto JSON com Content-Type: application/json.
folder_idtextoobrigatórioID da campanha (o folder_id devolvido na criação, ou o id de GET /sender/listfolders).
messageStatustextoopcionalFiltra pelo status da mensagem.
limitinteiroopcionalQuantidade máxima de itens por página (padrão 1000, máximo 1000).
offsetinteiroopcionalDeslocamento base zero para a paginação.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/listmessages ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "folder_id": "f3a9c2b1", "limit": 100, "offset": 0}'Resposta
{
"success": true,
"data": {
"messages": [
{
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg"
}
],
"pagination": {
"totalRecords": 30,
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/sender/stats
Retorna uma fotografia do processador de campanhas do dispositivo: estado atual, campanha em execução, ritmo observado e próximo envio agendado.
As métricas representam a execução desde a última inicialização do serviço e não substituem a consulta das campanhas e mensagens. messages_processed indica processamento pela fila, não entrega ou leitura pelo destinatário.
A resposta traz em data.status.current o estado do processador de campanhas (por exemplo idle ou sending), em data.statistics o ritmo observado e em data.scheduling o próximo envio agendado.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/sender/stats ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"status": "success",
"data": {
"status": {
"current": "idle",
"direct_message_active": false
},
"statistics": {
"messages_processed": 120,
"avg_processing_ms": 850,
"messages_per_minute": 12.5
},
"instance": {
"groups_count": 8,
"is_business": true,
"platform": "android",
"system_name": "Android",
"profile_name": "Atendimento"
},
"scheduling": {
"next_send_at": null,
"next_send_in_seconds": null
}
}
}
}Referência 20
Crie grupos e comunidades, gerencie participantes, convites e permissões.
/group/create
/group/info
/group/inviteInfo
/group/invitelink/{groupJID}
/group/join
/group/leave
/group/list
/group/list
/group/resetInviteCode
/group/updateAnnounce
/group/updateJoinApproval
/group/updateMemberAddMode
/group/updateDescription
/group/ephemeral
/group/updateImage
/group/updateLocked
/group/updateName
/group/updateParticipants
/community/create
/community/editgroups
/group/create
Cria um grupo com convidados iniciais opcionais. O WhatsApp inclui quem cria o grupo automaticamente.
Para criar o grupo só com o seu número, envie participants: [], omita o campo ou envie null. Informar só o próprio número do dispositivo tem o mesmo efeito; não é preciso incluir o criador.
Para convidar outras pessoas, informe números com DDI (só dígitos) ou JIDs completos, como 5511999999999@s.whatsapp.net. JIDs LID que o dispositivo já conhece também são aceitos. Os participantes são verificados; números repetidos e o próprio número do dispositivo são ignorados. Uma lista em que nenhum convidado é válido volta erro e não vira um grupo vazio.
O nome aceita de 1 a 100 caracteres nesta rota; para renomear depois, POST /group/updateName aceita de 1 a 25.
A resposta traz group e failed. Quem a privacidade impediu de entrar fica em failed e não recebe convite automático. Para chamar essa pessoa, pegue o link do grupo em GET /group/invitelink/{groupJID} e envie como texto por POST /send/text (use o group.JID da resposta).
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNome do grupo, de 1 a 100 caracteres.
participantslista de textosaceita nullopcionalOpcional. Vazio ([]), omitido ou null cria o grupo só com o criador. Cada item: número com DDI só com dígitos, JID completo (5511999999999@s.whatsapp.net) ou LID que o dispositivo já conhece. Repetidos e o próprio número do dispositivo são ignorados. Se nenhum convidado for válido, a API volta erro em vez de criar o grupo vazio.
Convidados iniciais: lista ou null.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/create ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Equipe de Vendas", "participants": [ "5511999999999", "5521987654321" ]}'Resposta
{
"success": true,
"data": {
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"failed": [
""
]
}
}/group/info
Consulta os dados de um grupo: participantes conhecidos, permissões e, quando disponíveis, a foto e a comunidade a que ele pertence. O uso normal precisa só de groupjid, por exemplo depois de escolher o grupo em POST /group/list.
getInviteLink: true traz também o link de convite, e getRequestsParticipants: true traz os pedidos de entrada pendentes. Os dois só funcionam para administrador com permissão confirmada; sem essa permissão, os campos podem vir ausentes.POST /group/updateParticipants com action: approve ou reject.force: true pede atualização ao WhatsApp; deixe false no uso normal.Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
getInviteLinkbooleanoopcionalSó traz o link se o número for administrador com permissão confirmada; sem permissão, o campo vem ausente.
Pede também o link de convite.
getRequestsParticipantsbooleanoopcionalSó para administrador. É daqui que saem os números usados em POST /group/updateParticipants com action approve ou reject.
Pede também os pedidos de entrada pendentes.
forcebooleanoopcionalDeixe false no uso normal.
Força atualização ao WhatsApp.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/info ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us"}'Resposta
{
"success": true,
"data": {
"JID": "120363153742561022@g.us",
"Name": "Comunidade de exemplo",
"Participants": [
{
"JID": "5521987654321@s.whatsapp.net",
"IsAdmin": true
}
],
"IsLocked": false,
"IsAnnounce": false
}
}/group/inviteInfo
Mostra os dados de um grupo a partir do link de convite ou do código, sem entrar nele.
Use para conferir nome, participantes e restrições antes de chamar POST /group/join.
Um objeto JSON com Content-Type: application/json.
invitecodetextoobrigatórioAceita o código curto (IYnl5Zg9bUcJD32rJrDzO7) ou o link completo https://chat.whatsapp.com/<código>.
Código de convite ou link completo do grupo.
invalid payload) ou código vazio (invalid invite code).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/inviteInfo ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "invitecode": "https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7" }'Resposta
{
"success": true,
"data": {
"response": "Group info retrieved successfully",
"group": {
"JID": "120363153742561022@g.us",
"Name": "Comunidade de exemplo",
"Participants": [
{
"JID": "5521987654321@s.whatsapp.net",
"IsAdmin": true
}
],
"IsLocked": false,
"IsAnnounce": false
}
}
}/group/invitelink/{groupJID}
Devolve o link de convite atual do grupo (https://chat.whatsapp.com/<código>). Qualquer pessoa com o link pode entrar, e ele vale até alguém gerar um novo em POST /group/resetInviteCode.
O número do dispositivo precisa ser administrador do grupo.
É o caminho para chamar quem a privacidade impediu de entrar em POST /group/create ou POST /group/updateParticipants: envie o link como texto por POST /send/text.
Troque o trecho entre chaves no caminho pelo valor.
groupJIDtextoobrigatórioVai no caminho da URL, por exemplo /group/invitelink/120363153742561022@g.us.
JID do grupo, terminado em @g.us.
inviteLink.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/group/invitelink/120363153742561022@g.us ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"inviteLink": "https://chat.whatsapp.com/AbCdEfGhIjKlMnOpQrStUv"
}
}/group/join
Entra num grupo pelo link de convite (https://chat.whatsapp.com/<código>) ou só pelo código do link. Para conferir nome, participantes e restrições antes de entrar, use POST /group/inviteInfo.
Só vale o convite do grupo por link. O código de um convite individual (o cartão "Entrar no grupo" recebido numa conversa) não funciona aqui, e a API ainda não tem rota para aceitar esse convite.
A resposta traz o JID do grupo em group; consulte os detalhes depois em POST /group/info.
Um objeto JSON com Content-Type: application/json.
invitecodetextoobrigatórioFormatos: código (IYnl5Zg9bUcJD32rJrDzO7) ou link (https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7). Código de convite individual não funciona.
Código ou link completo de convite do grupo, de 10 a 50 caracteres.
invalid payload) ou código vazio (invalid invite code).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/join ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "invitecode": "https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7" }'Resposta
{
"success": true,
"data": {
"response": "Group join successful",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/leave
Tira o número do dispositivo de um grupo.
Requisitos:
Comportamento:
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo: só dígitos seguidos de @g.us (ex.: 120363324255083289@g.us).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/leave ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363324255083289@g.us"}'Resposta
{
"success": true,
"data": {
"response": "Group leave successful"
}
}/group/list
Forma antiga, sem paginação: devolve todos os grupos de uma vez, e a resposta pode ficar grande. Mantida para integrações existentes; para integrações novas, prefira POST /group/list, que pagina.
noParticipants=true devolve a lista sem os membros, como no POST.force=true pede atualização da lista e pode reaproveitar uma atualização recente.Para ver os membros de um grupo, use POST /group/info no grupo escolhido.
Vão depois do ? no endereço, como nome=valor.
forcebooleanoopcionalPode reaproveitar a última atualização bem-sucedida feita nos últimos 20 segundos.
Pede atualização da lista.
noParticipantsbooleanoopcionalPor compatibilidade, aceita também o nome antigo noparticipants.
true devolve a lista sem os membros.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/group/list?noParticipants=true ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"groups": [
{
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
}
]
}
}/group/list
Busca grupos em páginas, para escolher qual abrir. Prefira páginas de resumos sem a lista de membros e consulte POST /group/info só no grupo escolhido.
Envie search, limit e offset, com noParticipants: true. A página tem 50 grupos por padrão e no máximo 1000. A busca considera nome, JID, descrição do grupo e nome da comunidade a que ele pertence. A resposta traz groups e pagination.
Comece com offset: 0 e repita a chamada com offset igual ao pagination.nextOffset enquanto pagination.hasMore for true. O total de grupos encontrados vem em pagination.totalRecords.
noParticipants continua false para preservar integrações existentes; o exemplo recomendado usa true.noParticipants: true evita carregá-los na página e enviá-los na resposta.force: true pede atualização ao WhatsApp. Normalmente basta deixar a API atualizar quando necessário; não use force em consultas repetidas em sequência.Um objeto JSON com Content-Type: application/json.
limitinteiroopcionalQuantidade máxima de grupos por página (padrão 50, máximo 1000).
offsetinteiroopcionalPara a próxima página, use o pagination.nextOffset da resposta enquanto pagination.hasMore for true.
Deslocamento da página, a partir de zero (padrão 0).
searchtextoopcionalBusca por nome, descrição, JID ou nome da comunidade a que o grupo pertence.
forcebooleanoopcionalNão é necessário no uso normal; não use em consultas repetidas em sequência.
Força atualização ao WhatsApp.
noParticipantsbooleanoopcionalO padrão é false por compatibilidade; o uso recomendado é true.
true devolve resumos sem os membros.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/list ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "search": "Suporte", "limit": 50, "offset": 0, "noParticipants": true}'Resposta
{
"success": true,
"data": {
"groups": [
{
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
}
],
"pagination": {
"totalRecords": 30,
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/group/resetInviteCode
Gera um novo link de convite para o grupo e invalida o anterior. Só administradores do grupo podem fazer isso.
A resposta traz o novo link em InviteLink e os dados atualizados do grupo em group. Para só consultar o link atual, sem trocar, use GET /group/invitelink/{groupJID}.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioO número do dispositivo precisa ser administrador do grupo.
JID do grupo, terminado em @g.us.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário sem permissão.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/resetInviteCode ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363308883996631@g.us"}'Resposta
{
"success": true,
"data": {
"InviteLink": "https://chat.whatsapp.com/AbCdEfGhIjKlMnOpQrStUv",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/updateAnnounce
Define quem pode enviar mensagens no grupo.
Com announce: true:
Com announce: false:
O número do dispositivo precisa ser administrador do grupo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
announcebooleanoobrigatórioTrue: só administradores enviam. false: todos enviam.
Quem pode enviar mensagens no grupo.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateAnnounce ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "announce": true}'Resposta
{
"success": true,
"data": {
"response": "Group announce enabled successfully",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/updateJoinApproval
Define se novos participantes precisam ser aprovados antes de entrar no grupo. O estado aparece no campo IsJoinApprovalRequired do objeto group da resposta e de POST /group/info.
Com IsJoinApprovalRequired: true:
POST /group/info com getRequestsParticipants: true;POST /group/updateParticipants com action: approve ou reject.Com IsJoinApprovalRequired: false, entradas por link ou convite não exigem aprovação.
O número do dispositivo precisa ser administrador do grupo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
IsJoinApprovalRequiredbooleanoobrigatórioNome com maiúsculas exatamente assim. true: as entradas passam por aprovação; os pedidos aparecem em POST /group/info (getRequestsParticipants) e são tratados em POST /group/updateParticipants com approve ou reject.
Se a entrada no grupo exige aprovação.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateJoinApproval ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "IsJoinApprovalRequired": true}'Resposta
{
"success": true,
"data": {
"response": "Group join approval enabled successfully",
"group": {
"JID": "120363339858396166@g.us",
"IsJoinApprovalRequired": true
},
"needs_refresh": false
}
}/group/updateMemberAddMode
Define quem pode adicionar novos participantes diretamente ao grupo. O estado aparece no campo MemberAddMode do objeto group da resposta e de POST /group/info.
Valores aceitos em MemberAddMode:
admin_add: só administradores adicionam membros;all_member_add: qualquer participante adiciona membros.O número do dispositivo precisa ser administrador do grupo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
MemberAddModetextoobrigatórioadmin_add: só administradores adicionam. all_member_add: qualquer participante adiciona.
Quem pode adicionar membros.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateMemberAddMode ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "MemberAddMode": "admin_add"}'Resposta
{
"success": true,
"data": {
"response": "Group member add mode set to admin_add successfully",
"group": {
"JID": "120363339858396166@g.us",
"MemberAddMode": "admin_add"
},
"needs_refresh": false
}
}/group/updateDescription
Altera a descrição do grupo, que aparece na tela de informações e pode ser vista por todos os participantes. Aceita até 512 caracteres.
O número do dispositivo precisa ser administrador do grupo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo: só dígitos seguidos de @g.us.
descriptiontextoobrigatórioNova descrição do grupo, até 512 caracteres.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE). Caso do WhatsApp (413): Descrição excede o limite máximo permitido.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateDescription ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "description": "Grupo oficial de suporte. Atendimento de segunda a sexta, das 9h às 18h."}'Resposta
{
"success": true,
"data": {
"response": "Group description updated successfully",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/ephemeral
Define o tempo das mensagens temporárias de um grupo.
Valores aceitos em duration:
0 ou "off" para desativar;"1d" (1 dia);"7d" (7 dias);"90d" (90 dias).Observações:
POST /chat/ephemeral;Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioSó grupo; para conversa individual, use POST /chat/ephemeral.
JID do grupo, terminado em @g.us.
durationstring|integerobrigatórioValores aceitos: 0 ou "off" (desativa), "1d", "7d" e "90d".
Duração das mensagens temporárias, como texto ou número.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/ephemeral ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "duration": "7d"}'Resposta
{
"success": true,
"data": {
"response": "Ephemeral timer updated successfully",
"chat": {
"wa_chatid": "120363339858396166@g.us",
"wa_ephemeralExpiration": 86400,
"wa_isGroup": true
},
"ephemeral": {
"enabled": true,
"seconds": 86400,
"label": "1d"
},
"group": {
"JID": "120363339858396166@g.us",
"IsEphemeral": true,
"DisappearingTimer": 86400
},
"needs_refresh": false
}
}/group/updateImage
Altera a imagem do grupo. A imagem pode ir por URL ou em base64.
Requisitos da imagem:
Para remover a imagem atual, envie "remove" ou "delete" em image.
O número do dispositivo precisa ser administrador do grupo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
imagetextoobrigatórioTrês modos: URL da imagem; imagem em base64; ou "remove"/"delete" para tirar a foto atual. A imagem precisa ser JPEG de até 640x640.
Nova imagem do grupo: URL, base64 ou "remove"/"delete".
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE). Caso do WhatsApp (413): Imagem muito grande.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateImage ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363308883996631@g.us", "image": "https://exemplo.com/logo-grupo.jpg" }'Resposta
{
"success": true,
"data": {
"response": "Group image updated successfully",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/updateLocked
Define se só administradores podem editar os dados do grupo.
Com locked: true, só administradores alteram nome, descrição, imagem e outras configurações do grupo. Com locked: false, qualquer participante pode editar esses dados.
Observações:
POST /group/updateMemberAddMode.Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
lockedbooleanoobrigatórioTrue: só administradores editam nome, descrição e imagem. false: qualquer participante edita.
Quem pode editar os dados do grupo.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateLocked ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363308883996631@g.us", "locked": true}'Resposta
{
"success": true,
"data": {
"response": "Group lock status changed successfully",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/updateName
Altera o nome do grupo. Só administradores do grupo podem fazer isso.
O nome precisa ter de 1 a 25 caracteres e seguir as regras do WhatsApp.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
nametextoobrigatórioNovo nome do grupo, de 1 a 25 caracteres.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateName ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363153742561022@g.us", "name": "Suporte Clientes"}'Resposta
{
"success": true,
"data": {
"response": "Group name updated successfully",
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"needs_refresh": false
}
}/group/updateParticipants
Gerencia os participantes do grupo. A ação vai em action:
add: adiciona participantes;remove: tira participantes do grupo;promote: torna participantes administradores;demote: tira o cargo de administrador;approve: aprova pedidos de entrada pendentes;reject: recusa pedidos de entrada pendentes.O número do dispositivo precisa ser administrador do grupo.
approve e reject valem para os pedidos pendentes, que existem quando a aprovação de entrada está ligada (POST /group/updateJoinApproval) e aparecem em POST /group/info com getRequestsParticipants: true.
A resposta traz em groupUpdated o resultado de cada participante: Error 0 é sucesso. Com action: add, quem a privacidade bloqueia volta com Error: 403 e AddRequest (código e prazo do convite individual que o WhatsApp gera). Para chamar essa pessoa, pegue o link do grupo em GET /group/invitelink/{groupJID} e envie como texto por POST /send/text. O campo needs_refresh indica se os detalhes do grupo precisam ser consultados de novo.
Um objeto JSON com Content-Type: application/json.
groupjidtextoobrigatórioJID do grupo, terminado em @g.us.
actiontextoobrigatórioAdd: adiciona; quem a privacidade bloqueia volta em groupUpdated com Error 403 e AddRequest. remove: tira do grupo. promote: torna administrador. demote: tira o cargo de administrador. approve/reject: aprova ou recusa pedidos de entrada pendentes (lista em POST /group/info com getRequestsParticipants: true). Todas exigem que o número do dispositivo seja administrador.
Ação a executar.
participantslista de textosobrigatórioCada item: número com DDI no formato internacional, sem + nem espaços, ou JID completo.
Participantes afetados pela ação.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador do grupo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/group/updateParticipants ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupjid": "120363308883996631@g.us", "action": "add", "participants": [ "5511999999999", "5521987654321" ]}'Resposta
{
"success": true,
"data": {
"groupUpdated": [
{
"JID": "5521987654321@s.whatsapp.net",
"Error": 0,
"AddRequest": null
},
{
"JID": "5511999999999@s.whatsapp.net",
"Error": 403,
"AddRequest": {
"Code": "EMVH7xMeLQRQcZQg",
"Expiration": "2026-10-08T15:38:19Z"
}
}
],
"needs_refresh": true
}
}/community/create
Cria uma comunidade no WhatsApp. A comunidade reúne vários grupos relacionados sob uma mesma administração.
Ela nasce só com o grupo principal de avisos, criado automaticamente. Outros grupos podem ser vinculados depois em POST /community/editgroups, usando como community o JID que volta em group.JID.
O número que cria a comunidade vira administrador dela automaticamente.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNome da comunidade.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Sem permissão para criar comunidades.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de criação de comunidades atingido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/community/create ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Comunidade do Bairro"}'Resposta
{
"success": true,
"data": {
"group": {
"JID": "jid8@g.us",
"OwnerJID": "1232@s.whatsapp.net",
"OwnerPN": "5511999999999",
"Name": "Grupo de Suporte",
"NameSetAt": "2026-10-20T12:00:00Z",
"NameSetBy": "Exemplo",
"NameSetByPN": "Exemplo",
"Topic": "https://exemplo.com/arquivo.jpg",
"TopicID": "https://exemplo.com/arquivo.jpg",
"TopicSetAt": "2026-10-20T12:00:00Z",
"TopicSetBy": "https://exemplo.com/arquivo.jpg",
"TopicSetByPN": "https://exemplo.com/arquivo.jpg",
"TopicDeleted": true,
"IsLocked": true,
"IsAnnounce": true,
"AnnounceVersionID": "",
"IsEphemeral": true,
"DisappearingTimer": 1,
"IsIncognito": true,
"IsParent": true,
"IsJoinApprovalRequired": true,
"LinkedParentJID": "https://exemplo.com/arquivo.jpg",
"IsDefaultSubGroup": true,
"DefaultMembershipApprovalMode": "text",
"GroupCreated": "2026-10-20T12:00:00Z",
"CreatorCountryCode": "AbCdEf123",
"ParticipantVersionID": "",
"Participants": [],
"MemberAddMode": "",
"AddressingMode": "",
"OwnerCanSendMessage": true,
"OwnerIsAdmin": true,
"DefaultSubGroupId": "120363153742561022@g.us",
"invite_link": "https://exemplo.com/arquivo.jpg",
"request_participants": "",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"picture_empty_at": "2026-10-20T12:00:00Z",
"image_checked_at": "2026-10-20T12:00:00Z",
"image_preview_checked_at": "2026-10-20T12:00:00Z",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"participant_profiles": [
{
"jid": "5511999999999@s.whatsapp.net",
"pn": "",
"lid": "123456789012345@lid",
"username": "Exemplo",
"display_name": "Exemplo",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"picture_id": "https://exemplo.com/arquivo.jpg",
"picture_preview_id": "https://exemplo.com/arquivo.jpg",
"is_admin": true,
"is_super_admin": true
}
],
"ParticipantCount": 10,
"request_participants_lid": "123456789012345@lid"
},
"failed": [
""
]
}
}/community/editgroups
Vincula ou desvincula grupos de uma comunidade do WhatsApp. Só administradores da comunidade podem fazer isso.
Ações em action:
add: vincula os grupos indicados à comunidade;remove: desvincula os grupos indicados.Vários grupos podem ir na mesma requisição.
Regras:
A resposta lista em success os grupos processados e em failed os que falharam.
Um objeto JSON com Content-Type: application/json.
communitytextoobrigatórioJID da comunidade (o group.JID devolvido em POST /community/create).
actiontextoobrigatórioadd: vincula grupos ainda não vinculados. remove: desvincula grupos já vinculados.
Operação.
groupjidslista de textosobrigatórioOs grupos precisam existir.
JIDs dos grupos (pelo menos 1).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Usuário não é administrador da comunidade.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/community/editgroups ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "community": "120363153742561022@g.us", "action": "add", "groupjids": [ "120363324255083289@g.us", "120363308883996631@g.us" ]}'Resposta
{
"message": "community updated",
"success": [
""
],
"failed": [
""
]
}Referência 12
Busque, arquive, fixe, silencie e marque conversas como lidas.
/chat/delete
/chat/archive
/chat/ephemeral
/chat/read
/chat/mute
/chat/pin
/chat/find
/chat/notes
/chat/notes/refresh
/chat/notes/edit
/chat/totalcount
/chat/avatar
/chat/delete
Apaga uma conversa, as mensagens guardadas dela ou as duas coisas, conforme as opções enviadas como true:
deleteChatWhatsApp: apaga a conversa no WhatsApp (em grupo isso não é permitido, e a conversa é só limpa)clearChatWhatsApp: limpa as mensagens da conversa no WhatsApp, sem sair deladeleteChatDB: tira a conversa do histórico do dispositivodeleteMessagesDB: apaga as mensagens guardadas da conversaAs opções podem ser combinadas e todas começam em false: envie como true as que quiser aplicar. Com clearChatWhatsApp e deleteChatWhatsApp juntos, a limpeza tem prioridade. Conversa não encontrada responde 404.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero com DDI ou JID da conversa; para grupo, o ID completo (@g.us).
deleteChatDBbooleanoopcionaltrue tira a conversa do histórico do dispositivo.
deleteMessagesDBbooleanoopcionaltrue apaga todas as mensagens guardadas da conversa.
deleteChatWhatsAppbooleanoopcionalEm grupo não é permitido: a conversa é só limpa.
true apaga a conversa no WhatsApp.
clearChatWhatsAppbooleanoopcionalSe vier junto com deleteChatWhatsApp=true, a limpeza tem prioridade.
true limpa as mensagens da conversa no WhatsApp sem sair dela. Vale para grupo e conversa individual.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/delete ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "deleteChatWhatsApp": true, "deleteChatDB": true, "deleteMessagesDB": true}'Resposta
{
"success": true,
"data": {
"response": "Chat deletion process completed",
"actions": [
"Chat deleted from WhatsApp",
"Chat deleted from database",
"Messages associated with chat deleted from database: 42"
],
"errors": [
"Error deleting chat from WhatsApp: connection timeout"
]
}
}/chat/archive
Altera o estado de arquivamento de um chat do WhatsApp.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero com DDI ou ID do grupo.
archivebooleanoobrigatóriotrue arquiva; false desarquiva.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/archive ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "archive": true}'Resposta
{
"success": true,
"data": {
"response": "Chat updated successfully"
}
}/chat/ephemeral
Define o temporizador de mensagens temporárias de uma conversa individual.
Valores aceitos em duration:
0 ou off: desativa1d: 1 dia7d: 7 dias90d: 90 diasOutro valor responde 400. Só vale para conversas individuais: com o ID de um grupo, a resposta é um erro que orienta usar POST /group/ephemeral. A resposta traz o chat com wa_ephemeralExpiration atualizado e ephemeral (enabled, seconds e label).
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioSó conversa individual; para grupo, use POST /group/ephemeral.
Identificador da conversa individual.
durationstring|integerobrigatórioValores aceitos: 0 ou "off" desativa; "1d", "7d" ou "90d" ativa por 1, 7 ou 90 dias. Outro valor responde 400.
Duração das mensagens temporárias.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/ephemeral ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net", "duration": "7d"}'Resposta
{
"success": true,
"data": {
"response": "Ephemeral timer updated successfully",
"chat": {
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_ephemeralExpiration": 604800,
"wa_isGroup": false
},
"ephemeral": {
"enabled": true,
"seconds": 604800,
"label": "7d"
}
}
}/chat/read
Atualiza o status de leitura de um chat no WhatsApp.
Quando um chat é marcado como lido:
Quando marcado como não lido:
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID da conversa: 5511999999999@s.whatsapp.net para pessoa ou 120363025678901234@g.us para grupo.
readbooleanoobrigatóriotrue marca como lida; false marca como não lida.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/read ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net", "read": true}'Resposta
{
"success": true,
"data": {
"response": "Chat read status updated successfully"
}
}/chat/mute
Silencia notificações de um chat por um período específico. As opções de silenciamento são:
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID da conversa (pessoa ou grupo).
muteEndTimeinteiroobrigatório0 tira o silêncio; 8 silencia por 8 horas; 168 por 1 semana; -1 para sempre.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/mute ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net", "muteEndTime": 8}'Resposta
{
"success": true,
"data": {
"response": "Chat mute settings updated successfully"
}
}/chat/pin
Fixa ou desafixa um chat no topo da lista de conversas. Chats fixados permanecem no topo mesmo quando novas mensagens são recebidas em outros chats.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero com DDI ou ID do grupo.
pinbooleanoobrigatóriotrue fixa; false desafixa.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/pin ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "pin": true}'Resposta
{
"success": true,
"data": {
"response": "Chat pinned"
}
}/chat/find
Busca conversas com filtros, ordenação e paginação. Qualquer campo da conversa serve de filtro: além dos listados abaixo, valem por exemplo wa_lastMsgTimestamp, wa_lastMessageType, wa_isGroup_community, phone, lead_name, lead_fullName, lead_email, lead_kanbanOrder e lead_field01 a lead_field20, com o nome exato do campo.
Nos filtros de texto, o valor pode começar com um operador:
=: igual~: contém!~: não contém!=: diferente>=: maior ou igual>: maior que<=: menor ou igual<: menor queoperator diz como combinar os filtros: AND (todos, o padrão) ou OR (qualquer um). sort ordena por um campo, com - na frente para decrescente ou + para crescente (ex.: -wa_lastMsgTimestamp).
No formato completo, o padrão é 2000 registros e um limit positivo é respeitado sem teto. Com compact: true, o padrão é 100 e o máximo 200; valores maiores são reduzidos para 200. limit omitido, 0 ou negativo usa o padrão do modo. Em listas e telas, prefira compact: true e páginas explícitas com limit e offset.
O formato compacto usa os mesmos nomes de campo, sem detalhes, notas completas, campos personalizados e estado do chatbot; inclui lead_awaitingReply. Os filtros podem usar campos que não aparecem no formato compacto.
A resposta traz chats, totalChatsStats (contadores) e pagination (totalRecords, limit, offset). Na busca direta por identificador (por exemplo, wa_chatid com o JID exato), a paginação volta como {totalRecords: 1, limit: 1, offset: 0}.
Um objeto JSON com Content-Type: application/json.
operatortextoopcionalComo combinar os filtros: AND (todos) ou OR (qualquer um).
sorttextoopcionalCampo de ordenação, com - na frente para decrescente ou + para crescente. Ex.: -wa_lastMsgTimestamp.
limitinteiroopcionalFormato completo: padrão 2000, sem teto para valor positivo. Com compact=true: padrão 100, máximo 200 (valores maiores viram 200). Omitido, 0 ou negativo usa o padrão do modo.
Itens por página.
offsetinteiroopcionalQuantidade de registros a pular (paginação).
compactbooleanoopcionalDevolve só os campos de lista: identidade, nomes, prévia, indicadores, não lidas, última mensagem, etiquetas e campos essenciais do lead (inclui lead_awaitingReply). Sem campos personalizados, notas completas nem estado do chatbot.
wa_fastidtextoopcionalFiltro pelo identificador rápido da conversa. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
wa_chatidtextoopcionalFiltro pelo JID da conversa. Com o valor exato, funciona como busca direta e devolve a paginação {totalRecords: 1, limit: 1, offset: 0}. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
wa_archivedbooleanoopcionalConversas arquivadas (true) ou não (false).
wa_contactNametextoopcionalNome salvo na agenda. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
wa_nametextoopcionalNome do perfil no WhatsApp. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
nametextoopcionalNome exibido da conversa. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
wa_isBlockedbooleanoopcionalContato bloqueado (true) ou não (false).
wa_isGroupbooleanoopcionaltrue traz só grupos; false, só conversas individuais.
wa_isGroup_adminbooleanoopcionalGrupos em que o número é administrador.
wa_isGroup_announcebooleanoopcionalGrupos em que só administradores enviam mensagens.
wa_isGroup_memberbooleanoopcionalGrupos dos quais o número ainda participa.
wa_isPinnedbooleanoopcionalConversas fixadas (true) ou não (false).
wa_unreadCounttextoopcionalMensagens não lidas, com operador: ">0" traz as conversas com mensagens não lidas.
lead_awaitingReplybooleanoopcionaltrue: conversas em que o contato espera resposta; false: as que não esperam. Conversa sem última mensagem não entra em nenhum dos dois.
wa_labeltextoopcionalID da etiqueta aplicada à conversa (o id devolvido em GET /labels, não o nome).
wa_notestextoopcionalTexto das notas internas. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
lead_tagstextoopcionalTags do lead, como texto. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
lead_isTicketOpenbooleanoopcionalAtendimento aberto (true) ou fechado (false).
lead_assignedAttendant_idtextoopcionalID do atendente responsável. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
lead_statustextoopcionalStatus do lead. Use =valor para igualdade exata. Aceita os operadores de texto no início do valor (veja a descrição); sem operador, vale "contém".
lead_tagtextoopcionalTraz as conversas que têm exatamente esta tag em lead_tags, sem confundir nomes parecidos.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/find ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "compact": true, "sort": "-wa_lastMsgTimestamp", "limit": 50, "offset": 0}'Resposta
{
"success": true,
"data": {
"chats": [
{
"id": "3EB0538DA65A59F6D8A251",
"wa_fastid": "",
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_chatlid": "123456789012345@lid",
"wa_archived": false,
"wa_contactName": "Exemplo",
"wa_name": "Exemplo",
"name": "Exemplo",
"image": "https://exemplo.com/arquivo.jpg",
"imagePreview": "https://exemplo.com/arquivo.jpg",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"wa_ephemeralExpiration": 0,
"wa_isBlocked": false,
"wa_isGroup": false,
"wa_isGroup_admin": false,
"wa_isGroup_announce": false,
"wa_isGroup_community": false,
"wa_isGroup_member": false,
"wa_isPinned": false,
"wa_label": [
"Exemplo"
],
"wa_notes": "Olá! Tudo certo por aqui.",
"wa_lastMessageTextVote": "Olá! Tudo certo por aqui.",
"wa_lastMessageType": "text",
"wa_lastMsgTimestamp": 1792500000000,
"wa_lastMessageSender": "Olá! Tudo certo por aqui.",
"lead_awaitingReply": true,
"wa_muteEndTime": 1792500000000,
"owner": "5511999999999",
"wa_unreadCount": 0,
"phone": "5511999999999",
"common_groups": "Grupo Família(120363123456789012@g.us),Trabalho(987654321098765432@g.us)",
"lead_name": "Exemplo",
"lead_fullName": "Exemplo",
"lead_email": "contato@exemplo.com",
"lead_personalid": "123456789012345@lid",
"lead_status": "success",
"lead_tags": [
""
],
"lead_notes": "Olá! Tudo certo por aqui.",
"lead_isTicketOpen": false,
"lead_assignedAttendant_id": "",
"lead_kanbanOrder": 0,
"lead_field01": "",
"lead_field02": "",
"lead_field03": "",
"lead_field04": "",
"lead_field05": "",
"lead_field06": "",
"lead_field07": "",
"lead_field08": "",
"lead_field09": "",
"lead_field10": "",
"lead_field11": "",
"lead_field12": "",
"lead_field13": "",
"lead_field14": "",
"lead_field15": "",
"lead_field16": "",
"lead_field17": "",
"lead_field18": "",
"lead_field19": "",
"lead_field20": "",
"chatbot_agentResetMemoryAt": 0,
"chatbot_lastTrigger_id": "",
"chatbot_lastTriggerAt": 0,
"chatbot_disableUntil": 1792500000,
"chatbot_summary": "Olá! Tudo certo por aqui."
}
],
"totalChatsStats": [],
"pagination": {
"totalRecords": 30,
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/chat/notes
Retorna a nota interna (wa_notes) de uma conversa usando só os dados já guardados, sem consultar o WhatsApp. Funciona inclusive durante uma reconexão.
number com o JID completo da conversa.POST /chat/notes/refresh.A resposta traz chat, wa_notes e source (local). Conversa não encontrada responde 404.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID completo da conversa.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/notes ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net"}'Resposta
{
"success": true,
"data": {
"chat": {
"wa_fastid": "admin:5511999999999",
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_notes": "Cliente prefere contato no período da tarde"
},
"wa_notes": "Cliente prefere contato no período da tarde",
"source": "local"
}
}/chat/notes/refresh
Lê de novo a nota interna da conversa no WhatsApp antes de devolver o valor atualizado.
force: false.force: true, que faz uma leitura mais completa e mais pesada; use só como correção.Enquanto a sincronização inicial do histórico estiver em andamento, a resposta é 409: tente de novo em instantes. Conversa não encontrada depois da leitura responde 404.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID completo da conversa.
forcebooleanoopcionalTente primeiro com false. true faz uma leitura completa e mais pesada; use só se a leitura padrão não atualizar a nota.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/notes/refresh ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net"}'Resposta
{
"success": true,
"data": {
"chat": {
"id": "3EB0538DA65A59F6D8A251",
"wa_fastid": "",
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_chatlid": "123456789012345@lid",
"wa_archived": false,
"wa_contactName": "Exemplo",
"wa_name": "Exemplo",
"name": "Exemplo",
"image": "https://exemplo.com/arquivo.jpg",
"imagePreview": "https://exemplo.com/arquivo.jpg",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"wa_ephemeralExpiration": 0,
"wa_isBlocked": false,
"wa_isGroup": false,
"wa_isGroup_admin": false,
"wa_isGroup_announce": false,
"wa_isGroup_community": false,
"wa_isGroup_member": false,
"wa_isPinned": false,
"wa_label": [
"Exemplo"
],
"wa_notes": "Olá! Tudo certo por aqui.",
"wa_lastMessageTextVote": "Olá! Tudo certo por aqui.",
"wa_lastMessageType": "text",
"wa_lastMsgTimestamp": 1792500000000,
"wa_lastMessageSender": "Olá! Tudo certo por aqui.",
"lead_awaitingReply": true,
"wa_muteEndTime": 1792500000000,
"owner": "5511999999999",
"wa_unreadCount": 0,
"phone": "5511999999999",
"common_groups": "Grupo Família(120363123456789012@g.us),Trabalho(987654321098765432@g.us)",
"lead_name": "Exemplo",
"lead_fullName": "Exemplo",
"lead_email": "contato@exemplo.com",
"lead_personalid": "123456789012345@lid",
"lead_status": "success",
"lead_tags": [
""
],
"lead_notes": "Olá! Tudo certo por aqui.",
"lead_isTicketOpen": false,
"lead_assignedAttendant_id": "",
"lead_kanbanOrder": 0,
"lead_field01": "",
"lead_field02": "",
"lead_field03": "",
"lead_field04": "",
"lead_field05": "",
"lead_field06": "",
"lead_field07": "",
"lead_field08": "",
"lead_field09": "",
"lead_field10": "",
"lead_field11": "",
"lead_field12": "",
"lead_field13": "",
"lead_field14": "",
"lead_field15": "",
"lead_field16": "",
"lead_field17": "",
"lead_field18": "",
"lead_field19": "",
"lead_field20": "",
"chatbot_agentResetMemoryAt": 0,
"chatbot_lastTrigger_id": "",
"chatbot_lastTriggerAt": 0,
"chatbot_disableUntil": 1792500000,
"chatbot_summary": "Olá! Tudo certo por aqui."
},
"wa_notes": "Cliente prefere contato no período da tarde",
"source": "appstate_reload"
}
}/chat/notes/edit
Atualiza a nota interna (wa_notes) da conversa no WhatsApp e guarda o resultado.
number e notes.notes: "" para limpar a nota.Enquanto a sincronização inicial do histórico estiver em andamento, a resposta é 409: tente de novo em instantes. Conversa não encontrada responde 404.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID completo da conversa.
notestextoobrigatórioEnvie "" (vazio) para limpar a nota.
Conteúdo da nota.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/notes/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net", "notes": "Cliente prefere contato no período da tarde"}'Resposta
{
"success": true,
"data": {
"response": "Chat notes updated",
"chat": {
"id": "3EB0538DA65A59F6D8A251",
"wa_fastid": "",
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_chatlid": "123456789012345@lid",
"wa_archived": false,
"wa_contactName": "Exemplo",
"wa_name": "Exemplo",
"name": "Exemplo",
"image": "https://exemplo.com/arquivo.jpg",
"imagePreview": "https://exemplo.com/arquivo.jpg",
"parent_community": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"image_url": "https://exemplo.com/arquivo.jpg",
"image_preview_url": "https://exemplo.com/arquivo.jpg",
"default_subgroup_jid": "120363153742561022@g.us"
},
"wa_ephemeralExpiration": 0,
"wa_isBlocked": false,
"wa_isGroup": false,
"wa_isGroup_admin": false,
"wa_isGroup_announce": false,
"wa_isGroup_community": false,
"wa_isGroup_member": false,
"wa_isPinned": false,
"wa_label": [
"Exemplo"
],
"wa_notes": "Olá! Tudo certo por aqui.",
"wa_lastMessageTextVote": "Olá! Tudo certo por aqui.",
"wa_lastMessageType": "text",
"wa_lastMsgTimestamp": 1792500000000,
"wa_lastMessageSender": "Olá! Tudo certo por aqui.",
"lead_awaitingReply": true,
"wa_muteEndTime": 1792500000000,
"owner": "5511999999999",
"wa_unreadCount": 0,
"phone": "5511999999999",
"common_groups": "Grupo Família(120363123456789012@g.us),Trabalho(987654321098765432@g.us)",
"lead_name": "Exemplo",
"lead_fullName": "Exemplo",
"lead_email": "contato@exemplo.com",
"lead_personalid": "123456789012345@lid",
"lead_status": "success",
"lead_tags": [
""
],
"lead_notes": "Olá! Tudo certo por aqui.",
"lead_isTicketOpen": false,
"lead_assignedAttendant_id": "",
"lead_kanbanOrder": 0,
"lead_field01": "",
"lead_field02": "",
"lead_field03": "",
"lead_field04": "",
"lead_field05": "",
"lead_field06": "",
"lead_field07": "",
"lead_field08": "",
"lead_field09": "",
"lead_field10": "",
"lead_field11": "",
"lead_field12": "",
"lead_field13": "",
"lead_field14": "",
"lead_field15": "",
"lead_field16": "",
"lead_field17": "",
"lead_field18": "",
"lead_field19": "",
"lead_field20": "",
"chatbot_agentResetMemoryAt": 0,
"chatbot_lastTrigger_id": "",
"chatbot_lastTriggerAt": 0,
"chatbot_disableUntil": 1792500000,
"chatbot_summary": "Olá! Tudo certo por aqui."
},
"wa_notes": "Cliente prefere contato no período da tarde",
"source": "api"
}
}/chat/totalcount
Retorna contadores totais e não lidos por estado, etiqueta e atendente. Os arrays são retornados vazios quando ainda não há etiquetas ou atendentes.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/totalcount ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"total_chats": {
"total": 10,
"unread": 1
},
"open_chats": {
"total": 10,
"unread": 1
},
"archived_chats": {
"total": 10,
"unread": 1
},
"group_chats": {
"total": 10,
"unread": 1
},
"blocked_chats": {
"total": 10,
"unread": 1
},
"label_counts": [
{
"id": "3EB0538DA65A59F6D8A251",
"labelid": "Exemplo",
"name": "Exemplo",
"total": 10,
"unread": 1
}
],
"attendant_counts": [
{
"id": "3EB0538DA65A59F6D8A251",
"name": "Exemplo",
"total": 10,
"unread": 1
}
]
}
}/chat/avatar
Retorna a URL temporária da imagem de uma conversa individual ou grupo. Use preview=true para solicitar a imagem reduzida ou preview=false para solicitar a imagem completa.
Quando não houver imagem disponível, a resposta continua válida e retorna url vazio. force=true solicita uma atualização antecipada, respeitando um intervalo mínimo de 20 segundos por imagem e dispositivo; não use essa opção em consultas repetidas.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero com DDI, JID de usuário, LID conhecido pelo dispositivo ou JID de grupo.
previewbooleanoopcionaltrue pede a imagem reduzida; false, a completa.
forcebooleanoopcionalRespeita o intervalo mínimo de 20 segundos por imagem e dispositivo; não use em consultas repetidas.
Pede uma atualização antecipada da imagem.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/avatar ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "preview": true}'Resposta
{
"success": true,
"data": {
"url": "https://pps.whatsapp.net/example.jpg"
}
}Referência 6
Agenda do número, detalhes de contato e verificação de números no WhatsApp.
/contacts
/contacts/list
/contact/add
/contact/remove
/chat/details
/chat/check
/contacts
Retorna a lista de contatos do WhatsApp conforme o filtro de contactScope:
address_book (padrão): só os contatos salvos na agendaoutside_address_book: só os contatos fora da agendaall: todos os contatos conhecidosCada contato vem com o JID e os nomes conhecidos. A lista vem inteira, sem paginação; em contas com muitos contatos, prefira POST /contacts/list.
Vão depois do ? no endereço, como nome=valor.
contactScopetextoopcionaladdress_book só a agenda (padrão); outside_address_book só os de fora da agenda; all todos os conhecidos.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/contacts?contactScope=address_book ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": [
{
"jid": "5511999999999@s.whatsapp.net",
"contact_name": "Contato Exemplo",
"contact_FirstName": "Contato"
}
]
}/contacts/list
Retorna uma lista paginada dos contatos da conta do WhatsApp conectada ao dispositivo. Controle a página com limit (padrão 100, máximo 1000) e offset no corpo da requisição, e escolha em contactScope entre os contatos da agenda, os de fora da agenda ou todos os conhecidos.
A resposta traz pagination com o total em totalRecords. A rota GET /contacts continua disponível para quem prefere a lista completa, sem paginação.
Um objeto JSON com Content-Type: application/json.
limitinteiroopcionalQuantidade máxima de resultados por página (padrão 100, máximo 1000).
offsetinteiroopcionalDeslocamento base zero para a paginação.
contactScopetextoopcionaladdress_book só a agenda (padrão); outside_address_book só os de fora da agenda; all todos os conhecidos.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/contacts/list ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "limit": 100, "offset": 0, "contactScope": "address_book"}'Resposta
{
"success": true,
"data": {
"contacts": [
{
"jid": "5511999999999@s.whatsapp.net",
"contact_name": "Joao Silva",
"contact_FirstName": "Joao"
}
],
"totalDeviceContacts": 10,
"pagination": {
"totalRecords": 30,
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/contact/add
Adiciona um novo contato à agenda do celular.
A rota realiza:
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNão aceita contato comercial (@lid) nem grupo (@g.us).
Telefone com DDI (no Brasil começa com 55). Aceita +, parênteses, hífen e espaços, ou o JID @s.whatsapp.net.
nametextoobrigatórioNome do contato; vale como nome completo e como primeiro nome.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/contact/add ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "+55 (21) 99999-9999", "name": "João Silva"}'Resposta
{
"success": true,
"message": "Contato adicionado com sucesso",
"contact": {
"jid": "5511999999999@s.whatsapp.net",
"name": "João Silva",
"phone": "5511999999999"
}
}/contact/remove
Remove um contato da agenda do celular conectado ao dispositivo e atualiza a lista de contatos sincronizada. Responde 404 quando o contato não está na agenda.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNão aceita contato comercial (@lid) nem grupo (@g.us).
Telefone com DDI (no Brasil começa com 55). Aceita +, parênteses, hífen e espaços, ou o JID @s.whatsapp.net.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/contact/remove ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5521999999999"}'Resposta
{
"success": true,
"message": "Contato removido com sucesso",
"removed_contact": {
"jid": "5511999999999@s.whatsapp.net",
"phone": "5511999999999"
}
}/chat/details
Retorna os dados disponíveis para apresentar ou editar uma conversa: identificação, nomes conhecidos, telefone, foto, estado do chat, dados de lead e informações de grupo quando aplicáveis.
Use depois de escolher um chat em POST /chat/find. Para obter somente a imagem, prefira POST /chat/avatar, mais leve, principalmente em listas com muitos chats. O campo preview permite escolher uma imagem menor para interfaces de listagem ou a imagem completa.
Cada dispositivo processa até 4 consultas desta rota ao mesmo tempo. A seguinte espera até 2 segundos por uma vaga; se não houver, recebe 429 com o header Retry-After. A rota também conta no limite de requisições do dispositivo.
Para contatos individuais, is_business indica se há um nome comercial conhecido. business_name traz esse nome quando disponível.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero com DDI ou ID do grupo.
previewbooleanoopcionaltrue devolve a foto em tamanho reduzido (para listas); false (padrão), em tamanho original.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de chamadas do dispositivo ou de consultas simultâneas desta rota.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/details ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999"}'Resposta
{
"success": true,
"data": {
"id": "k3m9x2p7q4w8z1t6",
"wa_fastid": "admin:5511999999999",
"wa_chatid": "5511999999999@s.whatsapp.net",
"wa_name": "João Silva",
"name": "João Silva",
"phone": "+55 11 99999-9999",
"owner": "admin",
"wa_archived": false,
"wa_isBlocked": false,
"wa_isGroup": false,
"lead_name": "João",
"lead_fullName": "João Silva",
"lead_email": "joao@exemplo.com",
"lead_status": "ativo",
"wa_contactName": "João Silva",
"is_business": false,
"business_name": "",
"wa_common_groups": "Grupo Família(120363123456789012@g.us),Trabalho(987654321098765432@g.us)",
"image": "https://pps.whatsapp.net/v/t61.24694-24/12345_image.jpg"
}
}/chat/check
Verifica se os números informados estão no WhatsApp e devolve os detalhes de cada um. Aceita vários de uma vez, inclusive IDs de grupo e de comunidade.
Números individuais: confirma se o número está no WhatsApp, devolve o nome verificado quando houver e o número no formato normalizado.
Grupos e comunidades: confirma se o grupo existe e devolve o nome. Também identifica comunidades e verifica subgrupos; buscando pelo ID de uma comunidade, devolve o ID do grupo de avisos dela.
Um objeto JSON com Content-Type: application/json.
numberslista de textosobrigatórioCom pelo menos 1 item.
Números com DDI ou IDs de grupo ou comunidade.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/check ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "numbers": [ "5511999999999", "5521988887777" ]}'Resposta
{
"success": true,
"data": [
{
"query": "",
"jid": "5511999999999@s.whatsapp.net",
"lid": "123456789012345@lid",
"isInWhatsapp": true,
"verifiedName": "Exemplo",
"groupName": "Exemplo",
"error": ""
}
]
}Referência 10
Reaja, edite, apague, fixe, baixe arquivos e busque mensagens.
Rotas para agir sobre mensagens já enviadas ou recebidas (baixar mídia, reagir, editar, apagar, fixar e marcar como lida), para ver quem recebeu e leu uma mensagem em grupo e para consultar o histórico do dispositivo.
As mensagens ficam guardadas no dispositivo por até 7 dias; com volume muito alto, a manutenção diária pode manter menos. Reagir, editar, apagar, fixar e baixar a mídia de novo dependem da mensagem original nesse histórico: fora dele, a rota responde que a mensagem não foi encontrada, e repetir a chamada não a recupera. O histórico não é um arquivo permanente: para guardar conversas por mais tempo, salve no seu sistema os eventos do webhook.
Para pedir ao celular mensagens anteriores que ainda não estão salvas, use POST /message/history-sync; para pedir de novo uma mensagem que chegou sem abrir, use POST /message/reload.
/message/download
/message/find
/message/status
/message/history-sync
/message/reload
/message/markread
/message/react
/message/delete
/message/edit
/message/pin
/message/download
Baixa o arquivo de uma mensagem de mídia (imagem, vídeo, áudio, documento ou figurinha). Na mensagem de botão com imagem, vídeo ou documento no topo, use o id da mensagem do botão: o download traz essa mídia.
generate_mp3 (padrão true): em áudios, true devolve MP3 e false devolve OGG.transcribe (padrão false): transcreve áudios para texto. Precisa de uma chave OpenAI: a já salva no dispositivo ou a enviada em openai_apikey. A chave enviada fica salva no dispositivo e é reutilizada nas próximas chamadas.download_quoted (padrão false): baixa a mídia da mensagem citada em vez da principal. Útil quando o contato responde a um Status ou a uma promoção: com a mídia original, você sabe de qual produto ou oferta ele está falando.return_base64 (padrão false): inclui o arquivo em base64. Evite: aumenta o uso de memória e processamento e o tamanho da resposta. Versões futuras poderão limitar o base64 em arquivos maiores que 5 MB, então não dependa dele para arquivos grandes.return_link: mantido por compatibilidade; a resposta sempre traz fileURL.A resposta traz fileURL (link para baixar o arquivo) e mimetype e, quando pedidos, base64Data e transcription. Por padrão, áudios vêm em MP3.
O link em fileURL é um endereço da DROPE (/wp-json/wdm/v1/media/...) e vale por 2 dias. Depois disso, chame esta rota de novo para gerar outro, enquanto a mensagem e a mídia original ainda estiverem disponíveis no histórico do dispositivo. Para guardar o arquivo por mais tempo, baixe pelo fileURL e salve num armazenamento próprio: guardar só o link não aumenta o prazo.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioID da mensagem contendo o arquivo
return_base64booleanoopcionalEvite: aumenta memória e resposta, e pode ser limitado acima de 5 MB no futuro. O fileURL vem sempre.
Inclui o conteúdo em base64. Evite em arquivos grandes; versões futuras poderão limitar arquivos maiores que 5 MB
generate_mp3booleanoopcionalSó para áudio: true devolve MP3, false devolve OGG.
Para áudios, define formato de retorno (true=MP3, false=OGG)
return_linkbooleanoopcionalMantido por compatibilidade; o fileURL vem sempre.
Mantido para compatibilidade. A URL pública é sempre retornada em fileURL
transcribebooleanoopcionalSó para áudio. Precisa de chave OpenAI salva no dispositivo ou enviada em openai_apikey.
Se verdadeiro, transcreve áudios para texto
openai_apikeytextoopcionalSe informada, fica salva no dispositivo para as próximas chamadas.
Chave da API OpenAI para transcrição (opcional)
download_quotedbooleanoopcionalBaixa a mídia da mensagem citada (ex.: o Status que o contato respondeu).
Se verdadeiro, baixa mídia da mensagem citada ao invés da mensagem principal
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/download ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "3EB0C431C26A1916713E"}'Resposta
{
"success": true,
"data": {
"fileURL": "https://dropestore.com/wp-json/wdm/v1/media/ASSINATURA_DO_ARQUIVO",
"mimetype": "audio/mpeg",
"base64Data": "UklGRkj...",
"transcription": "Texto transcrito"
}
}/message/find
Busca mensagens com múltiplos filtros disponíveis. Esta rota permite:
id para encontrar uma mensagem exatachatid para mensagens de uma conversa específicatrack_source e track_id para mensagens com dados de trackingmessageType: call, limit e offset para listar as chamadas mais recentes. A resposta pode trazer callPeer (identidade conhecida do contato) e content.isVideo.chatid: status@broadcast para os Status recebidos, mesmo sem webhook status_posts. Sem esse chatid, a busca não traz Status. Eles ficam guardados por 24 horas, como no WhatsApp (a limpeza roda uma vez por dia, então filtre messageTimestamp se precisar do corte exato), e o Status que o autor apaga sai da lista. Cada um vem com o autor em sender_pn, sender_lid e sender_image_preview_url (foto, quando conhecida) e, nos de imagem, vídeo ou link, com a miniatura em content.JPEGThumbnail. Baixe a mídia pelo /message/download. Um Status que não abriu vem com messageType: error e só o ID, o autor e o horário. Status de grupo (enviados e recebidos) ficam na conversa de cada grupo com messageType: GroupStatusMessage e o texto em text: liste todos com messageType: GroupStatusMessage, sem chatid. Saem em 24 horas, como os outros Status (os de campanha do /sender ficam com a campanha).limit para controlar quantas mensagens retornarFora dos Status, as mensagens guardadas só trazem no content as miniaturas em base64 que não têm cópia salva (prévia de link sem cópia, localização, anúncio, convites); as de mídia que pode ser baixada de novo (JPEGThumbnail e afins) chegam só no webhook, na hora da mensagem. Nas mensagens enviadas pela API nos últimos 7 dias, sendPayload traz o pedido de envio, sem os arquivos em base64 (links vêm). Depois do envio (em conversa individual, 1 hora depois), o arquivo em base64 guardado vira o texto [arquivo removido após o envio: tipo, N bytes].
A resposta traz messages (das mais recentes para as mais antigas) e pagination, com limit, offset, hasMore e nextOffset, sem o total. Para a próxima página, envie o nextOffset em offset enquanto hasMore for true. Para muitas mensagens, prefira páginas de até 1000.
O dispositivo guarda as mensagens por até 7 dias; com volume muito alto, a manutenção diária pode manter menos. Para pedir mensagens anteriores ao celular, use POST /message/history-sync. Para guardar conversas por mais tempo, salve no seu sistema os eventos do webhook.
Um objeto JSON com Content-Type: application/json.
idtextoopcionalBusca exata. Aceita o id completo, como 5511999999999:3EB0538DA65A59F6D8A251.
ID específico da mensagem para busca exata
chatidtextoopcionalFiltra por conversa. "status@broadcast" lista os Status recebidos (24 horas); sem ele, os Status não vêm.
ID do chat (ex.: 5511999999999@s.whatsapp.net ou um grupo @g.us).
messageTypetextoopcionalSem lista fechada. "call" (com limit e offset) lista as ligações; "GroupStatusMessage", sem chatid, lista os Status de grupo; "error" marca mensagens que não abriram (recupere com POST /message/reload).
Tipo da mensagem. Use call com limit e offset para o histórico de ligações.
track_sourcetextoopcionalFiltra pelo track_source usado no envio.
Origem do rastreamento para filtrar mensagens
track_idtextoopcionalFiltra pelo track_id usado no envio.
ID de rastreamento para filtrar mensagens
limitinteiroopcionalMínimo 1, padrão 100, sem máximo; prefira páginas de até 1000.
Número máximo de mensagens a retornar (padrão 100, sem máximo). Para muitas mensagens, prefira páginas de até 1000 e avance com pagination.nextOffset.
offsetinteiroopcionalPadrão 0. Avance com pagination.nextOffset enquanto pagination.hasMore for true.
Deslocamento para a paginação (0 traz as mensagens mais recentes).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/find ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "chatid": "5511999999999@s.whatsapp.net", "limit": 50, "offset": 0}'Resposta
{
"success": true,
"data": {
"messages": [
{
"id": "3EB0538DA65A59F6D8A251",
"messageid": "3EB0538DA65A59F6D8A251",
"chatid": "5511999999999@s.whatsapp.net",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Exemplo",
"isGroup": false,
"fromMe": false,
"messageType": "text",
"source": "",
"messageTimestamp": 1792500000000,
"status": "success",
"text": "Olá! Tudo certo por aqui.",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "5511999999999",
"error": "",
"content": [],
"wasSentByApi": true,
"pinned": true,
"sendFunction": "",
"sendPayload": [],
"fileURL": "https://exemplo.com/arquivo.jpg",
"callPeer": {
"jid": "5511999999999@s.whatsapp.net",
"name": "Exemplo",
"imagePreviewUrl": "https://exemplo.com/arquivo.jpg"
},
"send_folder_id": "f3a9c2b1",
"track_source": "",
"track_id": "",
"ai_metadata": {
"agent_id": "",
"turn": "",
"flow_id": "",
"request": {
"messages": [],
"tools": [],
"options": {
"model": "",
"temperature": 1.5,
"maxTokens": 10,
"topP": 1.5,
"frequencyPenalty": 1.5,
"presencePenalty": 1.5
}
},
"response": {
"choices": [],
"toolResults": [],
"error": ""
},
"outcome": {
"status": "sent",
"texts": 1,
"audio": true,
"menus": 1,
"files": 1,
"handoff": "",
"lead": [
""
],
"detail": ""
}
},
"sender_pn": "5511999999999@s.whatsapp.net",
"sender_lid": "123456789012345@lid",
"sender_image_preview_url": "https://exemplo.com/arquivo.jpg"
}
],
"pagination": {
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/message/status
Mostra quem recebeu e quem leu uma mensagem que você enviou num grupo: primeiro um resumo com os totais, depois a lista de cada participante. source diz de onde veio a resposta.
source: "memory": depois que esta rota é usada para um grupo, a API passa a acompanhar em memória as confirmações dos grupos do dispositivo, até 24 horas depois da última consulta. Respondem daí, na hora e sem depender do celular, as mensagens enviadas a partir de então e as que o celular já respondeu, com as confirmações que chegaram depois somadas. Cada mensagem fica até 24 horas na memória; em dispositivos com muito envio para grupos, as mais antigas saem antes.source: "phone": a primeira consulta de uma mensagem enviada antes disso, ou de qualquer mensagem depois de um reinício do serviço, pergunta ao celular da conta. O celular precisa estar ligado e com internet. Com o WhatsApp aberto, a resposta vem em cerca de 1 segundo; com o celular parado (um iPhone em segundo plano, por exemplo), ela pode não vir. Sem resposta em 40 segundos, a rota retorna 504. A lista é a que o celular guarda: logo depois de ficar sem internet, ele pode responder antes de receber as confirmações que chegaram nesse meio-tempo.summary: quantos participantes receberam (delivered) e leram (read). Quem leu também conta como recebido, e quem ouviu um áudio ou vídeo conta como lido.receipts: um item por participante e estado, em ordem de horário e em páginas, como nas outras listas da API: para a próxima, envie o pagination.nextOffset em offset enquanto pagination.hasMore for true. O resumo vem em todas.Delivered, quando o celular não guardou a hora da entrega.state filtra a lista por estado: Delivered, Read ou Played. O resumo continua com os totais da mensagem.id aceita o ID completo ou o curto da mensagem, que precisa estar no histórico do dispositivo.messages_update com type: "GroupReceipts".Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioMensagem enviada por você num grupo, com o ID completo ou curto; precisa estar no histórico do dispositivo.
ID da mensagem (completo ou curto).
statetextoopcionalFiltra a lista receipts; o summary continua com os totais.
Só as confirmações deste estado. Sem ele, todas.
limitinteiroopcionalAcima de 500, usa 500.
Itens por página. Acima de 500 usa 500.
offsetinteiroopcionalUse o pagination.nextOffset enquanto pagination.hasMore for true.
Deslocamento base zero; use o pagination.nextOffset da página anterior.
id ausenteTOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After. Caso do WhatsApp (503): Dispositivo sem conexão, sem como perguntar ao celular.PROVIDER_TIMEOUT). Caso do WhatsApp (504): O celular não respondeu em 40 segundos; ele precisa estar ligado e com internet.Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/status ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "3EB0538DA65A59F6D8A251"}'Resposta
{
"success": true,
"data": {
"source": "memory",
"summary": {
"delivered": 1,
"read": 1
},
"receipts": [
{
"participant": "5511999999999@s.whatsapp.net",
"participant_pn": "",
"participant_lid": "123456789012345@lid",
"state": "Delivered",
"timestamp": 1792500000000
}
],
"pagination": {
"totalRecords": 30,
"limit": 10,
"offset": 0,
"hasMore": true,
"nextOffset": 10
}
}
}/message/history-sync
Solicita ao WhatsApp uma sincronização sob demanda de mensagens antigas de um chat, para trás a partir de uma mensagem de referência (âncora).
Para recuperar uma mensagem salva que não abriu (messageType: "error" no /message/find), use POST /message/reload.
Regras:
numbercount é opcional e limitado a 100messageid é opcional; quando informado, a API usa essa mensagem como referência para buscar mensagens mais antigas do chatObservação:
messageid define a mensagem de referência para carregar histórico anterior; esse campo não serve para buscar essa mensagem específicaX via histórico, informe como messageid a mensagem logo depois de X e use count=1messageid não for informado, a API usa a mensagem mais antiga conhecida localmente desse chat como referência para buscar histórico anteriorhistory e também ficam disponíveis em /message/findA resposta traz o request_id do pedido. As mensagens chegam no webhook history com event: "messages" e o request_id em cada mensagem. Ele também vem no topo dos lotes messages e chats quando todo o lote pertence ao mesmo pedido; lotes mistos podem omiti-lo no topo. O pedido termina com um único lote event: "status" com o mesmo request_id:
status: completed quando o WhatsApp confirma a conclusão do pedido, timeout quando não houve resposta conclusiva em 2 minutos, blocked quando o celular indica mais mensagens, mas não entregou uma página que avancesuccess e error: só quando não há próxima página possível; success: false e o motivo em error (pagination_no_progress, anchor_unavailable, history_access_unavailable ou cursor_lookup_failed). Sempre vêm com blockedhas_more: o que o celular declarou. true há mais mensagens no celular, false chegou ao início da conversa, null não foi confirmado. Alguns aparelhos declaram true em toda resposta sob demanda, inclusive na vazia: com eles, a paginação termina em blocked com pagination_no_progress, nunca em has_more: falsehistory_access: unavailable quando há mais mensagens, mas o WhatsApp não dá acesso a elasnext_request: corpo pronto para pedir as mensagens anteriores; reenvie como veio. null quando não há uma próxima requisição utilizávelPara paginar, reenvie next_request do resultado final até ele vir null, aguardando o resultado de cada pedido. completed encerra o pedido, não toda a conversa. next_request: null sem has_more: false não comprova o início da conversa. Silêncio ou um lote com menos mensagens que count não indicam o fim do histórico: só has_more: false indica.
Com blocked e error: "pagination_no_progress", encerre a paginação desse chat sem repetir o pedido automaticamente: é o fim do que o celular entrega a partir daquela âncora, e repetir dá o mesmo resultado.
Cada chat tem um pedido ativo por vez. Repetir o pedido com a mesma mensagem de referência antes do status devolve o mesmo request_id (details.reused: true), sem novo envio ao celular. Um pedido com outra referência encerra o anterior, que recebe o próprio status final (em geral timeout), e segue normalmente. 409 só ocorre quando o requestId informado já está em uso.
O resultado final chega por webhook em até 2 minutos após enviar o pedido ao WhatsApp (details.result_timeout_ms). Mensagens atrasadas podem continuar chegando com o mesmo request_id por cerca de 5 minutos após o pedido, sem um segundo status final.
sync: true)sync: true segura a resposta até o resultado, por até timeoutMs (padrão e máximo 25000). As mensagens vêm em messages, e o topo da resposta traz os mesmos campos do status final (status, has_more, history_access, received_messages, next_request), além de received, timed_out e partial:
200 com esse resultado;200 com status: "pending", cerca de 2 segundos depois da última mensagem;202 com status: "pending", timed_out: true e messages vazio.Com status: "pending", o resultado final chega depois pelo webhook history, com o mesmo request_id. O webhook também é enviado no modo síncrono, e as mensagens são salvas do mesmo jeito.
Se a âncora foi apagada, a API tenta usar a próxima mensagem válida desse chat. details.requested_anchor_messageid informa a referência solicitada, details.anchor_messageid a usada e details.anchor_replaced indica a substituição. Sem alternativa, retorna HTTP 400 com status: "anchor_unavailable"; tente sem messageid para usar a mensagem mais antiga salva.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioJID completo do chat (ex.: 5511999999999@s.whatsapp.net ou 120363012345678901@g.us).
JID completo do chat.
messageidtextoopcionalÂncora: busca as mensagens ANTERIORES a ela (não a própria). Sem ela, usa a mais antiga salva do chat. Para pegar só a mensagem X, informe a mensagem logo depois de X com count=1.
ID da mensagem de referência usada para buscar mensagens mais antigas do chat.
countinteiroopcionalDe 1 a 100, padrão 50.
Quantidade desejada de mensagens no sync.
timestampinteiroopcionalVem no next_request; permite usar uma âncora que ainda não está salva.
Timestamp da mensagem de referência, em milissegundos ou segundos. Opcional; vem no next_request para a referência funcionar mesmo antes de a mensagem estar salva.
fromMebooleanoopcionalVem no next_request.
Indica se a mensagem de referência foi enviada pela conta conectada. Opcional; vem no next_request.
requestIdtextoopcionalOpcional; um id já em uso retorna 409. Para repetir o mesmo pedido, reenvie sem requestId.
Identificador opcional escolhido pelo cliente; quando omitido, a API gera um UUID. Retorna como request_id. Use um id novo por pedido: um id já em uso recebe 409.
fallbackModetextoopcionalEm grupos é ignorado (o pedido vai sempre para o grupo).
Para onde o pedido é enviado. try_alternates (padrão): em conversa individual, envia pelo número e pelo LID do chat, porque o celular guarda cada conversa por um dos dois endereços e ignora o pedido enviado pelo outro; a resposta chega uma vez só. exact: envia só pelo endereço preferido do chat (o LID, quando conhecido). Em grupos, o pedido vai sempre só para o grupo.
syncbooleanoopcionalCom true, segura a resposta até o resultado, por até timeoutMs.
Segura a resposta até o resultado do pedido, por até timeoutMs. Veja "Modo síncrono".
timeoutMsinteiroopcionalSó com sync=true. Padrão e máximo 25000; acima disso, vira 25000.
Só com sync: true: espera máxima em milissegundos. Valores maiores viram 25000.
sync: true, traz também as mensagens e o resultado do pedido.sync: true: nada chegou dentro de timeoutMs. O pedido segue e o resultado chega pelo webhook history com o mesmo request_id.anchor_unavailable: a mensagem de referência foi apagada e não há outra utilizável depois dela; envie sem messageid para usar a mensagem mais antiga salva.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).requestId informado já está em uso por outro pedido. Use um id novo; para repetir o mesmo pedido, reenvie sem requestId.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de pedidos de histórico pendentes no dispositivo.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After. Caso do WhatsApp (503): O dispositivo está parando; o pedido não foi registrado.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/history-sync ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999@s.whatsapp.net", "messageid": "3EB0538DA65A59F6D8A251", "count": 50}'Resposta
{
"success": true,
"request_id": "5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f",
"message": "History sync request sent. Messages will be received as history sync events.",
"details": {
"result_timeout_ms": 120000,
"requested_anchor_messageid": "3EB01234567890ABCDEF",
"anchor_messageid": "3EB01234567890ABCDEF",
"anchor_replaced": false
}
}/message/reload
Pede ao celular conectado uma nova cópia de uma mensagem que chegou sem abrir.
Quando uma mensagem chega e não pode ser aberta, a API já pede uma cópia ao celular automaticamente. Se a cópia não vier, a mensagem fica salva com messageType: "error" no /message/find, sem o conteúdo original. Vale também para Status de contatos (chatid: status@broadcast). Use esta rota para tentar de novo, por exemplo depois de abrir o WhatsApp no celular.
Regras:
id que o /message/find devolve ou o messageid404messageType: call) não podem ser pedidasResultado:
messages (status_posts para Status), e a linha do /message/find passa a ter o conteúdo, com o mesmo messageidSó mensagens que não abriram são recuperadas. Para uma mensagem já salva normalmente, a cópia que o celular reenvia é descartada como repetida, sem webhook nem alteração. Logo depois de conectar, enquanto o histórico inicial ainda está sendo processado, essa cópia pode chegar de novo como mensagem nova. Para buscar mensagens antigas que ainda não estão salvas, use POST /message/history-sync.
Um objeto JSON com Content-Type: application/json.
idtextoopcionalInforme id ou messageid (ao menos um).
ID da mensagem como o /message/find devolve (campo id).
messageidtextoopcionalAlternativa a id.
ID da mensagem no WhatsApp (campo messageid). Alternativa ao id.
id e messageid.id e sem messageid, ou a mensagem não pode ser pedida (ligação, ou mensagem de grupo sem autor salvo).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).POST /message/history-sync.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/reload ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "5511999999999:3EB0538DA65A59F6D8A251"}'Resposta
{
"success": true,
"message": "Message reload request sent. The message will be received if available.",
"details": {
"id": "5511988887777:3EB01234567890ABCDEF",
"messageid": "3EB01234567890ABCDEF",
"chat_jid": "5511999999999@s.whatsapp.net",
"sender_jid": "5511999999999@s.whatsapp.net",
"fromMe": false,
"candidate_count": 2,
"candidates": [
{
"chat_jid": "5511999999999@s.whatsapp.net",
"sender_jid": "5511999999999@s.whatsapp.net",
"strategy": "raw"
},
{
"chat_jid": "123456789012345@lid",
"sender_jid": "123456789012345@lid",
"strategy": "alt_lid"
}
]
}
}/message/markread
Marca uma ou mais mensagens como lidas no WhatsApp, de uma vez, com a leitura sincronizada entre os aparelhos da conta.
Envie em id a lista de IDs das mensagens. A resposta traz results, com um item por mensagem: message_id, status (success ou error) e, quando der erro, o motivo em error (por exemplo, mensagem não encontrada).
Um objeto JSON com Content-Type: application/json.
idlista de textosobrigatórioLista não vazia de IDs.
Lista de IDs das mensagens a serem marcadas como lidas
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/markread ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": [ "3EB0538DA65A59F6D8A251", "3EB0A1B2C3D4E5F6A7B8C9" ]}'Resposta
{
"success": true,
"data": {
"results": [
{
"message_id": "62AD1AD844E518180227BF68DA7ED710",
"status": "success"
},
{
"message_id": "ECB9DE48EB41F77BFA8491BFA8D6EF9B",
"status": "error",
"error": "Message not found"
}
]
}
}/message/react
Envia uma reação (emoji) a uma mensagem.
Informe o id da mensagem e, em text, o emoji da reação (qualquer emoji Unicode válido). Para remover a reação, envie text vazio (""). O chat e o autor da mensagem são obtidos da mensagem salva no dispositivo; o campo antigo number é opcional e ignorado.
Funciona em conversas individuais e em grupos.
404.400, com o motivo na mensagem de erro.Um objeto JSON com Content-Type: application/json.
texttextoobrigatórioUm emoji Unicode; string vazia ("") remove a reação.
Emoji Unicode da reação (ou string vazia para remover reação)
idtextoobrigatórioID da mensagem que receberá a reação
numbertextoopcionalObsoleto e ignorado.
(obsoleto) Campo antigo, opcional e ignorado: o chat vem da mensagem identificada por id.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/react ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "3EB0538DA65A59F6D8A251", "text": "\ud83d\udc4d"}'Resposta
{
"success": true,
"data": {
"id": "owner:generated_message_id",
"messageid": "generated_message_id",
"content": [],
"messageTimestamp": 1672531200000,
"messageType": "reaction",
"status": "Pending",
"owner": "instance_owner"
}
}/message/delete
Apaga uma mensagem para todos os participantes da conversa.
Notas Técnicas:
POST /newsletter/messages/deleteUm objeto JSON com Content-Type: application/json.
idtextoobrigatórioID completo (com ":") ou curto. Para canais, use POST /newsletter/messages/delete.
ID da mensagem a ser apagada
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/delete ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "5511999999999:3EB0538DA65A59F6D8A251"}'Resposta
{
"success": true,
"data": {
"timestamp": "2026-10-20T12:00:00Z",
"id": "3EB0538DA65A59F6D8A251"
}
}/message/edit
Edita o conteúdo de uma mensagem já enviada usando a funcionalidade nativa do WhatsApp.
Use esta operação para corrigir o texto de uma mensagem enviada pelo próprio dispositivo. A resposta retorna a mensagem atualizada e a alteração também aparece nos eventos configurados.
Importante:
messageidPOST /newsletter/messages/editUm objeto JSON com Content-Type: application/json.
idtextoobrigatórioSó mensagens enviadas pelo próprio dispositivo, dentro do prazo do WhatsApp. Para canais, use POST /newsletter/messages/edit.
ID completo retornado pela API ou apenas o messageid
texttextoobrigatórioNovo conteúdo de texto da mensagem
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "5511999999999:3EB0538DA65A59F6D8A251", "text": "Correção: a entrega é amanhã entre 9h e 12h."}'Resposta
{
"success": true,
"data": {
"id": "5511999999999:3A12345678901234567890123456789012",
"messageid": "3A12345678901234567890123456789012",
"content": "Texto editado da mensagem",
"messageTimestamp": 1704067200000,
"messageType": "text",
"status": "Pending",
"owner": "5511999999999"
}
}/message/pin
Fixa ou desafixa uma mensagem específica usando a funcionalidade nativa do WhatsApp.
Use esta operação para destacar uma mensagem importante em uma conversa individual ou grupo. A resposta registra a ação e ela também aparece nos eventos configurados.
Importante:
messageid1:1, a ação é suportada normalmenteapenas admins ou qualquer membro)pin não for enviado, o valor padrão é trueduration aceita dias (1, 7 ou 30)duration não for enviado ou vier com qualquer outro valor, a API usa 30 diaspin: false), duration é ignoradoUm objeto JSON com Content-Type: application/json.
idtextoobrigatórioID completo retornado pela API ou apenas o messageid
pinbooleanoopcionalPadrão true; false desafixa.
Define se a mensagem deve ser fixada (true) ou desafixada (false)
durationinteiroopcionalDias: 1, 7 ou 30; qualquer outro valor vira 30. Ignorado com pin=false.
Duração do pin em dias. Valores aceitos: 1, 7 ou 30. Qualquer outro valor cai para 30.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/message/pin ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "5511999999999:3EB0538DA65A59F6D8A251", "pin": true, "duration": 7}'Resposta
{
"success": true,
"data": {
"id": "5511999999999:3A12345678901234567890123456789012",
"messageid": "3A12345678901234567890123456789012",
"chatid": "120363123456789012@g.us",
"sender": "5511999999999@s.whatsapp.net",
"senderName": "Minha Instância",
"isGroup": true,
"fromMe": true,
"content": [],
"messageType": "PinInChatMessage",
"source": "web",
"messageTimestamp": 1704067200000,
"status": "Pending",
"text": "Mensagem fixada",
"quoted": "",
"edited": "",
"reaction": "",
"convertOptions": "",
"owner": "5511999999999",
"targetMessageID": "3EB0538DA65A59F6D8A251",
"pinned": true
}
}Referência 3
Fila de envio que responde na hora e entrega o resultado pelo webhook.
Controles operacionais da fila interna de envio assíncrono usada quando uma rota de envio recebe async=true.
Esta seção serve para:
async=trueEscopo:
/sender/*)/message/async
/message/async
/instance/updateDelaySettings
/message/async
Devolve um resumo da fila de envio async=true do dispositivo.
Cobre só as mensagens diretas enviadas com async=true; não representa as campanhas de envio em massa (/sender/*).
Campos da resposta:
status: situação da fila (veja abaixo)pending: quantidade estimada de mensagens pendentesprocessingNow: se uma mensagem está sendo processada neste momentoacceptingNewMessages: se a fila aceita novos envios async; confira antes de adicionar enviossessionReady: se a sessão do WhatsApp está pronta para enviar; false explica por que uma fila pode continuar pendenteresetting: se a fila está pausada por reset ou limpezaValores de status:
idle: não há mensagens pendentesqueued: há mensagens aguardando processamentoprocessing: uma mensagem está sendo processada agorawaiting_connection: a fila aguarda a sessão ficar prontawaiting_warmup: a fila aguarda a preparação da sessãowaiting_history: a fila aguarda a preparação do históricoresetting: a fila está temporariamente indisponível durante uma limpeza ou reinicializaçãoO resumo da fila não substitui o acompanhamento de cada mensagem: busque pelo id em POST /message/find ou acompanhe o evento messages_update.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/message/async ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Async queue status",
"instanceId": "",
"queue": {
"status": "waiting_connection",
"pending": 3,
"processingNow": true,
"acceptingNewMessages": true,
"sessionReady": false,
"historyReady": true,
"warmupRemainingMs": 1500,
"resetting": false
}
}
}/message/async
Cancela toda a fila de envio async=true do dispositivo e marca as mensagens pendentes como Canceled.
Atua só nos envios diretos com async=true. Não afeta:
/sender/*);Use quando houver uma fila acumulada ou quando for preciso cancelar todos os envios assíncronos ainda não concluídos. Depois da limpeza, o dispositivo volta a aceitar novos envios com async=true.
Se o dispositivo estiver em reset, ou se um envio em andamento não terminar a tempo, a fila não é limpa e a resposta é 409.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/message/async ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Async queue cleared",
"instanceId": "",
"stats": {
"trackedJobsCleared": 3,
"bufferedJobsMarkedCanceled": 2,
"drainedChannelJobs": 1,
"clearedOverflowJobs": 1,
"persistedQueuedCanceled": 5
}
}
}/instance/updateDelaySettings
Configura o intervalo, em segundos, entre as mensagens diretas enviadas com async=true.
async=true./sender/*).msg_delay_min: intervalo mínimo, 0 ou mais segundos (0 = sem intervalo).msg_delay_max: intervalo máximo; se for menor que msg_delay_min, passa a valer o mesmo valor de msg_delay_min.0.Um objeto JSON com Content-Type: application/json.
msg_delay_mininteirointeiro de 64 bitsobrigatórioValor negativo vira 0.
Intervalo mínimo, em segundos, entre mensagens async (0 = sem intervalo).
msg_delay_maxinteirointeiro de 64 bitsobrigatórioSe for menor que msg_delay_min, passa a valer msg_delay_min. Valor negativo vira 0.
Intervalo máximo, em segundos, entre mensagens async.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/updateDelaySettings ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "msg_delay_min": 3, "msg_delay_max": 8}'Resposta
{
"success": true,
"data": {
"instance": {
"id": "i91011ijkl",
"status": "connected",
"paircode": "1234-5678",
"qrcode": "data:image/png;base64,iVBORw0KGg...",
"name": "Instância Principal",
"profileName": "Loja ABC",
"profilePicUrl": "https://example.com/profile.jpg",
"isBusiness": true,
"plataform": "Android",
"owner": "user@example.com",
"lastDisconnect": "2025-01-24T14:00:00Z",
"lastDisconnectReason": "Network error",
"chatbot_enabled": true,
"chatbot_ignoreGroups": true,
"chatbot_stopConversation": "parar",
"chatbot_stopMinutes": 60,
"created": "2025-01-24T14:00:00Z",
"updated": "2025-01-24T14:30:00Z",
"currentPresence": "available"
}
}
}Referência 11
Conexão, status, privacidade e presença do número conectado.
Operações relacionadas ao ciclo de vida de um dispositivo, como conectar, desconectar e verificar o status.
/instance/connect
/instance/disconnect
/instance/reset
/instance/status
/instance/wa_messages_limits
/instance/updateInstanceName
/instance
/instance/privacy
/instance/privacy
/instance/presence
/instance/history-sync/status
/instance/connect
Inicia a conexão do dispositivo com o WhatsApp.
phone, devolve um QR Code para ler no celular.phone, devolve um código de pareamento para digitar no celular desse número.O dispositivo fica em connecting até o pareamento ser confirmado ou o prazo expirar. Acompanhe por GET /instance/status e não repita a chamada enquanto o processo estiver em andamento: um novo pedido nesse período volta 409.
Depois de conectado, o histórico disponível começa a chegar pelo evento history do webhook e pode ser consultado em POST /message/find e POST /chat/find.
A resposta pode trazer request_id no topo, antes mesmo da leitura do QR Code ou do código de pareamento. Guarde esse valor para relacionar a tentativa com os lotes history do pareamento (inclusive o status de conclusão) e com GET /instance/history-sync/status. Ele fica igual durante a mesma tentativa, muda a cada novo pareamento e pode faltar quando não há pareamento nem rastreamento disponível.
Em um pareamento novo, history_days escolhe quantos dias de histórico o celular envia: sem o campo, ou de 1 a 90, vale o histórico normal (90 dias quando o campo falta); de 91 a 365, ou 0 (o máximo, 365 dias), o pedido é o histórico completo, maior e mais demorado. Um dispositivo já pareado reconecta sem pedir histórico, e um QR Code ou código já gerado segue com o que foi pedido.
browser escolhe o navegador usado na autenticação: o padrão auto mantém um perfil válido já salvo ou escolhe Safari, Firefox ou Edge em conexões novas. systemName é o nome que aparece no celular, em aparelhos conectados; para maior estabilidade, o recomendado é deixar em branco e usar o padrão do navegador escolhido.
Para escolher uma região, consulte antes GET /proxy-managed/countries e GET /proxy-managed/cities e use os valores devolvidos nos campos proxy_managed_*.
Um objeto JSON com Content-Type: application/json.
phonetextoopcionalCom phone, a resposta traz um código de pareamento para digitar no celular desse número; sem phone, traz um QR Code.
Número no formato internacional, só dígitos (ex.: 5511999999999).
browsertextoopcionalNavegador usado na autenticação. auto (padrão) mantém um perfil válido já salvo ou escolhe Safari, Firefox ou Edge em conexões novas.
systemNametextoopcionalNome exibido no celular, em aparelhos conectados. Recomendado deixar em branco e usar o padrão do navegador escolhido.
proxy_managed_countrytextoopcionalPaís da região de conexão, ISO alpha-2 minúsculo: o countries[].value de GET /proxy-managed/countries.
proxy_managed_statetextoopcionalEnvie quando a cidade escolhida em GET /proxy-managed/cities trouxer state; se não trouxer, omita.
UF ou subdivisão da cidade escolhida (ex.: sp).
proxy_managed_citytextoopcionalUse junto de proxy_managed_country. A API valida a combinação e devolve erro se faltar algum dado necessário.
Cidade da região de conexão: sempre o cities[].value de GET /proxy-managed/cities.
history_daysinteiroopcionalSó vale em pareamento novo. Sem o campo: 90 dias, pelo histórico normal. De 1 a 90: os últimos N dias, pelo histórico normal. De 91 a 365: os últimos N dias, pelo histórico completo. 0: o máximo, 365 dias, pelo histórico completo. Um QR Code ou código já gerado segue com o que foi pedido.
Dias de histórico pedidos ao celular no pareamento (0 a 365). É um limite pedido, não uma garantia: o celular decide o que envia.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Limite de conexões simultâneas atingido.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After. Caso do WhatsApp (503): Capacidade de conexão temporariamente indisponível.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/connect ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "browser": "auto", "proxy_managed_country": "br", "proxy_managed_state": "sp", "proxy_managed_city": "campinas", "history_days": 90}'Resposta
{
"success": true,
"data": {
"response": "Connecting",
"request_id": "5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f",
"status": {
"connected": false,
"loggedIn": false,
"jid": null
}
}
}/instance/disconnect
Desconecta a conta do WhatsApp do dispositivo e encerra a sessão atual.
O pareamento é encerrado: para voltar, conecte de novo por POST /instance/connect, com QR Code ou código de pareamento. O dispositivo continua na sua conta, com o mesmo token.
Use para:
Estados possíveis depois de desconectar:
disconnected: desconectado do WhatsAppconnecting: em processo de reconexão (depois de chamar POST /instance/connect)Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/disconnect ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"instance": {
"id": "i91011ijkl",
"status": "connected",
"paircode": "1234-5678",
"qrcode": "data:image/png;base64,iVBORw0KGg...",
"name": "Instância Principal",
"profileName": "Loja ABC",
"profilePicUrl": "https://example.com/profile.jpg",
"isBusiness": true,
"plataform": "Android",
"owner": "user@example.com",
"lastDisconnect": "2025-01-24T14:00:00Z",
"lastDisconnectReason": "Network error",
"chatbot_enabled": true,
"chatbot_ignoreGroups": true,
"chatbot_stopConversation": "parar",
"chatbot_stopMinutes": 60,
"created": "2025-01-24T14:00:00Z",
"updated": "2025-01-24T14:30:00Z",
"currentPresence": "available"
},
"response": "Disconnected",
"info": "The device has been successfully disconnected from WhatsApp. A new QR code will be required for the next connection."
}
}/instance/reset
Pede uma retomada controlada da conexão sem apagar o dispositivo nem o pareamento existente. Use quando a sessão estiver presa ou os envios não estiverem andando.
Comportamentos possíveis:
409) ou quando a política de reconexão bloqueia a operação (403).A resposta informa:
instanceId: identificador do dispositivo autenticadoresetting: se há reset em andamento no momentoqueuedRecoveryAttempted: se as mensagens pendentes também entraram na tentativa de recuperaçãoEsta rota não recebe parâmetros.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Reset bloqueado pela política de reconexão.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/reset ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Instance reset started",
"resetting": true,
"instanceId": "k3m9x2p7q4w8z1t6",
"queuedRecoveryAttempted": true
}
}/instance/status
Retorna o status atual de um dispositivo, incluindo:
Esta rota é particularmente útil para:
Estados possíveis:
disconnected: Desconectado do WhatsAppconnecting: Em processo de conexão (aguardando QR code ou código de pareamento)connected: Conectado e autenticado com sucessohibernated: Sessão pausada, com credenciais preservadas para reconexãoTambém atende pelo caminho antigo
GET /instance/info.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/status ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"instance": {
"id": "k3m9x2p7q4w8z1t6",
"name": "meu-dispositivo",
"status": "connected",
"profileName": "Meu WhatsApp",
"currentTime": "2024-01-25T12:00:00.000Z"
},
"status": {
"connected": true,
"loggedIn": true,
"jid": {
"user": "5511999999999",
"agent": 0,
"device": 0
}
}
}
}/instance/wa_messages_limits
Consulta o estado atual de limitação do WhatsApp para a conta atualmente conectada.
Esta rota é útil para:
provider_code: 463A resposta consolida duas fontes internas do WhatsApp:
new_chat_message_capping: limite de mensagens para iniciar novas conversasreachout_timelock: restrição temporária para iniciar novas conversasObservações:
available: false e lookup_errormessage descreve o estado atual da conta atualmente conectadaprovider_message detalha o motivo reportado pelo WhatsApp quando houver restrição ativaEsta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/wa_messages_limits ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"provider": "whatsapp",
"reachable": true,
"can_send_new_messages": false,
"error_key": "WHATSAPP_REACHOUT_TIMELOCK",
"message": "WhatsApp indicates that the currently connected account is under a temporary restriction for starting new conversations. This is not an internal API error.",
"message_ptbr": "O WhatsApp indica que a conta atualmente conectada está sob uma restrição temporária para iniciar novas conversas. Isso não é um erro interno da API.",
"provider_message": "WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality.",
"provider_message_ptbr": "O WhatsApp informou que a conta atualmente conectada está sob uma restrição temporária para iniciar novas conversas, normalmente relacionada a volume ou qualidade de envios.",
"diagnostics_endpoint": "/instance/wa_messages_limits",
"new_chat_message_capping": {
"available": true,
"status": "CAPPED",
"used_quota": 10,
"total_quota": 10,
"cycle_end": "2026-04-30T23:59:59Z",
"ote_status": "EXHAUSTED",
"mv_status": "ACTIVE"
},
"reachout_timelock": {
"available": true,
"active": true,
"until": "2026-04-07T12:00:00Z",
"enforcement_type": "BIZ_QUALITY"
}
}
}/instance/updateInstanceName
Troca o nome do dispositivo na sua conta: é o nome que aparece no painel, nas listagens e nas respostas da API. O nome é texto livre e não precisa ser único.
Não muda o nome do perfil no WhatsApp; para isso, use POST /profile/name.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNovo nome do dispositivo, em texto livre (não precisa ser único). Não altera o nome do perfil no WhatsApp.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/updateInstanceName ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Atendimento Loja Centro"}'Resposta
{
"success": true,
"data": {
"id": "i91011ijkl",
"status": "connected",
"paircode": "1234-5678",
"qrcode": "data:image/png;base64,iVBORw0KGg...",
"name": "Instância Principal",
"profileName": "Loja ABC",
"profilePicUrl": "https://example.com/profile.jpg",
"isBusiness": true,
"plataform": "Android",
"owner": "user@example.com",
"lastDisconnect": "2025-01-24T14:00:00Z",
"lastDisconnectReason": "Network error",
"chatbot_enabled": true,
"chatbot_ignoreGroups": true,
"chatbot_stopConversation": "parar",
"chatbot_stopMinutes": 60,
"created": "2025-01-24T14:00:00Z",
"updated": "2025-01-24T14:30:00Z",
"currentPresence": "available"
}
}/instance
Desconecta o número e apaga o dispositivo da sua conta na hora, junto com os grupos sincronizados e os webhooks dele. O token deixa de valer imediatamente. As estatísticas de mensagens continuam contando para a conta.
Mesmo quando a remoção do número no WhatsApp ainda termina em segundo plano, a resposta já é de sucesso e o dispositivo já saiu da conta.
A operação não pode ser desfeita: para usar o número de novo, crie outro dispositivo pelo painel ou por POST /devices e conecte.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/instance ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Instance Deleted",
"info": "O dispositivo foi desconectado com sucesso e a instância foi removida do banco de dados."
}
}/instance/privacy
Busca as configurações de privacidade atuais da conta do WhatsApp atualmente conectada.
Importante - Diferença entre Status e Broadcast:
Limitação: As configurações de privacidade do broadcast (stories/reels) não estão disponíveis para alteração via API.
Retorna todas as configurações de privacidade como quem pode:
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/privacy ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"groupadd": "contacts",
"last": "contacts",
"status": "contacts",
"profile": "contacts",
"readreceipts": "all",
"online": "all",
"calladd": "all"
}
}/instance/privacy
Altera uma ou várias configurações de privacidade da conta do WhatsApp conectada ao dispositivo. Envie pelo menos uma das 7 configurações abaixo. Só as configurações que realmente mudaram são alteradas, e a resposta traz todas as configurações atualizadas.
Status e transmissão (broadcast) são coisas diferentes:
status): o recado que aparece embaixo do nome (ex.: "Disponível", "Ocupado" ou um texto personalizado).Configurações:
groupadd: quem pode adicionar a conta a gruposlast: quem vê o visto por últimostatus: quem vê o recado embaixo do nomeprofile: quem vê a foto do perfilreadreceipts: confirmação de leituraonline: quem vê quando a conta está onlinecalladd: quem pode ligarValores:
all: todoscontacts: só contatoscontact_blacklist: contatos, menos os bloqueadosnone: ninguémmatch_last_seen: igual ao visto por último (só em online)known: números conhecidos (só em calladd)Um objeto JSON com Content-Type: application/json.
groupaddtextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem pode adicionar a conta a grupos.
lasttextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem vê o visto por último.
statustextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem vê o recado embaixo do nome.
profiletextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem vê a foto do perfil.
readreceiptstextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Confirmação de leitura.
onlinetextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem vê quando a conta está online (match_last_seen = igual ao visto por último).
calladdtextoopcionalEnvie pelo menos uma das 7 configurações (groupadd, last, status, profile, readreceipts, online, calladd).
Quem pode ligar (known = números conhecidos).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/privacy ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "groupadd": "contacts", "last": "none", "status": "contacts", "profile": "contacts"}'Resposta
{
"success": true,
"data": {
"groupadd": "contacts",
"last": "contacts",
"status": "contacts",
"profile": "contacts",
"readreceipts": "all",
"online": "all",
"calladd": "all"
}
}/instance/presence
Atualiza a presença global da conta do WhatsApp conectada ao dispositivo, para todos os contatos.
available: a conta aparece como disponível (online)unavailable: a conta aparece como indisponível (offline)Atenção:
available em algumas situações internas da API, e com isso o visto por último também pode ser atualizado.POST /instance/privacy).Importante: limitação da presença unavailable
messages_update com status de entrega podem não chegar.available.Um objeto JSON com Content-Type: application/json.
presencetextoobrigatórioPresença global da conta: available (disponível, online) ou unavailable (indisponível, offline).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/presence ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "presence": "available"}'Resposta
{
"success": true,
"data": {
"response": "Presence updated successfully"
}
}/instance/history-sync/status
Retorna o diagnóstico em memória da sincronização de histórico iniciada no pareamento mais recente deste dispositivo. Não inicia uma nova sincronização.
O request_id é o mesmo devolvido por POST /instance/connect para essa tentativa e pelos lotes history do pareamento. O diagnóstico só existe após o pareamento: antes disso, pode retornar diagnosis: [no_trace]. Essa rota não acompanha os pedidos manuais de POST /message/history-sync; use o request_id desses pedidos nos eventos webhook.
deliveryStatus pode ser pending, delivered, partial, failed, no_webhook ou no_batches. O progresso informado pelo WhatsApp chegar a 100 não significa, sozinho, que todos os lotes já foram entregues.
O rastreamento é isolado por dispositivo, limitado aos eventos recentes e reiniciado junto com o processo. URLs de webhook podem aparecer no diagnóstico; trate a resposta como informação operacional sensível.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/history-sync/status ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"pairedAt": null,
"diagnosis": [
"no_trace"
]
}
}Referência 9
Crie, liste, conecte e apague dispositivos com a chave da conta.
/devices
/devices
/devices/{id}
/devices/{id}/qr
/devices/{id}/logout
/devices/{id}/status
/devices/{id}/stats
/devices/{id}/token/rotate
/token/refresh
/devices
Lista os dispositivos da sua conta, na ordem de criação.
A resposta é uma lista simples (sem o envelope success/data). Cada item traz:
name: nome do dispositivo;token: o token do dispositivo, para usar no header token das outras rotas. Só vem quando a chamada usa a chave da conta (Authorization: Bearer); pela sessão do painel, a lista vem sem token;id: id público do dispositivo, aceito no lugar do nome nas rotas /devices/{id};status: active, ou suspended quando a conta tem mais dispositivos do que o plano permite (os mais recentes ficam suspensos);created_at: data de criação em UTC (ISO 8601), ou null quando não há data gravada;has_legacy: true quando o dispositivo ainda aceita também o token antigo, além do atual. Deixa de valer quando você gera um token novo em POST /devices/{id}/token/rotate.Autentique com a chave da conta: Authorization: Bearer SUA_CHAVE_DA_CONTA (a chave fica no painel, no cartão Chave da API).
Esta rota não recebe parâmetros.
TOKEN_MISSING, API_KEY_INVALID).RATE_LIMITED). Aguarde o tempo de Retry-After.Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/devices ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Accept: application/json' Resposta
[
{
"name": "loja-centro",
"token": "dwa_8fK2mQ9xLp3vT7rN1cZ5wB4yH6jD0sA2eG8uI3oP5kR",
"id": "k3m9x2p7q4w8z1t6",
"status": "active",
"created_at": "2026-10-20T12:00:00Z",
"has_legacy": false
},
{
"name": "loja-sul",
"token": "dwa_Pq7Rs2Tu9Vw4Xy6Za1Bc3De5Fg8Hi0Jk2Lm4No6Pq8",
"id": "p2n8v5c1x7z3b9m4",
"status": "suspended",
"created_at": "2026-10-21T09:30:00Z",
"has_legacy": false
}
]/devices
Cria um dispositivo na sua conta e devolve o token dele em device.token (guarde: é ele que vai no header token das outras rotas).
Informe o nome em id ou em name: um dos dois é obrigatório e, se vierem os dois preenchidos, vale id. O nome tem até 64 caracteres e é normalizado: vira minúsculas e perde tudo que não for letra, número, - ou _ ("Loja Centro" vira "lojacentro"). Ele precisa ser único na conta.
O número de dispositivos é limitado pelo plano, mais os dispositivos extras comprados; os dispositivos suspensos também contam. Na resposta, devices traz os nomes de todos os dispositivos da conta, na ordem de criação.
Depois de criar, conecte o número com GET /devices/{id}/qr (ou POST /instance/connect, com o token do dispositivo), ou pelo QR Code do painel.
Um objeto JSON com Content-Type: application/json.
idtextoopcionalInforme id ou name. Se vierem os dois preenchidos, vale id. Se o nome ficar vazio depois da normalização, a resposta é 422.
Nome do dispositivo, até 64 caracteres. É normalizado: minúsculas, só letras, números, - e _.
nametextoopcionalUsado quando id não vem ou vem vazio.
Mesmo que id (formato antigo).
INVALID_JSON).TOKEN_MISSING, API_KEY_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_LIMIT).CONFLICT): já existe um dispositivo com esse nome na conta, outra criação de dispositivo da conta está em andamento ou não foi possível gravar o dispositivo. Confira o nome ou tente de novo em instantes.PAYLOAD_TOO_LARGE).VALIDATION).RATE_LIMITED). Aguarde o tempo de Retry-After.PROVIDER_ERROR). Tente de novo em instantes.Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/devices ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "loja-centro"}'Resposta
{
"success": true,
"devices": [
"loja-centro"
],
"device": {
"id": "k3m9x2p7q4w8z1t6",
"name": "loja-centro",
"token": "dwa_8fK2mQ9xLp3vT7rN1cZ5wB4yH6jD0sA2eG8uI3oP5kR"
}
}/devices/{id}
Apaga o dispositivo da conta: desconecta o número do WhatsApp e remove junto os grupos sincronizados, os webhooks, a fila de entregas de webhook e os erros de webhook. As mensagens já contadas continuam na estatística da conta. Não pode ser desfeito, e o token do dispositivo deixa de valer na hora.
Funciona mesmo sem plano ativo. Se o serviço de WhatsApp não confirmar a exclusão, o dispositivo não é apagado (para não deixar o número conectado por lá): tente de novo. Se o número já não existia no serviço de WhatsApp, a exclusão na conta segue normalmente.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, API_KEY_INVALID).WHATSAPP_FORBIDDEN).DEVICE_NOT_FOUND).WHATSAPP_CONFLICT). Tente de novo em instantes.RATE_LIMITED), ou serviço de WhatsApp ocupado (PROVIDER_BUSY). Aguarde o tempo de Retry-After.PROVIDER_ERROR); o dispositivo não foi apagado. Tente de novo em instantes.PROVIDER_TIMEOUT); o dispositivo não foi apagado. Tente de novo.Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Accept: application/json' Resposta
{
"success": true
}/devices/{id}/qr
Inicia a conexão do dispositivo com o WhatsApp e devolve o QR Code em data.instance.qrcode (imagem em base64), para ler no celular. Com phone, devolve também um código de pareamento em data.instance.paircode, para digitar no celular desse número.
Apesar de ser GET, esta rota começa o pareamento: chame uma vez. Durante o pareamento, chamar de novo responde 409 WHATSAPP_CONFLICT. Para acompanhar, consulte GET /devices/{id}/status: enquanto status for connecting, o QR Code atualizado vem em raw.instance.qrcode; quando status virar connected, o número está conectado.
Exige plano ativo e dispositivo não suspenso, ao contrário das outras rotas de gerenciamento.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
Vão depois do ? no endereço, como nome=valor.
phonetextoopcionalOpcional. De 10 a 15 dígitos; o que não for dígito é ignorado. Fora disso, a resposta é 422.
Número com DDI, só dígitos (ex.: 5511999999999). Com ele, a resposta traz também o código de pareamento.
data.instance.qrcode.WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, API_KEY_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_NOT_FOUND).WHATSAPP_CONFLICT). Acompanhe por GET /devices/{id}/status em vez de chamar de novo.phone fora do formato: precisa ter de 10 a 15 dígitos (VALIDATION).RATE_LIMITED), ou limite de conexões simultâneas do serviço de WhatsApp (PROVIDER_BUSY). Aguarde o tempo de Retry-After.PROVIDER_ERROR). Tente de novo em instantes.PROVIDER_TIMEOUT). Tente de novo.Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro/qr ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"connected": false,
"loggedIn": false,
"jid": null,
"instance": {
"id": "k3m9x2p7q4w8z1t6",
"name": "loja-centro",
"status": "connecting",
"qrcode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAA...",
"paircode": "",
"profileName": "",
"profilePicUrl": "",
"isBusiness": false,
"plataform": "",
"owner": "",
"lastDisconnect": "",
"lastDisconnectReason": "",
"created": "2026-10-20T12:00:00Z",
"updated": "2026-10-20T12:05:00Z"
}
}
}/devices/{id}/logout
Desconecta o número do WhatsApp e encerra a sessão. O dispositivo continua na conta, com o mesmo token; para conectar de novo, é preciso ler um QR Code novo (GET /devices/{id}/qr). Funciona mesmo sem plano ativo.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, API_KEY_INVALID).DEVICE_NOT_FOUND).DEVICE_DISCONNECTED).RATE_LIMITED), ou serviço de WhatsApp ocupado (PROVIDER_BUSY). Aguarde o tempo de Retry-After.PROVIDER_ERROR). Tente de novo em instantes.PROVIDER_TIMEOUT). Tente de novo.Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro/logout ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json' Resposta
{
"success": true
}/devices/{id}/status
Estado da conexão do dispositivo com o WhatsApp, em status:
connected: conectado e autenticado;connecting: pareamento em andamento, aguardando a leitura do QR Code ou o código de pareamento;disconnected: desconectado;hibernated: sessão pausada, com as credenciais guardadas para reconectar;unknown: o estado não veio na resposta.Os detalhes vêm em raw: raw.instance (nome, perfil, se é conta Business, última desconexão e o motivo) e raw.status (connected, loggedIn e jid). Durante o pareamento, o QR Code atualizado vem em raw.instance.qrcode (e o código de pareamento em raw.instance.paircode, quando pedido): é assim que se acompanha a conexão, sem chamar GET /devices/{id}/qr de novo. Tokens e campos internos são removidos de raw.
Funciona mesmo sem plano ativo.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
TOKEN_MISSING, API_KEY_INVALID).DEVICE_NOT_FOUND).RATE_LIMITED), ou serviço de WhatsApp ocupado (PROVIDER_BUSY). Aguarde o tempo de Retry-After.PROVIDER_ERROR). Tente de novo em instantes.PROVIDER_TIMEOUT). Tente de novo.Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro/status ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Accept: application/json' Resposta
{
"success": true,
"status": "connected",
"raw": {
"instance": {
"id": "k3m9x2p7q4w8z1t6",
"name": "loja-centro",
"status": "connected",
"qrcode": "",
"paircode": "",
"profileName": "Loja Centro",
"profilePicUrl": "",
"isBusiness": true,
"plataform": "android",
"owner": "5511999999999",
"lastDisconnect": "",
"lastDisconnectReason": "",
"created": "2026-10-20T12:00:00Z",
"updated": "2026-10-20T12:05:00Z"
},
"status": {
"connected": true,
"loggedIn": true,
"jid": {
"user": "5511999999999",
"agent": 0,
"device": 12,
"server": "s.whatsapp.net"
}
}
}
}/devices/{id}/stats
Total de mensagens enviadas pelo dispositivo no mês atual e a data e hora do último envio.
O mês e last_message_at seguem o fuso do site, America/Sao_Paulo (horário de Brasília); a resposta informa o mês em stats.month (AAAA-MM) e o fuso em stats.timezone. last_message_at vem no formato AAAA-MM-DD HH:MM:SS, ou null quando não houve envio no mês. Contam as chamadas bem-sucedidas das rotas de envio (/send/*, 1 cada) e as mensagens enfileiradas pelas campanhas (1 por destinatário). device traz o nome do dispositivo.
Funciona mesmo sem plano ativo.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
TOKEN_MISSING, API_KEY_INVALID).DEVICE_NOT_FOUND).RATE_LIMITED). Aguarde o tempo de Retry-After.Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro/stats ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Accept: application/json' Resposta
{
"success": true,
"device": "loja-centro",
"stats": {
"total_messages": 128,
"last_message_at": "2026-10-20 15:00:00",
"month": "2026-10",
"timezone": "America/Sao_Paulo"
}
}/devices/{id}/token/rotate
Gera um token novo para o dispositivo e devolve em token. O token anterior para de funcionar na hora, e o token antigo também (o que has_legacy indica em GET /devices): atualize suas integrações logo em seguida.
A conexão com o WhatsApp não cai; só muda o token de acesso à API. Não recebe corpo e funciona mesmo sem plano ativo.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioNome ou id público (id de GET /devices) do dispositivo.
TOKEN_MISSING, API_KEY_INVALID).DEVICE_NOT_FOUND).RATE_LIMITED). Aguarde o tempo de Retry-After.Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/devices/loja-centro/token/rotate ' \ --header 'Authorization: Bearer SUA_CHAVE_DA_CONTA' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json' Resposta
{
"success": true,
"token": "dwa_Q1w2E3r4T5y6U7i8O9p0A1s2D3f4G5h6J7k8L9z0X1c"
}/token/refresh
Gera uma chave da conta nova e devolve em token. A chave anterior para de funcionar na hora: atualize as integrações que usam as rotas de gerenciamento (/devices). Os tokens dos dispositivos não mudam.
Só funciona pelo painel, com a sessão de quem está logado (cookie e o cabeçalho X-WP-Nonce); a chave da conta em Authorization: Bearer não é aceita aqui. No painel, é o botão de gerar nova chave no cartão Chave da API.
Esta rota não recebe parâmetros.
token.SESSION_REQUIRED): entre na sua conta e envie o nonce da sessão.RATE_LIMITED). Aguarde o tempo de Retry-After.Requisição
Feita pelo painel. Esta ação usa a sessão de quem está logado na conta, não um token: use o painel de instâncias, no cartão Chave da API.
Resposta
{
"success": true,
"token": "dwk_Z9y8X7w6V5u4T3s2R1q0P9o8N7m6L5k4J3i2H1g0F9e"
}Referência 4
Crie etiquetas e aplique nas conversas.
/chat/labels
/label/edit
/labels
/labels/refresh
/chat/labels
Atualiza as etiquetas de uma conversa. Há três modos, e cada requisição usa exatamente um:
labelids): define o conjunto completo de etiquetas da conversa, substituindo as que já existem.add_labelid): adiciona uma etiqueta sem mexer nas outras.remove_labelid): remove uma etiqueta sem mexer nas outras.Enviar nenhum desses campos, ou mais de um, volta 422 (VALIDATION). Etiquetas inexistentes são recusadas.
Use os IDs devolvidos em GET /labels. Se a conversa não existir, a API volta 404 (WHATSAPP_NOT_FOUND). No modo labelids, a resposta lista em editions cada mudança feita.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero do contato ou JID do grupo da conversa.
labelidslista de textosopcionalExatamente um entre labelids, add_labelid e remove_labelid.
IDs que passam a ser todas as etiquetas da conversa (substitui as atuais).
add_labelidtextoopcionalExatamente um entre labelids, add_labelid e remove_labelid.
ID da etiqueta a adicionar.
remove_labelidtextoopcionalExatamente um entre labelids, add_labelid e remove_labelid.
ID da etiqueta a remover.
labelids, add_labelid e remove_labelid.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).WHATSAPP_NOT_FOUND).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/labels ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "add_labelid": "10"}'Resposta
{
"success": true,
"data": {
"response": "Labels updated successfully",
"editions": [
"Added label 10 to chat",
"Added label 20 to chat",
"Removed label 5 from chat"
]
}
}/label/edit
Cria, edita ou apaga uma etiqueta do dispositivo.
Como usar:
labelid: "new" com delete: false. A API gera o próximo labelid numérico disponível no dispositivo.labelid real da etiqueta, com o novo name e a nova color.labelid real com delete: true.Observações:
"Label created" ao criar e "Label edited" ao editar.labelid da etiqueta criada, consulte GET /labels depois da operação ou acompanhe o evento labels do webhook.Um objeto JSON com Content-Type: application/json.
labelidtextoobrigatórioCriar: new com delete: false. Editar: ID real. Apagar: ID real com delete: true.
ID da etiqueta, ou "new" para criar.
nametextoopcionalUsado ao criar e ao editar.
Nome da etiqueta.
colorinteiroopcionalCódigo da cor, de 0 a 19.
deletebooleanoopcionaltrue apaga a etiqueta indicada em labelid; não combine com labelid: "new".
Apagar a etiqueta.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/label/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "labelid": "new", "name": "Responder hoje", "color": 2, "delete": false}'Resposta
{
"success": true,
"data": {
"response": "Label created"
}
}/labels
Lista as etiquetas do dispositivo, usadas para organizar conversas e filtros. Use os IDs devolvidos em POST /chat/labels e POST /label/edit.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/labels ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": [
{
"id": "l121314mnop",
"name": "Cliente VIP",
"color": 2,
"colorHex": "#fed428",
"created": "2025-01-24T14:35:00.000Z",
"updated": "2025-01-24T15:00:00.000Z"
}
]
}/labels/refresh
Inicia uma nova leitura das etiquetas no WhatsApp, sem prender a requisição. A resposta volta 202 e só confirma que a recarga começou (status: "started") ou que já existe uma em andamento (status: "in_progress"). Para obter a lista atualizada, consulte GET /labels depois.
A recarga também atualiza as ligações entre etiquetas e conversas. Quando houver mudança, o evento chat_labels do webhook pode trazer os dados atualizados.
A resposta traz um request_id, repetido nos eventos labels e chat_labels do webhook dessa recarga. Se já houver uma recarga em andamento, o request_id é o dela.
Se a sincronização do histórico ainda estiver em andamento, a API volta 409 (WHATSAPP_CONFLICT); tente de novo em instantes.
Uso recomendado:
force: false;force: true;force: true só como tentativa de correção, porque ele faz uma recarga mais pesada.Um objeto JSON com Content-Type: application/json.
forcebooleanoopcionalTente primeiro com false; use true só como correção, porque a recarga é mais pesada. O corpo inteiro é opcional; sem ele, vale false.
Recarga completa.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/labels/refresh ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "force": false}'Resposta
{
"success": true,
"request_id": "3f1c9b52-8d4e-4a7b-9c61-2f0e5d7a1b84",
"status": "started",
"message": "Label refresh started. Use GET /labels to fetch the refreshed list.",
"force": false,
"fullSync": false
}Referência 2
Bloqueie e desbloqueie contatos.
/chat/block
Bloqueia ou desbloqueia um contato do WhatsApp. Contatos bloqueados não enviam mensagens para o dispositivo, e o dispositivo não envia mensagens para eles.
A resposta traz a lista atualizada de bloqueados em blockList; para consultá-la depois, use GET /chat/blocklist.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero do contato com DDI (ex.: 5511999999999).
blockbooleanoobrigatórioTrue bloqueia, false desbloqueia.
Bloquear ou desbloquear.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/block ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "block": true}'Resposta
{
"success": true,
"data": {
"response": "Blocked successfully",
"blockList": [
"5511999999999@s.whatsapp.net",
"5511888888888@s.whatsapp.net"
]
}
}/chat/blocklist
Devolve a lista completa de contatos bloqueados pelo dispositivo, em blockList (JIDs no formato número@s.whatsapp.net). A lista acompanha na hora os bloqueios e desbloqueios.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/blocklist ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"blockList": [
"5511999999999@s.whatsapp.net",
"5511888888888@s.whatsapp.net"
]
}
}Referência 5
Dados de lead, campos personalizados e tags de atendimento.
Sistema completo de gestão de relacionamento com clientes integrado à API.
Armazenamento interno: Todos os dados dos leads ficam salvos diretamente na API, eliminando a necessidade de bancos de dados externos. Sua aplicação pode focar apenas na interface e lógica de negócio.
Use variáveis dinâmicas nas mensagens para personalização automática:
Olá {{first_name}}! Empresa: {{lead_field01}}.
Seu email {{lead_email}} está correto?
Observações: {{lead_notes}}/chat/editLeadIdeal para: Vendas, marketing, atendimento, qualificação de leads
/instance/updateFieldsMap
/chat/editLead
/lead/resolve
/lead/tags
/lead/tags/edit
/instance/updateFieldsMap
Configura os rótulos dos 20 campos personalizados de leads do dispositivo (lead_field01 a lead_field20). A operação não altera os valores guardados nas conversas e não cria apelidos para variáveis.
Envie o mapa completo. Campos omitidos são recebidos como vazios e podem substituir rótulos configurados antes. Os campos que você não usa podem ir como "".
Mesmo depois de definir um rótulo, as mensagens usam o nome original do campo: se lead_field01 for rotulado como empresa, o variável continua sendo {{lead_field01}}; {{empresa}} não é substituído.
Use os rótulos para mostrar na sua interface o significado de cada campo. Os valores de cada lead são gravados pelas operações de CRM (POST /chat/editLead) no respectivo lead_fieldXX.
Também atende pelo caminho antigo
POST /crm/fields.
Um objeto JSON com Content-Type: application/json.
lead_field01textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 01 (até 255 caracteres).
lead_field02textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 02 (até 255 caracteres).
lead_field03textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 03 (até 255 caracteres).
lead_field04textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 04 (até 255 caracteres).
lead_field05textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 05 (até 255 caracteres).
lead_field06textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 06 (até 255 caracteres).
lead_field07textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 07 (até 255 caracteres).
lead_field08textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 08 (até 255 caracteres).
lead_field09textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 09 (até 255 caracteres).
lead_field10textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 10 (até 255 caracteres).
lead_field11textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 11 (até 255 caracteres).
lead_field12textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 12 (até 255 caracteres).
lead_field13textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 13 (até 255 caracteres).
lead_field14textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 14 (até 255 caracteres).
lead_field15textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 15 (até 255 caracteres).
lead_field16textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 16 (até 255 caracteres).
lead_field17textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 17 (até 255 caracteres).
lead_field18textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 18 (até 255 caracteres).
lead_field19textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 19 (até 255 caracteres).
lead_field20textoopcionalEnvie o mapa completo: campo omitido é recebido como vazio e pode apagar o rótulo configurado antes.
Rótulo do campo personalizado 20 (até 255 caracteres).
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/updateFieldsMap ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "lead_field01": "empresa", "lead_field02": "cargo", "lead_field03": "cidade", "lead_field04": "estado", "lead_field05": "origem", "lead_field06": "produto_interesse", "lead_field07": "valor_proposta", "lead_field08": "proximo_contato", "lead_field09": "vendedor", "lead_field10": "segmento", "lead_field11": "", "lead_field12": "", "lead_field13": "", "lead_field14": "", "lead_field15": "", "lead_field16": "", "lead_field17": "", "lead_field18": "", "lead_field19": "", "lead_field20": ""}'Resposta
{
"success": true,
"data": {
"id": "i91011ijkl",
"status": "connected",
"paircode": "1234-5678",
"qrcode": "data:image/png;base64,iVBORw0KGg...",
"name": "Instância Principal",
"profileName": "Loja ABC",
"profilePicUrl": "https://example.com/profile.jpg",
"isBusiness": true,
"plataform": "Android",
"owner": "user@example.com",
"lastDisconnect": "2025-01-24T14:00:00Z",
"lastDisconnectReason": "Network error",
"chatbot_enabled": true,
"chatbot_ignoreGroups": true,
"chatbot_stopConversation": "parar",
"chatbot_stopMinutes": 60,
"created": "2025-01-24T14:00:00Z",
"updated": "2025-01-24T14:30:00Z",
"currentPresence": "available"
}
}/chat/editLead
Atualiza as informações de lead de uma conversa: situação do atendimento, atendente responsável, posição no Kanban, tags, dados do lead e campos personalizados. Também controla a automação da conversa: pausar a IA (chatbot_disableUntil) e zerar a memória do agente (chatbot_agentResetMemoryAt).
Em lead_tags, a lista enviada passa a ser a lista de tags do lead ([] remove todas); tags que não existem são criadas, e a tag com kanban=true define a coluna do cartão no Kanban. Os rótulos de lead_field01 a lead_field20 são definidos em POST /instance/updateFieldsMap.
As alterações aparecem na hora nas consultas e nos eventos de webhook, para manter a sua aplicação sincronizada.
Também atende pelo caminho antigo
POST /crm/lead.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioConversa: wa_chatid (ex.: 5511999999999@s.whatsapp.net) ou wa_fastid (ex.: 5511888888888:5511999999999).
chatbot_disableUntilinteirointeiro de 64 bitsopcional-1 pausa até alguém religar; 0 religa a automação.
Pausa a automação (IA, gatilhos e fluxos) nesta conversa até este horário, em milissegundos.
chatbot_agentResetMemoryAtinteirointeiro de 64 bitsopcional-1 = agora; 0 desfaz; horário no futuro vale como agora.
Zera a memória da IA na conversa: o agente passa a ler só as mensagens a partir deste horário, em milissegundos.
lead_isTicketOpenbooleanoopcionalSituação do atendimento: true = aberto (em atendimento); false = fechado (resolvido).
lead_assignedAttendant_idtextoopcionalString vazia ("") remove a atribuição.
ID do atendente responsável pelo lead.
lead_kanbanOrderinteirointeiro de 64 bitsopcionalPosição do cartão no Kanban; valores maiores aparecem primeiro.
lead_tagslista de textosopcionalA lista enviada passa a ser a lista de tags do lead; [] remove todas. Tag que não existe é criada; a tag com kanban=true define a coluna do cartão no Kanban.
Tags do lead.
lead_nametextoopcionalNome principal do lead.
lead_fullNametextoopcionalNome completo do lead.
lead_emailtextoe-mailopcionalE-mail do lead.
lead_personalidtextoopcionalCPF ou CNPJ, só números ou formatado.
lead_statustextoopcionalStatus livre do lead no funil de vendas.
lead_notestextoopcionalAnotações sobre o lead.
lead_field01textoopcionalCampo personalizado 1 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field02textoopcionalCampo personalizado 2 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field03textoopcionalCampo personalizado 3 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field04textoopcionalCampo personalizado 4 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field05textoopcionalCampo personalizado 5 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field06textoopcionalCampo personalizado 6 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field07textoopcionalCampo personalizado 7 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field08textoopcionalCampo personalizado 8 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field09textoopcionalCampo personalizado 9 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field10textoopcionalCampo personalizado 10 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field11textoopcionalCampo personalizado 11 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field12textoopcionalCampo personalizado 12 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field13textoopcionalCampo personalizado 13 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field14textoopcionalCampo personalizado 14 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field15textoopcionalCampo personalizado 15 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field16textoopcionalCampo personalizado 16 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field17textoopcionalCampo personalizado 17 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field18textoopcionalCampo personalizado 18 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field19textoopcionalCampo personalizado 19 (o rótulo é definido em POST /instance/updateFieldsMap).
lead_field20textoopcionalCampo personalizado 20 (o rótulo é definido em POST /instance/updateFieldsMap).
Chat inteiro (sem lead_awaitingReply, por exemplo).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/chat/editLead ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "5511999999999@s.whatsapp.net", "lead_name": "João Silva", "lead_fullName": "João Silva Pereira", "lead_email": "joao.silva@seusite.com.br", "lead_personalid": "123.456.789-09", "lead_status": "proposta enviada", "lead_notes": "Pediu desconto à vista; retornar na sexta.", "lead_tags": [ "Em atendimento", "vip" ], "lead_isTicketOpen": true, "lead_assignedAttendant_id": "att_123456", "lead_field01": "Loja Centro Ltda", "lead_field03": "Campinas"}'Resposta
{
"success": true,
"data": {
"wa_fastid": "5511888888888:5511999999999",
"wa_chatid": "5511999999999@s.whatsapp.net",
"lead_name": "João Silva",
"lead_status": "qualificado",
"lead_tags": [
"vip",
"suporte"
],
"lead_isTicketOpen": true,
"lead_assignedAttendant_id": "att_123456"
}
}/lead/resolve
Tira conversas de "aguardando você" sem responder (o contato mandou "obrigado", por exemplo): lead_awaitingReply vira false e o pedido de humano (chatbot_summary) sai, sem religar a IA. A próxima mensagem do contato volta a ligar a espera.
Mande em lastMessageTimestamp o horário da última mensagem que a tela mostrava: o que chegou depois continua esperando. Para concluir todas, envie as conversas da lista "aguardando você" (/chat/find com lead_awaitingReply: true). Conversa que não existe é ignorada.
Um objeto JSON com Content-Type: application/json.
chatslista de objetosobrigatórioConversas a concluir: lista de 1 a 500 itens.
chatsnumbertextoobrigatórioConversa (chatid, como 5511999999999@s.whatsapp.net).
lastMessageTimestampinteirointeiro de 64 bitsopcionalSem ele, conclui até a última mensagem conhecida; o que chegou depois deste horário continua aguardando.
Horário (ms) da última mensagem que a tela mostrava.
chats vazio ou com mais de 500TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/lead/resolve ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "chats": [ { "number": "5511999999999@s.whatsapp.net", "lastMessageTimestamp": 1791400000000 }, { "number": "5521988888888@s.whatsapp.net" } ]}'Resposta
{
"success": true,
"data": {
"resolved": 1
}
}/lead/tags
Retorna as tags pertencentes ao dispositivo autenticado. Registros com kanban=true representam as colunas ativas do Kanban.
A resposta é ordenada com as colunas ativas primeiro, seguidas por kanbanOrder e nome. A rota usa somente dados locais e funciona mesmo quando a sessão do WhatsApp está desconectada.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/lead/tags ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": [
{
"id": "k3m9x2p7q4w8z1t6",
"name": "Novo",
"kanban": true,
"kanbanOrder": 1000,
"owner": "5511999999999",
"created": "2026-09-03 12:00:00.000Z",
"updated": "2026-09-03 12:00:00.000Z"
}
]
}/lead/tags/edit
Cria uma tag quando id não é informado ou edita uma tag do dispositivo autenticado quando id está presente.
Use kanban=true para transformar a tag em uma coluna do quadro e kanban=false para retirá-la do Kanban sem apagar a tag. A alteração vale somente para o dispositivo autenticado.
Use delete=true junto de id para apagar definitivamente a tag. Ao apagar, a tag também é removida dos chats que a utilizam.
Um objeto JSON com Content-Type: application/json.
idtextoopcionalOmita para criar; obrigatório para editar e para apagar (delete: true).
ID da tag.
nametextocondicionalObrigatório ao criar (sem id); opcional ao editar. Nome repetido no mesmo dispositivo volta 409.
Nome da tag (até 100 caracteres).
kanbanbooleanoopcionaltrue transforma a tag em coluna do Kanban; false tira do Kanban sem apagar a tag.
kanbanOrderinteirointeiro de 64 bitsopcionalOrdem da coluna no Kanban, em ordem crescente.
deletebooleanoopcionalSó junto de id.
Apaga a tag definitivamente e a tira das conversas que a usam.
id é obrigatório quando delete é true.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After. Caso do WhatsApp (503): Recuperação de uma alteração anterior ainda em andamento.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/lead/tags/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Em atendimento", "kanban": true, "kanbanOrder": 2000}'Resposta
{
"success": true,
"data": {
"id": "3EB0538DA65A59F6D8A251",
"name": "Exemplo",
"kanban": false,
"kanbanOrder": 0,
"owner": "5511999999999",
"created": "2026-10-20T12:00:00Z",
"updated": "2026-10-20T12:00:00Z"
}
}Referência 5
Mensagens prontas para usar no atendimento.
Gerenciamento de respostas rápidas para agilizar o atendimento.
Importante: Este recurso tem serventia apenas se você utilizar um sistema frontend/interface personalizada para registrar e utilizar as respostas. A API apenas armazena as respostas, mas não as aplica automaticamente.
Não é um chatbot: Para respostas automáticas, use os recursos de Chatbot.
/quick-replies
/quick-replies
/quick-replies/{id}
/quick-replies/{id}
/quick-replies/{id}
/quick-replies
Lista as respostas rápidas do dispositivo, de qualquer tipo, em ordem de atalho (shortCut).
Paginação: comece com offset 0 e repita a chamada com offset igual a pagination.nextOffset enquanto pagination.hasMore for true. limit vai de 1 a 500 (padrão 100).
As respostas rápidas pertencem ao número conectado: se o dispositivo ainda não foi conectado ao WhatsApp, a resposta é 409.
Vão depois do ? no endereço, como nome=valor.
limitinteiroopcionalMáximo de itens na página, de 1 a 500.
offsetinteiroopcionalQuantos itens pular. Para a próxima página, use pagination.nextOffset da resposta anterior.
WHATSAPP_REJECTED). O motivo vem em reason: invalid_body (corpo malformado ou campo desconhecido) ou validation_failed (valor fora do permitido); a mensagem em error explica.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).WHATSAPP_CONFLICT, com reason instance_not_paired). As respostas rápidas pertencem ao número conectado: conecte o dispositivo antes.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/quick-replies?limit=50&offset=0 ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"items": [
{
"id": "qr_8f2k1m9x",
"shortCut": "endereco",
"aiDescription": "",
"onWhatsApp": false,
"message": {
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
},
"createdAt": "2026-10-20T12:00:00Z",
"updatedAt": "2026-10-20T12:00:00Z"
},
{
"id": "qr_3c4d5e6f",
"shortCut": "horario",
"aiDescription": "",
"onWhatsApp": true,
"message": {
"kind": "text",
"text": "Atendemos de segunda a sexta, das 9h às 18h."
},
"createdAt": "2026-10-19T09:30:00Z",
"updatedAt": "2026-10-19T09:30:00Z"
}
],
"pagination": {
"totalRecords": 2,
"limit": 50,
"offset": 0,
"hasMore": false,
"nextOffset": 2
}
}
}/quick-replies
Guarda uma mensagem pronta de qualquer tipo (texto, arquivo, contato, localização, menu ou PIX) para usar no atendimento.
shortCut e message são obrigatórios. message.kind diz o tipo; os outros campos de message são os do envio correspondente (veja a tabela em message), sem number e sem os campos de envio.
Arquivo de media: por URL fica guardado como foi enviado; em base64 é guardado pela API, com até 5 MB para imagem, 16 MB para áudio e vídeo e 20 MB para documento, e 50 MB no total por dispositivo. O corpo aceita até 28 MB (um documento de 20 MB em base64).
Menu: type button, button_legacy, list ou poll (carrossel ainda não). A mídia do botão (file) só vai por URL. As opções precisam dar para enviar, senão a resposta é 400: enquete com pelo menos 2, lista com pelo menos um item (a linha de seção [...] não conta) e botões com pelo menos 1.
onWhatsApp: true (só na criação e só com kind=text) cria a resposta também no WhatsApp Business; nesse caso o dispositivo precisa estar conectado.
Campos fora desta lista são descartados antes do envio. O sucesso responde 200 com a resposta criada; guarde o id para editar ou apagar.
Um objeto JSON com Content-Type: application/json.
shortCuttextoobrigatórioObrigatório na criação.
Atalho para encontrar a resposta (também é o que o atendimento automático usa para escolher).
messageobjetoobrigatórioObrigatório na criação.
Mensagem guardada: kind mais o mesmo corpo do envio correspondente, sem number e sem os campos de envio (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Campos | Corpo igual ao de |
|---|---|---|
text | text (obrigatório; aceita variáveis como {{name}}) | POST /send/text |
media | type e file (obrigatórios), text (legenda), docName | POST /send/media |
contact | fullName e phoneNumber (obrigatórios), organization, email, url | POST /send/contact |
location | latitude e longitude (obrigatórias), name, address | POST /send/location |
menu | type, text e choices (obrigatórios), footerText, listButton, selectableCount, file, mimetype, docName | POST /send/menu |
pix | pixType e pixKey (obrigatórios), pixName | POST /send/pix-button |
messagekindtextoobrigatórioObrigatório sempre que message for enviado.
Tipo da mensagem guardada. Define quais outros campos de message valem.
texttextocondicionalObrigatório com kind=text e com kind=menu. Opcional com kind=media (legenda).
Texto da mensagem. Com kind=text é o corpo (aceita variáveis como {{name}}); com kind=media é a legenda; com kind=menu é o texto principal.
typetextocondicionalObrigatório com kind=media e com kind=menu; os valores aceitos dependem do kind.
Com kind=media: image, video, document, audio, ptt ou myaudio. Com kind=menu: button, button_legacy, list ou poll (carrossel ainda não).
filetextocondicionalObrigatório com kind=media. Opcional com kind=menu e type=button, e só por URL.
Com kind=media: URL ou base64 do arquivo. Por URL fica guardado como foi enviado; em base64 o arquivo é guardado pela API (imagem até 5 MB, áudio e vídeo até 16 MB, documento até 20 MB; 50 MB no total por dispositivo). Com kind=menu (type=button): mídia do cabeçalho, só por URL.
docNametextoopcionalSó com kind=media e type=document, ou com kind=menu quando file é documento.
Nome do arquivo exibido quando o arquivo é documento.
fullNametextocondicionalObrigatório com kind=contact.
Nome completo do contato.
phoneNumbertextocondicionalObrigatório com kind=contact.
Telefones do contato, separados por vírgula.
organizationtextoopcionalSó com kind=contact.
Empresa do contato.
emailtextoopcionalSó com kind=contact.
E-mail do contato.
urltextoopcionalSó com kind=contact.
Site do contato.
nametextoopcionalSó com kind=location.
Nome do local.
addresstextoopcionalSó com kind=location.
Endereço do local.
latitudenúmerocondicionalObrigatória com kind=location.
Latitude do local (-90 a 90).
longitudenúmerocondicionalObrigatória com kind=location.
Longitude do local (-180 a 180).
choiceslista de textoscondicionalObrigatório com kind=menu. Enquete precisa de pelo menos 2 opções, lista de pelo menos 1 item (a linha de seção "[...]" não conta) e botões de pelo menos 1; senão a resposta é 400.
Opções do menu, no mesmo formato de POST /send/menu: botão "texto|id", "texto|copy:código", "texto|call:+5511999999999" ou "texto|https://..."; lista com "[Seção]" e "item|id|descrição"; enquete só com o texto de cada opção.
footerTexttextoopcionalSó com kind=menu (type button ou list).
Texto do rodapé do menu.
listButtontextoopcionalSó com kind=menu e type=list.
Texto do botão que abre a lista.
selectableCountinteiroopcionalSó com kind=menu e type=poll.
Quantas opções a pessoa pode marcar na enquete.
mimetypetextoopcionalSó com kind=menu e file.
Força o tipo do file do menu: image, video, document ou o MIME type do arquivo.
pixTypetextocondicionalObrigatório com kind=pix.
Tipo da chave PIX: CPF, CNPJ, PHONE, EMAIL ou EVP.
pixKeytextocondicionalObrigatório com kind=pix.
Valor da chave PIX.
pixNametextoopcionalSó com kind=pix.
Nome exibido como recebedor (padrão "Pix" quando vazio).
aiDescriptiontextoopcionalReservado ao atendimento automático. Vazio por padrão.
onWhatsAppbooleanoopcionalSó na criação e só com message.kind=text. Exige o dispositivo conectado (senão 409).
Cria a resposta também no WhatsApp Business.
id.WHATSAPP_REJECTED). O motivo vem em reason: invalid_body (corpo malformado ou campo desconhecido) ou validation_failed (valor fora do permitido); a mensagem em error explica.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).WHATSAPP_CONFLICT, ou DEVICE_DISCONNECTED quando o motivo é o dispositivo desconectado). O motivo vem em reason: instance_not_paired (o dispositivo ainda não foi conectado ao WhatsApp; conecte antes) ou instance_not_connected (resposta do WhatsApp Business, onWhatsApp, só é criada, editada ou apagada com o dispositivo conectado).PAYLOAD_TOO_LARGE). Para arquivos grandes, envie file por URL.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR); tente de novo em instantes. Com respostas onWhatsApp, também quando a mudança não chegou ao WhatsApp Business (reason whatsapp_sync_failed): nada foi gravado nem apagado.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/quick-replies ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "shortCut": "saudacao", "message": { "kind": "text", "text": "Olá {{name}}! Como posso ajudar?" }}'Resposta
{
"success": true,
"data": {
"id": "qr_5e6f7g8h",
"shortCut": "saudacao",
"aiDescription": "",
"onWhatsApp": false,
"message": {
"kind": "text",
"text": "Olá {{name}}! Como posso ajudar?"
},
"createdAt": "2026-10-20T12:00:00Z",
"updatedAt": "2026-10-20T12:00:00Z"
}
}/quick-replies/{id}
Devolve a resposta rápida pelo id (o que veio na criação ou na listagem).
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioID da resposta rápida, como vem na criação ou na listagem.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).id neste dispositivo (WHATSAPP_NOT_FOUND).WHATSAPP_CONFLICT, com reason instance_not_paired). As respostas rápidas pertencem ao número conectado: conecte o dispositivo antes.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/quick-replies/qr_8f2k1m9x ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"id": "qr_8f2k1m9x",
"shortCut": "endereco",
"aiDescription": "",
"onWhatsApp": false,
"message": {
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
},
"createdAt": "2026-10-20T12:00:00Z",
"updatedAt": "2026-10-20T12:00:00Z"
}
}/quick-replies/{id}
Altera só os campos enviados. message, quando enviado, substitui a mensagem inteira (não mescla campos), com as mesmas regras por kind da criação (veja a tabela em message); trocar ou remover um arquivo apaga o anterior.
Se outra edição trocar a mensagem ao mesmo tempo, esta volta 409 com reason conflict e nada é gravado: leia a resposta de novo e repita. Respostas no WhatsApp Business (onWhatsApp) continuam só de texto e só são editadas com o dispositivo conectado. onWhatsApp vale só na criação.
Arquivo de media: por URL fica guardado como foi enviado; em base64 é guardado pela API, com até 5 MB para imagem, 16 MB para áudio e vídeo e 20 MB para documento, e 50 MB no total por dispositivo. O corpo aceita até 28 MB (um documento de 20 MB em base64).
Menu: type button, button_legacy, list ou poll (carrossel ainda não). A mídia do botão (file) só vai por URL. As opções precisam dar para enviar, senão a resposta é 400: enquete com pelo menos 2, lista com pelo menos um item (a linha de seção [...] não conta) e botões com pelo menos 1.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioID da resposta rápida.
Um objeto JSON com Content-Type: application/json.
shortCuttextoopcionalOpcional na edição.
Atalho para encontrar a resposta (também é o que o atendimento automático usa para escolher).
aiDescriptiontextoopcionalReservado ao atendimento automático. Vazio por padrão.
onWhatsAppbooleanoopcionalNão use na edição: respostas do WhatsApp Business continuam só de texto.
Vale só na criação; não envie na edição.
messageobjetoopcionalOpcional. Quando enviado, substitui a mensagem inteira (não mescla campos); trocar ou remover o arquivo apaga o anterior.
Mensagem guardada: kind mais o mesmo corpo do envio correspondente, sem number e sem os campos de envio (replyid, mentions, delay, readchat, readmessages, async, forward, track_source, track_id).
| kind | Campos | Corpo igual ao de |
|---|---|---|
text | text (obrigatório; aceita variáveis como {{name}}) | POST /send/text |
media | type e file (obrigatórios), text (legenda), docName | POST /send/media |
contact | fullName e phoneNumber (obrigatórios), organization, email, url | POST /send/contact |
location | latitude e longitude (obrigatórias), name, address | POST /send/location |
menu | type, text e choices (obrigatórios), footerText, listButton, selectableCount, file, mimetype, docName | POST /send/menu |
pix | pixType e pixKey (obrigatórios), pixName | POST /send/pix-button |
messagekindtextoobrigatórioObrigatório sempre que message for enviado.
Tipo da mensagem guardada. Define quais outros campos de message valem.
texttextocondicionalObrigatório com kind=text e com kind=menu. Opcional com kind=media (legenda).
Texto da mensagem. Com kind=text é o corpo (aceita variáveis como {{name}}); com kind=media é a legenda; com kind=menu é o texto principal.
typetextocondicionalObrigatório com kind=media e com kind=menu; os valores aceitos dependem do kind.
Com kind=media: image, video, document, audio, ptt ou myaudio. Com kind=menu: button, button_legacy, list ou poll (carrossel ainda não).
filetextocondicionalObrigatório com kind=media. Opcional com kind=menu e type=button, e só por URL.
Com kind=media: URL ou base64 do arquivo. Por URL fica guardado como foi enviado; em base64 o arquivo é guardado pela API (imagem até 5 MB, áudio e vídeo até 16 MB, documento até 20 MB; 50 MB no total por dispositivo). Com kind=menu (type=button): mídia do cabeçalho, só por URL.
docNametextoopcionalSó com kind=media e type=document, ou com kind=menu quando file é documento.
Nome do arquivo exibido quando o arquivo é documento.
fullNametextocondicionalObrigatório com kind=contact.
Nome completo do contato.
phoneNumbertextocondicionalObrigatório com kind=contact.
Telefones do contato, separados por vírgula.
organizationtextoopcionalSó com kind=contact.
Empresa do contato.
emailtextoopcionalSó com kind=contact.
E-mail do contato.
urltextoopcionalSó com kind=contact.
Site do contato.
nametextoopcionalSó com kind=location.
Nome do local.
addresstextoopcionalSó com kind=location.
Endereço do local.
latitudenúmerocondicionalObrigatória com kind=location.
Latitude do local (-90 a 90).
longitudenúmerocondicionalObrigatória com kind=location.
Longitude do local (-180 a 180).
choiceslista de textoscondicionalObrigatório com kind=menu. Enquete precisa de pelo menos 2 opções, lista de pelo menos 1 item (a linha de seção "[...]" não conta) e botões de pelo menos 1; senão a resposta é 400.
Opções do menu, no mesmo formato de POST /send/menu: botão "texto|id", "texto|copy:código", "texto|call:+5511999999999" ou "texto|https://..."; lista com "[Seção]" e "item|id|descrição"; enquete só com o texto de cada opção.
footerTexttextoopcionalSó com kind=menu (type button ou list).
Texto do rodapé do menu.
listButtontextoopcionalSó com kind=menu e type=list.
Texto do botão que abre a lista.
selectableCountinteiroopcionalSó com kind=menu e type=poll.
Quantas opções a pessoa pode marcar na enquete.
mimetypetextoopcionalSó com kind=menu e file.
Força o tipo do file do menu: image, video, document ou o MIME type do arquivo.
pixTypetextocondicionalObrigatório com kind=pix.
Tipo da chave PIX: CPF, CNPJ, PHONE, EMAIL ou EVP.
pixKeytextocondicionalObrigatório com kind=pix.
Valor da chave PIX.
pixNametextoopcionalSó com kind=pix.
Nome exibido como recebedor (padrão "Pix" quando vazio).
WHATSAPP_REJECTED). O motivo vem em reason: invalid_body (corpo malformado ou campo desconhecido) ou validation_failed (valor fora do permitido); a mensagem em error explica.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).id neste dispositivo (WHATSAPP_NOT_FOUND).WHATSAPP_CONFLICT, ou DEVICE_DISCONNECTED quando o motivo é o dispositivo desconectado). O motivo vem em reason: instance_not_paired (o dispositivo ainda não foi conectado ao WhatsApp; conecte antes) ou instance_not_connected (resposta do WhatsApp Business, onWhatsApp, só é criada, editada ou apagada com o dispositivo conectado); conflict: outra edição trocou a mensagem ao mesmo tempo, nada foi gravado, leia a resposta de novo e repita.PAYLOAD_TOO_LARGE). Para arquivos grandes, envie file por URL.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR); tente de novo em instantes. Com respostas onWhatsApp, também quando a mudança não chegou ao WhatsApp Business (reason whatsapp_sync_failed): nada foi gravado nem apagado.PROVIDER_TIMEOUT).Requisição
curl --request PATCH \ --url 'https://dropestore.com/wp-json/wdm/v1/quick-replies/qr_8f2k1m9x ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "shortCut": "endereco-centro"}'Resposta
{
"success": true,
"data": {
"id": "qr_8f2k1m9x",
"shortCut": "endereco-centro",
"aiDescription": "",
"onWhatsApp": false,
"message": {
"kind": "location",
"name": "Loja Centro",
"address": "Av. Paulista, 1000",
"latitude": -23.5614,
"longitude": -46.6559
},
"createdAt": "2026-10-20T12:00:00Z",
"updatedAt": "2026-10-20T12:30:00Z"
}
}/quick-replies/{id}
Apaga a resposta rápida e o arquivo guardado, se houver. Respostas no WhatsApp Business (onWhatsApp) são apagadas lá também: para isso o dispositivo precisa estar conectado, e, se o WhatsApp Business não confirmar, nada é apagado (502).
O sucesso responde 200 com {"success":true,"data":null}.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioID da resposta rápida.
data vem null).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).id neste dispositivo (WHATSAPP_NOT_FOUND).WHATSAPP_CONFLICT, ou DEVICE_DISCONNECTED quando o motivo é o dispositivo desconectado). O motivo vem em reason: instance_not_paired (o dispositivo ainda não foi conectado ao WhatsApp; conecte antes) ou instance_not_connected (resposta do WhatsApp Business, onWhatsApp, só é criada, editada ou apagada com o dispositivo conectado).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR); tente de novo em instantes. Com respostas onWhatsApp, também quando a mudança não chegou ao WhatsApp Business (reason whatsapp_sync_failed): nada foi gravado nem apagado.PROVIDER_TIMEOUT).Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/quick-replies/qr_8f2k1m9x ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": null
}Referência 26
Crie e administre canais, publique e acompanhe mensagens.
Rotas para canais do WhatsApp: criar, seguir e administrar canais, ler os posts publicados, editar e apagar posts recentes e consultar visualizações e reações.
@newsletter. Preserve o JID completo: ele não equivale ao número de um contato nem ao JID de um grupo.viewsCount) e as reações (reactionCounts) vêm em cada post dessa rota, não por evento de webhook.number igual ao JID do canal. Publicações em canal não entram na fila de envio assíncrono.Valem nas rotas deste grupo que os listam nos próprios parâmetros.
jidtextoopcionalJID do canal: o formato completo 120363123456789012@newsletter ou só o identificador numérico.
/newsletter/create
/newsletter/list
/newsletter/info
/newsletter/link
/newsletter/subscribe
/newsletter/messages
/newsletter/messages/edit
/newsletter/messages/delete
/newsletter/updates
/newsletter/viewed
/newsletter/reaction
/newsletter/follow
/newsletter/unfollow
/newsletter/mute
/newsletter/unmute
/newsletter/delete
/newsletter/picture
/newsletter/name
/newsletter/description
/newsletter/settings
/newsletter/search
/newsletter/admin/invite
/newsletter/admin/accept
/newsletter/admin/remove
/newsletter/admin/revoke
/newsletter/owner/transfer
/newsletter/create
Cria um canal no WhatsApp com a conta conectada ao dispositivo.
name é obrigatório; description e picture são opcionais.picture aceita URL HTTP/HTTPS, base64 puro ou data URI; imagem acima de 1 MB é recusada.Para publicar no canal, use as rotas de envio (como POST /send/text e POST /send/media) com number igual ao JID completo do canal, terminado em @newsletter. Publicações em canal não entram na fila de envio assíncrono, mesmo com async: true.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNome público do canal.
descriptiontextoopcionalDescrição pública do canal.
picturetextoopcionalURL HTTP/HTTPS, base64 puro ou data URI. Imagem acima de 1 MB é recusada.
Imagem do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After. Caso do WhatsApp (502): O WhatsApp não devolveu o canal criado (resposta vazia).PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/create ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Ofertas da Loja Exemplo", "description": "Promoções e novidades da Loja Exemplo, todo dia às 9h.", "picture": "https://seusite.com.br/imagens/canal.png" }'Resposta
{
"success": true,
"data": {
"response": []
}
}/newsletter/list
Lista os canais seguidos pela conta conectada. Use para montar uma tela de canais antes de consultar posts, silenciar notificações ou deixar de seguir.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/list ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": [
[]
]
}
}/newsletter/info
Retorna nome, descrição, imagem e demais informações disponíveis de um canal pelo jid. Use antes de exibir o canal ou executar ações administrativas.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/info ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": []
}
}/newsletter/link
Resolve a chave de um convite de canal e retorna as informações do canal antes de segui-lo, sem exigir que a conta já siga esse canal.
Um objeto JSON com Content-Type: application/json.
keytextoobrigatórioChave do convite do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/link ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "key": "0029VaKsT4n9Gv7Q1ZpXyW2e"}'Resposta
{
"success": true,
"data": {
"response": []
}
}/newsletter/subscribe
Assina, por tempo limitado, as atualizações internas do WhatsApp para um canal.
5m0s).Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/subscribe ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": "5m0s"
}
}/newsletter/messages
Busca os posts de um canal direto no WhatsApp, sem depender de mensagens salvas. Use para carregar os posts recentes de um canal e paginar para trás.
Identificação do canal:
jid com o JID completo (120363123456789012@newsletter) ou só o identificador numéricoid, no lugar de jidObservações:
count define quantos posts voltambeforeid o serverid do post mais antigo que você já temresponse; cada post traz serverid, messageid, type, timestamp, as visualizações em viewsCount e as reações em reactionCounts (emoji e quantidade)Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioTambém aceito no campo id (apelido mantido por compatibilidade).
JID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
countinteiroopcionalQuantidade de posts a buscar.
beforeidinteiroopcionalEnvie o serverid do post mais antigo da página anterior.
Retorna os posts anteriores ao serverid informado (paginação para trás).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/messages ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "count": 20}'Resposta
{
"success": true,
"data": {
"response": [
{
"messageid": "3EB0B4302B3A8A52F7A1",
"serverid": 12345,
"type": "text",
"timestamp": "2026-03-24T18:20:00Z",
"viewsCount": 1200,
"reactionCounts": {
"\ud83d\udc4d": 22,
"\ud83d\udd25": 7
},
"message": {
"conversation": "Post do canal"
}
}
]
}
}/newsletter/messages/edit
Edita um post recente de um canal direto no WhatsApp, sem depender de mensagens salvas.
jid e o post por messageid ou serverid (envie ao menos um dos dois).text ou caption (ao menos um dos dois).text, image, video e document podem ser editados.mediahandle pode informar o handle de mídia já conhecido.count e maxpages controlam o tamanho dessa busca. Se o post não estiver nessa janela, a resposta é 404.Para posts de canal, use esta rota, não POST /message/edit.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
messageidtextoopcionalEnvie messageid ou serverid (ao menos um dos dois).
ID lógico do post no canal, como vem em messageid nos posts de POST /newsletter/messages.
serveridinteiroopcionalEnvie messageid ou serverid (ao menos um dos dois).
Identificador sequencial do post no canal, como vem em serverid nos posts de POST /newsletter/messages.
texttextoopcionalEnvie text ou caption (ao menos um dos dois).
Novo texto do post, ou nova legenda de um post de mídia.
captiontextoopcionalEnvie text ou caption (ao menos um dos dois).
Mesmo papel de text, para atualizar a legenda de posts de mídia.
mediahandletextoopcionalSó para posts de mídia (image, video, document).
Handle de mídia já conhecido, usado quando a edição precisa preservar a mídia do post.
countinteiroopcionalQuantidade de posts buscados por página ao localizar o post.
maxpagesinteiroopcionalQuantidade máxima de páginas buscadas ao localizar o post.
messageid e serverid.text e caption.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/messages/edit ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "messageid": "3EB0B4302B3A8A52F7A1", "text": "Oferta atualizada: frete grátis até domingo."}'Resposta
{
"success": true,
"data": {
"response": {
"jid": "120363123456789012@newsletter",
"targetmessageid": "3EB0B4302B3A8A52F7A1",
"targetserverid": 12345,
"messageid": "3EB01234567890ABCDEF",
"serverid": 12346
}
}
}/newsletter/messages/delete
Apaga um post recente de um canal direto no WhatsApp, sem depender de mensagens salvas. O post é apagado para todos no canal.
jid e o post por messageid ou serverid (envie ao menos um dos dois).count e maxpages controlam o tamanho dessa busca. Se o post não estiver nessa janela, a resposta é 404.Para posts de canal, use esta rota, não POST /message/delete.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
messageidtextoopcionalEnvie messageid ou serverid (ao menos um dos dois).
ID lógico do post no canal, como vem em messageid nos posts de POST /newsletter/messages.
serveridinteiroopcionalEnvie messageid ou serverid (ao menos um dos dois).
Identificador sequencial do post no canal, como vem em serverid nos posts de POST /newsletter/messages.
countinteiroopcionalQuantidade de posts buscados por página ao localizar o post.
maxpagesinteiroopcionalQuantidade máxima de páginas buscadas ao localizar o post.
messageid e serverid.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/messages/delete ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "messageid": "3EB0B4302B3A8A52F7A1"}'Resposta
{
"success": true,
"data": {
"response": {
"jid": "120363123456789012@newsletter",
"targetmessageid": "3EB0B4302B3A8A52F7A1",
"targetserverid": 12345,
"messageid": "3EB01234567890ABCDEF",
"serverid": 12346
}
}
}/newsletter/updates
Obsoleta. Não use. Para visualizações e reações dos posts, use POST /newsletter/messages, que traz viewsCount e reactionCounts em cada post.
O WhatsApp não responde à consulta de atualizações desta rota: depois de 10 segundos de espera, a chamada termina em erro (504 PROVIDER_TIMEOUT).
Parâmetros mantidos por compatibilidade:
afterid filtra atualizações depois de um serveridsince filtra pelo momento da atualização, em segundos ou milissegundosUm objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
countinteiroopcionalQuantidade máxima de atualizações retornadas.
afteridinteiroopcionalRetorna só atualizações posteriores ao serverid informado.
sinceinteiroopcionalAcima de 1000000000000, o valor é lido como milissegundos; caso contrário, como segundos.
Momento de corte (timestamp Unix).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR).PROVIDER_TIMEOUT). Nesta rota obsoleta é o resultado esperado: o WhatsApp não responde à consulta de atualizações em 10 segundos. Use POST /newsletter/messages.Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/updates ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "count": 50, "afterid": 12345}'Resposta
{
"success": true,
"data": {
"response": [
{
"messageid": "3EB0B4302B3A8A52F7A1",
"serverid": 12345,
"type": "text",
"timestamp": "2026-03-24T19:00:00Z",
"viewsCount": 1540,
"reactionCounts": {
"\ud83d\udc4d": 35,
"\ud83d\udd25": 11
}
}
]
}
}/newsletter/viewed
Marca um ou mais posts do canal como visualizados.
serverids a lista de serverid dos posts; o serverid vem em cada post de POST /newsletter/messages.Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
serveridslista de inteirosobrigatórioLista de serverid dos posts a marcar como visualizados.
serveridsTOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/viewed ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "serverids": [ 12345, 12346 ]}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/reaction
Envia, altera ou remove uma reação em um post do canal.
serverid identifica o post.reaction traz o emoji; envie reaction vazio ("") para remover a reação.reactionmessageid é opcional; sem ele, o WhatsApp gera o ID da reação.Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
serveridinteiroobrigatórioserverid do post que recebe a reação.
reactiontextoopcionalTexto vazio ("") remove a reação.
Emoji da reação.
reactionmessageidtextoopcionalOpcional; se omitido, o WhatsApp gera o ID.
ID da reação.
serveridTOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/reaction ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "serverid": 12345, "reaction": "\ud83d\udd25"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/follow
Faz a conta conectada seguir um canal, que então passa a aparecer na listagem e fica disponível para consulta de posts.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/follow ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/unfollow
Remove o canal da lista seguida pela conta conectada sem apagar o canal nem seus posts.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/unfollow ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/mute
Silencia as notificações de um canal sem deixar de segui-lo; os posts continuam disponíveis para consulta.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/mute ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/unmute
Reativa as notificações de um canal anteriormente silenciado, mantendo a inscrição e o histórico disponíveis.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/unmute ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/delete
Exclui um canal administrado pela conta conectada. Para só deixar de acompanhar um canal, use POST /newsletter/unfollow.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioO canal precisa ser administrado pela conta conectada.
JID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/delete ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/picture
Atualiza a imagem de um canal.
picture aceita URL HTTP/HTTPS, base64 puro ou data URI.Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
picturetextoobrigatórioURL HTTP/HTTPS, base64 puro ou data URI. Imagem acima de 1 MB é recusada.
Nova imagem do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/picture ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "picture": "https://seusite.com.br/imagens/canal.png" }'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/name
Altera o nome público de um canal administrado pela conta conectada.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
nametextoobrigatórioNovo nome público do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/name ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "name": "Ofertas VIP da Loja Exemplo"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/description
Atualiza a descrição pública do canal, que explica o tema, a frequência e o conteúdo publicado.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
descriptiontextoopcionalNova descrição pública do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/description ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "description": "Promoções e novidades da Loja Exemplo, todo dia às 9h."}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/settings
Atualiza as configurações de um canal. Hoje, esta rota controla só reactionCodes, a configuração de reações do canal.
Valores aceitos em reactionCodes: all, basic, none ou blocklist.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
reactionCodestextoobrigatórioValores aceitos: all, basic, none ou blocklist.
Configuração de reações do canal.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/settings ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "reactionCodes": "basic"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/search
Pesquisa canais públicos no diretório do WhatsApp pelo texto.
Observações:
searchText é obrigatório: o WhatsApp só pesquisa o diretório por texto. Sem ele, ou com texto vazio, a API responde 422 VALIDATION antes de consultar o WhatsAppafter o valor de response.after da página anterior, sem alterar; a API também aceita esse cursor nos campos cursor, startCursor ou start_cursorresponse.after vier null, não há mais páginasUm objeto JSON com Content-Type: application/json.
searchTexttextoobrigatórioObrigatório e não pode ser vazio.
Texto pesquisado no diretório de canais.
limitinteiroopcionalQuantidade de canais por página.
aftertextoopcionalTambém aceito como cursor, startCursor ou start_cursor. Quando response.after vier null, não há mais páginas.
Cursor da próxima página, copiado sem alterar de response.after.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/search ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "searchText": "promoções", "limit": 20}'Resposta
{
"success": true,
"data": {
"response": {
"after": "YXJyYXljb25uZWN0aW9uOjIw",
"data": [
[]
]
}
}
}/newsletter/admin/invite
Envia a um telefone um convite para administrar o canal. O acesso só muda depois que o convidado aceitar, com POST /newsletter/admin/accept na conta dele. Para cancelar um convite ainda não aceito, use POST /newsletter/admin/revoke.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
phonetextoobrigatórioTelefone convidado, no formato internacional (código do país, DDD e número), como 5511999999999.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/admin/invite ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "phone": "5511987654321"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/admin/accept
Aceita um convite pendente e torna a conta conectada administradora do canal informado.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioPrecisa existir um convite pendente para a conta conectada.
JID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/admin/accept ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/admin/remove
Tira o papel de administrador do telefone informado. A pessoa não deixa de seguir o canal por causa disso. Para cancelar um convite ainda não aceito, use POST /newsletter/admin/revoke.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
phonetextoobrigatórioTelefone do administrador a remover, no formato internacional (código do país, DDD e número), como 5511999999999.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/admin/remove ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "phone": "5511987654321"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/admin/revoke
Cancela um convite de administrador que ainda não foi aceito. Administradores ativos não são removidos por esta rota; para isso, use POST /newsletter/admin/remove.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
phonetextoobrigatórioSó cancela convite ainda não aceito.
Telefone que recebeu o convite, no formato internacional (código do país, DDD e número), como 5511999999999.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/admin/revoke ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "phone": "5511987654321"}'Resposta
{
"success": true,
"data": {
"response": true
}
}/newsletter/owner/transfer
Transfere a propriedade do canal para outro telefone.
phone é obrigatório.quitAdmin: true, o dono anterior deixa de ser administrador depois da transferência.Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do canal. Aceita o formato completo 120363123456789012@newsletter ou apenas o identificador numérico.
phonetextoobrigatórioTelefone do novo dono, no formato internacional (código do país, DDD e número), como 5511999999999.
quitAdminbooleanoopcionalCom true, o dono anterior deixa de ser administrador depois da transferência.
Tira o dono anterior da administração depois da transferência.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/newsletter/owner/transfer ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "120363123456789012@newsletter", "phone": "5511987654321", "quitAdmin": false}'Resposta
{
"success": true,
"data": {
"response": true
}
}Referência 2
Nome e foto do perfil do número.
Operações relacionadas ao perfil da conta do WhatsApp atualmente conectada, como alterar nome e imagem de perfil.
/profile/name
Altera o nome de exibição do perfil da conta do WhatsApp conectada ao dispositivo, com até 25 caracteres. A mudança é sincronizada com o WhatsApp e a resposta confirma a alteração.
Importante:
Para trocar o nome do dispositivo na sua conta (e não o do perfil), use POST /instance/updateInstanceName.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNovo nome de exibição do perfil no WhatsApp (até 25 caracteres).
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Ação não permitida.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/profile/name ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Loja Centro Atendimento"}'Resposta
{
"success": true,
"message": "Nome do perfil alterado com sucesso",
"profile": {
"name": "Minha Empresa - Atendimento",
"updated_at": 1704067200
}
}/profile/image
Altera a foto do perfil da conta do WhatsApp conectada ao dispositivo, ou remove a foto atual. A imagem pode ir por URL, em base64 ou com o comando de remoção; a mudança é sincronizada com o WhatsApp e a resposta confirma a alteração.
Importante:
413).Um objeto JSON com Content-Type: application/json.
imagetextoobrigatórioUm de três formatos: URL da imagem (http ou https), a imagem em base64, ou o texto remove (ou delete) para remover a foto atual.
Foto do perfil, em JPEG com 640x640 pixels.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED). Caso do WhatsApp (403): Ação não permitida.PAYLOAD_TOO_LARGE). Caso do WhatsApp (413): Imagem muito grande.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/profile/image ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "image": "https://seusite.com.br/imagens/logo-640x640.jpg" }'Resposta
{
"success": true,
"message": "Imagem do perfil alterada com sucesso",
"profile": {
"image_updated": true,
"image_removed": false,
"updated_at": 1704067200
}
}Referência 13
Perfil da empresa, produtos e coleções do catálogo.
EXPERIMENTAL - Rotas ainda não testados completamente.
Operações relacionadas ao perfil comercial do WhatsApp Business. Permite consultar e atualizar dados do perfil comercial como descrição, endereço, email, categorias e gerenciar o catálogo de produtos.
Requisitos:
Nota: Estes rotas podem não funcionar como esperado. Reporte problemas encontrados.
/business/get/profile
/business/get/categories
/business/update/profile
/business/catalog/list
/business/catalog/info
/business/catalog/delete
/business/catalog/show
/business/catalog/hide
/business/catalog/save
/business/catalog/collection/list
/business/catalog/collection/create
/business/catalog/collection/{id}
/business/catalog/collection/{id}
/business/get/profile
Retorna os dados públicos de um perfil comercial do WhatsApp: descrição, endereço, e-mail, sites e categorias. Informe em jid o perfil a consultar; para ver o perfil do número conectado, use o JID dele.
Perfil comercial é o das contas WhatsApp Business. As categorias vêm em categories, com o mesmo id de GET /business/get/categories.
Um objeto JSON com Content-Type: application/json.
jidtextoopcionalJID do perfil comercial a consultar: número com DDI seguido de @s.whatsapp.net.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/get/profile ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "5511999999999@s.whatsapp.net"}'Resposta
{
"success": true,
"data": {
"response": {
"tag": "",
"description": "Loja de roupas e acessórios",
"address": "Av. Paulista, 1000 - São Paulo",
"email": "contato@seusite.com.br",
"websites": [
"https://seusite.com.br"
],
"categories": [
{
"id": "1223524174334504",
"localized_display_name": "Loja de roupas"
}
]
}
}
}/business/get/categories
Lista as categorias de negócio que o WhatsApp oferece para perfis comerciais, cada uma com id e o nome em localized_display_name.
A lista serve para consulta: a API não tem rota para trocar a categoria do perfil (POST /business/update/profile altera só descrição, endereço e e-mail). Para ver as categorias de um perfil, use POST /business/get/profile.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/business/get/categories ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": [
{
"id": "1223524174334504",
"localized_display_name": "Loja de roupas"
},
{
"id": "180164648685982",
"localized_display_name": "Restaurante"
}
]
}
}/business/update/profile
Atualiza o perfil comercial da conta WhatsApp Business conectada ao dispositivo. Envie pelo menos um entre description, address e email (sem nenhum, a resposta é 422); só os campos enviados mudam. Categoria e sites não são alterados por esta rota.
Cada campo é atualizado separadamente. A resposta é 200 mesmo quando parte dos campos falha: confira failed (quantos falharam) e updated (quantos mudaram); o resultado de cada campo vem em response. Quando nenhum campo é atualizado, a resposta é 502 PROVIDER_ERROR, sem o resultado por campo.
Um objeto JSON com Content-Type: application/json.
descriptiontextoopcionalEnvie pelo menos um entre description, address e email.
Nova descrição do perfil comercial.
addresstextoopcionalEnvie pelo menos um entre description, address e email.
Novo endereço do perfil comercial.
emailtextoopcionalEnvie pelo menos um entre description, address e email.
Novo e-mail do perfil comercial.
description, address e email.failed maior que zero, algum campo não foi atualizado; o resultado de cada campo vem em response.WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR); nesse caso o resultado por campo não é devolvido. Tente de novo em instantes.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/update/profile ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "description": "Loja de roupas e acessórios", "address": "Av. Paulista, 1000 - São Paulo", "email": "contato@seusite.com.br"}'Resposta
{
"success": true,
"data": {
"response": {
"description": {
"status": "updated"
},
"address": {
"status": "updated"
},
"email": {
"status": "updated"
}
},
"updated": 3,
"failed": 0
}
}/business/catalog/list
Lista uma página de produtos do catálogo de um perfil comercial, com até 50 produtos por chamada. Use com o dispositivo conectado a uma conta WhatsApp Business.
Paginação: envie só jid para a primeira página. Se a resposta trouxer response.next, envie esse valor em after na próxima chamada, copiado sem alterar (é um cursor opaco, não decodifique). Sem response.next, não há mais páginas.
Preços vêm como texto em milésimos da moeda: "19990" = R$ 19,99. A promoção, quando há, vem em sale_price.price. O id de cada produto é o que as outras rotas do catálogo pedem.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do dono do catálogo (ex.: 5511999999999@s.whatsapp.net). Para o seu catálogo, use o JID do número conectado.
aftertextoopcionalOmita na primeira página.
Cursor da próxima página: o response.next da resposta anterior, copiado sem alterar.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/list ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "5511999999999@s.whatsapp.net"}'Resposta
{
"success": true,
"data": {
"response": {
"next": "Q1VSU09SX1BST1hJTUFfUEFHSU5B",
"products": [
{
"id": "1234567890",
"retailer_id": "CAM-BAS-P",
"name": "Camiseta básica",
"description": "Camiseta 100% algodão, cor preta.",
"price": "19990",
"currency": "BRL",
"url": "https://seusite.com.br/produtos/camiseta-basica",
"is_hidden": false,
"is_sanctioned": false,
"product_availability": "in stock",
"media": {
"images": [
{
"id": "987654321098765",
"request_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta.jpg",
"original_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta-original.jpg"
}
]
},
"sale_price": {
"price": "14990",
"start_date": "2026-10-20",
"end_date": "2026-10-31"
},
"status_info": {
"status": "APPROVED",
"can_appeal": false
}
}
]
}
}
}/business/catalog/info
Retorna os detalhes de um produto do catálogo: nome, preço, promoção, imagens, situação da revisão e dados de conformidade. Informe o jid do dono do catálogo e o id do produto, como vem na listagem (POST /business/catalog/list). Use com o dispositivo conectado a uma conta WhatsApp Business.
Preços vêm como texto em milésimos da moeda: "19990" = R$ 19,99. A promoção fica em sale_price.price. Para editar só um campo em POST /business/catalog/save, leia o produto aqui e reenvie os demais.
Um objeto JSON com Content-Type: application/json.
jidtextoobrigatórioJID do dono do catálogo (ex.: 5511999999999@s.whatsapp.net).
idtextoobrigatórioID do produto, como vem em response.products[].id da listagem.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/info ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "jid": "5511999999999@s.whatsapp.net", "id": "1234567890"}'Resposta
{
"success": true,
"data": {
"response": {
"id": "1234567890",
"retailer_id": "CAM-BAS-P",
"name": "Camiseta básica",
"description": "Camiseta 100% algodão, cor preta.",
"price": "19990",
"currency": "BRL",
"url": "https://seusite.com.br/produtos/camiseta-basica",
"is_hidden": false,
"is_sanctioned": false,
"product_availability": "in stock",
"media": {
"images": [
{
"id": "987654321098765",
"request_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta.jpg",
"original_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta-original.jpg"
}
]
},
"sale_price": {
"price": "14990",
"start_date": "2026-10-20",
"end_date": "2026-10-31"
},
"status_info": {
"status": "APPROVED",
"can_appeal": false
},
"belongs_to": "5511999999999@s.whatsapp.net",
"max_available": 50
}
}
}/business/catalog/delete
Apaga um produto do catálogo do número conectado. Não pode ser desfeito. Para só tirar o produto da vitrine, use POST /business/catalog/hide. Use com o dispositivo conectado a uma conta WhatsApp Business.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioID do produto, como vem em response.products[].id da listagem.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/delete ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "1234567890"}'Resposta
{
"success": true,
"data": {
"response": "Deleted product"
}
}/business/catalog/show
Torna visível na vitrine um produto do catálogo do número conectado, por exemplo um que foi ocultado com POST /business/catalog/hide. Use com o dispositivo conectado a uma conta WhatsApp Business.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioID do produto, como vem em response.products[].id da listagem.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/show ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "1234567890"}'Resposta
{
"success": true,
"data": {
"response": "Product shown"
}
}/business/catalog/hide
Tira um produto da vitrine sem apagá-lo, no catálogo do número conectado. Para exibir de novo, use POST /business/catalog/show. Use com o dispositivo conectado a uma conta WhatsApp Business.
Um objeto JSON com Content-Type: application/json.
idtextoobrigatórioID do produto, como vem em response.products[].id da listagem.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/hide ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "id": "1234567890"}'Resposta
{
"success": true,
"data": {
"response": "Product hidden"
}
}/business/catalog/save
Cria um produto quando id não é informado, ou edita o produto indicado em id. Use com o dispositivo conectado a uma conta WhatsApp Business. Criar e editar respondem 200, com o produto salvo em response.
Preços são textos de inteiros em milésimos da moeda: "19990" = R$ 19,99. currency é obrigatória quando há price, e currency ou sale_price sem price são recusados (400).
Imagem: envie uma das três fontes (sem nenhuma, a resposta é 422):
image_data: imagem nova JPEG ou PNG em base64 ou Data URL, até 16 MB;image_url: endereço público HTTPS de uma imagem nova JPEG ou PNG, até 16 MB;image_urls: para manter imagens já cadastradas, as URLs que o próprio catálogo devolveu (media.images[].request_image_url ou original_image_url, lidas em POST /business/catalog/info).A edição substitui o produto inteiro: o que não for enviado fica vazio. Para alterar só um campo, leia o produto em POST /business/catalog/info e reenvie os demais: description, price, currency, sale_price, url, retailer_id, image_urls, video_urls, compliance_category e compliance_info. Na leitura a promoção vem em sale_price.price; no envio, sale_price é só o texto do valor. Só is_hidden mantém o valor atual quando omitido.
O corpo aceita até 22 MB, o bastante para uma imagem de 16 MB em base64.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNome do produto (até 256 caracteres).
idtextoopcionalOmita para criar; informe para editar. Na edição o produto é substituído inteiro.
ID do produto a editar, como vem na listagem.
descriptiontextoopcionalNa edição, se omitida, fica vazia.
Descrição do produto (até 4096 caracteres).
currencytextocondicionalObrigatória quando há price. Enviada sem price, a resposta é 400.
Moeda em 3 letras maiúsculas (ex.: BRL).
pricetextoopcionalExige currency. Na edição, se omitido, fica vazio.
Preço em milésimos da moeda, como texto de inteiros: "19990" = R$ 19,99.
sale_pricetextoopcionalSó com price; sem price, a resposta é 400. Na edição, se omitido, fica vazio.
Preço promocional em milésimos da moeda, como texto ("14990" = R$ 14,99). No envio é só o valor; na leitura vem em sale_price.price.
urltextoURLopcionalNa edição, se omitido, fica vazio.
Link do produto na sua loja (URL, até 2048 caracteres).
retailer_idtextoopcionalNa edição, se omitido, fica vazio.
Código do produto no seu sistema (SKU), até 256 caracteres.
is_hiddenbooleanoopcionalÚnico campo que, omitido na edição, mantém o valor atual.
true deixa o produto fora da vitrine.
image_urlslista de textosopcionalUma das três fontes de imagem (image_data, image_url ou image_urls) é obrigatória. Use para manter as imagens atuais na edição.
URLs HTTPS de imagens já cadastradas, como o catálogo devolve (media.images[].request_image_url ou original_image_url). Não aceita outros endereços. De 1 a 10.
video_urlslista de textosopcionalNa edição, se omitido, o produto fica sem vídeo.
URLs de vídeos já associados ao produto, até 10.
image_datatextoopcionalUma das três fontes de imagem é obrigatória.
Imagem nova JPEG ou PNG em base64 ou Data URL, até 16 MB.
image_urltextoURLopcionalUma das três fontes de imagem é obrigatória.
Endereço público HTTPS de uma imagem nova JPEG ou PNG, até 16 MB.
compliance_categorytextoopcionalNa edição, se omitida, fica vazia.
Categoria de conformidade do produto (até 128 caracteres).
compliance_infoobjetoopcionalNa edição, se omitido, fica vazio.
Dados de origem e de importação do produto.
compliance_infocountry_code_origintextoopcionalPaís de origem (código do país, ex.: CN).
importer_nametextoopcionalNome do importador.
importer_addressobjetoopcionalEndereço do importador.
importer_addressstreet1textoopcionalLogradouro e número.
street2textoopcionalComplemento.
citytextoopcionalCidade.
regiontextoopcionalEstado ou região.
postal_codetextoopcionalCEP.
country_codetextoopcionalCódigo do país.
widthinteiroopcionalLargura, de 1 a 1024.
heightinteiroopcionalAltura, de 1 a 1024.
image_data, image_url e image_urls.response.WHATSAPP_REJECTED), por exemplo currency ou sale_price sem price. A mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE). Para imagens grandes, prefira image_url.errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Tente de novo em instantes.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/save ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Camiseta básica", "currency": "BRL", "price": "19990", "image_url": "https://exemplo.com/camiseta.jpg" }'Resposta
{
"success": true,
"data": {
"response": {
"id": "1234567890",
"retailer_id": "CAM-BAS-P",
"name": "Camiseta básica",
"description": "Camiseta 100% algodão, cor preta.",
"price": "19990",
"currency": "BRL",
"url": "https://seusite.com.br/produtos/camiseta-basica",
"is_hidden": false,
"is_sanctioned": false,
"product_availability": "in stock",
"media": {
"images": [
{
"id": "987654321098765",
"request_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta.jpg",
"original_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta-original.jpg"
}
]
},
"sale_price": {
"price": "14990",
"start_date": "2026-10-20",
"end_date": "2026-10-31"
},
"status_info": {
"status": "APPROVED",
"can_appeal": false
}
}
}
}/business/catalog/collection/list
Lista as coleções do catálogo do número conectado, cada uma com os seus produtos. Use com o dispositivo conectado a uma conta WhatsApp Business.
Paginação: na primeira página, não informe after. Se a resposta trouxer response.next, envie esse valor em after na próxima chamada, copiado sem alterar (é um cursor opaco, não decodifique). Sem response.next, não há mais páginas.
Preços vêm como texto em milésimos da moeda: "19990" = R$ 19,99.
Vão depois do ? no endereço, como nome=valor.
aftertextoopcionalOmita na primeira página.
Cursor da próxima página: o response.next da resposta anterior, copiado sem alterar.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/collection/list ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": {
"next": "QVFIUjNfY29sZWNvZXM",
"collections": [
{
"id": "876543210987654",
"name": "Novidades",
"products": [
{
"id": "1234567890",
"retailer_id": "CAM-BAS-P",
"name": "Camiseta básica",
"description": "Camiseta 100% algodão, cor preta.",
"price": "19990",
"currency": "BRL",
"url": "https://seusite.com.br/produtos/camiseta-basica",
"is_hidden": false,
"is_sanctioned": false,
"product_availability": "in stock",
"media": {
"images": [
{
"id": "987654321098765",
"request_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta.jpg",
"original_image_url": "https://mmg.whatsapp.net/v/t45.5328-4/camiseta-original.jpg"
}
]
},
"sale_price": {
"price": "14990",
"start_date": "2026-10-20",
"end_date": "2026-10-31"
},
"status_info": {
"status": "APPROVED",
"can_appeal": false
}
}
],
"status_info": {
"status": "APPROVED",
"can_appeal": false
}
}
]
}
}
}/business/catalog/collection/create
Cria uma coleção no catálogo do número conectado com produtos que já existem, pelos IDs da listagem de produtos (POST /business/catalog/list). Use com o dispositivo conectado a uma conta WhatsApp Business.
A resposta traz o id da coleção e a situação da revisão em review_status.
Um objeto JSON com Content-Type: application/json.
nametextoobrigatórioNome da coleção.
product_idslista de textosobrigatórioIDs de produtos que já existem no catálogo (response.products[].id da listagem). Pelo menos 1.
id e review_status vêm em response.WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/collection/create ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Novidades", "product_ids": [ "1234567890", "1234567891" ]}'Resposta
{
"success": true,
"data": {
"response": {
"id": "876543210987654",
"review_status": "PENDING"
}
}
}/business/catalog/collection/{id}
Altera só os campos enviados da coleção indicada pelo id da URL. Envie pelo menos uma alteração (sem nenhuma, a resposta é 422): name troca o nome, add_product_ids inclui produtos e remove_product_ids tira produtos da coleção sem apagá-los do catálogo. Use com o dispositivo conectado a uma conta WhatsApp Business.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioID da coleção, como vem em response.collections[].id de GET /business/catalog/collection/list.
Um objeto JSON com Content-Type: application/json.
nametextoopcionalEnvie pelo menos um entre name, add_product_ids e remove_product_ids.
Novo nome da coleção.
add_product_idslista de textosopcionalEnvie pelo menos um entre name, add_product_ids e remove_product_ids.
IDs de produtos do catálogo a incluir na coleção.
remove_product_idslista de textosopcionalEnvie pelo menos um entre name, add_product_ids e remove_product_ids.
IDs de produtos a tirar da coleção (continuam no catálogo).
name, add_product_ids e remove_product_ids.id e review_status vêm em response.WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request PATCH \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/collection/876543210987654 ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "name": "Em destaque", "add_product_ids": [ "1234567890" ]}'Resposta
{
"success": true,
"data": {
"response": {
"id": "876543210987654",
"review_status": "PENDING"
}
}
}/business/catalog/collection/{id}
Apaga uma coleção do catálogo do número conectado. Os produtos continuam no catálogo. Use com o dispositivo conectado a uma conta WhatsApp Business.
Troque o trecho entre chaves no caminho pelo valor.
idtextoobrigatórioID da coleção, como vem em response.collections[].id de GET /business/catalog/collection/list.
WHATSAPP_REJECTED); a mensagem em error explica o motivo.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).DEVICE_DISCONNECTED). Conecte e tente de novo.PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request DELETE \ --url 'https://dropestore.com/wp-json/wdm/v1/business/catalog/collection/876543210987654 ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Deleted collection"
}
}Referência 2
Inicie e rejeite chamadas de voz.
Operações relacionadas a chamadas peloWhatsApp. Permite realizar e rejeitar chamadas programaticamente.
/call/make
Inicia uma chamada de voz para um contato. Funciona só com números válidos do WhatsApp.
Sem fileUrl, a chamada só faz o telefone do contato tocar: não há conversa de voz nos dois sentidos.
Com fileUrl, a API toca o áudio quando a chamada é atendida e encerra a ligação no fim do áudio. São aceitos MP3, WAV e OGG/Opus por URL http(s), data URI ou base64, com até 25 MB.
call_duration (opcional) é o tempo máximo da chamada, em segundos: ao fim desse tempo ela é encerrada sozinha, sem precisar de POST /call/reject. Use 0 ou omita para não limitar a reprodução do áudio por tempo.
A resposta confirma que o pedido foi aceito (confirmed: false enquanto o WhatsApp ainda não confirmou a chamada) e, quando há fileUrl, traz o estado do áudio em audio.
Um objeto JSON com Content-Type: application/json.
numbertextoobrigatórioNúmero do contato com DDI (ex.: 5511999999999).
call_durationinteiroopcionalAo fim, a chamada é encerrada sozinha. 0 ou omitido não limita o áudio por tempo.
Tempo máximo da chamada, em segundos.
fileUrltextoopcionalMP3, WAV ou OGG/Opus por URL http(s), data URI ou base64, até 25 MB. A chamada termina no fim do áudio. Sem fileUrl, o telefone só toca.
Áudio para tocar quando a chamada for atendida.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/call/make ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "number": "5511999999999", "call_duration": 0, "fileUrl": "https://exemplo.com/audio.mp3" }'Resposta
{
"success": true,
"data": {
"response": "Call request accepted locally, awaiting WhatsApp confirmation",
"confirmed": false,
"call": {
"id": "3EB0538DA65A59F6D8A251",
"from": "5511999999999@s.whatsapp.net",
"callCreator": "",
"callCreatorAlt": "",
"groupJid": "120363153742561022@g.us",
"fromMe": true,
"wasSentByAPI": true,
"source": "",
"primaryJid": "",
"alternateJid": "",
"timestamp": 1792500000000,
"timestampISO": "2026-10-20T12:00:00Z",
"updatedAt": 1792500000,
"updatedAtISO": "2026-10-20T12:00:00Z",
"participants": [
"5511999999999@s.whatsapp.net"
]
},
"audio": {
"requested": true,
"mode": "call",
"queued": true,
"fileUrl": "https://exemplo.com/arquivo.jpg",
"input": "",
"source": "",
"playback": "starts_when_call_is_ready"
}
}
}/call/reject
Rejeita uma chamada recebida no WhatsApp.
O corpo pode ir vazio ({}), que é o uso recomendado. Os campos number e id são opcionais e servem para indicar uma chamada específica. O ID da chamada chega no evento call do webhook, em event.CallID.
A resposta de sucesso traz response: "Call rejected".
Um objeto JSON com Content-Type: application/json.
numbertextoopcionalOpcional; use junto com id para indicar uma chamada específica.
Número de quem ligou, com DDI (ex.: 5511999999999).
idtextoopcionalOpcional. Chega no evento call do webhook, em event.CallID.
ID da chamada a rejeitar.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/call/reject ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"response": "Call rejected"
}
}Referência 4
Escolha por onde a conexão do número sai.
Por padrão, o dispositivo se conecta ao WhatsApp por uma conexão gerenciada, com IPs do Brasil. Você pode manter esse padrão, escolher a região da conexão gerenciada (país, estado e cidade do catálogo de GET /proxy-managed/countries e GET /proxy-managed/cities) ou usar um proxy próprio com proxy_url. Para clientes de outros países, considere um proxy da região do cliente.
/instance/proxy
/instance/proxy
/proxy-managed/countries
/proxy-managed/cities
/instance/proxy
Mostra a configuração desejada e a rota de conexão usada pelo dispositivo no momento. Use para confirmar se o proxy escolhido está ativo ou se uma rota alternativa foi aplicada para preservar a conexão.
mode informa a configuração escolhida: custom, internal ou none.effective_mode informa a conexão em uso: custom, internal ou direct.fallback.active indica que a rota principal não está disponível.proxy_url retorna a URL configurada com credenciais mascaradas.last_test_error ajuda a diagnosticar a última falha conhecida.Em condições normais, mode e effective_mode correspondem. Durante uma contingência, eles podem divergir sem alterar a preferência salva. Não use esta rota em consultas repetidas sem intervalo; acompanhe também GET /instance/status.
Também atende pelo caminho antigo
GET /proxy.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/proxy ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"mode": "custom",
"effective_mode": "custom",
"fallback": {
"active": false,
"reason": "",
"since": 0
},
"proxy_url": "http://***:***@cliente-proxy.example:8080",
"proxy_fallback": "internal",
"managed": false,
"last_test_at": 0,
"last_test_error": "",
"validation_error": false
}
}/instance/proxy
Define explicitamente um dos três estados aceitos:
mode=custom: usa um proxy próprio, informado em proxy_url;mode=internal: usa a infraestrutura interna;mode=none: conexão direta, permitida só com confirm_no_proxy=true.Importante: POST /instance/proxy confirma que a configuração foi salva, não que o proxy já está comprovadamente em uso. A validação de verdade acontece no próximo ciclo real de conexão do dispositivo.
Na prática:
200 aqui = configuração gravada;GET /instance/proxy e leia effective_mode, effective_detail, fallback.active, last_test_error e validation_error.custom)Esquemas aceitos em proxy_url: http://, https://, socks5:// e socks5h:// (ex.: http://usuario:senha@host:porta). O esquema socks:// genérico não é aceito; para SOCKS, use socks5:// ou socks5h://.
Em proxy_fallback você define a contingência:
internal: tenta a infraestrutura interna e, se ainda assim falhar, pode usar a conexão direta como último recurso;never: sem contingência;proxy_url).internal)rotate_now: true troca na hora o proxy interno gravado. Havendo mais de uma origem interna disponível, outra origem é escolhida; havendo só uma, troca apenas o proxy/IP dentro dela. Sem alternativa para a troca, a resposta é 409.proxy_managed_country, proxy_managed_state e proxy_managed_city escolhem a região de conexão. Use os valores de GET /proxy-managed/countries e GET /proxy-managed/cities.Um objeto JSON com Content-Type: application/json.
modetextoopcionalÉ o campo que define o estado; os outros campos dependem dele.
custom = proxy próprio; internal = infraestrutura interna; none = conexão direta.
proxy_urltextocondicionalObrigatório quando mode=custom. Esquemas aceitos: http://, https://, socks5:// e socks5h://; socks:// genérico é recusado.
URL do proxy próprio, ex.: http://usuario:senha@host:porta.
proxy_fallbacktextoopcionalSó com mode=custom. Valores: internal, never ou uma URL de proxy de contingência (mesmos esquemas de proxy_url).
Contingência quando o proxy próprio falha.
confirm_no_proxybooleanocondicionalObrigatório (true) quando mode=none.
Confirma a conexão direta, sem proxy.
rotate_nowbooleanoopcionalSó com mode=internal. Sem outra origem ou proxy disponível para a troca, volta 409.
Troca na hora o proxy interno gravado.
proxy_managed_countrytextoopcionalSó com mode=internal.
País da região de conexão, ISO alpha-2 (o countries[].value de GET /proxy-managed/countries).
proxy_managed_statetextoopcionalSó com mode=internal e quando a cidade do catálogo trouxer state.
UF da cidade escolhida (ex.: sp).
proxy_managed_citytextoopcionalSó com mode=internal.
Cidade da região de conexão (o cities[].value de GET /proxy-managed/cities).
proxy_url é obrigatório quando mode é custom.confirm_no_proxy é obrigatório quando mode é none.TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request POST \ --url 'https://dropestore.com/wp-json/wdm/v1/instance/proxy ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "mode": "custom", "proxy_url": "http://usuario:senha@proxy.seusite.com.br:8080" , "proxy_fallback": "internal"}'Resposta
{
"success": true,
"data": {
"details": "Proxy configurado",
"proxy": {
"mode": "custom",
"effective_mode": "custom",
"fallback": {
"active": false,
"reason": "",
"since": 0
},
"proxy_url": "http://***:***@proxy-do-cliente.example:8080",
"proxy_fallback": "internal",
"managed": false,
"last_test_at": 0,
"last_test_error": "",
"validation_error": false
},
"restart_requested": true
}
}/proxy-managed/countries
Lista os países disponíveis para a região de conexão: o campo proxy_managed_country de POST /instance/connect e de POST /instance/proxy (com mode=internal).
Os valores em countries[].value são exatamente os aceitos em proxy_managed_country; os de countries[].label servem só para exibição. Envie sempre o value.
Como toda a API, a rota exige o token do dispositivo no header token e segue o limite de requisições do seu plano. Quando o catálogo estiver temporariamente indisponível, a resposta é um erro temporário: tente de novo em alguns segundos.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Rate-limit excedido. Aguarde o tempo indicado no header Retry-After.PROVIDER_ERROR).PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/proxy-managed/countries ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"countries": [
{
"value": "br",
"label": "Brazil"
}
]
}
}/proxy-managed/cities
Lista as cidades disponíveis para a região de conexão, para os campos proxy_managed_country, proxy_managed_state e proxy_managed_city de POST /instance/connect e de POST /instance/proxy (com mode=internal).
Como toda a API, a rota exige o token do dispositivo no header token e segue o limite de requisições do seu plano. Se o catálogo de cidades estiver temporariamente indisponível, tente de novo depois do intervalo indicado na resposta.
Como escolher a cidade:
br em proxy_managed_country.GET /proxy-managed/cities?country=br para obter as cidades brasileiras (filtre com state e search).proxy_managed_country: o país escolhido, ex.: brproxy_managed_state: o state devolvido pela cidade, ex.: sp, quando houverproxy_managed_city: sempre o cities[].valueSe a cidade escolhida não trouxer state, envie só proxy_managed_country e proxy_managed_city. A API valida a combinação e devolve erro se faltar algum dado necessário.
Vão depois do ? no endereço, como nome=valor.
countrytextoopcionalPaís, ISO alpha-2 minúsculo (padrão br).
statetextoopcionalUF ou subdivisão, minúscula (ex.: sp, rj, mg). Filtra quando o catálogo traz state.
searchtextoopcionalFiltro parcial por nome ou slug, sem diferenciar acento nem maiúsculas.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After. Caso do WhatsApp (429): Rate-limit excedido. Aguarde o tempo indicado no header Retry-After.PROVIDER_ERROR).PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/proxy-managed/cities?country=br&state=sp&search=camp ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"country": "br",
"state": "sp",
"cities": [
{
"value": "campinas",
"label": "Campinas",
"state": "sp",
"state_label": "São Paulo",
"raw_city": "campinas"
},
{
"value": "saopaulo",
"label": "São Paulo",
"state": "sp",
"state_label": "São Paulo",
"raw_city": "sao_paulo"
}
]
}
}Referência 2
Ligue o número a uma caixa de entrada do Chatwoot.
INTEGRAÇÃO BETA - Sistema de integração com Chatwoot para atendimento unificado
AVISO: Esta integração está em fase BETA. Use por sua conta e risco. Recomendamos testes em ambiente não-produtivo antes do uso em produção.
Esta categoria contém recursos para configurar e gerenciar a integração com o Chatwoot, uma plataforma de atendimento ao cliente open-source. A integração permite centralizar conversas do WhatsApp no Chatwoot.
Ideal para: Empresas com equipes de atendimento, call centers, suporte técnico (em ambiente de testes)
Requer: Dispositivo do Chatwoot configurada, tokens de API e ambiente de testes
Lembre-se: Integração em BETA - funcionalidades podem mudar sem aviso prévio
/chatwoot/config
/chatwoot/config
/chatwoot/config
Retorna a configuração atual da integração com o Chatwoot no dispositivo: se está ligada, o endereço, a conta, a caixa de entrada e as opções de sincronização. Use para conferir a configuração antes de alterá-la.
Por segurança, o token de acesso do Chatwoot não é devolvido. O campo chatwoot_access_token_set indica se há um token salvo.
Esta rota não recebe parâmetros.
WHATSAPP_REJECTED).TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request GET \ --url 'https://dropestore.com/wp-json/wdm/v1/chatwoot/config ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Accept: application/json' Resposta
{
"success": true,
"data": {
"chatwoot_enabled": true,
"chatwoot_url": "https://app.chatwoot.com",
"chatwoot_account_id": 1,
"chatwoot_inbox_id": 5,
"chatwoot_ignore_groups": false,
"chatwoot_sign_messages": true,
"chatwoot_create_new_conversation": false
}
}/chatwoot/config
Atualiza a configuração da integração com o Chatwoot no dispositivo.
chatwoot_inbox_webhook_url o endereço de webhook para configurar na caixa de entrada do Chatwootchatwoot_inbox_webhook_url da resposta.A integração está em fase beta e pode mudar. Teste antes de usar em produção. O histórico antigo não é sincronizado, só as mensagens novas.
access_token é obrigatório. Como o token nunca é devolvido em GET /chatwoot/config, envie "" (vazio) para manter o token já salvo ao alterar o resto da configuração.
Um objeto JSON com Content-Type: application/json.
enabledbooleanoobrigatórioLiga (true) ou desliga (false) a integração.
urltextoobrigatórioEndereço do seu Chatwoot, sem barra no final.
access_tokentextoobrigatórioEnvie "" (vazio) para manter o token já salvo.
Token de acesso da API do Chatwoot (em Profile Settings > Access Token).
account_idinteirointeiro de 64 bitsobrigatórioID da conta no Chatwoot (aparece na URL da conta).
inbox_idinteirointeiro de 64 bitsobrigatórioID da caixa de entrada no Chatwoot (nas configurações da caixa de entrada).
ignore_groupsbooleanoopcionalIgnora as mensagens de grupos do WhatsApp na sincronização.
sign_messagesbooleanoopcionalAssina as mensagens enviadas ao WhatsApp com o nome do agente.
create_new_conversationbooleanoopcionalSempre cria uma conversa nova em vez de reaproveitar a existente.
TOKEN_MISSING, TOKEN_INVALID).PLAN_INACTIVE, TRIAL_EXPIRED, DEVICE_SUSPENDED).PAYLOAD_TOO_LARGE).errors (VALIDATION).RATE_LIMITED), ou chamadas simultâneas demais da conta, até 10 ao mesmo tempo, ou o WhatsApp pediu pausa (PROVIDER_BUSY); aguarde o tempo de Retry-After.PROVIDER_ERROR). Quando o serviço do WhatsApp está instável, a API recusa as chamadas por alguns segundos e informa o tempo em Retry-After.PROVIDER_TIMEOUT).Requisição
curl --request PUT \ --url 'https://dropestore.com/wp-json/wdm/v1/chatwoot/config ' \ --header 'token: SEU_TOKEN_DO_DISPOSITIVO' \ --header 'Content-Type: application/json ' \ --header 'Accept: application/json ' \ --data '{ "enabled": true, "url": "https://chatwoot.seusite.com.br" , "access_token": "pXXGHHHyJPYHYgWHJHYHgJjj", "account_id": 1, "inbox_id": 5, "ignore_groups": true, "sign_messages": true, "create_new_conversation": false}'Resposta
{
"success": true,
"data": {
"message": "Configuração do Chatwoot salva. Use esta URL no webhook da caixa de entrada do Chatwoot:",
"chatwoot_inbox_webhook_url": "https://sua-api.com/chatwoot/webhook/inst_abc123"
}
}Nada encontrado para .
Tente uma palavra mais curta ou um destes temas:
Sugestões