API de WhatsApp Business

API de WhatsApp Business en Marruecos: sus mensajes de WhatsApp desde su código

La API de WhatsApp Business de EnvoiSMS.ma envía sus mensajes de WhatsApp por el mismo endpoint REST que sus SMS: POST /v1/messages con channel: "whatsapp", desde su propio número de WhatsApp Business conectado. Plantillas aprobadas por Meta, medios, listas y botones, respuestas dentro de la ventana de 24 horas, informes de entrega por webhook. Cada mensaje se factura en dírhams según su categoría: hacia un número marroquí, 0,65 MAD por notificación y 0,90 MAD por mensaje de marketing, sin suscripción.

Un solo endpoint para SMS y WhatsApp

¿Ya envía SMS? WhatsApp es la misma llamada con un campo más: POST https://api.envoisms.ma/v1/messages, cabecera Authorization: Bearer <clave API> y channel: "whatsapp". El mensaje sale de su propio número de WhatsApp Business, conectado en el panel. Sin número conectado, la API responde 403 WHATSAPP_NOT_CONNECTED y no se cobra nada.

  • El mismo parámetro channel en los SDK oficiales de Node.js, PHP, Python y Go
  • Una cabecera Idempotency-Key hace que cada envío se pueda reintentar: un reintento tras un timeout nunca factura dos veces
  • Errores JSON con un código estable (error.code) sobre el que ramificar

Plantillas de Meta y ventana de 24 horas

Una plantilla aprobada por Meta puede abrir una conversación en cualquier momento: está exenta de la ventana de servicio y se factura según la categoría registrada en su cuenta. Un mensaje libre (texto, medio, lista…) solo se acepta si el contacto le escribió por WhatsApp en las últimas 24 horas; si no, la API responde 400 OUT_OF_24H_WINDOW antes de cualquier cargo.

  • template: { name, language, components } para iniciar una conversación
  • La respuesta 400 OUT_OF_24H_WINDOW incluye window_expired y window_expires_at
  • Las reacciones no se facturan

Mensajes enriquecidos: medios, listas, botones

El mismo endpoint transporta todos los tipos de mensaje de WhatsApp: texto, medios por id o por enlace, mensajes interactivos (lista, botones, flow, botón de URL, solicitud de ubicación), reacciones, tarjetas de contacto, ubicaciones y stickers, con un contexto de respuesta para citar el mensaje del cliente.

  • interactive: list, button, flow, cta_url, location_request_message
  • Medios por id (ya subido) o por enlace
  • Contexto de respuesta en cualquier tipo de mensaje

Conversaciones, webhooks y códigos OTP

GET /v1/conversations lista sus conversaciones con la hora de expiración de su ventana de 24 horas, y POST /v1/messages/typing muestra un indicador de escritura mientras prepara la respuesta. Los estados de sus mensajes llegan a sus webhooks firmados con HMAC-SHA256 en la cabecera X-EnvoiSMS-Signature-256. Para un código de un solo uso por WhatsApp, POST /v1/verify/send con channel whatsapp pasa por el remitente compartido de EnvoiSMS: ningún número que conectar.

  • Eventos message.sent, message.delivered, message.failed, message.undeliverable
  • Firma t=<marca de tiempo>,v1=<hex>: rechace toda entrega de más de 5 minutos
  • Claves sandbox env_test_: todo el recorrido simulado, nada entregado ni cobrado

Todo lo que debe saber sobre API de WhatsApp Business.

¿Necesito conectar mi propio número de WhatsApp para usar la API?
Sí, para enviar mensajes con POST /v1/messages y channel: "whatsapp": salen de su número de WhatsApp Business conectado en el panel. Sin conexión, la API responde 403 WHATSAPP_NOT_CONNECTED y no cobra nada. Solo los códigos OTP (POST /v1/verify/send con channel whatsapp) pasan por el remitente compartido de EnvoiSMS sin conexión.
¿Qué pasa si envío un mensaje libre fuera de la ventana de 24 horas?
La API lo rechaza con 400 OUT_OF_24H_WINDOW antes de cualquier cargo. Envíe en su lugar una plantilla aprobada por Meta: abre una conversación en cualquier momento.
¿Las plantillas de mensajes deben ser aprobadas por Meta?
Sí. Para iniciar una conversación se usa una plantilla aprobada por Meta. La consola permite enviar sus plantillas y seguir su aprobación.
¿Un mensaje puede pasar a SMS si el destinatario no tiene WhatsApp?
Sí: añada cascade: true a un envío de WhatsApp y el mensaje sale como SMS si el número no es accesible o no tiene WhatsApp. Un tipo de mensaje que el SMS no puede llevar (medios, botones…) se rechaza con CASCADE_NOT_SUPPORTED. Para un texto ordinario a un cliente, el canal SMS por defecto sigue siendo la opción correcta.
¿Cómo se factura un mensaje de WhatsApp?
Por mensaje, en dírhams, según la categoría de la plantilla y el país del destinatario, descontado de su saldo prepago sin suscripción. Los precios actualizados están en la página de precios.