API Legacy (para clientes con integraciones previas)
POST /panel/api_wa.php - Mismo contrato que el conector del proyecto anterior.
Acepta texto, imagen y archivos en una sola llamada, sin necesidad de URL publica.
Ideal para migrar sin tocar el codigo existente.
wasenderapi_token del celular (64 hex chars, formato nuevo)
o token_legacy (base64-like, sistema antiguo) si MASH lo migro.
Cada celular tiene su propio token. Lo copias desde el panel.
destinatario
string
Si
Numero de WhatsApp. 10+ digitos. Acepta formato libre MX: 8711281619, 5218711281619, +52 1 871 128 1619. Auto-normaliza a 521.
mensaje
string
Si
Texto del mensaje (max 4096 chars). Para imagen/archivo es el caption opcional.
mime
string
No
Contenido del archivo en base64. Sin prefijo data:.... Si viene con prefijo se limpia automaticamente.
tipomime
string
Si (si hay mime)
MIME type del archivo: image/jpeg, image/png, application/pdf, application/msword, etc. Determina si va como imagen, video, audio o documento.
modo
string
No
directo o DIRECTO: envio inmediato (sin cola). Si se omite, va a la cola humanizada (1 msg cada 5s, evita baneo de Meta).
marcarleido
string
No
NO SOPORTADO. Devuelve error. Para marcar mensajes como leidos, esperar al webhook entrante (automatico).
Respuestas (text/plain)
Respuesta
Significa
HTTP
OK-{id}
Mensaje encolado. id es el id de cola_mensajes para tracking.
200
ERROR-TOKEN INVALIDO
El token no coincide con ningun celular (o el celular esta inactivo).
200
NUMERO INVALIDO, SOLO SE ACEPTAN 10 DIGITOS
El destinatario no tiene 10+ digitos.
200
ERROR-CLIENTE {estado}
El cliente del celular no esta activo (suspendido o baja).
200
ERROR-CELULAR {estado}
El celular existe pero esta suspendido o desconectado.
200
ERROR-SALDO INSUFICIENTE
El celular no tiene creditos y el plan no es ilimitado.
200
ERROR-MARCARLEIDO NO SOPORTADO
Se envio marcarleido=1. Esta feature no esta disponible via este endpoint.
200
ERROR-ENVIO HTTP {code} ID-{id}
Modo directo fallo. id es el id de cola_mensajes registrado como error.
En la seccion Tokens para sistemas externos aparece una tabla con un celular por fila. Cada fila tiene 2 columnas: token nuevo (wasenderapi) y token legacy (sistema antiguo, si fue migrado).
Click Copiar en el que corresponda. Pegalo como token= en el POST.
Privacidad: el token es el mismo que se usa para llamar a wasenderapi directamente. Tratalo como password. Si lo rotas, los sistemas externos que lo usen dejaran de funcionar.
Ejemplos
4 casos comunes. Todos usan https://panel.multimensajes.com/panel/api_wa.php como base.
1
Enviar texto (cola humanizada)
El caso mas simple. El mensaje se encola y se envia ~1 cada 5s. Recomendado para campanas, notificaciones batch, mensajes no urgentes.
curl -X POST https://panel.multimensajes.com/panel/api_wa.php \
-d "token=dc181b737305a0812e6e450c..." \
-d "destinatario=5218711281619" \
-d "mensaje=Hola Maria, tu pedido #1234 ya esta listo para recoger."
import base64, requests
with open('/ruta/a/factura.pdf', 'rb') as f:
pdf_b64 = base64.b64encode(f.read()).decode('ascii')
r = requests.post(
'https://panel.multimensajes.com/panel/api_wa.php',
data={
'token': 'dc181b737305a0812e6e450c...',
'destinatario': '5218711281619',
'mensaje': 'Tu factura del mes',
'tipomime': 'application/pdf',
'mime': pdf_b64,
},
)
print(r.text) # OK-250
Respuesta:OK-250. El sistema lo trata como mensaje_enviar_documento automaticamente.
4
Modo directo (envio inmediato, sin cola)
Agrega modo=directo (o DIRECTO) y el mensaje sale en ese mismo request. Ideal para 2FA, alertas, codigos OTP, confirmaciones en tiempo real. Solo texto (con archivo cae a cola porque el base64 hay que procesarlo en backend).
Importante: el envio directo no es anonimo. WhatsApp ve el spike inmediato. Usalo solo para mensajes sensibles al tiempo (OTP, alertas urgentes, confirmaciones). Para campanas usa el modo normal.
const params = new URLSearchParams();
params.set('token', 'dc181b737305a0812e6e450c...');
params.set('destinatario', '5218711281619');
params.set('mensaje', 'Tu codigo de verificacion es: 482913');
params.set('modo', 'directo');
const r = await fetch('https://panel.multimensajes.com/panel/api_wa.php', {
method: 'POST',
body: params,
});
console.log(await r.text());
// OK-260 si se envio. ERROR-ENVIO HTTP xxx si fallo.
Respuesta exitosa:OK-260 y el mensaje queda registrado en cola_mensajes con estado='enviado' y enviado_en poblado. Respuesta de fallo:ERROR-ENVIO HTTP 4xx ID-261 (el mensaje queda en estado='error' con el motivo).
Preguntas frecuentes
¿Y si mi sistema envia el token del sistema antiguo (base64)?
El endpoint acepta los dos formatos. MASH puede mapear el token antiguo en el campo celulares.token_legacy desde el panel. Asi tu sistema externo sigue mandando el mismo token sin cambios.
¿Que pasa con el saldo si el cliente es plan ilimitado?
Si clientes.plan = 'ilimitado', no se descuenta credito del celular. Si el cliente es 'medido' y el celular llega a 0, el siguiente envio devuelve ERROR-SALDO INSUFICIENTE.
¿Como migrar a la API moderna?
Cuando estes listo, usa los endpoints de la API moderna (con WA_<id>_<hash> en lugar del token legacy). El contrato cambia un poco (es JSON, no form-encoded), pero la logica es la misma. Te ayudo en el batch que quieras.
¿Que hago si la respuesta es un HTTP 500 inesperado?
Si el body empieza con <br /> Fatal error, es un bug del panel. Reportamelo con la hora exacta y el token que usaste (NO el mensaje, por seguridad). El error_log del server tiene el detalle.
¿Listo para migrar?
Este endpoint queda activo indefinidamente para los sistemas externos que ya lo usen. Para integraciones nuevas, te recomiendo la API moderna.