Base URL y autenticación
https://wapiflex.link
Incluye las credenciales en cada solicitud:
x-public-key: identificador público.x-secret-key: secreto mostrado al generar la clave.Idempotency-Key: obligatorio al crear un envío.


Consulta plantillas, calcula una estimación y envía a uno o varios destinatarios mediante jobs idempotentes.
Descargar OpenAPI JSONhttps://wapiflex.link
Incluye las credenciales en cada solicitud:
x-public-key: identificador público.x-secret-key: secreto mostrado al generar la clave.Idempotency-Key: obligatorio al crear un envío.GET /api/v1/connection.GET /api/v1/templates para obtener el ID y las variables.POST /api/v1/template-messages/estimate.POST /api/v1/template-messages/send.GET /api/v1/template-messages/{job_id} o recibe webhooks.Los nombres son estables y corresponden a la estructura de Meta:
header.1: primera variable de encabezado.header.media: URL pública del archivo de encabezado.body.1, body.2: variables del cuerpo.button.0.1: variable del primer botón URL.La consulta de plantillas devuelve únicamente las variables que debes enviar.
curl -X POST https://wapiflex.link/api/v1/template-messages/send \ -H "Content-Type: application/json" \ -H "x-public-key: pk_xxx" \ -H "x-secret-key: sk_xxx" \ -H "Idempotency-Key: pedido-10001" \ -d '{
"template_id": 123,
"currency": "PEN",
"recipients": [
{
"phone": "51999999999",
"external_id": "cliente-1001",
"variables": {
"body.1": "Carlos",
"body.2": "S/ 100.00"
}
}
]
}'const response = await fetch("https://wapiflex.link/api/v1/template-messages/send", { method: "POST", headers: { "Content-Type": "application/json", "x-public-key": "pk_xxx", "x-secret-key": "sk_xxx", "Idempotency-Key": "pedido-10001" }, body: JSON.stringify({
"template_id": 123,
"currency": "PEN",
"recipients": [
{
"phone": "51999999999",
"external_id": "cliente-1001",
"variables": {
"body.1": "Carlos",
"body.2": "S/ 100.00"
}
}
]
}) }); const result = await response.json();$payload = json_decode("{ \"template_id\": 123, \"currency\": \"PEN\", \"recipients\": [ { \"phone\": \"51999999999\", \"external_id\": \"cliente-1001\", \"variables\": { \"body.1\": \"Carlos\", \"body.2\": \"S/ 100.00\" } } ]}", true); $ch = curl_init("https://wapiflex.link/api/v1/template-messages/send"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-public-key: pk_xxx", "x-secret-key: sk_xxx", "Idempotency-Key: pedido-10001" ], CURLOPT_POSTFIELDS => json_encode($payload) ]); $result = json_decode(curl_exec($ch), true);import requests response = requests.post( "https://wapiflex.link/api/v1/template-messages/send", headers={ "x-public-key": "pk_xxx", "x-secret-key": "sk_xxx", "Idempotency-Key": "pedido-10001", }, json={
"template_id": 123,
"currency": "PEN",
"recipients": [
{
"phone": "51999999999",
"external_id": "cliente-1001",
"variables": {
"body.1": "Carlos",
"body.2": "S/ 100.00"
}
}
]
}, ) result = response.json(){ "ok": true, "job_id": "1770e00d-75e6-42be-9d47-55ea77a379db", "status": "queued", "recipients": 1, "links": { "status": "/api/v1/template-messages/1770e00d-75e6-42be-9d47-55ea77a379db" } }El detalle del job muestra el estado y el motivo de error de cada número.
WapiFlex envía un JSON con id, type, created_at y data.
Verifica X-WapiFlex-Signature calculando HMAC-SHA256 sobre:
{X-WapiFlex-Timestamp}.{cuerpo_json_sin_modificar}Los eventos fallidos se reintentan automáticamente con espera progresiva.
401: credenciales inválidas.402: función o cuota no disponible.403: permiso insuficiente o consentimiento requerido.409: sesión desconectada o conflicto de idempotencia.422: plantilla, destinatario o variables inválidas.429: límite de solicitudes o espera mínima activa.