Enviar mensaje de texto

Envia un mensaje de texto plano via WhatsApp. Default encola (modo humanizado). Con directo=1 envia al instante.

POST /api/mensaje_enviar_texto.php API Key

Parametros

Nombre Tipo Requerido Descripcion
key string Si API key del celular (formato WA_<id>_<hash>)
destinatario string Si Numero con codigo de pais, sin +. Mexico/USA/Canada/Espana/30+ paises auto-detectados. Ej: 5218711281619, +52 1 871 128 1619, 8711281619
mensaje string Si Texto del mensaje (max 4096 caracteres). Cada mensaje debe ser UNICO para evitar ser bloqueado por WhatsApp.
directo boolean No 1 = envio instantaneo (sin cola, util para 2FA y chatbots). 0 o ausente = cola humanizada (default).
preview_url boolean No Mostrar preview de URLs (default: false)

Respuestas

200 OK
{
    "ok": true,
    "msg_id": "abc123...",
    "modo": "directo|cola",
    "wasenderapi_msg_id": "..."
}
400 Peticion invalida
{
    "ok": false,
    "error": "Parametros invalidos"
}
401 No autorizado
{
    "ok": false,
    "error": "API key invalida"
}
402 Pago requerido
{
    "ok": false,
    "error": "Saldo insuficiente"
}
429 Demasiadas peticiones
{
    "ok": false,
    "error": "Mensaje duplicado o rate limit",
    "retry_after": 5
}

Ejemplos de codigo

Listos para copiar y pegar. Cubre los 8 lenguajes mas usados.

<?php
// PHP + cURL
$ch = curl_init('https://api.multimensajes.com/api/mensaje_enviar_texto.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'key' => 'WA_8_a1b2c3d4e5f6g7h8',
    'destinatario' => '5218711281619',
    'mensaje' => 'Hola, este es un mensaje de prueba desde WA API.',
    'directo' => 'valor_ejemplo',
    'preview_url' => 'false',
]);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
import requests

response = requests.post(
    'https://api.multimensajes.com/api/mensaje_enviar_texto.php',
    data={
    'key': 'key': 'WA_8_a1b2c3d4e5f6g7h8',
    'destinatario': 'destinatario': '5218711281619',
    'mensaje': 'mensaje': 'Hola, este es un mensaje de prueba desde WA API.',
    'directo': 'directo': 'valor_ejemplo',
    'preview_url': 'preview_url': False
    },
    timeout=30
)
data = response.json()
print(data)
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

const params = new URLSearchParams();
params.append('key', 'WA_8_a1b2c3d4e5f6g7h8');
params.append('destinatario', '5218711281619');
params.append('mensaje', 'Hola, este es un mensaje de prueba desde WA API.');
params.append('directo', 'valor_ejemplo');
params.append('preview_url', 'false');

const response = await fetch('https://api.multimensajes.com/api/mensaje_enviar_texto.php', {
    method: 'POST',
    body: params
});
const data = await response.json();
console.log(data);
curl -X POST 'https://api.multimensajes.com/api/mensaje_enviar_texto.php' \
  -d 'key=WA_8_a1b2c3d4e5f6g7h8' \
  -d 'destinatario=5218711281619' \
  -d 'mensaje=Hola%2C+este+es+un+mensaje+de+prueba+desde+WA+API.' \
  -d 'directo=valor_ejemplo' \
  -d 'preview_url=false'
package main

import (
    "fmt"
    "net/url"
    "net/http"
    "io/ioutil"
)

func main() {
    form := url.Values{}
    form.Add("key", "WA_8_a1b2c3d4e5f6g7h8")
    form.Add("destinatario", "5218711281619")
    form.Add("mensaje", "Hola, este es un mensaje de prueba desde WA API.")
    form.Add("directo", "valor_ejemplo")
    form.Add("preview_url", "false")

    resp, _ := http.PostForm("https://api.multimensajes.com/api/mensaje_enviar_texto.php", form)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class WhatsAppAPI {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://api.multimensajes.com/api/mensaje_enviar_texto.php");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        StringBuilder params = new StringBuilder();
        params.append("key=WA_8_a1b2c3d4e5f6g7h8\&");
        params.append("
        params.append("destinatario=5218711281619\&");
        params.append("
        params.append("mensaje=Hola%2C+este+es+un+mensaje+de+prueba+desde+WA+API.\&");
        params.append("
        params.append("directo=valor_ejemplo\&");
        params.append("
        params.append("preview_url=false\&");
        params.append("
        con.getOutputStream().write(params.toString().getBytes());
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) System.out.println(line);
    }
}
require 'net/http'
require 'uri'
require 'json'

uri = URI('https://api.multimensajes.com/api/mensaje_enviar_texto.php')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

req = Net::HTTP::Post.new(uri.path)
req.set_form_data(
  'key' => 'WA_8_a1b2c3d4e5f6g7h8',
  'destinatario' => '5218711281619',
  'mensaje' => 'Hola, este es un mensaje de prueba desde WA API.',
  'directo' => 'valor_ejemplo',
  'preview_url' => 'false'
)

response = http.request(req)
puts JSON.parse(response.body)
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Collections.Generic;

class Program {
    static async Task Main() {
        var client = new HttpClient();
        var form = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("key", "WA_8_a1b2c3d4e5f6g7h8"),
            new KeyValuePair<string, string>("destinatario", "5218711281619"),
            new KeyValuePair<string, string>("mensaje", "Hola, este es un mensaje de prueba desde WA API."),
            new KeyValuePair<string, string>("directo", "valor_ejemplo"),
            new KeyValuePair<string, string>("preview_url", "false")
        });
        var response = await client.PostAsync("https://api.multimensajes.com/api/mensaje_enviar_texto.php", form);
        var content = await response.Content.ReadAsStringAsync();
        Console.WriteLine(content);
    }
}

Pruebalo tu mismo

Copia este comando y pegalo en tu terminal (necesitas curl):

curl -X POST 'https://api.multimensajes.com/api/mensaje_enviar_texto.php' \
  -d 'key=WA_8_a1b2c3d4e5f6g7h8' \
  -d 'destinatario=5218711281619' \
  -d 'mensaje=Hola%2C+este+es+un+mensaje+de+prueba+desde+WA+API.' \
  -d 'directo=valor_ejemplo' \
  -d 'preview_url=false'

Endpoints relacionados

Modo directo vs cola

Por default este endpoint usa la cola humanizada: el mensaje se encola y el worker lo envia en los proximos segundos, distribuyendo el trafico para que parezca mas natural y reduzca el riesgo de baneo de WhatsApp.

Si necesitas envio instantaneo (chatbots, 2FA, sistemas en tiempo real), envia el parametro directo=1. La API llama a WhatsApp al instante y registra el resultado como enviado en tu historial. Si WhatsApp devuelve error, la API registra el fallo y devuelve HTTP 5xx (tu codigo debe manejarlo).

¿Cuando usar cada uno?
  • Cola (default): notificaciones batch, marketing, recordatorios, envios masivos. Mas seguro contra baneos.
  • Directo (directo=1): 2FA (codigos OTP), confirmaciones de pedido en tiempo real, chatbots interactivos, alertas criticas.

Ejemplo modo directo (Python):

import requests

r = requests.post(
    'https://api.multimensajes.com/api/mensaje_enviar_texto.php',
    headers={'Authorization': 'Bearer WA_11_a1b2c3d4...'},
    json={
        'destinatario': '5218711281619',
        'mensaje': 'Tu codigo de verificacion es: 482915',
        'directo': 1,
    },
    timeout=10,
)
data = r.json()
# data['modo'] == 'directo'
# data['wasenderapi_msg_id'] == 'ABC123...'  (campo interno del API, ver CHANGELOG)
# data['msg_id'] == UUID interno para tracking

Proteccion anti-duplicado

Para evitar ser bloqueado por WhatsApp (y para que tu cuenta no envie el mismo mensaje en bucle por un bug), la API valida automaticamente que cada mensaje sea unico por destinatario y celular.

Regla: si envias el mismo mensaje (mismo texto + mismo destinatario + mismo celular) 3 veces en 2 minutos, tu cuenta queda bloqueada 5 minutos para ese celular. El bloqueo se aplica con cache en memoria (memoria compartida) y NO requiere query a BD.

El hash de deduplicacion se calcula diferente por tipo:

Respuesta cuando se detecta duplicado:

HTTP 429
{
  "ok": false,
  "codigo": 306,
  "error": "Mensaje duplicado / cuenta bloqueada",
  "detalle": "Has enviado el mismo mensaje 3 veces en 120s. Tu cuenta queda bloqueada 300s. ... (bloqueo restante: 245s). Personaliza el contenido: cada mensaje debe ser unico para evitar ser bloqueado por WhatsApp."
}
Como evitar el baneo de WhatsApp (y nuestro baneo anti-duplicado):
  1. Personaliza cada mensaje. Usa el nombre del destinatario, una clave unica, la fecha, o un contador. Ej: "Hola Juan, tu pedido #4827 esta en camino (enviado el 07/08)".
  2. Respeta los rate limits de WhatsApp. 1 mensaje cada 5 segundos es seguro. Mas de 256 msg/min es riesgo de baneo. La cola humanizada te protege automaticamente.
  3. No envies el mismo contenido a muchos contactos. WhatsApp detecta spam. Si envias 1000 numeros con el mismo texto, te banean.
  4. Usa captions unicos. Si envias la misma imagen a 100 contactos, el caption debe ser distinto para cada uno.
  5. Si tu sistema tiene retry logic, asegurate de que el retry tenga backoff exponencial y un maximo de 3 intentos.

La respuesta exitosa incluye anti_dupe: { count, max: 3, window_s: 120 } para que sepas cuantos envios llevas en la ventana de 2 minutos. Cuando count llegue a 3, el siguiente envio sera rechazado.