Migrar de WAHA a la API oficial de WhatsApp
En resumen: para llevar un bot o una automatización de WAHA a la Cloud API oficial de Meta, conecta el número a ZapClaw con la Coexistencia, envía por la API REST de ZapClaw en lugar de /api/sendText y lee el webhook de ZapClaw en lugar del evento message de WAHA. El número sigue funcionando en la app de WhatsApp Business en tu celular. Abajo: los pasos, los campos de envío de texto y multimedia y los principales campos de webhook lado a lado, y lo que no tiene equivalente en la API oficial.
ZapClaw es un gateway alojado en la Cloud API de Meta: ningún servidor ni sesión de WAHA que mantener en marcha y ninguna app propia en Meta.
Plan Business: US$ 29 al mes, con números ilimitados
Empieza gratis Ver el mapeo de camposPor qué pasar a la API oficial
- Las condiciones de WhatsApp. Los motores de WAHA ejecutan WhatsApp Web en un navegador o hablan con WhatsApp Web por WebSocket, y la propia introducción de WAHA dice que WhatsApp no permite bots ni clientes no oficiales, por lo que el método no debe considerarse totalmente seguro. Las Condiciones del servicio de WhatsApp prohíben usar el servicio por medios automatizados de una forma que WhatsApp no autorizó, y mencionan el envío automático de mensajes entre las comunicaciones que no permiten. La Cloud API de Meta es la API que Meta ofrece a las empresas para esto.
- La app sigue en el celular. Con la Coexistencia, tu equipo sigue respondiendo en la app de WhatsApp Business mientras tu sistema usa la API con el mismo número, y los chats se mantienen sincronizados.
- Ningún servidor que mantener. WAHA es un software que instalas en tu propio servidor. ZapClaw corre el gateway; tú te quedas solo con el sistema que recibe tu webhook.
- Webhooks firmados sin configurar nada. WAHA firma sus webhooks con HMAC SHA-512 cuando le das una clave a la sesión. ZapClaw firma cada cuerpo con HMAC-SHA256 desde el principio y guarda cada evento para reenviarlo desde el panel.
Las políticas de Meta siguen aplicando en la API oficial: Meta puede restringir o desactivar una cuenta que las incumple, y la API de ZapClaw responde entonces 403 con el motivo (errores, en inglés).
Lo que necesitas para conectar
- La app de WhatsApp Business en el número, en la versión 2.24.17 o posterior, con uso habitual.
- Autenticación en dos pasos activada en la cuenta personal de Facebook que autoriza la conexión.
- El número fuera de cualquier otro proveedor. Si está conectado a otra plataforma, desconéctalo allí primero.
- Una computadora para hacer la conexión, con tu celular a la mano para confirmarla en la app.
No necesitas una empresa registrada ni un negocio verificado para conectar. La lista completa.
La migración, paso a paso
- Primero, mapea tu código. Cambia tus llamadas de envío y tu manejador de webhook con las tablas de abajo, o pon el shim delante de tu flujo para que conserve sus llamadas de WAHA mientras lo reescribes.
- Revisa el número. La Coexistencia conecta números que funcionan en la app de WhatsApp Business, no en WhatsApp normal. Haz una copia de seguridad de tus chats en la app y revisa los requisitos de arriba.
- Conecta el número. Crea tu cuenta en ZapClaw y conecta el número en la ventana de Meta, desde el panel. Meta desvincula entonces todos los dispositivos vinculados a la cuenta, incluida la sesión de WAHA. Detén o borra la sesión en WAHA después, para que nadie vuelva a escanear su código QR y dos sistemas respondan al mismo cliente.
- Configura el webhook. En el panel, en Webhook, pega tu URL HTTPS pública, elige los eventos y copia la clave de firma. Marca Mensajes enviados desde la app WhatsApp Business si tu flujo escuchaba
message.anypara tus propios mensajes. - Crea una clave de API y envía con ella en el encabezado
X-API-Keyahttps://api.zapclaw.app. El campofromindica el número, así que una clave envía desde todos los números de la cuenta. - Crea tus plantillas. Fuera de la ventana de 24 horas, y para escribir primero, Meta solo acepta una plantilla aprobada. Créalas en el panel o con
POST /api/v1/send/templates, y pasalanguageal enviar una: el valor por defecto de la API espt_BR. - Prueba. Haz clic en Enviar evento de prueba en la página Webhook del panel, luego escribe a tu número desde otro celular y comprueba que tu flujo recibe el mensaje y responde.
Envío: las llamadas de WAHA y su equivalente en ZapClaw
Las rutas de WAHA son relativas a tu servidor de WAHA, y las de ZapClaw a https://api.zapclaw.app.
| WAHA | ZapClaw | |
|---|---|---|
| Enviar texto | POST /api/sendText |
POST /api/v1/send/text |
| Enviar multimedia | /api/sendImage, /api/sendVideo, /api/sendVoice, /api/sendSticker, /api/sendFile |
POST /api/v1/send/media con type image, video, audio, sticker o document |
| Autenticación | Encabezado X-Api-Key |
Encabezado X-API-Key, con una clave de ZapClaw |
| Tu número | session, en el cuerpo |
from, en el cuerpo |
| Destinatario | chatId: el número más @c.us |
to: el número, solo dígitos |
| Texto | text |
text, hasta 4,096 caracteres |
| Vista previa del enlace | linkPreview |
previewUrl |
| Responder a un mensaje | reply_to |
replyTo: el wamid del mensaje |
| Archivo multimedia | file.url, o file.data en base64, con file.mimetype |
link, una URL https pública, o mediaId de POST /api/v1/media |
| Nombre de archivo | file.filename |
filename (documento) |
| Leyenda | caption |
caption (imagen, video, documento) |
| Conversión de formato | convert, asNote |
Sin equivalente: envía un formato que WhatsApp acepte |
| Menciones | mentions |
Sin equivalente |
La ubicación, las tarjetas de contacto y las reacciones van por POST /api/v1/send/location, /send/contacts y /send/reaction (referencia de la API, en inglés). El shim de más abajo aún no convierte esas llamadas: envíalas directo a ZapClaw.
Recepción: el evento message y su equivalente en ZapClaw
WAHA envía un sobre con event, session, me y payload; las rutas de payload de abajo son las de un evento message. ZapClaw envía event, timestamp, data y account a una sola URL para todos tus números.
| WAHA | ZapClaw | |
|---|---|---|
| Evento | message; message.any incluye también los tuyos |
message.received; tus mensajes enviados desde la app llegan como message.echo (opcional) |
| Cuál de tus números | session, me.id |
account.phone_number_id, account.display_phone_number |
| Remitente | payload.from: el número más @c.us |
data.from, solo dígitos, y data.user_id, el id permanente del contacto |
| Enviado por ti | payload.fromMe |
El evento message.echo, con data.to |
| Id del mensaje | payload.id |
data.message_id, un wamid |
| Nombre del contacto | No está en el payload documentado; va en el _data propio del motor |
data.contact_name |
| Hora | payload.timestamp: segundos en los ejemplos de la documentación |
data.timestamp: segundos, como cadena |
| Texto | payload.body, que lleva la leyenda en los archivos multimedia |
data.text.body, o data.<type>.caption en los archivos multimedia |
| Tiene multimedia | payload.hasMedia |
data.type es image, audio, video, document o sticker |
| Archivo multimedia | payload.media.url, que descargas con tu X-Api-Key |
data.<type>.media_url, que descargas con tu X-API-Key |
| Tipo MIME y nombre de archivo | payload.media.mimetype, payload.media.filename |
data.<type>.mime_type, data.document.filename |
| Mensaje citado | payload.replyTo.id |
data.context.id |
| Estado de entrega | message.ack, con payload.ackName igual a ERROR, PENDING, SERVER, DEVICE, READ o PLAYED |
message.status, con data.status igual a failed, sent, delivered o read |
| Autenticación de la solicitud | Opcional: X-Webhook-Hmac, un HMAC SHA-512 del cuerpo, cuando la sesión tiene una clave |
Siempre: X-ZapClaw-Signature, un HMAC-SHA256 del cuerpo sin procesar, hecho con tu clave de firma (cómo verificarla, en inglés) |
Un enlace multimedia de ZapClaw necesita tu clave de API, y Meta guarda los archivos recibidos unos 30 días, así que descarga lo que quieras conservar. Las entregas pueden llegar fuera de orden: cuando el orden importa, ordena por el sequence del nivel superior.
Lo que no tiene equivalente, y qué hacer en su lugar
- Grupos. Los grupos siguen funcionando en la app de WhatsApp Business, pero la Cloud API de Meta no los admite en un número con Coexistencia: enviar a un chat
@g.usy recibir mensajes de grupo por la API dejan de funcionar. Mantén las automatizaciones de grupo fuera del número que migres. - Texto libre en cualquier momento. Un mensaje de texto o multimedia solo sale dentro de las 24 horas siguientes al último mensaje que te envió el contacto. Fuera de esa ventana, ZapClaw responde
422conmeta_code: 131047: envía una plantilla aprobada en su lugar. - Escribir primero. El primer mensaje a alguien que no te escribió en las últimas 24 horas tiene que ser una plantilla aprobada. Meta te cobra las plantillas directamente, aparte de tu plan de ZapClaw.
- Estados, canales y listas de difusión. ZapClaw no tiene endpoint para chats
status@broadcastni@newsletter, y Meta incluye las listas de difusión entre lo que la Coexistencia no admite. - Visualización única, mensajes temporales y llamadas. Meta desactiva la visualización única y los mensajes temporales en los chats individuales. Las llamadas de voz y de video siguen funcionando en la app, pero la Cloud API no las admite en un número con Coexistencia.
- Encuestas, menciones, presencia, editar o borrar un mensaje enviado. ZapClaw no tiene endpoint para ellos. Los botones y las listas van por
POST /api/v1/send/interactive. - Base64 y conversión de formato. Sube el archivo con
POST /api/v1/mediay envía elmediaIdque devuelve, o envía unlinkhttps público, en un formato que WhatsApp acepte. - Ids antiguos de mensajes. Los ids de WAHA no son ids de la Cloud API, así que una respuesta no puede citar un mensaje de antes de la migración. Los ids nuevos empiezan con
wamid. - Ids de contacto. Un
@lides un id oculto de WhatsApp, no un número de teléfono. Identifica a los contactos por número de teléfono y guardadata.user_idcomo clave permanente: un contacto que adopta un nombre de usuario de WhatsApp puede llegar condata.fromigual anull. - Volumen. Un número con Coexistencia está fijo en 20 mensajes por segundo, un límite de Meta que no se puede aumentar, y el envío masivo no encaja.
- WhatsApp para Windows y WearOS. Meta no permite volver a vincularlos después de la migración, y los mensajes enviados desde ellos no generan webhook.
Sigue usando la app de WhatsApp Business en el celular: Meta desconecta un número con Coexistencia cuya app pasa unos 14 días sin uso, y ZapClaw avisa a tu webhook con un evento account.account_update (detalles, en inglés).
Un adaptador corto
Dos funciones para Node.js 18 o más reciente, sin dependencias: la primera envía donde tu código llamaba a /api/sendText, la segunda convierte un message.received de ZapClaw en los campos de payload que tu flujo ya lee. Comprueba el encabezado X-ZapClaw-Signature antes de confiar en un cuerpo.
// Sending: what was POST /api/sendText with an X-Api-Key header
const sendText = async ({ chatId, text }) => {
const res = await fetch('https://api.zapclaw.app/api/v1/send/text', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.ZAPCLAW_API_KEY,
},
body: JSON.stringify({
from: process.env.ZAPCLAW_FROM,
to: chatId.replace(/@c\.us$/, ''),
text,
}),
});
if (!res.ok) throw new Error(`ZapClaw answered ${res.status}`);
return (await res.json()).message; // message.wamid is the new message id
};
// Receiving: the payload of a WAHA message event, taken from a message.received body
const MEDIA = ['image', 'audio', 'video', 'document', 'sticker'];
const fromZapClaw = (body) => {
const d = body.data;
const media = MEDIA.includes(d.type) ? d[d.type] : null;
return {
from: `${d.from}@c.us`,
fromMe: false,
id: d.message_id,
timestamp: Number(d.timestamp),
body: d.text ? d.text.body : (media ? media.caption || '' : ''),
hasMedia: Boolean(media),
media: media ? { url: media.media_url, mimetype: media.mime_type } : null,
};
};
La versión completa está en GitHub: zapclaw/migrate-to-whatsapp-official-api convierte texto, multimedia, estados de entrega y webhooks, e incluye un pequeño shim. Una llamada que no se convierte, como una ubicación, una tarjeta de contacto o una reacción, se rechaza con un código de error claro: envía esas llamadas directo por la API de ZapClaw. Apunta al shim la URL base de WAHA que usa tu flujo: reenvía a ZapClaw las llamadas que convierte y transforma los webhooks firmados de ZapClaw de nuevo en eventos message, message.any y message.ack, para que migres primero y reescribas después. Licencia MIT.
Si tu caso es distinto
- Varias sesiones. Si usabas una sesión de WAHA por número, una cuenta de ZapClaw las reúne a todas:
account.phone_number_iddistingue los números en una sola URL de webhook, yfromelige el número al enviar. - n8n o Make. Usa un disparador de webhook que recibe los eventos de ZapClaw y una solicitud HTTP que llama a la API de envío: n8n y Make.
- Chatwoot. El canal WhatsApp Cloud del propio Chatwoot habla con ZapClaw en lugar de Meta: Chatwoot en la API oficial de WhatsApp.
- Un agente de IA detrás de WAHA. Dify, Flowise y Typebot tienen cada uno una guía para ZapClaw: Dify, Flowise y Typebot.
Cuánto cuesta
- Gratis: 500 mensajes al mes y 1 número, sin tarjeta y sin fecha de vencimiento. Al llegar al límite, el envío se pausa y los mensajes nuevos quedan retenidos hasta que te suscribas.
- Business: US$ 29 al mes, con 20,000 mensajes incluidos y números ilimitados.
- Agency: US$ 49 al mes para agencias, con 3 clientes y 60,000 mensajes incluidos y números ilimitados.
Meta te cobra directamente las tarifas de mensajes de WhatsApp, sin margen de ZapClaw. Todos los planes y precios.
Ver también
- Las API de WhatsApp no oficiales y la API oficial de Meta, comparadas: Baileys, whatsapp-web.js y WAHA frente a la Cloud API de Meta, con fuentes.
- La API oficial de WhatsApp con ZapClaw: lo que obtienes y los requisitos.
- Lo que necesitas para conectar un número con la Coexistencia.
- La referencia del webhook (en inglés), con cada evento y campo.
- Si vienes de otra herramienta: Evolution API o Z-API.
Fuentes
Revisado el 15 de octubre de 2026. Los campos de WAHA pueden variar según el motor, así que revisa la documentación del motor que usas.
- WAHA, introducción (en inglés): instalación en tu propio servidor, y la advertencia sobre bots y clientes no oficiales.
- WAHA, motores (en inglés): WEBJS, WPP, NOWEB y GOWS, y cómo cada uno llega a WhatsApp Web.
- WAHA, enviar mensajes (en inglés): endpoints, el encabezado
X-Api-Keyy los campos del cuerpo. - WAHA, recibir mensajes (en inglés): enlaces multimedia, respuestas y tipos de id de chat.
- WAHA, eventos (en inglés): el sobre,
message,message.any,message.acky la opción de HMAC. - Condiciones del servicio de WhatsApp: acceso automatizado y envío automático de mensajes.
- Meta, incorporación de usuarios de la app de WhatsApp Business (en inglés): la Coexistencia, los dispositivos vinculados, la velocidad de envío y lo que no admite.
- ZapClaw: referencia del webhook, errores, archivo OpenAPI (en inglés) y precios.
- zapclaw/migrate-to-whatsapp-official-api: el mapeo completo, con una fuente para cada fila.
Lleva tus flujos de WAHA a la API oficial
Empieza en el plan gratuito: un número, sin tarjeta. Pasa al plan Business cuando necesites más números o más mensajes.
Empieza gratis Leer la documentación del webhook