Pular para o conteúdo
WbizTool

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

  1. 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.

  2. Instale o cliente, ou use fetch

    Rode npm install wbiztool-client para o cliente oficial. Ou chame a API com fetch, que não precisa de pacote no Node.js 18 e versões mais recentes.

  3. 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": 1 e um msg_id significa que a mensagem está na fila do seu número.

  4. Confira se ela saiu

    Passe uma URL em webhook para ser avisado quando a mensagem for enviada ou falhar, ou consulte o endpoint de status da mensagem com o msg_id.

Exemplos de código: Node.js

Instalar o cliente oficial
npm install wbiztool-client
Enviar um texto com o cliente oficial
const { 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);
Enviar um texto com fetch
// 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);
}
Resposta
{"status": 1, "message": "Created", "msg_id": 9817263}
Enviar um PDF (upload de arquivo)
// 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());
Consultar o status da mensagem
// 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);
}
Agendar uma mensagem para depois
// 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");
}
Receber o webhook de status (Express)
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_type como 0 para texto, 1 para imagem ou 2 para arquivo. Informe uma img_url ou file_url pública, ou envie o arquivo como multipart form data em um campo chamado file.

  • Mensagens pessoais com os seus dados

    Preencha msg com 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 webhook e o seu servidor recebe um POST form-encoded como msg_id=9817263&status=SENT quando a mensagem é enviada, falha, é cancelada ou expira.

  • Agende para depois

    Faça um POST para /api/v1/schedule_msg/ com date (dd/mm/aaaa), time (HH:MM) e um timezone. Formate a data com Intl.DateTimeFormat nesse mesmo fuso horário, não no do seu servidor.

  • Descarte mensagens que chegariam tarde demais

    expire_after_seconds marca 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": 1 significa 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 confira status em vez de response.ok.
  • O scheduleMessage do 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-client no npm (npm install wbiztool-client). O sendMessage dele 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": 1 e um msg_id significa que ela está na fila. Passe uma URL em webhook para receber um POST com SENT, FAILED, CANCELLED ou EXPIRED, ou chame o endpoint de status da mensagem com o msg_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

Veja também

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átis

Planos pagos a partir de US$ 25 por mês nos EUA. Preços