curl --request POST \
--url https://api.revem.ai/whatsapp/public/v1/templates/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sender": {
"phoneNumber": "+56912345678"
},
"to": "+56987654321",
"templateName": "confirmacion_pedido",
"languageCode": "es",
"variables": {
"body": {
"nombre": "Ana",
"pedido": "1234"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sender: {phoneNumber: '+56912345678'},
to: '+56987654321',
templateName: 'confirmacion_pedido',
languageCode: 'es',
variables: {body: JSON.stringify({nombre: 'Ana', pedido: '1234'})}
})
};
fetch('https://api.revem.ai/whatsapp/public/v1/templates/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/whatsapp/public/v1/templates/send"
payload = {
"sender": { "phoneNumber": "+56912345678" },
"to": "+56987654321",
"templateName": "confirmacion_pedido",
"languageCode": "es",
"variables": { "body": {
"nombre": "Ana",
"pedido": "1234"
} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ticketId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"ok": true,
"conversationId": null,
"ticketId": null,
"messageId": "<string>",
"warning": "send_accepted_incomplete"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}Enviar una plantilla de WhatsApp
Envía una plantilla aprobada desde un número de tu organización. Dentro de las 24 horas desde el último mensaje entrante, las plantillas de texto sin botones ni cabeceras multimedia se envían como mensajes de texto libre; en los demás casos se envían como plantilla. Registra el mensaje en la conversación y aplica la política de tickets del canal. No asigna el ticket a un usuario ni cambia a modo manual. La aceptación no garantiza entrega. No hay deduplicación: repetir una solicitud puede enviar otro mensaje; no reintentes automáticamente un error de resultado incierto.
curl --request POST \
--url https://api.revem.ai/whatsapp/public/v1/templates/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sender": {
"phoneNumber": "+56912345678"
},
"to": "+56987654321",
"templateName": "confirmacion_pedido",
"languageCode": "es",
"variables": {
"body": {
"nombre": "Ana",
"pedido": "1234"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sender: {phoneNumber: '+56912345678'},
to: '+56987654321',
templateName: 'confirmacion_pedido',
languageCode: 'es',
variables: {body: JSON.stringify({nombre: 'Ana', pedido: '1234'})}
})
};
fetch('https://api.revem.ai/whatsapp/public/v1/templates/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/whatsapp/public/v1/templates/send"
payload = {
"sender": { "phoneNumber": "+56912345678" },
"to": "+56987654321",
"templateName": "confirmacion_pedido",
"languageCode": "es",
"variables": { "body": {
"nombre": "Ana",
"pedido": "1234"
} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ticketId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"ok": true,
"conversationId": null,
"ticketId": null,
"messageId": "<string>",
"warning": "send_accepted_incomplete"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}{
"error": "<string>",
"ok": false,
"message": "<string>"
}Authorizations
La API key de tu organización, con la forma rvm_<prefijo>.<secreto>, enviada como Authorization: Bearer rvm_…. Revem la emite y sólo se muestra una vez; si la pierdes se reemplaza, no se recupera.
Body
Exactamente uno: phoneNumberId (ID de Meta) o phoneNumber (teléfono internacional con código de país, sin espacios). Debe pertenecer a tu organización.
- Option 1
- Option 2
Show child attributes
Show child attributes
Teléfono del destinatario con código de país, sin espacios. El + es opcional.
^\+?[1-9]\d{6,14}$Nombre exacto de la plantilla aprobada en la cuenta del remitente.
512^[a-z0-9_]+$Idioma exacto de la plantilla, por ejemplo es o es_CL.
^[a-z]{2,3}(?:_[A-Z]{2})?$Mapas de claves y valores de texto, separados en header y body. Usa nombres sin llaves (nombre) o posiciones (1, 2). buttons usa el índice del botón desde cero y el sufijo de su URL dinámica. No se aceptan claves faltantes ni desconocidas.
Show child attributes
Show child attributes
ID de una imagen previamente guardada en Revem para esta plantilla. Obligatorio sólo para cabeceras IMAGE. Cabeceras de video/documento y botones especiales no se admiten.
Nombre utilizado al resolver el contacto destinatario.
1 - 200