Saltar al contenido
WbizTool

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

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

  2. Instala el cliente, o usa fetch

    Ejecuta npm install wbiztool-client para el cliente oficial. O llama a la API con fetch, que no necesita ningún paquete en Node.js 18 y posteriores.

  3. 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": 1 y un msg_id significa que el mensaje está en cola en tu número.

  4. Comprueba que salió

    Pasa una URL de webhook para que te avisen cuando el mensaje se envíe o falle, o consulta el endpoint de estado del mensaje con el msg_id.

Ejemplos de código en Node.js

Instalar el cliente oficial
npm install wbiztool-client
Enviar un texto con el 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 un texto con 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);
}
Respuesta
{"status": 1, "message": "Created", "msg_id": 9817263}
Enviar un PDF (subida de archivo)
// 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 el estado del mensaje
// 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);
}
Programar un mensaje para más tarde
// 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");
}
Recibir el webhook de estado (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);

Lo que puedes hacer

  • Textos, imágenes y archivos

    Pon msg_type en 0 para texto, 1 para una imagen o 2 para un archivo. Indica una img_url o file_url pública, o sube el archivo como multipart form data en un campo llamado file.

  • Mensajes personalizados con tus datos

    Rellena msg con 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 webhook y tu servidor recibe un POST codificado como formulario, por ejemplo msg_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/ con date (dd/mm/aaaa), time (HH:MM) y una timezone. Da formato a la fecha con Intl.DateTimeFormat en esa misma zona horaria, no en la de tu servidor.

  • Descarta los mensajes que llegan tarde

    expire_after_seconds marca 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": 1 significa 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 comprueba status en lugar de response.ok.
  • El scheduleMessage del 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-client en npm (npm install wbiztool-client). Su sendMessage enví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": 1 y un msg_id significa que está en cola. Pasa una URL de webhook para recibir un POST con SENT, FAILED, CANCELLED o EXPIRED, o llama al endpoint de estado del mensaje con el msg_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

Relacionado

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 gratis

Planes de pago desde $25 al mes en EE. UU. Precios