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