Migrar de Z-API a la API oficial de WhatsApp
En resumen: para llevar un bot o una automatización del producto de código QR de Z-API 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 /send-text y lee el webhook de ZapClaw en lugar de ReceivedCallback. 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 conecta tu número a la Cloud API de Meta con la Coexistencia, sin sesión de código QR y sin 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. La documentación de Z-API dice que, después de leer su código QR, estás usando una sesión de WhatsApp Web. 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.
- Muchos números, una cuenta. Los planes de pago de ZapClaw admiten números ilimitados por un precio por cuenta, y el plan Agency mantiene separados los números, contactos, plantillas, claves de API y webhook de cada cliente.
- Webhooks que puedes verificar. La documentación de webhooks de Z-API no describe ninguna firma en los callbacks que envía. ZapClaw firma cada cuerpo con HMAC-SHA256 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 Z-API mientras lo reescribes.
- Haz una copia de seguridad de tus chats en la app de WhatsApp Business 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 Z-API. Desconecta la instancia en Z-API después, para que nadie vuelva a leer 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 leía callbacks con
fromMe: true. - 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, sin id de instancia ni token en la ruta. - 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 Z-API y su equivalente en ZapClaw
Las rutas de Z-API empiezan con https://api.z-api.io/instances/{instanceId}/token/{token}, abreviado abajo como …. Las de ZapClaw empiezan con https://api.zapclaw.app.
| Z-API | ZapClaw | |
|---|---|---|
| Enviar texto | POST …/send-text |
POST /api/v1/send/text |
| Enviar multimedia | …/send-image, …/send-video, …/send-audio, …/send-sticker, …/send-document/{extension} |
POST /api/v1/send/media |
| Autenticación | Id de la instancia y token en la ruta, más un encabezado Client-Token opcional |
Encabezado X-API-Key |
| Tu número | La instancia, en la ruta | from, en el cuerpo |
| Destinatario | phone: un número o un id de grupo |
to: un número, solo dígitos |
| Texto | message |
text, hasta 4,096 caracteres |
| Archivo multimedia | image, video, audio, sticker o document: un enlace o base64 |
type, más link (una URL https pública) o mediaId de POST /api/v1/media |
| Nombre del documento | La extensión en la ruta, fileName en el cuerpo |
filename, con su extensión |
| Leyenda | caption |
caption (imagen, video, documento) |
| Responder a un mensaje | messageId, en los envíos de texto y multimedia |
replyTo: el wamid del mensaje |
| Retrasos | delayMessage, delayTyping |
Sin equivalente. POST /api/v1/send/typing muestra el indicador de escritura en un mensaje que recibiste. |
| Visualización única | viewOnce |
No se admite en un número con Coexistencia |
| Editar un mensaje enviado | editMessageId |
Sin equivalente |
| Respuesta | zaapId, messageId, id |
201 con message.id y message.wamid |
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: ReceivedCallback y su equivalente en ZapClaw
Z-API envía cada mensaje como un objeto plano con type: "ReceivedCallback". ZapClaw envía event, timestamp, data y account a una sola URL para todos tus números.
| Z-API | ZapClaw | |
|---|---|---|
| Evento | type: "ReceivedCallback" |
event: "message.received", también en el encabezado X-ZapClaw-Event |
| Cuál de tus números | instanceId, connectedPhone |
account.phone_number_id, account.display_phone_number |
| Remitente | phone |
data.from, y data.user_id, el id permanente del contacto |
| Enviado por ti | fromMe: true |
Un evento aparte, message.echo, con data.to, para mensajes enviados desde la app de WhatsApp Business o WhatsApp Web (opcional) |
| Id del mensaje | messageId |
data.message_id, un wamid |
| Nombre del contacto | senderName, chatName |
data.contact_name |
| Hora | momment: milisegundos en los ejemplos de la documentación |
data.timestamp: segundos, como cadena |
| Texto | text.message |
data.text.body |
| Imagen | image.imageUrl, image.mimeType, image.caption |
data.image.media_url, data.image.mime_type, data.image.caption |
| Audio | audio.audioUrl, audio.ptt |
data.audio.media_url, data.audio.voice |
| Video | video.videoUrl, video.caption |
data.video.media_url, data.video.caption |
| Documento | document.documentUrl, document.fileName |
data.document.media_url, data.document.filename |
| Sticker | sticker.stickerUrl |
data.sticker.media_url |
| Ubicación | location.latitude, location.longitude |
data.location.latitude, data.location.longitude |
| Respuesta de botón | buttonsResponseMessage.buttonId |
data.interactive.button_reply.id; la respuesta rápida de una plantilla llega como data.button.payload |
| Respuesta de lista | listResponseMessage.selectedRowId |
data.interactive.list_reply.id |
| Mensaje citado | referenceMessageId |
data.context.id |
| Grupos | isGroup, participantPhone |
Siempre un chat individual |
| Estado de entrega | MessageStatusCallback, con SENT, RECEIVED, READ, READ_BY_ME o PLAYED |
message.status, con data.status igual a sent, delivered, read o failed |
| Resultado del envío | DeliveryCallback, con error cuando el envío falló |
message.status con failed, y el motivo de Meta en data.errors |
| Almacenamiento de archivos | Z-API guarda los archivos 30 días | Meta guarda los archivos recibidos unos 30 días; descárgalos con tu X-API-Key |
| Autenticación de la solicitud | Ninguna descrita en la documentación de webhooks | X-ZapClaw-Signature: un HMAC-SHA256 del cuerpo sin procesar, hecho con tu clave de firma (cómo verificarla, en inglés) |
Z-API avisa de un envío fallido en su webhook DeliveryCallback, en el campo error; su MessageStatusCallback no tiene un estado de fallo. En ZapClaw, un message.status con failed trae el motivo de Meta en data.errors: lleva ahí el manejo de errores de tu DeliveryCallback. 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 id de grupo y 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 estados ni canales, 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.
- Editar un mensaje enviado, retrasos de envío, encuestas y menciones. ZapClaw no tiene endpoint para ellos. Los botones y las listas van por
POST /api/v1/send/interactive. - Base64 en el cuerpo del envío. Sube el archivo con
POST /api/v1/mediay envía elmediaIdque devuelve, o envía unlinkhttps público. - Ids antiguos de mensajes. Los ids de Z-API 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. Guarda
data.user_idcomo clave permanente de un contacto: 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 send-text, la segunda convierte un message.received de ZapClaw en los campos de ReceivedCallback que tu flujo ya lee. Comprueba el encabezado X-ZapClaw-Signature antes de confiar en un cuerpo.
// Sending: what was POST .../instances/{instanceId}/token/{token}/send-text
const sendText = async ({ phone, message }) => {
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: phone, text: message }),
});
if (!res.ok) throw new Error(`ZapClaw answered ${res.status}`);
const sent = (await res.json()).message;
return { zaapId: sent.id, messageId: sent.wamid, id: sent.wamid };
};
// Receiving: the ReceivedCallback fields, taken from a message.received body
const fromZapClaw = (body) => ({
phone: body.data.from,
messageId: body.data.message_id,
senderName: body.data.contact_name,
momment: Number(body.data.timestamp) * 1000,
text: body.data.text ? { message: body.data.text.body } : undefined,
});
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 o una tarjeta de contacto, 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 Z-API que usa tu flujo: reenvía a ZapClaw las llamadas que convierte y transforma los webhooks firmados de ZapClaw de nuevo en ReceivedCallback, MessageStatusCallback y, para un envío fallido, DeliveryCallback, para que migres primero y reescribas después. Licencia MIT.
Si tu caso es distinto
- Z-API Omni. Z-API describe Omni como una capa técnica sobre la API oficial de Meta, y también incluye en él un canal de WhatsApp Web. Si tu número usa el canal de Omni en la API de Meta, ya está en esa API a través de Z-API, y un número no puede estar en dos proveedores a la vez: desconéctalo primero en Z-API y luego conéctalo a ZapClaw. Si usa el canal de WhatsApp Web de Omni, sigue los pasos de arriba.
- n8n o Make. Reemplaza los pasos de Z-API por 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.
- Varias instancias. Si usabas una instancia de Z-API por número, una cuenta de ZapClaw los reúne a todos:
account.phone_number_idlos distingue en una sola URL de webhook, yfromelige el número al enviar.
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
- ZapClaw o Z-API: los dos lado a lado, antes de decidir.
- Las API de WhatsApp no oficiales y la API oficial de Meta, comparadas: lo que dicen las condiciones de WhatsApp, con fuentes.
- La API oficial de WhatsApp con ZapClaw: lo que obtienes y los requisitos.
- La referencia del webhook (en inglés), con cada evento y campo.
- Si vienes de otra herramienta: Evolution API o WAHA.
Fuentes
Revisado el 15 de octubre de 2026. Z-API cambia su API con el tiempo, así que revisa su documentación antes de migrar.
- Z-API, introducción (en portugués): el código QR y la sesión de WhatsApp Web.
- Z-API, seguridad y Client-Token (en inglés): el id de la instancia y el token en la ruta, y el encabezado opcional.
- Páginas de envío de Z-API (en inglés): texto, imagen, documento, audio, video, sticker y respuesta.
- Webhooks de Z-API (en inglés): introducción, al recibir un mensaje (archivos guardados 30 días), ejemplos de callback, estado del mensaje y al enviar un mensaje, con sus ejemplos (
DeliveryCallbacky su campoerror). - Z-API Omni (en portugués): cómo lo describe Z-API, y sus canales.
- 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 Z-API 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