Enviar imagen (base64)

Variante que acepta la imagen como base64 (data URI o base64 puro) en vez de una URL publica. Util cuando no tienes donde hospedar la imagen. Default encola; con directo=1 envia al instante y elimina el archivo temporal antes de la respuesta.

POST /api/mensaje_enviar_imagen_base64.php API Key

Parametros

Nombre Tipo Requerido Descripcion
key string Si API key del celular
destinatario string Si Numero con codigo de pais
imageBase64 string Si Imagen en base64. Acepta data URI ("data:image/png;base64,...") o base64 puro
mime string No image/jpeg, image/png, image/webp, image/gif. Opcional si viene en data URI
caption string No Texto que acompana la imagen. Personalizarlo si envias la misma imagen a varios destinatarios.
filename string No Nombre sugerido del archivo (para logging)
directo boolean No 1 = envio instantaneo (archivo temporal se ELIMINA antes de la respuesta). 0 o ausente = cola (archivo se envia al worker y se elimina al enviar).

Respuestas

200 OK
{
    "ok": true,
    "msg_id": "abc123...",
    "modo": "directo|cola",
    "origen": "base64_directo|base64_inline"
}
400 Peticion invalida
{
    "ok": false,
    "error": "Base64 invalido"
}
413 Respuesta
{
    "ok": false,
    "error": "Archivo demasiado grande (max 16MB)"
}
415 Respuesta
{
    "ok": false,
    "error": "MIME no permitido"
}
402 Pago requerido
{
    "ok": false,
    "error": "Saldo insuficiente"
}

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_imagen_base64.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'key' => 'WA_8_a1b2c3d4e5f6g7h8',
    'destinatario' => '5218711281619',
    'imageBase64' => 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
    'mime' => 'image/png',
    'caption' => 'Mira esta imagen',
    'filename' => 'factura.pdf',
    'directo' => 'valor_ejemplo',
]);
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_imagen_base64.php',
    data={
    'key': 'key': 'WA_8_a1b2c3d4e5f6g7h8',
    'destinatario': 'destinatario': '5218711281619',
    'imageBase64': 'imageBase64': 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
    'mime': 'mime': 'image/png',
    'caption': 'caption': 'Mira esta imagen',
    'filename': 'filename': 'factura.pdf',
    'directo': 'directo': 'valor_ejemplo'
    },
    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('imageBase64', 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');
params.append('mime', 'image/png');
params.append('caption', 'Mira esta imagen');
params.append('filename', 'factura.pdf');
params.append('directo', 'valor_ejemplo');

const response = await fetch('https://api.multimensajes.com/api/mensaje_enviar_imagen_base64.php', {
    method: 'POST',
    body: params
});
const data = await response.json();
console.log(data);
curl -X POST 'https://api.multimensajes.com/api/mensaje_enviar_imagen_base64.php' \
  -d 'key=WA_8_a1b2c3d4e5f6g7h8' \
  -d 'destinatario=5218711281619' \
  -d 'imageBase64=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII%3D' \
  -d 'mime=image%2Fpng' \
  -d 'caption=Mira+esta+imagen' \
  -d 'filename=factura.pdf' \
  -d 'directo=valor_ejemplo'
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("imageBase64", "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=")
    form.Add("mime", "image/png")
    form.Add("caption", "Mira esta imagen")
    form.Add("filename", "factura.pdf")
    form.Add("directo", "valor_ejemplo")

    resp, _ := http.PostForm("https://api.multimensajes.com/api/mensaje_enviar_imagen_base64.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_imagen_base64.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("imageBase64=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII%3D\&");
        params.append("
        params.append("mime=image%2Fpng\&");
        params.append("
        params.append("caption=Mira+esta+imagen\&");
        params.append("
        params.append("filename=factura.pdf\&");
        params.append("
        params.append("directo=valor_ejemplo\&");
        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_imagen_base64.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',
  'imageBase64' => 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
  'mime' => 'image/png',
  'caption' => 'Mira esta imagen',
  'filename' => 'factura.pdf',
  'directo' => 'valor_ejemplo'
)

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>("imageBase64", "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="),
            new KeyValuePair<string, string>("mime", "image/png"),
            new KeyValuePair<string, string>("caption", "Mira esta imagen"),
            new KeyValuePair<string, string>("filename", "factura.pdf"),
            new KeyValuePair<string, string>("directo", "valor_ejemplo")
        });
        var response = await client.PostAsync("https://api.multimensajes.com/api/mensaje_enviar_imagen_base64.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_imagen_base64.php' \
  -d 'key=WA_8_a1b2c3d4e5f6g7h8' \
  -d 'destinatario=5218711281619' \
  -d 'imageBase64=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII%3D' \
  -d 'mime=image%2Fpng' \
  -d 'caption=Mira+esta+imagen' \
  -d 'filename=factura.pdf' \
  -d 'directo=valor_ejemplo'

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.