Envía mensajes de WhatsApp con Node.js
Envía textos, imágenes y archivos de WhatsApp desde tu app de Node.js, desde tu propio número vinculado a WbizTool como WhatsApp Web. Usa el paquete oficial wbiztool-client o el fetch integrado en Node.js 18 y posteriores.
Prueba gratuita: 50 mensajes en cualquier periodo de 30 días, sin tarjeta.
Cómo funciona
Obtén tu clave API y vincula tu número
Regístrate y vincula tu número de WhatsApp en la página Números de WhatsApp con un código QR o un código de vinculación, igual que WhatsApp Web. En Configuración → Claves API, crea una clave y copia tu Client ID (la guía de claves API de abajo muestra dónde). El ID que aparece en la tarjeta del número (por ejemplo, ID 678) es tu
whatsapp_client.Instala el cliente, o usa fetch
Ejecuta
npm install wbiztool-clientpara el cliente oficial. O llama a la API con fetch, que no necesita ningún paquete en Node.js 18 y posteriores.Envía el mensaje
Haz un POST con tus credenciales, el número de teléfono y el texto a
https://wbiztool.com/api/v1/send_msg/. Una respuesta con"status": 1y unmsg_idsignifica que el mensaje está en cola en tu número.Comprueba que salió
Pasa una URL de
webhookpara que te avisen cuando el mensaje se envíe o falle, o consulta el endpoint de estado del mensaje con elmsg_id.
Ejemplos de código en 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);Lo que puedes hacer
Textos, imágenes y archivos
Pon
msg_typeen 0 para texto, 1 para una imagen o 2 para un archivo. Indica unaimg_urlofile_urlpública, o sube el archivo como multipart form data en un campo llamadofile.Mensajes personalizados con tus datos
Rellena
msgcon tus propios datos: un nombre, un número de pedido, una fecha de vencimiento. El formato de WhatsApp como *negrita* y _cursiva_ funciona, hasta 3.000 caracteres.Webhooks para cada estado
Pasa
webhooky tu servidor recibe un POST codificado como formulario, por ejemplomsg_id=9817263&status=SENT, cuando el mensaje se envía, falla, se cancela o caduca.Programa para más tarde
Haz un POST a
/api/v1/schedule_msg/condate(dd/mm/aaaa),time(HH:MM) y unatimezone. Da formato a la fecha conIntl.DateTimeFormaten esa misma zona horaria, no en la de tu servidor.Descarta los mensajes que llegan tarde
expire_after_secondsmarca un mensaje como caducado si no salió a tiempo, algo útil para mensajes urgentes como una hora estimada de entrega.Recordatorios recurrentes
La API de recordatorios repite un mensaje según una programación cron, por ejemplo a las 10:00 el día 1 de cada mes. Los recordatorios requieren un plan de pago.
Conviene saber
"status": 1significa que el mensaje está en cola, no que se entregó. Sent es el estado final de éxito; la API no informa si el mensaje se entregó o se leyó.- Los errores al enviar un mensaje llegan con HTTP 400 (429 en el límite diario); los errores al programar un mensaje suelen llegar con HTTP 200 y
"status": 0, así que analiza siempre el cuerpo y compruebastatusen lugar deresponse.ok. - El
scheduleMessagedel cliente oficial envía un campo que el endpoint de programación no lee. Llama a/api/v1/schedule_msg/con fetch, como se muestra arriba. - Guarda la clave API en tu servidor, por ejemplo en una variable de entorno. Cualquiera que la tenga puede enviar desde tus números, así que nunca la pongas en JavaScript del navegador, en una app móvil ni en código que publiques.
- Para publicar en un grupo de WhatsApp en lugar de en un número, consulta el ejemplo de mensajes a grupos: funciona en todos los planes, también en la prueba gratuita.
- La prueba gratuita incluye 50 mensajes en cualquier periodo de 30 días y 1 número, sin tarjeta. Los planes de pago empiezan en $25 al mes en EE. UU. (tu precio aparece en Precios) y envían mensajes ilimitados con uso justo: hasta 1.000 al día por número.
- Los mensajes salen desde tu propio número de WhatsApp, así que se aplican las reglas de WhatsApp: escribe a personas que esperan saber de ti.
Preguntas frecuentes
- ¿Hay un paquete oficial de Node.js para la API de WbizTool?
- Sí:
wbiztool-clienten npm (npm install wbiztool-client). SusendMessageenvía un mensaje. Para programar mensajes y consultar el estado, llama a los endpoints con fetch como se muestra arriba. - ¿Puedo llamar a la API desde el navegador?
- No lo hagas: la petición lleva tu clave API, y cualquiera que la tenga puede enviar desde tus números. Llama a la API desde tu servidor de Node.js y guarda la clave en una variable de entorno.
- ¿Cómo sé si el mensaje se envió?
- Una respuesta con
"status": 1y unmsg_idsignifica que está en cola. Pasa una URL dewebhookpara recibir un POST conSENT,FAILED,CANCELLEDoEXPIRED, o llama al endpoint de estado del mensaje con elmsg_id. Sent es el estado final: la API no informa si se entregó o se leyó. - ¿En qué formato envío el número de teléfono?
- Envía el número con su código de país (919876543210), o sin él (9876543210) junto con
country_code(91). Los espacios, el +, los guiones y los paréntesis se quitan por ti, así que +91 98765-43210 también funciona. - ¿Necesito la API de WhatsApp Business o la aprobación de Meta?
- No. WbizTool envía desde tu propio número de WhatsApp o WhatsApp Business, vinculado como WhatsApp Web. No hay aprobación de Meta ni plantillas de mensajes que aprobar.
- ¿Se paga por mensaje?
- No. La prueba gratuita incluye 50 mensajes en cualquier periodo de 30 días. Los planes de pago envían mensajes ilimitados con uso justo, hasta 1.000 al día por número: Lite $25, Standard $59 y Advanced $149 al mes en EE. UU.; la página de Precios muestra el precio de tu país.
Lee las guías
- API de envío de mensajes
- API de estado del mensaje
- API para programar mensajes
- Claves API y Client ID
- Conecta tu número de WhatsApp
Relacionado
- PythonEnvía mensajes de WhatsApp desde Python con el cliente oficial o simplemente con requests.
- cURLEnvía, programa y sigue mensajes de WhatsApp con un solo comando cURL.
- n8nEnvía mensajes de WhatsApp desde n8n con el nodo de la comunidad de WbizTool.
- Avisos de pedidosConfirmaciones de pedido, avisos de envío y alertas de nuevos pedidos para Shopify, WooCommerce y más.
Envía hoy tu primer mensaje automatizado de WhatsApp
Crea una cuenta, escanea el código QR y envía un mensaje en menos de cinco minutos.
Empieza gratisPlanes de pago desde $25 al mes en EE. UU. Precios
