Compatibilidad con sistemas externos

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.

¿Tu sistema es nuevo? Si arrancas de cero, usa la API moderna: Guia para principiantes · OpenAPI 3.0

Contrato del endpoint

POST /panel/api_wa.php text/plain Solo sistemas externos

Parametros (form-encoded)

ParametroTipoRequeridoDescripcion
token string Si 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)

RespuestaSignificaHTTP
OK-{id}Mensaje encolado. id es el id de cola_mensajes para tracking.200
ERROR-TOKEN INVALIDOEl token no coincide con ningun celular (o el celular esta inactivo).200
NUMERO INVALIDO, SOLO SE ACEPTAN 10 DIGITOSEl 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 INSUFICIENTEEl celular no tiene creditos y el plan no es ilimitado.200
ERROR-MARCARLEIDO NO SOPORTADOSe 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.200
ERROR-ARCHIVO BASE64 INVALIDOEl base64 del archivo no se pudo decodificar.200
ERROR-METODO NO PERMITIDOEl request no es POST.405

Como obtener el token

  1. Entra al panel como super admin: panel.multimensajes.com/login
  2. Ve a Clientes > [cliente] > Ver
  3. 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).
  4. 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."
<?php
$ch = curl_init('https://panel.multimensajes.com/panel/api_wa.php');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query([
        'token'        => 'dc181b737305a0812e6e450c...',
        'destinatario' => '5218711281619',
        'mensaje'      => 'Hola Maria, tu pedido #1234 ya esta listo para recoger.',
    ]),
]);
$resp = curl_exec($ch);
echo $resp; // OK-229
import requests

r = requests.post(
    'https://panel.multimensajes.com/panel/api_wa.php',
    data={
        'token':        'dc181b737305a0812e6e450c...',
        'destinatario': '5218711281619',
        'mensaje':      'Hola Maria, tu pedido #1234 ya esta listo para recoger.',
    },
)
print(r.text)  # OK-229
const params = new URLSearchParams();
params.set('token',        'dc181b737305a0812e6e450c...');
params.set('destinatario', '5218711281619');
params.set('mensaje',      'Hola Maria, tu pedido #1234 ya esta listo para recoger.');

const r = await fetch('https://panel.multimensajes.com/panel/api_wa.php', {
    method: 'POST',
    body:   params,
});
console.log(await r.text()); // OK-229

Respuesta: OK-229 (el 229 es el id en cola_mensajes para tracking). El worker lo procesa y envia en segundos.

2

Enviar imagen (base64 inline, encolada)

La imagen viaja como base64 dentro del mismo POST. No necesitas hosting. El worker la guarda temporal, se la pasa a WhatsApp y la borra.

Limites: 16MB para imagen. Formatos: jpg, png, webp, gif. Si excedes, fueza a modo=directo abajo.
IMGB64=$(base64 -w 0 /ruta/a/foto.jpg)

curl -X POST https://panel.multimensajes.com/panel/api_wa.php \
  -d "token=dc181b737305a0812e6e450c..." \
  -d "destinatario=5218711281619" \
  -d "mensaje=Aqui esta tu foto" \
  --data-urlencode "tipomime=image/jpeg" \
  --data-urlencode "mime=$IMGB64"
<?php
$img_b64 = base64_encode(file_get_contents('/ruta/a/foto.jpg'));

$ch = curl_init('https://panel.multimensajes.com/panel/api_wa.php');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query([
        'token'        => 'dc181b737305a0812e6e450c...',
        'destinatario' => '5218711281619',
        'mensaje'      => 'Aqui esta tu foto',
        'tipomime'     => 'image/jpeg',
        'mime'         => $img_b64,
    ]),
]);
echo curl_exec($ch); // OK-240
import base64, requests

with open('/ruta/a/foto.jpg', 'rb') as f:
    img_b64 = base64.b64encode(f.read()).decode('ascii')

r = requests.post(
    'https://panel.multimensajes.com/panel/api_wa.php',
    data={
        'token':        'dc181b737305a0812e6e450c...',
        'destinatario': '5218711281619',
        'mensaje':      'Aqui esta tu foto',
        'tipomime':     'image/jpeg',
        'mime':         img_b64,
    },
)
print(r.text)  # OK-240
import fs from 'fs';

const imgB64 = fs.readFileSync('/ruta/a/foto.jpg').toString('base64');

const params = new URLSearchParams();
params.set('token',        'dc181b737305a0812e6e450c...');
params.set('destinatario', '5218711281619');
params.set('mensaje',      'Aqui esta tu foto');
params.set('tipomime',     'image/jpeg');
params.set('mime',         imgB64);

const r = await fetch('https://panel.multimensajes.com/panel/api_wa.php', {
    method: 'POST', body: params,
});
console.log(await r.text()); // OK-240

Respuesta: OK-240. El worker decodifica el base64, lo guarda en /storage/uploads/, llama a wasenderapi y borra el archivo.

3

Enviar archivo / documento (PDF, DOC, XLS, ZIP)

Mismo flujo que imagen pero con tipomime de documento. Soporta PDF, Word, Excel, ZIP, TXT, CSV, etc.

Limites: 50MB para documento. La deteccion es automatica: image/* -> imagen, video/* -> video, audio/* -> audio, cualquier otro -> documento.
PDFB64=$(base64 -w 0 /ruta/a/factura.pdf)

curl -X POST https://panel.multimensajes.com/panel/api_wa.php \
  -d "token=dc181b737305a0812e6e450c..." \
  -d "destinatario=5218711281619" \
  -d "mensaje=Tu factura del mes" \
  --data-urlencode "tipomime=application/pdf" \
  --data-urlencode "mime=$PDFB64"
<?php
$pdf_b64 = base64_encode(file_get_contents('/ruta/a/factura.pdf'));

$ch = curl_init('https://panel.multimensajes.com/panel/api_wa.php');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query([
        'token'        => 'dc181b737305a0812e6e450c...',
        'destinatario' => '5218711281619',
        'mensaje'      => 'Tu factura del mes',
        'tipomime'     => 'application/pdf',
        'mime'         => $pdf_b64,
    ]),
]);
echo curl_exec($ch); // OK-250
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.
curl -X POST https://panel.multimensajes.com/panel/api_wa.php \
  -d "token=dc181b737305a0812e6e450c..." \
  -d "destinatario=5218711281619" \
  -d "mensaje=Tu codigo de verificacion es: 482913" \
  -d "modo=directo"
<?php
$ch = curl_init('https://panel.multimensajes.com/panel/api_wa.php');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query([
        'token'        => 'dc181b737305a0812e6e450c...',
        'destinatario' => '5218711281619',
        'mensaje'      => 'Tu codigo de verificacion es: 482913',
        'modo'         => 'directo',  // envio inmediato
    ]),
    CURLOPT_TIMEOUT        => 30,       // esperar respuesta de wasenderapi
]);
$resp = curl_exec($ch);
// OK-260 si se envio, ERROR-ENVIO HTTP 4xx/5xx si fallo
echo $resp;
import requests

r = requests.post(
    'https://panel.multimensajes.com/panel/api_wa.php',
    data={
        'token':        'dc181b737305a0812e6e450c...',
        'destinatario': '5218711281619',
        'mensaje':      'Tu codigo de verificacion es: 482913',
        'modo':         'directo',
    },
    timeout=30,  # esperar respuesta
)
print(r.text)  # OK-260 o ERROR-ENVIO HTTP xxx
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.

Ir a la guia de la API moderna Ir al portal del cliente