Documentación interactiva · Portal de desarrolladores · Especificación OpenAPI · EN · FR · DE · IT · PT · ES
URL base : https://api.mailpro.com/sms
La API de SMS de Mailpro™ permite gestionar mediante programación listas de contactos telefónicos, números de teléfono y enviar mensajes SMS masivos o individuales.
Todos los endpoints aceptan tres métodos de autenticación. Utilice el que mejor se adapte a su stack.
POST /token, sin scopes.> Los métodos heredados Bearer JWT e id_client+api_key siguen funcionando sin cambios y no > se restringen por scope. Únicamente los tokens de acceso OAuth 2.0 están sujetos a > las comprobaciones de scope por endpoint que se muestran en cada operación a continuación.
Mailpro opera un único servidor de autorización OAuth 2.0 para todas sus APIs, en una única superficie sin distinción de versión: https://api.mailpro.com/oauth/. No existe un endpoint OAuth por versión: obtiene un token desde /oauth/token y el mismo token funciona en esta API de SMS, en el CRM v3 y en Email v2. Los endpoints a los que puede llamar se rigen por los scopes del token, no por la URL base de la API. Emisor (claim iss): https://api.mailpro.com/oauth/.
| Endpoint | URL |
|---|---|
| Authorize | GET https://api.mailpro.com/oauth/authorize |
| Token / Refresh | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Grants: authorization_code + PKCE (S256, obligatorio), client_credentials, refresh_token (con rotación). TTL del token de acceso 20 min; refresh token 30 días (deslizante, de un solo uso); código de autorización 60 s.
Inicio rápido — obtener un token e invocar esta API (sustituya los marcadores; nunca incluya un secreto real en un commit):
curl -X POST https://api.mailpro.com/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "scope=sms:send sms:read"
A continuación, llame a esta API con Authorization: Bearer ACCESS_TOKEN. El mismo token funciona en las APIs CRM v3 y Email v2. Un token que no disponga del scope requerido por un endpoint recibirá 403 insufficient_scope. Recorrido completo del flujo y catálogo de scopes: consulte la documentación de la API CRM v3 › Autenticación. Scopes relevantes para SMS: sms:send, sms:read, sms:contacts:read, sms:contacts:write, account:read.
Authorization: Bearer <access_token>
Obtenga un token mediante POST /token (form-encoded, grant de contraseña OAuth2):
POST https://api.mailpro.com/sms/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
El mismo token también es válido en la API CRM v3 y en la API Email v2: autentíquese una vez y llame a cualquier API. Los tokens son válidos durante 30 días por defecto; utilice grant_type=refresh_token para renovarlo sin volver a autenticarse. No tiene scopes: prefiera OAuth 2.0 para integraciones instalables.
Dos credenciales:
| Parámetro | Tipo | Descripción |
|---|---|---|
id_client | integer | Su ID numérico de cliente Mailpro, disponible en Ajustes → Acceso a la API |
api_key | string | Su clave de API (formato GUID), disponible en Ajustes → Acceso a la API |
Envíelas en cualquiera de estos lugares — elija uno:
id_client: 12345 y api_key: a1b2c3d4-…. Las URL son registradas por los servidores web, las CDN y los proxys, por lo que una clave en la query string puede filtrarse en los registros de acceso. Las cabeceras no se registran.?id_client=12345&api_key=…. Se mantiene por compatibilidad con integraciones existentes. Migre a las cabeceras tan pronto como pueda.Si proporciona credenciales en más de un lugar, prevalece la cabecera.
Para los tokens emitidos por OAuth, cada grupo de endpoints requiere un scope (la autenticación heredada queda exenta). Cada operación indica su scope en Authorization. Resumen:
| Endpoints | Scope requerido |
|---|---|
/send/* (masivo, individual, planificación) | sms:send |
/history/list, /credit/get | sms:read |
/phone/list, /list/list | sms:contacts:read |
/phone/{add,edit,del}, /list/{edit,del}, /import/upload | sms:contacts:write |
/account/limits | account:read |
> POST /list/add (crear una lista) actualmente es accesible con cualquier > token válido: aún no está restringido por scope. El rechazo por scope en los endpoints > restringidos devuelve 403 con > { "error": "insufficient_scope", "required_scope": "…" }.
Todos los endpoints admiten json (predeterminado) y xml. Especifique el formato en la URL:
/credit/get.json/credit/get.xmlLos nombres de campo en las respuestas están en PascalCase (TotalCredits, FirstName, …), mientras que los parámetros de solicitud están en snake_case (id_client, address_book_id, …). Los endpoints de lista envuelven sus filas en un array Items.
Misma regla en las tres API de Mailpro (Email v2, CRM v3, SMS): 5000 elementos por página, por defecto y como máximo.
NumberOfRecords — elementos por página. Ausente, 0 o por encima de 5000 = 5000.PageNumber — número de página a partir de 1 (por defecto 1).Parámetros desconocidos: se ignoran, nunca se rechazan. Cuando una solicitud lleva un parámetro que la API no reconoce, la respuesta incluye X-Ignored-Parameters (los nombres) y X-Documentation (un enlace a esta página), para que un error tipográfico no pase desapercibido.
Un SMS cuesta créditos del país × número de partes.
Créditos del país — cada país de destino tiene un precio de 1, 2 o 3 créditos, según el prefijo internacional del número. El envío a un número cuyo prefijo no tarifamos se rechaza con un 400.
Número de partes — un mensaje más largo que un SMS lo divide el operador y cada parte se factura. El límite depende de los caracteres utilizados:
| Alfabeto | Mensaje único | Por parte al dividir |
|---|---|---|
| GSM-7 (latino estándar) | 160 caracteres | 153 caracteres |
| Unicode (acentos fuera de GSM-7, cirílico, emoji, …) | 70 caracteres | 67 caracteres |
Un solo carácter fuera de GSM-7 pasa todo el mensaje a Unicode; así, un emoji puede llevar un mensaje de 160 caracteres de 1 a 3 partes. Los caracteres ^ { } [ ] ~ | \ y € cuentan como dos cada uno, aunque sean GSM-7.
*Ejemplo:* un mensaje de 300 caracteres en latino estándar = 2 partes; enviado a un país de 2 créditos, cuesta 2 × 2 = 4 créditos por destinatario.
Los números de teléfono se normalizan automáticamente. Puede enviarlos en muchos formatos: los espacios, guiones, puntos, barras, paréntesis, guiones bajos y espacios no separables se eliminan antes de la validación. Cualquier otro carácter (letras, apóstrofos, =, ;, etc.) invalida el número.
| Válido | No válido |
|---|---|
+41794849980 — E.164 internacional | 0612345678 — formato nacional (0 inicial) |
0041 79 484 99 80 — prefijo 00 + espacios | 41'794'849'80 — apóstrofos (no se eliminan) |
+33 6-12-34-56-78 — + con guiones | tel=0041794849980 — caracteres adicionales |
41794849980 — solo dígitos | 1234567 — demasiado corto (< 8 dígitos) |
Reglas:
+, 00 o sin prefijo0)-, punto ., barra /, paréntesis ( ), guion bajo _, NBSP=, ;, + dentro del número, etc.) → rechazado41794849980)| HTTP | Código | Significado |
|---|---|---|
| 400 | 103 | Entrada malformada — parámetro obligatorio ausente o no válido |
| 202 | 202 | Créditos SMS insuficientes |
| 401 | id_client / api_key no válidos | |
| 500 | 500 | Error interno |
Mailpro™ puede notificar a su servidor en tiempo real cuando se producen eventos SMS en su cuenta (un SMS se entrega, un SMS falla, su saldo de créditos es bajo, etc.). Estilo Stripe: su URL recibe un POST firmado con HMAC-SHA256 en cuanto se dispara el evento.
Cada evento enviado a su webhook cuenta como 1 petición en su cuota de peticiones a la API.
POST /webhooks. La respuesta contiene un secret que se muestra una sola vez (estilo Stripe / GitHub): guárdelo.secret (fragmentos a continuación).> ⏱ Retardo de activación — tras crear, actualizar o eliminar un webhook, el > cambio tarda hasta 10 minutos en propagarse por todos los servidores de la API > de Mailpro. Durante ese intervalo, los eventos pueden no coincidir aún con su nueva suscripción > (o pueden seguir coincidiendo con una recién eliminada). Es el tiempo necesario para > refrescar la caché de suscripciones en memoria de cada instancia de la API.
Todos los eventos comparten un sobre común:
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "sms.queued",
"created": 1748194800,
"apiVersion": "sms",
"account": { "id": 12345, "name": "ACME Corp" },
"data": {
"messageId": 12345,
"to": "41791234567",
"queuedAt": "2026-05-27T14:32:12.0123456Z",
"scheduledAt": "2026-05-27T14:32:12.0123456Z",
"parts": 1
}
}
| Campo | Formato | Descripción |
|---|---|---|
id | evt_ + 32 hex | ID único del evento — utilícelo como clave de idempotencia en su lado. |
type | <dominio>.<verbo> | Tipo de evento canónico. |
created | Segundos Unix UTC | Incluido en la firma HMAC. |
apiVersion | "sms" para los eventos emitidos por POST /sms/send/add_single; "v3" para los eventos emitidos por POST /v3/Sms/SingleSMS; "watcher" para los eventos basados en DLR emitidos por el worker. | Qué componente de Mailpro publicó el evento. |
account.id | int | Su ID de cliente Mailpro (= id_client). |
account.name | string | El nombre de su cuenta (útil para depuración en el cliente). |
data | object | Carga útil del evento — su forma depende de type (véase el catálogo a continuación). |
Solo se emiten realmente los eventos enumerados a continuación. Las formas son el JSON literal enviado por la plataforma: respete estos nombres de campo exactamente al parsearlos.
| Evento | Disparador | Forma de data |
|---|---|---|
ping | Prueba mediante POST /webhooks/{id}/test | { message } |
sms.queued | POST /sms/send/add_single o POST /v3/Sms/SingleSMS aceptado en la cola de envío de Mailpro | { messageId: int, to: string, queuedAt: ISO-8601, scheduledAt: ISO-8601, parts: int } |
sms.delivered | DLR con código de operador 004 u 008 (códigos de éxito) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
sms.failed | DLR con cualquier otro código de operador (timeout, no entregado, rechazado, en lista negra, …) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
credits.sms.low | El saldo de créditos SMS ha caído por debajo de su umbral de alerta (worker CreditsLowWatcher) | { remaining: int, threshold: int, alertedAt: ISO-8601 } |
> Nota — no existe un evento sms.sent. El DLR del operador es la única retroalimentación > que recibe la plataforma entre «en cola» y «entregado/fallido», por lo que el siguiente > evento que recibirá tras sms.queued será sms.delivered (éxito) o > sms.failed (error). La mayoría de los mensajes llegan al operador en segundos y se recibe > un DLR en minutos; las condiciones de la red móvil pueden, en ocasiones, prolongar este plazo > a horas.
> Nomenclatura de campos — sms.queued utiliza to (el destino tal como lo envió > el llamador de la API, tras la normalización). sms.delivered / sms.failed utilizan > phone (el destino tal como lo devolvió el operador en el DLR). Serán > los mismos dígitos en la práctica, pero los nombres difieren porque los eventos > proceden de rutas de código distintas.
Suscríbase a todos los eventos de esta API pasando ["*"] en el array events.
Cada POST incluye una cabecera X-Mailpro-Signature:
X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id: evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: sms.delivered
X-Mailpro-Attempt: 1
Para verificar:
t y v1 de la cabecera.|now - t| > 300 (ventana de protección contra replay de 5 minutos).expected = hex(HMAC_SHA256(secret, t + "." + raw_body)).v1 con expected (crypto.timingSafeEqual, hash_equals, CryptographicOperations.FixedTimeEquals) — nunca con ==.const crypto = require('crypto');
function verifyMailproSignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
if (Math.abs(Date.now() / 1000 - parseInt(parts.t)) > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(parts.t + '.' + rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(parts.v1, 'hex'),
Buffer.from(expected, 'hex'));
}
function verifyMailproSignature(string $rawBody, string $header, string $secret): bool {
parse_str(str_replace(',', '&', $header), $p);
if (abs(time() - (int)$p['t']) > 300) return false;
$expected = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
return hash_equals($expected, $p['v1']);
}
import hmac, hashlib, time
def verify_mailpro_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split('=') for p in header.split(','))
t = int(parts['t'])
if abs(time.time() - t) > 300:
return False
expected = hmac.new(
secret.encode(),
f"{t}.".encode() + raw_body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, parts['v1'])
using System.Security.Cryptography;
using System.Text;
static bool VerifyMailproSignature(string rawBody, string header, string secret) {
var parts = header.Split(',')
.Select(p => p.Split('='))
.ToDictionary(a => a[0], a => a[1]);
var t = long.Parse(parts["t"]);
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
var expected = Convert.ToHexString(hash).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(expected),
Encoding.UTF8.GetBytes(parts["v1"]));
}
| Intento | Espera antes del siguiente |
|---|---|
| 1 → 2 | 10 segundos |
| 2 → 3 | 1 minuto |
| 3 → 4 | 5 minutos |
| 4 → 5 | 30 minutos |
| 5 → 6 | 2 horas |
| 6 → 7 | 6 horas |
| 7 | abandonado (entrega marcada como failed) |
Tras 10 fallos consecutivos en el mismo webhook, este se desactiva automáticamente (isActive: false) y usted recibe un correo de notificación. Reactívelo con PUT /webhooks/{id} una vez que su endpoint esté corregido.
Consideramos su webhook como satisfactorio únicamente si devuelve un estado dentro de 200–299. Cualquier 3xx/4xx/5xx o un timeout (> 10 s) cuenta como un fallo y dispara reintentos. Si su endpoint está caído permanentemente, devuelva 410 Gone de forma explícita: los reintentos seguirán produciéndose, pero el motivo del fallo quedará más claro en su registro de entregas.
| Límite | Valor |
|---|---|
| Webhooks por cuenta | 20 |
| Eventos suscritos por webhook | 50 |
| Tamaño máximo del payload | 256 KB |
| Timeout HTTP por intento | 10 segundos |
| Retención del historial de entregas | 30 días |
Obtenga un token JWT Bearer para autenticar todas las demás llamadas a la API. El endpoint SMS /token es una redirección 307 al emisor canónico /v3/token — su cliente HTTP sigue la redirección de forma transparente (se conservan el método POST y el cuerpo).
/tokenObtener token de acceso (redirección 307 a /v3/token)
Obtiene un token JWT Bearer utilizando las credenciales de cliente de Mailpro. Pase el access_token devuelto como Authorization: Bearer <token> en todas las solicitudes posteriores. El mismo token también es válido en la API CRM v3 y en la API Email v2.
> ⚙ Detalle de implementación — POST /sms/token es una redirección > temporal 307 a POST /v3/token (configurada en la capa de reescritura > del web.config de IIS). HTTP 307 conserva tanto el método (POST) > como el cuerpo de la solicitud, por lo que cualquier cliente HTTP conforme > a la norma sigue la redirección de forma transparente — usted sigue haciendo POST a /sms/token > y recibe un JWT válido. No hay lógica de emisión de tokens duplicada; la API > SMS nunca emite tokens por sí misma.
| Tipo de grant | Caso de uso |
|---|---|
password | Integración estándar — nombre de usuario + clave de API |
refresh_token | Renovar un token de acceso a punto de caducar sin volver a autenticarse |
client_credentials | Servidor a servidor solo con el ID de cliente |
Utilice grant_type=refresh_token para renovar el token de acceso sin volver a autenticarse. Almacene los tokens en el lado del servidor (Vault, variables de entorno); nunca los incruste en JS de navegador ni en binarios de aplicaciones móviles. Consulte la nota de seguridad completa en la documentación de /token de la API CRM v3.
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | sí | |
username | string | Su nombre de usuario de Mailpro (correo electrónico). Obligatorio para el grant password. | |
password | string | Su clave de API de Mailpro (formato GUID). Obligatorio para el grant password. | |
refresh_token | string | Refresh token anterior. Obligatorio para el grant refresh_token. | |
client_id | string | Su ID de cliente de Mailpro (entero). Obligatorio para el grant client_credentials. |
Respuestas
| Código | Descripción |
|---|---|
200 | Token emitido correctamente. Devuelto por POST /v3/token tras el
seguimiento transparente del 307 — su cliente HTTP ve un 200 normal con
la misma estructura de cuerpo que recibiría directamente del endpoint
de tokens v3.
|
307 | Redirección temporal a POST /v3/token, emitida por la regla de reescritura
de IIS en web.config. Los clientes HTTP conformes a la norma la siguen
automáticamente y conservan el método POST original junto con el cuerpo del formulario.
Solo es visible para los clientes que desactivan explícitamente el seguimiento de redirecciones
(p. ej., curl --max-redirs 0).
|
400 | Credenciales no válidas o tipo de grant no admitido |
Ejemplo 200
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 31535999,
"userName": "12345",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"application": null
}
Ejemplo 400
{
"error": "invalid_grant",
"error_description": "The username or password is incorrect."
}
Compruebe su saldo de créditos SMS, su cuota mensual de API y el estado de su cuenta.
/account/limits.{format}Obtener la cuota mensual de la API
Devuelve la cuota mensual de solicitudes de la API para el cliente autenticado.
Cálculo de la cuota: el límite se calibra a partir de los créditos de la suscripción de correo electrónico (normalmente subscription_credits × 5). Para un plan de 10 000 correos electrónicos al mes, esto da un presupuesto mensual de 50 000 solicitudes. Se restablece en la fecha de aniversario de la suscripción (no el día 1 del mes natural).
Qué consume créditos:
v2, v3 o sms.Qué es GRATIS (no consume créditos):
/health.401, 403 o 429.La cuota se comparte entre las 3 APIs de Mailpro (v2, v3, sms) — un cliente = un presupuesto mensual para toda la plataforma. Los envíos SMS consumen adicionalmente el saldo dedicado de créditos SMS (GET /credit/get.{format}).
Scope OAuth : account:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Instantánea de la cuota |
401 | Credenciales no válidas |
404 | No se encontró registro de cuota (cuenta recién creada; la fila se creará en la primera solicitud autenticada). |
Ejemplo 200
{
"monthlyLimit": 50000,
"remaining": 32847,
"used": 17153,
"isFree": false,
"remainedSendsForFree": null
}
Envíe mensajes SMS — ya sea un único SMS transaccional a un destinatario, o una campaña masiva a toda una lista de contactos.
/send/add.{format}Enviar SMS masivos a una lista de contactos
Envía un mensaje SMS a todos los números de teléfono de una lista de contactos. Admite la programación: establezca scheduled_time en una fecha futura para enviar más tarde, o omítalo para enviar de inmediato.
Consumo de créditos: los créditos se descuentan en el momento del envío. Los mensajes largos (>160 caracteres GSM-7) se dividen en varias partes, cada una con un coste adicional en créditos.
La respuesta devuelve { "Error": "Insufficient Credit", "Code": 202 } si la cuenta no tiene créditos suficientes.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
message | string | sí | Texto del mensaje SMS. Manténgalo por debajo de 160 caracteres para un SMS de una sola parte. Los caracteres que no pertenecen al alfabeto GSM-7 (p. ej., chino, árabe, emojis) cambian la codificación a Unicode, reduciendo el límite a 70 caracteres por parte. |
to | integer | sí | ID de la lista de contactos a la que enviar (de /list/list) |
scheduled_time | string (date-time) | Programe el envío para una fecha/hora futura (ISO 8601). Omita o deje vacío para enviar de inmediato. | |
shorten_urls | boolean | Indique true para sustituir cada enlace del mensaje por un enlace corto https://mailp.ro/m/...: menos caracteres, por lo que a veces menos partes de SMS facturadas. Un enlace que no se pueda acortar se queda como está. |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío masivo de SMS creado correctamente |
202 | Créditos SMS insuficientes |
400 | Falta el campo obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"Id": 6001,
"Message": "Flash sale today only — 30% off all orders. Shop now at mailpro.com/shop",
"ScheduledTime": "2026-04-20T10:00:00",
"To": [
"42"
]
}
Ejemplo 202
{
"Error": "Insufficient Credit",
"Code": 202
}
Ejemplo 400
{
"Error": "Malformed Input",
"Code": 103
}
/send/add_single.{format}Enviar un único SMS (GET)
Envía un único SMS a un destinatario mediante una solicitud GET. Útil para integraciones sencillas donde POST no esté disponible. Las credenciales y el mensaje se pasan como parámetros de consulta.
Nota: evite usar GET para mensajes sensibles — los parámetros de consulta aparecen en los registros del servidor. Utilice preferentemente POST /send/add_single.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
to | query | string | sí | Número de teléfono del destinatario. Acepta +41…, 0041… o 41… con o sin separadores. Consulte Formato del número de teléfono en la descripción de la API. |
message | query | string | sí | Texto del mensaje SMS (máx. 160 caracteres para la codificación estándar) |
scheduled_time | query | string (date-time) | Programe el envío (ISO 8601). Omita para enviar de inmediato. | |
shorten_urls | query | boolean | Indique true para sustituir cada enlace del mensaje por un enlace corto https://mailp.ro/m/...: menos caracteres, por lo que a veces menos partes de SMS facturadas. Un enlace que no se pueda acortar se queda como está. |
Respuestas
| Código | Descripción |
|---|---|
200 | SMS enviado (o programado) correctamente |
202 | Créditos SMS insuficientes |
400 | Falta el parámetro obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"Id": 5001,
"Message": "Your appointment is confirmed for tomorrow at 10:00.",
"ScheduledTime": "2026-04-15T09:00:00",
"To": "0041791234567",
"Charge": "1"
}
/send/add_single.{format}Enviar un único SMS
Envía un único mensaje SMS a un número de teléfono destinatario. Admite programación mediante scheduled_time.
Consumo de créditos: los créditos se descuentan en el momento del envío. El campo Charge de la respuesta muestra cuántos créditos se consumieron.
La respuesta devuelve { "Error": "Insufficient Credit", "Code": 202 } si la cuenta no tiene créditos suficientes.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
message | string | sí | Texto del mensaje SMS |
to | string | sí | Número de teléfono del destinatario. Acepta +41…, 0041… o 41… con o sin separadores. Consulte Formato del número de teléfono en la descripción de la API. |
scheduled_time | string (date-time) | Programe el envío para una hora futura. Omita para enviar de inmediato. | |
shorten_urls | boolean | Indique true para sustituir cada enlace del mensaje por un enlace corto https://mailp.ro/m/...: menos caracteres, por lo que a veces menos partes de SMS facturadas. Un enlace que no se pueda acortar se queda como está. |
Respuestas
| Código | Descripción |
|---|---|
200 | SMS enviado (o programado) correctamente |
202 | Créditos SMS insuficientes |
400 | Falta el campo obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"Id": 5001,
"Message": "Your verification code is 8472. Valid for 10 minutes.",
"ScheduledTime": "2026-04-15T14:30:00",
"To": "0041791234567",
"Charge": "1"
}
Ejemplo 202
{
"Error": "Insufficient Credit",
"Code": 202
}
Ejemplo 400
{
"Error": "Malformed Input",
"Code": 103
}
/send/list.{format}Listar las campañas SMS
Devuelve la lista de campañas SMS (envíos masivos) de la cuenta. Paginación mediante las cabeceras NumberOfRecords y PageNumber.
Utilice type_to para filtrar por tipo de envío:
0 (por defecto) — envíos masivos a listas1 — envíos individuales únicosScope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
type_to | query | integer: 0, 1 | Filtro de tipo de envío:
- 0 (por defecto) — envíos masivos a una lista de contactos
- 1 — envíos individuales a un solo número
|
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de campañas SMS devuelta correctamente |
401 | Credenciales no válidas |
Ejemplo 200
[
{
"Id": 5001,
"Message": "Your verification code is 8472",
"ScheduledTime": "2026-04-15T09:00:00",
"To": "41791234567"
}
]
/send/del.{format}Cancelar o eliminar un envío de SMS
Cancela un envío SMS programado pendiente, o elimina uno completado del historial. Solo se pueden cancelar los envíos programados para el futuro. Los envíos en curso no se pueden detener.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
id_send | integer | sí | ID del envío SMS que se va a cancelar o eliminar (de /send/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío SMS cancelado o eliminado correctamente |
400 | Falta id_send |
401 | Credenciales no válidas |
500 | Eliminación fallida (envío no encontrado o ya procesado) |
Ejemplo 200
{
"Result": "OK"
}
Ejemplo 500
{
"Error": "Delete failed",
"Code": 500
}
/send/scheduled.{format}Listar mis envíos SMS programados
Devuelve los envíos SMS (únicos o de campaña) programados para una fecha futura que aún no se han despachado. Útil antes de llamar a /cancel o /reschedule.
Los registros se ordenan por scheduled_time ascendente.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
id_client | query | integer | sí | |
api_key | query | string | sí | |
NumberOfRecords | header | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). Cabecera HTTP o parámetro de query. | |
PageNumber | header | integer | Número de página (basado en 1) para las respuestas paginadas. Se envía como cabecera HTTP. |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de envíos SMS programados |
401 | Credenciales no válidas |
Ejemplo 200
[
{
"Id": 9001,
"Message": "Black Friday: 30% off until midnight.",
"ScheduledTime": "2026-11-27T12:00:00",
"To": "+33671234567"
}
]
/send/{id_send}/cancel.{format}Cancelar un envío SMS programado
Cancela un SMS programado que aún no se ha despachado. Si el envío ya se ha procesado (o no existe / pertenece a otro cliente), devuelve 409 Conflict.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
id_send | path | integer | sí |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | |
api_key | string | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío cancelado |
401 | Credenciales no válidas |
409 | Ya despachado o no encontrado |
Ejemplo 200
{
"Result": "OK",
"Cancelled": 9001
}
Ejemplo 409
{
"error": "conflict",
"message": "Send not found, not owned by client, or already dispatched."
}
/send/{id_send}/reschedule.{format}Reprogramar un envío SMS programado
Actualiza la fecha prevista de un SMS programado que aún no se ha despachado. La nueva fecha debe ser futura y dentro de los 90 días.
Nombre del campo de fecha: la API acepta scheduled_time (principal) así como los alias heredados PlanDate, date_planned y DatePlanned. Proporcione cualquiera de ellos — se utiliza el primero que no sea nulo.
Scope OAuth : sms:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
id_send | path | integer | sí |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | |
api_key | string | sí | |
scheduled_time | string (date-time) | Nombre de campo principal. | |
PlanDate | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. | |
date_planned | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. | |
DatePlanned | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío reprogramado |
400 | scheduled_time ausente o no válido |
401 | Credenciales no válidas |
409 | Ya despachado, no encontrado o nueva fecha fuera de rango |
Ejemplo 200
{
"Result": "OK",
"Id": 9001,
"NewScheduledTime": "2026-12-31T14:30:00"
}
Ejemplo 409
{
"error": "conflict",
"message": "Reschedule failed — send not found, already dispatched, or new date out of range."
}
Gestione listas de contactos SMS. Una lista de contactos agrupa números de teléfono para envíos masivos. Puede crear hasta 1000 listas por cuenta (mismo límite en las tres API de Mailpro y en la app).
/list/list.{format}Listar las listas de contactos telefónicos
Devuelve todas las listas de contactos SMS de la cuenta. Utilice los valores Id devueltos al enviar campañas SMS masivas o al añadir números de teléfono.
Scope OAuth : sms:contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Listas de teléfonos devueltas correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Items": [
{
"AddressBookId": 42,
"Name": "Newsletter subscribers",
"TotalNumberPhones": 1547
},
{
"AddressBookId": 43,
"Name": "Loyalty program",
"TotalNumberPhones": 823
}
]
}
/list/add.{format}Crear una lista de contactos
Crea una nueva lista de contactos SMS con el nombre indicado. La lista comienza vacía — añada números de teléfono con POST /phone/add. Máximo 1000 listas por cuenta (mismo límite en las tres API de Mailpro y en la app). Devuelve HTTP 422 si se alcanza el límite.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
name | string | sí | Nombre visible de la nueva lista de contactos |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de contactos creada correctamente |
400 | Falta el campo obligatorio (name) |
401 | Credenciales no válidas |
Ejemplo 200
{
"Id": 44,
"Name": "Spring campaign 2026",
"NumberPhones": 0
}
Ejemplo 400
{
"Error": "Malformed Input",
"Code": 103
}
/list/edit.{format}Renombrar una lista de contactos
Actualiza el nombre visible de una lista de contactos SMS existente. Los números de teléfono de la lista no se ven afectados.
Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
address_book_id | integer | sí | ID de la lista de contactos a renombrar (de /list/list) |
name | string | sí | Nuevo nombre visible para la lista de contactos |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de contactos renombrada correctamente |
400 | Falta el campo obligatorio |
401 | Credenciales no válidas |
/list/del.{format}Eliminar una lista de contactos
Elimina de forma permanente una lista de contactos SMS y todos los números de teléfono que contiene. Esta acción no se puede deshacer.
Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
address_book_id | integer | sí | ID de la lista de contactos que se va a eliminar |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de contactos eliminada correctamente |
400 | Falta address_book_id |
401 | Credenciales no válidas |
Gestione números de teléfono individuales dentro de una lista de contactos — añada, actualice y elimine entradas.
/phone/list.{format}Listar los números de teléfono de una lista de contactos
Devuelve una lista paginada de los números de teléfono de una lista de contactos concreta. Utilice address_book_id para especificar qué lista desea recuperar. Paginación: NumberOfRecords y PageNumber (5000 por página por defecto, página 1).
Scope OAuth : sms:contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
address_book_id | query | integer | sí | ID de la lista de contactos de la que se van a recuperar los números de teléfono |
NumberOfRecords | header | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). Cabecera HTTP o parámetro de query. | |
PageNumber | header | integer | Número de página (basado en 1) para las respuestas paginadas. Se envía como cabecera HTTP. | |
SortByName | header | boolean | Establézcalo en true para ordenar los resultados alfabéticamente por nombre. |
Respuestas
| Código | Descripción |
|---|---|
200 | Números de teléfono devueltos correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Items": [
{
"Id": 1001,
"Number": "41791234567",
"FirstName": "Alice",
"LastName": "Dupont"
},
{
"Id": 1002,
"Number": "33612345678",
"FirstName": "Bob",
"LastName": "Martin"
}
]
}
/phone/add.{format}Añadir uno o varios números de teléfono a una lista
Añade uno o varios números de teléfono a una lista de contactos.
Número único: utilice el campo number.
Importación masiva: utilice el campo phone_list con los números separados por punto y coma: +41791234567;+33612345678;0049301234567
Los números de teléfono aceptan los formatos +, 00 o simple — consulte la Formato del número de teléfono en la descripción de la API para ver la lista completa de entradas aceptadas y rechazadas. Los números duplicados se omiten silenciosamente salvo que se establezca force=1.
Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
address_book_id | integer | sí | ID de la lista de contactos a la que añadir el o los números |
number | string | Número de teléfono único. Acepta +41…, 0041… o 41… con o sin
separadores (espacios, guiones, puntos, barras, paréntesis). Consulte
Formato del número de teléfono en la descripción de la API.
Utilice este campo O phone_list — no ambos.
| |
phone_list | string | Lista de números de teléfono separados por punto y coma para la importación masiva.
Utilice este campo O number — no ambos.
Ejemplo: 0041791234567;0033612345678
| |
firstname | string | Nombre del contacto (opcional, solo para número único) | |
lastname | string | Apellido del contacto (opcional, solo para número único) | |
force | integer: 0, 1 | Establézcalo en 1 para añadir un número aunque se haya dado de baja previamente o ya exista.
Valor por defecto: 0 (los duplicados se omiten).
|
Respuestas
| Código | Descripción |
|---|---|
200 | Número(s) de teléfono añadido(s) correctamente |
400 | Falta el campo obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"Id": 1003,
"Number": "0041791234567",
"FirstName": "Alice",
"LastName": "Dupont"
}
/phone/edit.{format}Actualizar una entrada de número de teléfono
Actualiza el número de teléfono o los datos de contacto de una entrada existente. Utilice number_id (de /phone/list) para identificar la entrada que se va a actualizar. Solo se actualizan los campos proporcionados en la solicitud.
Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
number_id | integer | sí | ID de la entrada del número de teléfono que se va a actualizar (de /phone/list) |
number | string | Nuevo número de teléfono. Acepta +41…, 0041… o 41… con o sin separadores. Consulte Formato del número de teléfono en la descripción de la API. | |
firstname | string | Nuevo nombre del contacto | |
lastname | string | Nuevo apellido del contacto |
Respuestas
| Código | Descripción |
|---|---|
200 | Entrada del número de teléfono actualizada correctamente |
400 | Falta number_id |
401 | Credenciales no válidas |
/phone/del.{format}Eliminar un número de teléfono de una lista
Elimina permanentemente una entrada de número de teléfono concreta de su lista de contactos. Utilice number_id (de /phone/list) para identificar la entrada.
Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_client | integer | sí | Su ID de cliente de Mailpro |
api_key | string | sí | Su clave de API (GUID) |
number_id | integer | sí | ID de la entrada del número de teléfono que se va a eliminar (de /phone/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Número de teléfono eliminado correctamente |
400 | Falta number_id |
401 | Credenciales no válidas |
Compruebe el saldo restante de créditos SMS de su cuenta (independiente de la cuota mensual de solicitudes de la API — consulte /account/limits).
/credit/get.{format}Obtener el saldo de créditos SMS
Devuelve el saldo actual de créditos SMS de su cuenta. Los créditos SMS se consumen en el momento del envío. Un SMS estándar (≤160 caracteres GSM-7) cuesta 1 crédito. Los mensajes más largos o los que contengan caracteres especiales pueden costar más.
> Nota: esto devuelve su saldo de créditos de envío de SMS, no su cuota de solicitudes de la API. > Para la cuota de la API consulte GET /account/limits.{format}.
Scope OAuth : sms:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Saldo de créditos devuelto correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"TotalCredits": 5000
}
Consulte el registro completo de las campañas SMS pasadas.
/history/list.{format}Listar el historial de envíos de SMS
Devuelve un registro paginado de todas las campañas SMS pasadas enviadas desde esta cuenta. Los resultados se ordenan por fecha descendente (los más recientes primero). Paginación: NumberOfRecords y PageNumber (cabeceras o query, 5000 por página por defecto).
Scope OAuth : sms:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de historial devuelta correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Items": [
{
"Id": 583294,
"DateSent": "2026-07-17T18:56:39.813",
"Message": "Your verification code is 8472",
"Charge": 3,
"Parts": 1
}
]
}
Cargue un archivo CSV o XLSX para importar números de teléfono a una lista de contactos de forma masiva. El archivo se pone en cola para procesarse de manera asíncrona — realice el seguimiento de la finalización mediante el ImportJobId devuelto o mediante el callback opcional webhook_url.
/import/upload.{format}Cargar un archivo de números de teléfono (CSV / XLSX) para importación masiva
Cargue un archivo CSV o XLSX para importar números de teléfono a una lista de contactos. El archivo se almacena y se pone en cola para procesarse de manera asíncrona — el endpoint devuelve inmediatamente un ImportJobId.
Tipo de solicitud: multipart/form-data
Campos de formulario obligatorios:
id_client (entero) — su ID de cliente de Mailproapi_key (cadena) — su clave de APIid_list (entero) — ID de la lista de contactos de destinofile (binario) — el archivo CSV o XLSX que se va a cargarOpcional:
webhook_url (cadena) — URL HTTPS llamada cuando finaliza el procesamiento. Recibe una carga útil JSON con el estado final (success / failed) y los recuentos de filas importadas / omitidas / no válidas.Formato del archivo:
Phone o PhoneNumber — sin distinción entre mayúsculas y minúsculas)+41791234567Scope OAuth : sms:contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Cuerpo de la solicitud (multipart/form-data)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_list | integer (int64) | sí | ID de la lista de contactos de destino |
file | string (binary) | sí | Archivo CSV o XLSX (UTF-8, máx. 50 MB) |
webhook_url | string (uri) | URL de callback invocada cuando finaliza el procesamiento |
Respuestas
| Código | Descripción |
|---|---|
200 | Archivo aceptado y puesto en cola |
400 | No se ha cargado ningún archivo o falta id_list |
401 | Credenciales no válidas |
500 | Error del servidor o del almacenamiento |
Ejemplo 200
{
"Result": "OK",
"ImportJobId": 15,
"InternalName": "230575-20260420142616-phones.csv"
}
Suscriba su servidor a notificaciones en tiempo real de eventos SMS. Mailpro envía mediante POST una carga útil JSON firmada con HMAC a su URL en cuanto se produce el evento suscrito. Consulte la sección «Webhooks» de la introducción para ver el catálogo completo de eventos, el sobre de la carga útil, los fragmentos de verificación de firma y la política de reintentos.
/webhooksListar webhooks
Devuelve todos los webhooks configurados en la cuenta autenticada.
Respuestas
| Código | Descripción |
|---|---|
200 | Matriz de webhooks |
401 | Credenciales no válidas |
Ejemplo 200
{
"items": [
{
"id": 14,
"url": "https://example.com/hooks/mailpro",
"description": "Integración con Slack",
"is_active": true,
"created_at": "2026-07-01T21:09:52.43",
"updated_at": "2026-07-21T18:56:08.02",
"last_delivery_at": "2026-07-21T18:56:07.653",
"last_delivery_status": 200,
"consecutive_failures": 0,
"events": [
"sms.delivered",
"sms.failed"
]
}
],
"total": 1
}
/webhooksCrear un webhook
Crea una nueva suscripción de webhook. La respuesta contiene un secret que se muestra una sola vez — almacénelo inmediatamente en el lado del servidor. Utilícelo para verificar la firma HMAC de cada carga útil entrante.
Límites: máx. 20 webhooks por cuenta, máx. 50 eventos por webhook.
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
url | string (uri) | sí | Endpoint HTTPS (HTTP rechazado en producción) |
events | array of string | sí | Lista de tipos de evento a los que suscribirse (consulte el catálogo anterior). Utilice ["*"] para suscribirse a todos los eventos de esta API. |
description | string |
Ejemplo
{
"url": "https://example.com/hooks/mailpro",
"events": [
"sms.delivered",
"sms.failed"
],
"description": "Integración con Slack"
}
Respuestas
| Código | Descripción |
|---|---|
201 | Webhook creado — el secret se devuelve únicamente aquí |
400 | URL no válida, lista de eventos no válida o límite superado |
401 | Credenciales no válidas |
Ejemplo 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"sms.delivered",
"sms.failed"
],
"description": "Integración con Slack",
"isActive": true,
"consecutiveFailures": 0,
"autoDisabledAt": null,
"autoDisabledReason": null,
"createdAt": "2026-05-25T10:00:00Z",
"updatedAt": "2026-05-25T10:00:00Z",
"secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}
/webhooks/{id}Obtener un webhook
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | El webhook |
404 | Webhook no encontrado |
/webhooks/{id}Actualizar un webhook
Actualización parcial — solo se modifican los campos enviados.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Establézcalo en true para volver a habilitar un webhook desactivado automáticamente una vez corregido su endpoint. |
Respuestas
| Código | Descripción |
|---|---|
200 | Webhook actualizado |
400 | Carga útil no válida |
404 | Webhook no encontrado |
/webhooks/{id}Eliminar un webhook
Elimina permanentemente el webhook y todo su historial de entregas.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
204 | Eliminado |
404 | Webhook no encontrado |
/webhooks/{id}/testEnviar un evento de prueba
Pone en cola un evento ping inmediato (o cualquier otro tipo de evento mediante el campo eventType del cuerpo) hacia su endpoint. Útil para comprobar la accesibilidad y la verificación de firma antes de depender de eventos reales.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
eventType | string |
Ejemplo
{
"eventType": "ping"
}
Respuestas
| Código | Descripción |
|---|---|
202 | Evento puesto en cola para su despacho |
404 | Webhook no encontrado |
Ejemplo 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretRotar el secreto HMAC
Genera un nuevo secreto HMAC e invalida el anterior de inmediato. El nuevo secreto se devuelve una sola vez en la respuesta — almacénelo. Cada entrega a partir de ese momento se firmará con el nuevo secreto.
Utilícelo si sospecha que su secreto se ha visto comprometido.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Nuevo secreto (visible una sola vez) |
404 | Webhook no encontrado |
Ejemplo 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesListar los intentos de entrega
Devuelve el historial de intentos de despacho de este webhook (retención de 30 días). Útil para la depuración — qué eventos se enviaron, los códigos de estado recibidos, los recuentos de reintentos y los mensajes de error.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
limit | query | integer | ||
cursor | query | integer (int64) | Cursor de paginación (= último ID de entrega visto). Devuelve las entregas con id < cursor. |
Respuestas
| Código | Descripción |
|---|---|
200 | Matriz de intentos de entrega (más recientes primero) |
404 | Webhook no encontrado |
/webhooks/{id}/deliveries/{deliveryId}/replayReproducir una entrega
Pone en cola un nuevo intento de entrega con la misma carga útil que la original. Útil para volver a activar una entrega fallida tras corregir su endpoint. Se crea una NUEVA fila Webhook_Delivery (la original se conserva para auditoría). La reproducción sigue la política de reintentos estándar (mismo calendario de backoff, misma regla de desactivación automática tras 10 fallos).
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
deliveryId | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
202 | Reproducción puesta en cola |
404 | Webhook o entrega no encontrado |