API de pasarela de mensajería
Una sola API para todos los canales de mensajería
Envía mensajes de WhatsApp Business, SMS, Telegram, Messenger, Instagram y TikTok a través de un único endpoint REST. Prepago, facturado por mensaje saliente, con webhooks de entrega y modo de prueba.
- Desde
- 0,0003 $
- por mensaje saliente
- Al registrarte
- 100
- mensajes gratis
- Permanencia
- Ninguna
- prepago, sin contrato
curl https://api.omnimessage.co/v1/messages \
-H "Authorization: Bearer om_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-shipped" \
-d '{
"channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
"to": "+971501234567",
"type": "text",
"text": { "body": "Your order #1042 has shipped." },
"reference": "order-1042"
}'{
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"mode": "live",
"channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"channel_type": "whatsapp",
"direction": "outbound",
"to": "+971501234567",
"from": "+971800123456",
"type": "text",
"content": {
"text": { "body": "Your order #1042 has shipped." }
},
"status": "queued",
"error": null,
"reference": "order-1042",
"metadata": {},
"billing": {
"source": "wallet",
"amount_micros": 1000,
"package_grant_id": null,
"refunded": false
},
"created_at": "2026-10-05T09:30:00.000Z",
"sent_at": null,
"delivered_at": null,
"read_at": null,
"failed_at": null
}Canales
Siete tipos de canal, un mismo formato de solicitud
Conecta los remitentes que ya tienes. Cada uno se convierte en un ID de canal que pasas al mismo endpoint, y todos te devuelven los mismos estados.
- 0,001 $WhatsApp BusinessPlantillas, mensajes interactivos y contenido multimedia en tu propio número de la Cloud API.Texto · Archivos adjuntos · Plantilla · Botones de respuesta · Lista · Botón de URL · Ubicación · Contactos
- 0,0005 $SMSMensajes de texto y multimedia desde tu propio número de Twilio.Texto · Archivos adjuntos
- 0,0005 $SMS OTPUna ruta solo de texto para códigos de un solo uso.Texto
- 0,0003 $TelegramMensajes de bot con botones, encuestas, ubicaciones y contenido multimedia.Texto · Archivos adjuntos · Botones de respuesta · Ubicación · Contactos · Encuesta
- 0,0005 $MessengerConversaciones con quienes escriben a tu página de Facebook.Texto · Archivos adjuntos · Botones de respuesta
- 0,0005 $InstagramMensajes directos para una cuenta profesional de Instagram.Texto · Archivos adjuntos · Botones de respuesta
- 0,0005 $TikTokMensajes directos para una cuenta de empresa de TikTok.Texto · Archivos adjuntos · Botones de respuesta
- Trae tus propios canalesTus números y tus bots siguen siendo tuyosMira qué necesita cada canal
Cómo funciona
Del registro a un mensaje entregado en cuatro pasos
No hay llamada comercial ni compromiso mínimo. Puedes hacer tu primera llamada a la API en modo de prueba un minuto después de crear la cuenta.
- Paso 01
Crea una cuenta
Regístrate, verifica tu correo y crea una clave de API en la consola. Las claves de prueba funcionan de inmediato, antes de conectar ningún canal.
- Paso 02
Conecta un canal
Inicia sesión con Facebook o TikTok en la consola para conectar un número de WhatsApp, una página o una cuenta de empresa. Añade un bot de Telegram o un número de Twilio con sus credenciales, en la consola o con
POST /v1/channels. - Paso 03
Envía a través de un solo endpoint
POST /v1/messagesrecibe un ID de canal, un destinatario y un objeto de contenido tipado. El formato de la solicitud es el mismo en todos los canales. - Paso 04
Sigue cada entrega
Los webhooks firmados informan de los estados enviado, entregado, leído y fallido. El mismo historial está en la consola y en
GET /v1/messages.
Tipos de mensaje
Lo que envías es lo que ven
Cada mensaje tiene un tipo y un objeto de contenido bajo la clave de ese tipo. Elige uno para ver el cuerpo de la solicitud junto al mensaje que genera.
{
"channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
"to": "+971501234567",
"type": "text",
"text": {
"body": "Tu pedido n.º 1042 ya está en camino. Síguelo en https://example.com/t/1042",
"preview_url": true
},
"reference": "order-1042"
}Texto sin formato, aceptado por todos los tipos de canal. Activa preview_url para que el canal muestre una vista previa del enlace.
CanalesWhatsApp Business, SMS, SMS OTP, Telegram, Messenger, Instagram y TikTok
Consola
Una consola para todo lo que no es código
Crea claves, conecta canales, busca en el registro de mensajes, reenvía entregas de webhooks y gestiona la facturación. Todo lo que muestra la consola también está disponible a través de la API.
Precios
Paga por mensaje o compra mensajes por volumen
Recarga un monedero prepago desde 10 $ y paga el precio por mensaje de cada canal, o compra un paquete de créditos de mensajes para el volumen de tus canales más caros.
10 mil mensajes
8 $
0,0008 $ por mensaje
- 10.000 mensajes salientes
- Válido durante 3 meses desde la compra
- Válido en todos los tipos de canal
100 mil mensajes
Destacado60 $
0,0006 $ por mensaje
- 100.000 mensajes salientes
- Válido durante 6 meses desde la compra
- Válido en todos los tipos de canal
1 M mensajes
400 $
0,0004 $ por mensaje
- 1.000.000 mensajes salientes
- Válido durante 12 meses desde la compra
- Válido en todos los tipos de canal
Pago por uso
| Canal | Por mensaje |
|---|---|
| WhatsApp Business | 0,001 $ |
| Telegram | 0,0003 $ |
| SMS | 0,0005 $ |
| SMS OTP | 0,0005 $ |
| Messenger | 0,0005 $ |
| 0,0005 $ | |
| TikTok | 0,0005 $ |
Qué cubre el precio
- Se facturaLos mensajes salientes aceptados por la API, en el momento en que se aceptan.
- GratisLos mensajes entrantes, los mensajes en modo de prueba, los webhooks y la consola.
- Se reembolsaCualquier mensaje que termine como fallido, al paquete o al monedero del que salió.
- AparteLas tarifas que Meta, los operadores u otros proveedores cobran por el canal en sí.
Experiencia de desarrollo
Hecho para integrarse una vez y olvidarse
Webhooks firmados, reintentos seguros, un sandbox que se comporta como producción y errores sobre los que puedes ramificar tu código.
Webhooks que puedes verificar
Cada entrega se firma con HMAC-SHA256 sobre la marca de tiempo y el cuerpo sin procesar, en la cabecera OmniMessage-Signature. Responde con cualquier 2xx en un máximo de 10 segundos. Las entregas fallidas se reintentan ocho veces con espera progresiva, desde 30 segundos hasta 24 horas.
import { createHmac, timingSafeEqual } from 'node:crypto';
// header is "t=<unix seconds>,v1=<hex hmac-sha256>"
export function verifySignature(rawBody, header, secret) {
const parts = header.split(',').map((part) => part.split('='));
const { t, v1 = '' } = Object.fromEntries(parts);
const expected = createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
const matches =
v1.length === expected.length &&
timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
return fresh && matches;
}{
"id": "evt_8Kd2pQ7wN4xB1zR6mT3c",
"object": "event",
"type": "message.delivered",
"mode": "live",
"created_at": "2026-10-05T09:30:02.900Z",
"data": {
"object": {
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"status": "delivered",
"reference": "order-1042",
"delivered_at": "2026-10-05T09:30:02.871Z"
}
}
}Un modo de prueba que no cuesta nada
Las claves de prueba usan canales de sandbox integrados, así que no hay nada que conectar. Los últimos dígitos del destinatario determinan el resultado simulado, y tus webhooks se disparan igual que en producción.
curl https://api.omnimessage.co/v1/messages \
-H "Authorization: Bearer om_test_..." \
-H "Content-Type: application/json" \
-d '{
"channel": "ch_test_whatsapp",
"to": "+971501230002",
"type": "text",
"text": { "body": "Hello from the sandbox" }
}'Errores con un tipo y un código
Todas las respuestas que no son 2xx tienen el mismo cuerpo: un type para la clase de fallo, un code estable sobre el que ramificar, el param causante cuando lo hay y un request_id para soporte.
{
"error": {
"type": "billing_error",
"code": "insufficient_balance",
"message": "Not enough wallet balance or package credits.",
"request_id": "req_5Vn1cH8jL3qW6yD9sF2k",
"doc_url": "https://omnimessage.co/docs/errors#insufficient_balance"
}
}POST idempotentes
Envía una cabecera
Idempotency-Keyy un reintento dentro de las 24 horas siguientes devuelve la respuesta almacenada conIdempotent-Replayed: true, sin enviar ni cobrar dos veces.Límites predecibles
100 solicitudes por segundo por clave en
POST /v1/messagesy 20 en el resto. Cada respuesta incluyeRateLimit-Remaining, y un 429 incluyeRetry-After.Envío por lotes
POST /v1/messages/batchacepta hasta 100 mensajes. Cada elemento se acepta, se rechaza y se factura por separado, y la respuesta 207 informa de ellos por índice.Claves con ámbitos
Da a cada clave solo los ámbitos que necesita, como
messages:writeobilling:read, y restríngela a una lista de IP permitidas.
Preguntas
Antes de integrar
Las respuestas cortas. Las largas están en la documentación.
¿Necesito mi propio número de WhatsApp, bot o número de SMS?
Sí. OmniMessage es una pasarela a la que traes tus propios canales: conectas tu propio número de WhatsApp Cloud API, bot de Telegram, número de Twilio o cuenta social, y conservas su titularidad. La página de canales indica qué necesita cada tipo.
¿Qué se me factura exactamente?
Un cargo por cada mensaje saliente que la API acepta: un crédito de paquete si tienes alguno; si no, el precio por mensaje del tipo de canal, con cargo a tu monedero. Los mensajes entrantes y los mensajes en modo de prueba son gratuitos, y un mensaje que termina como fallido se reembolsa automáticamente.
¿Están incluidas las tarifas de Meta, de los operadores o de los proveedores?
No. La tarifa de pasarela cubre la API, el seguimiento de entregas, los webhooks y la consola. Las tarifas que Meta, Twilio u otro proveedor cobran por el canal en sí quedan entre tú y ese proveedor.
¿Cómo hago pruebas sin enviar mensajes reales?
Usa una clave que empiece por om_test_. Cada cuenta tiene un canal de sandbox por tipo, como ch_test_whatsapp. No se entrega ni se cobra nada y los estados son simulados: un destinatario terminado en 0000 falla, 0001 se queda en enviado, 0002 además se lee, y cualquier otro se entrega en unos dos segundos.
¿Qué pasa cuando se me acaba el saldo?
La API responde 402 insufficient_balance y no se pone nada en cola, así que nunca quedas debiendo dinero a posteriori. Puedes suscribirte al evento balance.low o activar la recarga automática para recargar el monedero cuando baje de un umbral que tú elijas.
¿Necesito un SDK?
No. La API es JSON sobre HTTPS con autenticación bearer, así que sirve cualquier cliente HTTP. La documentación incluye ejemplos en cURL, Node, Python y PHP.
Envía hoy tu primer mensaje en modo de prueba
Crea una cuenta, copia una clave de prueba y llama a la API antes de conectar un solo canal. Cada cuenta nueva empieza con 100 mensajes gratis.