Envie mensagens de WhatsApp com Node.js
Envie textos, imagens e arquivos de WhatsApp pelo seu app Node.js, do seu próprio número conectado ao WbizTool como no WhatsApp Web. Use o pacote oficial wbiztool-client ou o fetch que vem no Node.js 18 e versões mais recentes.
Teste grátis: 50 mensagens em quaisquer 30 dias, sem cartão.
Como funciona
Pegue sua chave de API e conecte seu número
Cadastre-se e conecte seu número de WhatsApp na página Números do WhatsApp com um código QR ou um código de login, como no WhatsApp Web. Em Configurações → Chaves de API, crie uma chave e copie seu Client ID (o guia de chaves de API abaixo mostra onde). O ID no cartão do número (como ID 678) é o seu
whatsapp_client.Instale o cliente, ou use fetch
Rode
npm install wbiztool-clientpara o cliente oficial. Ou chame a API com fetch, que não precisa de pacote no Node.js 18 e versões mais recentes.Envie a mensagem
Faça um POST com suas credenciais, o número de telefone e o texto para
https://wbiztool.com/api/v1/send_msg/. Uma resposta com"status": 1e ummsg_idsignifica que a mensagem está na fila do seu número.Confira se ela saiu
Passe uma URL em
webhookpara ser avisado quando a mensagem for enviada ou falhar, ou consulte o endpoint de status da mensagem com omsg_id.
Exemplos de código: Node.js
npm install wbiztool-clientconst { WbizToolClient } = require("wbiztool-client");
const client = new WbizToolClient({
clientId: 12345,
apiKey: "YOUR_API_KEY",
whatsappClient: 678,
});
(async () => {
// Errors throw, with the API's response in the error message.
const result = await client.sendMessage({
phone: "9876543210",
countryCode: "91",
message: "Hi Aman, your order #4821 has shipped.",
});
console.log(result);
})().catch(console.error);// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
country_code: "91",
phone: "9876543210",
msg: "Hi Aman, your order #4821 has shipped and will arrive on Thursday.",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Queued with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message);
}{"status": 1, "message": "Created", "msg_id": 9817263}// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("whatsapp_client", "678");
form.append("msg_type", "2");
form.append("country_code", "91");
form.append("phone", "9876543210");
form.append("msg", "Your invoice for order #4821 is attached.");
form.append("file_name", "invoice-4821.pdf");
form.append("file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", { method: "POST", body: form });
console.log(await response.json());// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const msgId = 9817263;
const response = await fetch(`https://wbiztool.com/api/v1/message/status/${msgId}/`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.message === "Unknown message id") {
console.log("No message with this ID in your workspace");
} else if (!("status_text" in result)) {
console.error("Request failed:", result.message ?? "no message in response");
} else if (result.status === 1) {
console.log("Sent");
} else if (result.status === 2) {
console.log("Failed:", result.error);
} else {
console.log("Status:", result.status_text);
}// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const tz = "Asia/Kolkata";
const sendAt = new Date(Date.now() + 2 * 60 * 60 * 1000); // two hours from now
// Format the date and time in the timezone you send, not your server's.
const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(sendAt); // "24/12/2026"
const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(sendAt); // "09:00"
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
country_code: "91",
phone: "9876543210",
msg: "Hi Aman, a reminder that your appointment starts in 30 minutes.",
date,
time,
timezone: tz,
}),
});
const result = await response.json(); // schedule errors come back with HTTP 200 and "status": 0
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}const express = require("express");
const app = express();
// WbizTool posts form fields, not JSON.
app.post("/wbiztool-webhook", express.urlencoded({ extended: false }), (req, res) => {
const { msg_id, status } = req.body; // status: SENT, FAILED, CANCELLED or EXPIRED
console.log(msg_id, status);
res.sendStatus(200);
});
app.listen(3000);O que você pode fazer
Textos, imagens e arquivos
Defina
msg_typecomo 0 para texto, 1 para imagem ou 2 para arquivo. Informe umaimg_urloufile_urlpública, ou envie o arquivo como multipart form data em um campo chamadofile.Mensagens pessoais com os seus dados
Preencha
msgcom os seus próprios registros – um nome, um número de pedido, uma data de vencimento. A formatação do WhatsApp, como *negrito* e _itálico_, funciona, com até 3.000 caracteres.Webhooks para cada status
Passe
webhooke o seu servidor recebe um POST form-encoded comomsg_id=9817263&status=SENTquando a mensagem é enviada, falha, é cancelada ou expira.Agende para depois
Faça um POST para
/api/v1/schedule_msg/comdate(dd/mm/aaaa),time(HH:MM) e umtimezone. Formate a data comIntl.DateTimeFormatnesse mesmo fuso horário, não no do seu servidor.Descarte mensagens que chegariam tarde demais
expire_after_secondsmarca uma mensagem como expirada se ela não sair a tempo, o que serve para mensagens urgentes, como previsões de entrega.Lembretes recorrentes
A API de lembretes repete uma mensagem seguindo uma agenda cron, como às 10:00 do dia 1º de cada mês. Os lembretes precisam de um plano pago.
Bom saber
"status": 1significa que a mensagem está na fila, não que foi entregue. Enviada é o estado final de sucesso; a API não informa se a mensagem foi entregue ou lida.- Os erros de envio de mensagem voltam com HTTP 400 (429 no limite diário); os erros de agendamento costumam voltar com HTTP 200 e
"status": 0, então sempre leia o corpo e confirastatusem vez deresponse.ok. - O
scheduleMessagedo cliente oficial envia um campo que o endpoint de agendamento não lê. Chame/api/v1/schedule_msg/com fetch, como mostrado acima. - Guarde a chave de API no seu servidor, por exemplo em uma variável de ambiente. Quem tiver a chave pode enviar dos seus números, então nunca a coloque em JavaScript do navegador, em um app de celular ou em código que você publica.
- Para publicar em um grupo do WhatsApp em vez de um número, veja o exemplo de mensagens para grupos: funciona em todos os planos, inclusive no teste grátis.
- O teste grátis tem 50 mensagens em quaisquer 30 dias e 1 número, sem cartão. Os planos pagos começam em US$ 25 por mês nos EUA (o seu preço aparece em Preços) e enviam mensagens ilimitadas dentro do uso justo: até 1.000 por dia por número.
- As mensagens saem do seu próprio número de WhatsApp, então as regras do próprio WhatsApp valem: mande mensagens para quem espera ter notícias suas.
Perguntas frequentes
- Existe um pacote Node.js oficial para a API do WbizTool?
- Sim:
wbiztool-clientno npm (npm install wbiztool-client). OsendMessagedele envia uma mensagem. Para agendar e consultar status, chame os endpoints com fetch como mostrado acima. - Posso chamar a API pelo navegador?
- Não faça isso: a requisição leva a sua chave de API, e quem a tiver pode enviar dos seus números. Chame a API pelo seu servidor Node.js e guarde a chave em uma variável de ambiente.
- Como sei que a mensagem foi enviada?
- Uma resposta com
"status": 1e ummsg_idsignifica que ela está na fila. Passe uma URL emwebhookpara receber um POST comSENT,FAILED,CANCELLEDouEXPIRED, ou chame o endpoint de status da mensagem com omsg_id. Enviada é o estado final: a API não informa se a mensagem foi entregue ou lida. - Em que formato envio o número de telefone?
- Envie o número com o código do país (919876543210), ou sem ele (9876543210) junto com
country_code(91). Espaços, +, hífens e parênteses são removidos para você, então +91 98765-43210 também funciona. - Preciso da API oficial do WhatsApp Business ou de aprovação da Meta?
- Não. O WbizTool envia do seu próprio número de WhatsApp ou WhatsApp Business, conectado como no WhatsApp Web. Não há aprovação da Meta nem modelos de mensagem para aprovar.
- A cobrança é por mensagem?
- Não. O teste grátis inclui 50 mensagens em quaisquer 30 dias. Os planos pagos enviam mensagens ilimitadas dentro do uso justo, até 1.000 por dia por número: Lite US$ 25, Standard US$ 59 e Advanced US$ 149 por mês nos EUA; Preços mostra o preço do seu país.
Leia os guias
- API de envio de mensagens
- API de status da mensagem
- API de agendamento de mensagens
- Chaves de API e Client ID
- Conecte seu número de WhatsApp
Veja também
- PythonEnvie mensagens de WhatsApp pelo Python com o cliente oficial ou com requests.
- cURLEnvie, agende e acompanhe mensagens de WhatsApp com um único comando cURL.
- n8nEnvie mensagens de WhatsApp pelo n8n com o community node do WbizTool.
- Atualizações de pedidosConfirmações de pedido, atualizações de envio e alertas de novos pedidos para Shopify, WooCommerce e mais.
Envie hoje sua primeira mensagem automática de WhatsApp
Crie uma conta, escaneie o QR code e envie uma mensagem em menos de cinco minutos.
Comece grátisPlanos pagos a partir de US$ 25 por mês nos EUA. Preços
