Documentación interactiva · Portal de desarrolladores · Especificación OpenAPI · EN · FR · DE · IT · PT · ES
URL base : https://api.mailpro.com/v2
La API Email v2 de Mailpro™ le permite gestionar mediante programación listas de contactos, plantillas de correo, direcciones de remitente y campañas, así como enviar tanto correos masivos como transaccionales.
Todos los endpoints aceptan tres métodos de autenticación. Utilice el que mejor se adapte a su stack.
POST /token, sin scopes.> El Bearer JWT heredado e IdClient+ApiKey siguen funcionando sin cambios y no están > sujetos a los scopes. Solo los tokens de acceso OAuth 2.0 están sujetos a los controles de scope > por endpoint indicados en cada operación más abajo.
Mailpro utiliza un único servidor de autorización OAuth 2.0 para todas sus API, en una superficie única e independiente de la versión: https://api.mailpro.com/oauth/. No existe un endpoint OAuth por versión: usted obtiene un token en /oauth/token y el mismo token funciona en esta API Email v2, en CRM v3 y en SMS. Los endpoints a los que puede llamar dependen de los scopes del token, no de la URL base de la API. Emisor (claim iss): https://api.mailpro.com/oauth/.
| Endpoint | URL |
|---|---|
| Autorización | GET https://api.mailpro.com/oauth/authorize |
| Token / renovación | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Descubrimiento | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Grants: authorization_code + PKCE (S256, obligatorio), client_credentials, refresh_token (rotación). Duración del token de acceso: 20 min; token de actualización: 30 días (deslizantes, de un solo uso); código de autorización: 60 s.
Inicio rápido: obtener un token y llamar a esta API (sustituya los valores; nunca haga commit de un secreto real):
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=email:send email:read"
Después llame a esta API con Authorization: Bearer ACCESS_TOKEN. El mismo token funciona en las API CRM v3 y SMS. Un token al que le falte el scope exigido por un endpoint recibe 403 insufficient_scope. Recorrido completo y catálogo de scopes: consulte la documentación de la API CRM v3 › Autenticación. Scopes útiles para el email: email:send, email:read, email:templates:read, email:templates:write, contacts:read, contacts:write, account:read.
Authorization: Bearer <access_token>
Obtenga un token mediante POST /token (codificado como formulario, OAuth2 password grant):
POST https://api.mailpro.com/v2/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 SMS: autentíquese una sola vez y llame a cualquier API. Los tokens son válidos durante 30 días de forma predeterminada; utilice grant_type=refresh_token para renovarlos sin volver a autenticarse. Sin scopes: prefiera OAuth 2.0 para las integraciones instalables.
Dos credenciales:
| Parámetro | Tipo | Descripción |
|---|---|---|
IdClient | entero | Su identificador numérico de cliente Mailpro, disponible en Configuración → Acceso API |
ApiKey | cadena | Su clave de API, disponible en Configuración → Acceso API |
Envíelas en uno cualquiera de estos lugares — elija solo uno:
IdClient: 12345 y ApiKey: a1b2c3d4-…. Las URL quedan registradas por los servidores web, las CDN y los proxies, de modo que una clave incluida en la cadena de consulta puede filtrarse en los registros de acceso. Las cabeceras no se registran.?IdClient=12345&ApiKey=…. Se conserva por compatibilidad con integraciones existentes. Migre a cabeceras lo antes posible.IdClient=12345&ApiKey=… en application/x-www-form-urlencoded.Si proporciona las credenciales en más de un lugar, prevalece la cabecera.
Para los tokens emitidos por OAuth, cada grupo de endpoints exige un scope (la autenticación heredada está exenta). Cada operación indica su scope en Authorization. Resumen:
| Endpoints | Scope requerido |
|---|---|
/send/* (campañas, transaccional, programación, prueba — salvo /send/{IdSend}/status) | email:send |
/stats/* (salvo /stats/del), /history/list, /send/{IdSend}/status | email:read |
/message/*, /senderEmail/* (lectura) | email:templates:read |
/message/*, /senderEmail/* (add/edit/del), /stats/del | email:templates:write |
/list/list, /email/list | contacts:read |
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/upload | contacts:write |
/account/* | account:read |
Un rechazo por scope devuelve 403 con { "error": "insufficient_scope", "required_scope": "…" }.
Todos los endpoints admiten json (predeterminado) y xml. Especifique el formato en la URL:
/email/list.json/email/list.xmlMisma 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).bodyHTML=true) devuelven 10 elementos por página./email/list añade X-Total-Count (el total real) y X-Truncated: true cuando quedan contactos más allá de la página.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.
| HTTP | Significado |
|---|---|
| 400 | Solicitud incorrecta — falta un parámetro obligatorio o es inválido |
| 401 | No autorizado — IdClient o ApiKey no válidos |
| 403 | Prohibido — se ha alcanzado el límite de la cuenta (p. ej., número máximo de listas) |
| 404 | No encontrado — el recurso solicitado no existe |
| 500 | Error interno del servidor |
Errores derivados de las reglas de negocio:
"Not enough credit available." → 403 — su cuenta no dispone de créditos de correo restantes"Email address unsubscribed." → 400 — el destinatario se ha dado de bajaCada email enviado de forma unitaria (POST /send/sendmail, la API CRM v3, el relé SMTP o una automatización) recibe un identificador. Puede seguirse hasta que el servidor del destinatario lo acepte o lo rechace. Las campañas no están cubiertas aquí: utilice las estadísticas.
POST /send/sendmail.{format} contiene el identificador del envío.email.delivered y email.bounced envían el estado final a su servidor en cuanto se conoce, sin ninguna consulta.GET /send/{IdSend}/status.{format} devuelve el estado actual (tabla más abajo).status | Significado | ¿Final? |
|---|---|---|
queued | Aceptado, en espera de envío. | no |
scheduled | Programado para más tarde (DatePlanned). | no |
sent | Entregado por nuestros servidores, aún sin respuesta del servidor del destinatario. | no |
delivered | Aceptado por el servidor del destinatario (DiagCode = su respuesta SMTP). | sí |
bounced | Rechazado. BounceType: hard = dirección no válida o rechazo definitivo; soft = rechazo tras nuevos intentos (buzón lleno, servidor inaccesible…). | sí |
not_found | Identificador desconocido o que no pertenece a su cuenta. | sí |
Consultar sin entrar en bucle
delivered aparece unos 5 minutos después de la entrega.Retry-After (el número de segundos que debe esperar), y la llamada no cuenta en su cuota.scheduled: no es necesario consultar antes de DatePlanned.Los estados se conservan durante 365 días.
Mailpro™ puede notificar a su servidor en tiempo real cuando se producen ciertos eventos en su cuenta (un correo se entrega, una campaña finaliza, un contacto rebota, etc.). Al estilo de 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 única vez (al estilo de Stripe / GitHub): consérvelo.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 los servidores de la API de Mailpro. > Durante ese intervalo, los eventos pueden no coincidir todavía con su nueva suscripción > (o pueden seguir coincidiendo con una que acaba de eliminarse). Ese es el tiempo necesario para > refrescar la caché en memoria de suscripciones en cada instancia de la API.
Todos los eventos comparten un envoltorio común:
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "email.delivered",
"created": 1748194800,
"apiVersion": "v2",
"account": { "id": 12345, "name": "ACME Corp" },
"data": { "messageId": "...", "email": "[email protected]", "...": "..." }
}
| Campo | Formato | Descripción |
|---|---|---|
id | evt_ + 32 hex | Identificador único del evento — utilícelo como clave de idempotencia en su lado. |
type | <domain>.<verb> | Tipo de evento canónico. |
created | Segundos Unix UTC | Se incluye en la firma HMAC. |
apiVersion | "v2" | Indica qué API de Mailpro publicó el evento. |
account.id | int | Su identificador de cliente Mailpro (= IdClient). |
account.name | string | El nombre de su cuenta (útil para depuración en el lado cliente). |
data | object | Carga útil del evento — la estructura depende de type (consulte el catálogo a continuación). |
| Evento | Disparador | Estructura de data |
|---|---|---|
ping | Prueba mediante POST /webhooks/{id}/test | { message } |
email.processed | Envío aceptado por la canalización | { messageId, email, campaignId, processedAt } |
email.delivered | Un correo individual fue aceptado por el servidor del destinatario — API v2/v3, SMTP o Automation (no campañas). Emitido desde el flujo de entrega de PowerMTA. | { messageId, email, idSending, sendingType, diagCode, deliveredAt } |
email.opened | Impacto en el píxel de seguimiento | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Clic en un enlace rastreado | { messageId, email, campaignId, clickedAt, url, ip, userAgent } |
email.bounced | Rebote duro o blando | { messageId, email, campaignId, bouncedAt, bounceType, reason } |
email.spam_report | Reclamación FBL | { messageId, email, campaignId, reportedAt } |
email.unsubscribed | Clic en el enlace de baja | { messageId, email, campaignId, unsubscribedAt } |
email.dropped | Rechazado antes del envío | { messageId, email, campaignId, droppedAt, reason } |
campaign.started | Comienza la distribución | { campaignId, name, totalRecipients, startedAt } |
campaign.finished | Todos los destinatarios procesados | { campaignId, name, totalSent, totalFailed, finishedAt } |
credits.low | El saldo de créditos de correo está por debajo de su umbral de alerta | { remaining, threshold } |
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: email.delivered
X-Mailpro-Attempt: 1
Para verificar:
t y v1 de la cabecera.|now - t| > 300 (ventana de protección contra repetición 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 | Retardo antes del siguiente intento |
|---|---|
| 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 (la entrega se marca como failed) |
Tras 10 fallos consecutivos en el mismo webhook, este se desactiva automáticamente (isActive: false) y recibirá un correo de notificación. Vuelva a activarlo con PUT /webhooks/{id} una vez que su endpoint esté reparado.
Consideramos que su webhook se ha procesado correctamente solo si devuelve un estado en el rango 200–299. Cualquier 3xx/4xx/5xx o un tiempo de espera agotado (> 10 s) se considera un fallo y dispara reintentos. Si su endpoint está permanentemente inactivo, 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 de la carga útil | 256 KB |
| Tiempo de espera HTTP por intento | 10 segundos |
| Retención del historial de entregas | 30 días |
Obtenga un token Bearer JWT para autenticar todas las demás llamadas a la API. El endpoint /token de v2 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 Bearer JWT 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 CRM API v3 y la SMS API.
> ⚙ Detalle de implementación — POST /v2/token es una redirección > temporal 307 a POST /v3/token (configurada en la capa de reescritura > de IIS web.config). HTTP 307 conserva tanto el método (POST) > como el cuerpo de la solicitud, de modo que cualquier cliente HTTP > conforme con el estándar sigue la redirección de forma transparente — > usted continúa enviando POST a /v2/token y recibe un JWT válido a > cambio. No hay lógica de emisión de tokens duplicada; la Email API v2 > nunca emite tokens por sí misma.
| Tipo de concesión | Caso de uso |
|---|---|
password | Integración estándar — nombre de usuario + clave de API |
refresh_token | Renovar un token de acceso que está a punto de expirar 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 servidor (Vault, variables de entorno); no los incruste nunca en JS de navegador ni en binarios de aplicaciones móviles. Consulte la documentación de /token de la CRM API v3 para ver la nota de seguridad completa.
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 la concesión password. | |
password | string | Su clave de API de Mailpro (formato GUID). Obligatorio para la concesión password. | |
refresh_token | string | Token de actualización anterior. Obligatorio para la concesión refresh_token. | |
client_id | string | Su ID de cliente de Mailpro (entero). Obligatorio para la concesión client_credentials. |
Respuestas
| Código | Descripción |
|---|---|
200 | Token emitido correctamente. Devuelto por POST /v3/token tras seguir
de forma transparente la redirección 307 — su cliente HTTP ve una
respuesta 200 normal con la misma forma 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 con
el estándar la siguen automáticamente y conservan el método POST
original y 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 concesión 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."
}
Consulte su saldo de créditos de correo, su cuota mensual de API y el estado de su suscripción.
/account/credits.{format}Obtener saldo de créditos de correo
Devuelve el saldo restante de créditos de correo de su cuenta de Mailpro. Cada correo enviado consume un crédito. Los créditos no expiran con la suscripción, pero solo pueden utilizarse mientras esta esté activa.
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 | Saldo de créditos devuelto correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Credits": 48500
}
/account/subscriptionEndDate.{format}Obtener fecha de finalización de la suscripción
Devuelve la fecha de caducidad de la suscripción actual de Mailpro. Después de la fecha de caducidad, los envíos quedan bloqueados hasta que se renueve la suscripción.
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 | Fecha de finalización de la suscripción devuelta correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"SubscriptionEndDate": "2027-01-15T00:00:00"
}
/account/limits.{format}Obtener cuota mensual de API
Devuelve la cuota mensual de solicitudes de API del cliente autenticado.
Cálculo de la cuota: el límite se calibra a partir de los créditos de correo de la suscripción (normalmente subscription_credits × 5). Para un plan de 10 000 correos 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 de la API.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.
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 ha encontrado 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": 0
}
Gestione las listas (listas de contactos). Una lista agrupa contactos para campañas masivas. Máximo de 1000 listas por cuenta (mismo límite en las tres API de Mailpro y en la app). Type 0 = lista estándar. Type 1 = lista negra (utilizada para la gestión de bajas).
/list/list.{format}Listar todas las listas
Devuelve todas las listas de la cuenta, ordenadas por fecha de creación (las más recientes primero), a menos que se haya establecido sortByName=true. Utilice type=0 para las listas normales o type=1 para las listas negras.
> Alias heredado: /addressbook/list.{format} — mismo endpoint, mantenido por > compatibilidad retroactiva. Las nuevas integraciones deben utilizar /list/*.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
titleFilter | query | string | Filtrar por título (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
type | query | integer: 0, 1 | 0 = solo listas estándar, 1 = solo listas negras. Omítalo para devolver todas. | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
sortByName | query | boolean | Establezca true para ordenar los resultados alfabéticamente por título |
Respuestas
| Código | Descripción |
|---|---|
200 | Listas devueltas correctamente.
> La respuesta también contiene un campo duplicado heredado AddressBookList (contenido idéntico)
> y cada elemento incluye un duplicado heredado AddressBookID (idéntico a ListID). Las nuevas
> integraciones deben ignorarlos.
|
401 | Credenciales no válidas |
Ejemplo 200
{
"Lists": [
{
"ListID": 101,
"Title": "Newsletter — France",
"Type": 0,
"NumberEmails": 4521,
"CreationDate": "2025-01-15T10:30:00"
},
{
"ListID": 102,
"Title": "Unsubscribers",
"Type": 1,
"NumberEmails": 312,
"CreationDate": "2025-01-15T10:31:00"
}
]
}
/list/add.{format}Crear una lista
Crea una nueva lista (lista de contactos). La lista comienza vacía — añada contactos con /email/add o /email/addSingle. Máximo de 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.
> Alias heredado: /addressbook/add.{format} — mismo endpoint, mantenido por compatibilidad retroactiva.
Scope OAuth : 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 |
|---|---|---|---|
Title | string | sí | Nombre para mostrar de la nueva lista |
Type | integer: 0, 1 | 0 = lista estándar (predeterminado), 1 = lista negra |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista creada correctamente.
> También se devuelve un campo duplicado heredado AddressBookList (contenido idéntico).
|
400 | Falta el Title |
401 | Credenciales no válidas |
422 | Límite de listas (1000) alcanzado |
Ejemplo 200
{
"Lists": [
{
"ListID": 103,
"Title": "Spring Campaign 2026",
"Type": 0,
"NumberEmails": 0,
"CreationDate": "2026-04-14T12:00:00"
}
]
}
/list/edit.{format}Renombrar una lista
Actualiza el título de una lista existente. Los contactos que contiene no se ven afectados.
> Alias heredado: /addressbook/edit.{format} — mismo endpoint, mantenido por compatibilidad retroactiva. > El nombre de parámetro AddressBookID también se acepta como alias heredado de ListID.
Scope OAuth : 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 |
|---|---|---|---|
ListID | integer | sí | ID de la lista que se va a renombrar (de /list/list). También se acepta el alias heredado AddressBookID. |
Title | string | sí | Nuevo título de la lista |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista renombrada correctamente |
400 | Falta ListID o Title |
401 | Credenciales no válidas |
404 | Lista no encontrada |
/list/del.{format}Eliminar una lista
Elimina permanentemente una lista y todos los contactos que contiene. Esta acción no se puede deshacer.
> Alias heredado: /addressbook/del.{format} — mismo endpoint, mantenido por compatibilidad retroactiva. > El nombre de parámetro AddressBookID también se acepta como alias heredado de ListID.
Scope OAuth : 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 |
|---|---|---|---|
ListID | integer | sí | ID de la lista que se va a eliminar. También se acepta el alias heredado AddressBookID. |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista eliminada correctamente |
400 | Falta ListID |
401 | Credenciales no válidas |
404 | Lista no encontrada |
Ejemplo 200
{
"Result": "OK"
}
Gestione contactos de correo individualmente. Los contactos pertenecen a una o varias listas. Utilice la importación masiva (/email/add) para grandes lotes, o la adición de un único contacto (/email/addSingle) para inscripciones individuales con valores de campos personalizados.
/email/list.{format}Listar contactos
Devuelve una lista paginada de contactos de correo de la cuenta. Filtre por lista o por patrón de correo. Los resultados se ordenan alfabéticamente cuando sortByName=true; de lo contrario, por orden de inserción.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
emailFilter | query | string | Filtrar por dirección de correo (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
listId | query | integer | Devolver solo los contactos de esta lista. También se acepta el alias heredado addressBookId. | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
sortByName | query | boolean | Establezca true para ordenar los resultados alfabéticamente por dirección de correo |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de contactos devuelta correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Emails": [
{
"IdEmail": 10001,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont"
}
]
}
/email/add.{format}Importar contactos (masivo)
Importa una o varias direcciones de correo en una lista en una única solicitud. Proporcione las direcciones en EmailList separadas por punto y coma.
Ejemplo: [email protected];[email protected];[email protected]
Este endpoint solo importa direcciones de correo. Para establecer también valores de campos personalizados, utilice /email/addSingle para cada contacto.
Las direcciones dadas de baja anteriormente se omiten silenciosamente a menos que se establezca Force=1.
Selección de lista: proporcione ListId (o su alias heredado AddressBookId). Es necesario al menos uno.
Scope OAuth : 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 |
|---|---|---|---|
ListId | integer | ID de la lista de destino. También se acepta el alias heredado AddressBookId. | |
EmailList | string | sí | Direcciones de correo separadas por punto y coma que se van a importar |
Force | integer: 0, 1 | Establezca 1 para volver a importar direcciones que se habían dado de baja anteriormente.
Predeterminado: 0 (las direcciones dadas de baja se omiten).
|
Respuestas
| Código | Descripción |
|---|---|
200 | Contactos importados correctamente |
400 | Falta EmailList |
401 | Credenciales no válidas |
Ejemplo 200
{
"Result": "3 contacts imported"
}
/email/addSingle.{format}Añadir un único contacto
Añade un contacto a una lista con valores de campos personalizados opcionales.
Field1 a Field25 se asignan a las definiciones de columnas personalizadas de su lista. La asignación depende del orden en que se hayan definido las columnas — consulte la configuración de su lista en la interfaz de Mailpro para ver qué número de campo corresponde a cada columna (por ejemplo, Field1 = FirstName, Field2 = LastName, Field3 = City…).
Selección de lista: proporcione ListId (o su alias heredado AddressBookId).
Scope OAuth : 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 |
|---|---|---|---|
ListId | integer | ID de la lista de destino. También se acepta el alias heredado AddressBookId. | |
Email | string | sí | Dirección de correo del nuevo contacto |
Force | integer: 0, 1 | Establezca 1 para volver a añadir una dirección dada de baja anteriormente | |
Field1 | string | Valor del campo personalizado 1 (la asignación de columnas depende de su lista) | |
Field2 | string | Valor del campo personalizado 2 | |
Field3 | string | Valor del campo personalizado 3 | |
Field4 | string | Valor del campo personalizado 4 | |
Field5 | string | Valor del campo personalizado 5 |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto añadido correctamente |
400 | Falta Email |
401 | Credenciales no válidas |
Ejemplo 200
{
"EmailId": 10002,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"ListID": 101
}
/email/edit.{format}Actualizar un contacto
Actualiza la dirección de correo o los valores de los campos personalizados de un contacto existente. Identifique el contacto mediante EmailId (de /email/list). Tanto EmailId como Email son obligatorios.
Scope OAuth : 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 |
|---|---|---|---|
EmailId | integer | sí | ID del contacto que se va a actualizar (de /email/list) |
Email | string | sí | Nueva dirección de correo del contacto |
Field1 | string | Nuevo valor del campo personalizado 1 | |
Field2 | string | Nuevo valor del campo personalizado 2 | |
Field3 | string | Nuevo valor del campo personalizado 3 |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto actualizado correctamente |
400 | Falta EmailId o Email |
401 | Credenciales no válidas |
404 | Contacto no encontrado |
/email/del.{format}Eliminar un contacto
Elimina permanentemente un contacto por su identificador único.
Scope OAuth : 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 |
|---|---|---|---|
EmailId | integer | sí | ID del contacto que se va a eliminar (de /email/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto eliminado correctamente |
400 | Falta EmailId |
401 | Credenciales no válidas |
404 | Contacto no encontrado |
Gestione plantillas de correo HTML. Una plantilla de mensaje almacena el asunto del correo, el cuerpo HTML y la configuración del enlace de baja. Las plantillas se reutilizan en distintas campañas.
/message/list.{format}Listar plantillas de mensaje
Devuelve las plantillas de correo HTML guardadas de la cuenta. De forma predeterminada, el cuerpo HTML no se incluye en la respuesta para mantener cargas útiles pequeñas. Establezca bodyHTML=true para incluirlo (limita automáticamente los resultados a 10 por página).
Scope OAuth : email:templates:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
subjectFilter | query | string | Filtrar por asunto (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
bodyHTML | query | boolean | Establezca true para incluir el cuerpo HTML completo en cada resultado.
Cuando es true, los resultados se limitan automáticamente a 10 por página, independientemente de numberOfRecords.
|
Respuestas
| Código | Descripción |
|---|---|
200 | Plantillas de mensaje devueltas correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"MessageList": [
{
"IDMessage": 501,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0,
"UpdateDate": "2026-03-10T14:22:00"
}
]
}
/message/add.{format}Crear una plantilla de mensaje
Crea una nueva plantilla de correo HTML. La plantilla almacena el asunto, el cuerpo HTML y los ajustes del enlace de baja. Una vez creada, utilice el IDMessage devuelto al lanzar una campaña.
Scope OAuth : email:templates: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 |
|---|---|---|---|
Subject | string | sí | Asunto del correo electrónico (máx. 255 caracteres) |
BodyHTML | string | sí | Contenido HTML completo del cuerpo del correo |
Language | string | sí | Código de idioma para la localización del enlace de baja (p. ej. EN, FR, DE) |
LinkAlign | string: left, center, right | sí | Alineación horizontal del enlace de baja |
LinkUp | integer: 0, 1 | sí | Posición del enlace de baja — 0 = parte inferior del correo, 1 = parte superior |
Respuestas
| Código | Descripción |
|---|---|
200 | Plantilla de mensaje creada correctamente |
400 | Falta un campo obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"IDMessage": 502,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0
}
/message/edit.{format}Actualizar una plantilla de mensaje
Actualiza el contenido y los metadatos de una plantilla de mensaje existente.
Scope OAuth : email:templates: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 |
|---|---|---|---|
MessageId | integer | sí | ID de la plantilla de mensaje que se va a actualizar (de /message/list) |
Subject | string | sí | Nuevo asunto del correo electrónico |
BodyHTML | string | sí | Nuevo contenido HTML del cuerpo del correo |
Language | string | sí | Código de idioma para la localización del enlace de baja |
LinkAlign | string: left, center, right | sí | |
LinkUp | integer: 0, 1 | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Plantilla de mensaje actualizada correctamente |
400 | Falta un campo obligatorio |
401 | Credenciales no válidas |
404 | Plantilla de mensaje no encontrada |
/message/del.{format}Eliminar una plantilla de mensaje
Elimina permanentemente una plantilla de mensaje por su identificador único. No se pueden eliminar las plantillas utilizadas por campañas programadas pendientes.
Scope OAuth : email:templates: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 |
|---|---|---|---|
MessageId | integer | sí | ID de la plantilla de mensaje que se va a eliminar (de /message/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Plantilla de mensaje eliminada correctamente |
400 | Falta MessageId |
401 | Credenciales no válidas |
404 | Plantilla de mensaje no encontrada |
Envíe campañas masivas de correo a una lista y gestione los envíos programados. Una campaña utiliza una plantilla de mensaje y una dirección de remitente.
/send/list.{format}Listar campañas programadas
Devuelve la lista de campañas de correo programadas y procesadas recientemente. Los resultados se ordenan por fecha de envío prevista (las más recientes primero).
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
subjectMessageFilter | query | string | Filtrar por asunto de la campaña (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de campañas devuelta correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"sends": [
{
"IDSend": 3001,
"ListID": 101,
"SenderEmail": "[email protected]",
"SenderName": "Your Company Newsletter",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
]
}
/send/campaign.{format}Lanzar una campaña
Programa o envía inmediatamente una campaña de correo a una lista utilizando una plantilla de mensaje guardada y una dirección de remitente.
Obligatorio:
IDMessage — la plantilla que se va a enviar (de /message/list)IDEmailExp — la dirección de remitente que se va a utilizar (de /senderEmail/list)ListId — la lista de destinatarios (de /list/list). También se acepta el alias heredado IDAddressBook.Programación: establezca DatePlanned en una fecha/hora ISO 8601 futura para programar el envío. Omita DatePlanned para enviar inmediatamente.
Seguimiento de estadísticas: establezca Campaign=1 y proporcione un TitleCampaign para activar el seguimiento de aperturas/clics/rebotes en la sección Estadísticas.
Scope OAuth : email: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 |
|---|---|---|---|
ListId | integer | ID de la lista de destinatarios (de /list/list). También se acepta el alias heredado IDAddressBook. | |
IDMessage | integer | sí | ID de la plantilla de mensaje que se va a enviar (de /message/list) |
IDEmailExp | integer | sí | ID de la dirección de correo del remitente que se va a utilizar (de /senderEmail/list) |
IDUnsubscribeList | integer | Lista utilizada para recopilar los contactos dados de baja (lista negra).
También se acepta el alias heredado IDUnsubscribeAddressBook.
| |
DatePlanned | string (date-time) | Fecha/hora de envío programadas (ISO 8601). Omítalo para enviar inmediatamente. | |
Campaign | integer: 0, 1 | Establezca 1 para realizar el seguimiento de este envío como una campaña con nombre en las estadísticas | |
TitleCampaign | string | Título de la campaña mostrado en las estadísticas (obligatorio cuando Campaign=1) |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña programada o enviada correctamente.
> La respuesta también devuelve los alias heredados AddressBookID y UnsubscribeAddressBookID
> (idénticos a ListID / UnsubscribeListID). Las nuevas integraciones deben ignorarlos.
|
400 | Falta IDMessage o IDEmailExp |
401 | Credenciales no válidas |
403 | Créditos de correo insuficientes |
404 | Lista, mensaje o remitente no encontrados |
Ejemplo 200
{
"send": {
"IDSend": 3002,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
}
/send/del.{format}Cancelar o eliminar una campaña
Cancela un envío de campaña programado pendiente o elimina uno completado. Solo se pueden cancelar los envíos programados para una fecha futura — los envíos en curso no se pueden detener.
Scope OAuth : email: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 |
|---|---|---|---|
IdSend | integer | sí | ID del envío de campaña que se va a cancelar o eliminar (de /send/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña cancelada o eliminada correctamente |
400 | Falta IdSend |
401 | Credenciales no válidas |
404 | Campaña no encontrada |
Ejemplo 200
{
"Result": "Campaign Deleted"
}
/send/scheduled.{format}Listar mis campañas de correo programadas
Devuelve las campañas de correo y los envíos individuales programados para una fecha futura que aún no se han enviado. Útil antes de llamar a /cancel o /reschedule. Los registros se ordenan por DatePlanned en orden ascendente.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de campañas / envíos programados.
> Cada registro también incluye los alias heredados AddressBookID y
> UnsubscribeAddressBookID (idénticos a ListID / UnsubscribeListID).
|
401 | Credenciales no válidas |
Ejemplo 200
{
"sends": [
{
"IDSend": 5001,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-05-01T09:00:00",
"SubjectMessage": "Spring Sale 2026",
"NumberCredit": 4521
}
]
}
/send/{IdSend}/cancel.{format}Cancelar una campaña / envío programado
Cancela un envío de correo programado (campaña o individual) que aún no se ha despachado. Si el envío ya se ha enviado (o no existe / pertenece a otro cliente), devuelve 409 Conflict.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSend | path | integer | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío cancelado |
401 | Credenciales no válidas |
409 | Ya enviado o no encontrado |
Ejemplo 200
{
"Result": "OK",
"Cancelled": 5001
}
/send/{IdSend}/reschedule.{format}Reprogramar una campaña / envío programado
Actualiza el DatePlanned de un envío de correo programado. La nueva fecha debe ser futura y estar dentro de los próximos 90 días.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSend | path | integer | sí |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
PlanDate | string (date-time) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío reprogramado |
400 | PlanDate no proporcionado o no válido |
401 | Credenciales no válidas |
409 | Ya enviado, no encontrado o nueva fecha fuera de rango (debe ser futura y estar dentro de los próximos 90 días) |
Ejemplo 200
{
"Result": "OK",
"IdSend": 5001,
"NewPlanDate": "2026-12-31T14:30:00"
}
/send/sendingTest.{format}Enviar un correo de prueba
Envía una vista previa de una plantilla de mensaje a un destinatario especificado para su revisión antes de lanzar la campaña real. El remitente, la plantilla y el destinatario de la prueba se identifican mediante sus ID.
Scope OAuth : email: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 |
|---|---|---|---|
MessageId | integer | sí | ID de la plantilla de mensaje que se va a previsualizar (de /message/list) |
IDEmailExpFrom | integer | sí | ID de la dirección de remitente que se va a utilizar (de /senderEmail/list) |
IDEmailExpTo | integer | sí | ID de la dirección de remitente destinataria — el correo de prueba se envía a esta dirección |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo de prueba enviado correctamente |
400 | Falta un campo obligatorio |
401 | Credenciales no válidas |
Ejemplo 200
{
"SendingTest": {
"IdSendingTest": 7001,
"ToEmail": "[email protected]",
"FromEmail": "[email protected]",
"SenderName": "Your Company Newsletter"
}
}
Envíe correos transaccionales puntuales a destinatarios individuales. A diferencia de las campañas, los correos transaccionales no requieren una lista: se pasan directamente el correo del destinatario y el cuerpo HTML.
/send/mail/scheduled.{format}Listar los correos individuales programados
Devuelve los correos individuales enviados con /send/sendmail y una fecha futura que aún no han salido. Las campañas se listan con /send/scheduled.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Correos programados devueltos |
401 | Credenciales no válidas |
Ejemplo 200
{
"scheduledMails": [
{
"IdSingleSend": 880123,
"Email": "[email protected]",
"Subject": "Your invoice",
"DatePlanned": "2026-12-01T09:00:00"
}
]
}
/send/mail/{IdSingleSend}/cancel.{format}Cancelar un correo individual programado
Cancela el correo mientras no haya salido.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSingleSend | path | integer (int64) | sí | IdSingleSend devuelto por /send/sendmail |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo cancelado |
401 | Credenciales no válidas |
409 | Envío no encontrado o ya realizado |
Ejemplo 200
{
"Result": "OK",
"Cancelled": 880123
}
/send/mail/{IdSingleSend}/reschedule.{format}Reprogramar un correo individual programado
Cambia la fecha de envío. La nueva fecha debe ser futura y estar dentro de 90 días. También se acepta PATCH.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSingleSend | path | integer (int64) | sí | IdSingleSend devuelto por /send/sendmail |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
PlanDate | string (date-time) | sí | Nueva fecha de envío (ISO 8601) |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo reprogramado |
400 | Fecha ausente o no válida |
401 | Credenciales no válidas |
409 | Envío no encontrado, ya realizado o fecha fuera de los límites |
Ejemplo 200
{
"Result": "OK",
"IdSingleSend": 880123,
"NewPlanDate": "2026-12-15T09:00:00"
}
/send/sendmail.{format}Enviar un correo transaccional
Envía un correo transaccional puntual a uno o varios destinatarios. A diferencia de las campañas, este endpoint no requiere una lista — la dirección del destinatario y el cuerpo HTML se pasan directamente.
Obligatorio:
IDEmailExp — el ID de la dirección de remitente (de /senderEmail/list)EmailData — destinatario en formato email,field1,field2,...,field25 (separado por comas)BodyHTML — el cuerpo HTMLSubject — el asuntoFormato de EmailData: [email protected],Alice,Dupont,Paris El primer valor es la dirección de correo; los valores 2 a 26 se asignan a Field1–Field25 para las variables de personalización de su plantilla HTML.
Múltiples destinatarios: separe varias entradas de EmailData con punto y coma: [email protected],Alice;[email protected],Bob
Programación: establezca DatePlanned en una fecha/hora ISO 8601 futura, u omítalo para enviar inmediatamente.
Scope OAuth : email:send
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 |
|---|---|---|---|
IDEmailExp | integer | sí | ID de la dirección de correo del remitente que se va a utilizar (de /senderEmail/list) |
EmailData | string | sí | Destinatario en formato email,campo1,campo2,...,campo25 (separados por comas).
El primer valor es la dirección de correo; los demás son campos de personalización
asignados a Field1–Field25 en tu plantilla HTML.
La parte local del correo (antes de @) acepta letras, dígitos y
. _ - + — incluido el sub-addressing RFC 5322 (user+tag@domain, p. ej. Gmail,
Fastmail, Proton). Los demás caracteres especiales que permite la RFC 5322
(p. ej. ! # $ % & ' * / = ? ^ { | } ~) y las partes locales entre comillas no
se aceptan.
|
BodyHTML | string | sí | Contenido HTML completo del cuerpo del correo |
Subject | string | sí | Asunto del correo electrónico (máx. 255 caracteres) |
attachments | array of string (binary) | Archivos adjuntos opcionales — envía la solicitud como multipart/form-data y añade una parte de archivo por adjunto (cualquier nombre de campo). Hasta 5 archivos, 10 MB por archivo, 15 MB en total. Tipos aceptados: PDF, Word, Excel, PowerPoint, imágenes (JPG, PNG, GIF, WebP), ZIP, CSV, TXT — los archivos ejecutables y scripts se rechazan. Facturación: el envío mantiene su crédito habitual, más 1 crédito por cada 512 KB de adjuntos más allá de los primeros 512 KB (los adjuntos ≤ 512 KB no añaden nada). Todos los demás campos de este endpoint (ReplyTo, ActivateStatistics, CustomHeaders, …) funcionan exactamente igual que en la variante form-urlencoded. | |
KeepInMyFiles | boolean | false (por defecto): los archivos adjuntos solo se usan para este envío — se almacenan fuera de
su cuenta, no cuentan en su cuota de almacenamiento y se eliminan automáticamente después de
35 días. true: los archivos adjuntos también se guardan en los archivos de su cuenta (carpeta
Secure/Files/Sending/api) y cuentan en su cuota de almacenamiento.
|
Respuestas
| Código | Descripción |
|---|---|
200 | Correo transaccional enviado o programado correctamente |
400 | Falta un campo obligatorio o formato de correo no válido |
401 | Credenciales no válidas |
403 | Créditos de correo insuficientes |
404 | Remitente no encontrado o dirección de correo dada de baja |
Ejemplo 200
{
"SingleSend": {
"IdSingleSend": 8001,
"IdEmailExp": 201,
"DatePlanned": "2026-04-15T14:30:00",
"Subject": "Your order #12345 is confirmed",
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"UnsubscriptionLink": false,
"ActivateStatistics": true
}
}
/send/{IdSend}/status.{format}Obtener el estado de entrega de un correo transaccional
Devuelve el estado de entrega actual de un correo transaccional enviado con /send/sendmail. Pase el IdSingleSend que devolvió esa llamada.
Valores posibles: delivered (aceptado por el servidor del destinatario, véase DiagCode), bounced (rechazado — BounceType: hard dirección no válida o rechazo definitivo, soft rechazo tras nuevos intentos), sent (entregado al servidor de correo, aún sin respuesta), scheduled (aún no enviado, DatePlanned en el futuro) y queued (en espera de envío). delivered y bounced son finales: deje de consultar. Cada email tiene un estado final como máximo 48 horas después del envío; consulte cada 15 minutos como máximo (cada llamada cuenta en su cuota de la API) o utilice los webhooks email.delivered / email.bounced. Solo el cliente que envió el email puede leer su estado — cualquier otro id devuelve 404.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSend | path | integer | sí | El IdSingleSend devuelto por /send/sendmail. |
Respuestas
| Código | Descripción |
|---|---|
200 | Estado de entrega actual |
401 | Credenciales no válidas |
404 | No se encontró ningún envío transaccional con este id para este cliente |
Ejemplo 200
{
"status": {
"IdSingleSend": 8001,
"Email": "[email protected]",
"Status": "delivered",
"DatePlanned": "2026-04-15T14:30:00",
"StatusDate": "2026-04-15T14:30:07",
"DiagCode": "2.0.0 (success)",
"BounceType": null
}
}
Liste y gestione las direcciones de correo de remitente validadas. Solo las direcciones verificadas pueden utilizarse como dirección From en las campañas.
/senderEmail/list.{format}Listar direcciones de remitente validadas
Devuelve la lista de direcciones de correo de remitente configuradas para la cuenta. Solo las direcciones con IsValid: true se pueden utilizar al enviar campañas. Las nuevas direcciones se añaden con /senderEmail/add y son válidas una vez que se hace clic en el enlace del correo de validación.
Scope OAuth : email:templates:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
emailFilter | query | string | Filtrar por dirección de correo (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
sortByName | query | boolean | Establezca true para ordenar los resultados alfabéticamente por nombre del remitente |
Respuestas
| Código | Descripción |
|---|---|
200 | Direcciones de remitente devueltas correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"ExpEmailList": [
{
"IDEmailExp": 201,
"Email": "[email protected]",
"SenderName": "Your Company Newsletter",
"IsValid": true,
"CreationDate": "2025-06-01T09:00:00"
},
{
"IDEmailExp": 202,
"Email": "[email protected]",
"SenderName": "Your Company Support",
"IsValid": true,
"CreationDate": "2025-06-01T09:05:00"
}
]
}
/senderEmail/add.{format}Añadir una dirección de remitente
Añade la dirección con los mismos controles que la aplicación y le envía un correo de validación. Se puede utilizar una vez que se haga clic en el enlace de ese correo. Una cuenta puede tener hasta 25 remitentes, validados o pendientes.
Scope OAuth : email:templates: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 |
|---|---|---|---|
Email | string | sí | Dirección del remitente |
SenderName | string | sí | Nombre mostrado a los destinatarios |
Respuestas
| Código | Descripción |
|---|---|
200 | Dirección añadida. DomainHasMx es false cuando el dominio no tiene registro MX. |
400 | Falta Email o SenderName |
401 | Credenciales no válidas |
422 | Dirección rechazada: no válida, ya entre los remitentes de la cuenta, dominio de correo público, nombre prohibido o límite de 25 alcanzado. El mensaje indica el motivo. |
503 | No disponible temporalmente, inténtelo de nuevo |
Ejemplo 200
{
"Result": "OK",
"ConfirmationSent": true,
"DomainHasMx": true
}
/senderEmail/{IdSenderEmail}/resendValidation.{format}Enviar de nuevo el correo de validación
Para una dirección que aún espera la validación.
Scope OAuth : email:templates:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSenderEmail | path | integer | sí | ID del remitente, de /senderEmail/list |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo enviado de nuevo |
401 | Credenciales no válidas |
404 | Remitente no encontrado |
409 | Este remitente ya está validado |
503 | No disponible temporalmente, inténtelo de nuevo |
Ejemplo 200
{
"Result": "OK",
"ConfirmationSent": true
}
/senderEmail/{IdSenderEmail}/authentication.{format}Comprobar el dominio de un remitente (SPF, DKIM, DMARC, MX)
Comprueba el dominio en directo en el DNS y devuelve los registros que hay que publicar. Solo lectura. El DKIM se activa en la aplicación: DkimSettingsUrl abre la pantalla correcta.
Scope OAuth : email:templates:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
IdSenderEmail | path | integer | sí | ID del remitente, de /senderEmail/list |
Respuestas
| Código | Descripción |
|---|---|
200 | Estado del dominio. Spf.RecommendedRecord se crea a partir de su registro actual: publíquelo solo si Spf.ChangeNeeded es true. |
401 | Credenciales no válidas |
404 | Remitente no encontrado |
503 | No disponible temporalmente, inténtelo de nuevo |
Ejemplo 200
{
"Domain": "example.com",
"Spf": {
"Valid": true,
"Record": "v=spf1 include:spf.mailpro.com -all",
"RecommendedRecord": "v=spf1 include:spf.mailpro.com -all",
"ChangeNeeded": false
},
"Dkim": {
"Valid": true,
"Records": [
{
"Host": "key._domainkey.example.com",
"Value": "v=DKIM1;k=rsa;p=MIIBIjANBgkq...",
"Validated": true
}
]
},
"Dmarc": {
"Valid": true,
"Record": "v=DMARC1; p=quarantine"
},
"Mx": {
"Valid": true,
"Record": "mail.example.com"
},
"DkimSettingsUrl": "https://app.mailpro.com/dkim/list?d=example.com"
}
/senderEmail/del.{format}Eliminar una dirección de remitente
Elimina una dirección de correo de remitente validada de la cuenta. No se pueden eliminar las direcciones de remitente utilizadas por campañas programadas.
Scope OAuth : email:templates: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 |
|---|---|---|---|
idEmailExp | integer | sí | ID de la dirección de remitente que se va a eliminar (de /senderEmail/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Dirección de remitente eliminada correctamente |
400 | Falta idEmailExp |
401 | Credenciales no válidas |
Ejemplo 200
{
"Result": "EmailSender Deleted"
}
Acceda a las métricas de rendimiento por campaña: aperturas, clics, rebotes y más. Disponibles desgloses detallados por hora, día, país, sistema operativo y cliente de correo.
/stats/list.{format}Listar estadísticas de campañas
Devuelve las métricas de rendimiento globales de todas las campañas: número de envíos, tasa de apertura, tasa de clics, número de rebotes. Filtre por rango de fechas o título de campaña. Los resultados se ordenan por fecha de envío (los más recientes primero).
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
titleCampaignFilter | query | string | Filtrar por título de la campaña (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
dateStart | query | string (date-time) | Inicio del filtro de rango de fechas (ISO 8601) | |
dateEnd | query | string (date-time) | Fin del filtro de rango de fechas (ISO 8601) |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas de campaña devueltas correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"Campaigns": [
{
"IdCampaign": 8001,
"DateCampaign": "2026-04-20T09:00:01",
"TitleCampaign": "Spring Newsletter April 2026",
"NumberEmailSend": 4521,
"NumberEmailOpen": 1823,
"NumberEmailClick": 342,
"BadMail": 12,
"NumberUnsubscribers": 8,
"NumberComplaints": 1,
"SpamTrap": 0,
"DeliverabilityScore": 98
}
]
}
/stats/byHour.{format}Estadísticas por hora
Devuelve el desglose por hora de aperturas y clics de una campaña concreta. Útil para comprender el momento óptimo de envío.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí | ID de la campaña (de /stats/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas por hora devueltas correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"ByHour": [
{
"Hour": 9,
"Opens": 823,
"Clicks": 142
},
{
"Hour": 10,
"Opens": 512,
"Clicks": 98
}
]
}
/stats/byDay.{format}Estadísticas por día
Devuelve el desglose diario de aperturas y clics de una campaña concreta.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí | ID de la campaña (de /stats/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas diarias devueltas correctamente |
401 | Credenciales no válidas |
/stats/del.{format}Eliminar estadísticas de campaña
Elimina permanentemente todos los registros estadísticos de una campaña determinada.
Scope OAuth : email:templates: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 |
|---|---|---|---|
IdCampaign | integer | sí | ID de la campaña cuyas estadísticas se van a eliminar (de /stats/list) |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas de campaña eliminadas correctamente |
400 | Falta IdCampaign |
401 | Credenciales no válidas |
404 | Campaña no encontrada |
Ejemplo 200
{
"Result": "Statistic Deleted"
}
/stats/country.{format}Desglose por geolocalización
Devuelve el desglose por geolocalización de las aperturas de campaña — cuántas aperturas proceden de cada país.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Desglose por país devuelto |
401 | Credenciales no válidas |
/stats/open.{format}Registro de eventos de apertura
Devuelve el registro por destinatario de los eventos de apertura de una campaña (una fila por apertura). Utilice emailFilter para buscar un destinatario concreto (coincidencia parcial, no distingue mayúsculas y minúsculas).
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. |
Respuestas
| Código | Descripción |
|---|---|
200 | Eventos de apertura devueltos |
401 | Credenciales no válidas |
/stats/click.{format}Registro de eventos de clic
Devuelve el registro por destinatario de los eventos de clic de una campaña — incluyendo qué enlace se ha pulsado y cuándo.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. |
Respuestas
| Código | Descripción |
|---|---|
200 | Eventos de clic devueltos |
401 | Credenciales no válidas |
/stats/system.{format}Desglose por sistema operativo
Devuelve el desglose de las aperturas por sistema operativo (Windows, macOS, iOS, Android, Linux, etc.) para una campaña determinada.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Desglose por SO devuelto |
401 | Credenciales no válidas |
/stats/emailSoftware.{format}Desglose por cliente de correo
Devuelve el desglose de las aperturas por cliente de correo (Gmail, Outlook, Apple Mail, Thunderbird, etc.) para una campaña determinada.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Desglose por cliente de correo devuelto |
401 | Credenciales no válidas |
/stats/bounce.{format}Registro de rebotes
Devuelve la lista de destinatarios rebotados (rebotes duros, rebotes blandos, quejas de spam) de una campaña, con el motivo del fallo para cada dirección.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
idCampaign | query | integer | sí | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. |
Respuestas
| Código | Descripción |
|---|---|
200 | Eventos de rebote devueltos |
401 | Credenciales no válidas |
Ejemplo 200
{
"ListBadMail": [
{
"Email": "[email protected]",
"Date": "2026-04-20T09:05:12",
"Error": "550 5.1.1 recipient rejected",
"AddressbookId": 1813318
}
]
}
Consulte el registro completo de todos los envíos de correo anteriores.
/history/list.{format}Listar el historial de envíos
Devuelve un registro paginado de todos los envíos de correo anteriores. Filtre por ID de campaña o por asunto. Establezca bodyHTML=true para incluir el cuerpo HTML (limita automáticamente a 10 por página).
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
subjectMessageFilter | query | string | Filtrar por asunto de la campaña (coincidencia parcial, no distingue mayúsculas y minúsculas) | |
idCampaign | query | integer | Devolver el historial solo de una campaña concreta | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo (véase Paginación). | |
pageNumber | query | integer | Número de página (comienza en 1). El valor predeterminado es 1. | |
bodyHTML | query | boolean | Establezca true para incluir el cuerpo HTML completo.
Limita automáticamente los resultados a 10 por página.
|
Respuestas
| Código | Descripción |
|---|---|
200 | Historial devuelto correctamente |
401 | Credenciales no válidas |
Ejemplo 200
{
"HistoricList": [
{
"IDHistoric": 9001,
"SubjectMessage": "Spring Newsletter — April 2026",
"DateSend": "2026-04-20T09:00:01",
"NumberSend": 4521,
"NumberOpen": 1823,
"NumberClick": 342
}
]
}
Cargue un archivo CSV o XLSX para importar contactos de correo en una lista de forma masiva. El archivo se pone en cola para su procesamiento asíncrono — siga la finalización mediante el ImportJobId devuelto o a través de la devolución de llamada WebhookUrl opcional.
/import/upload.{format}Cargar un archivo de contactos (CSV / XLSX) para importación masiva
Cargue un archivo CSV o XLSX para importar contactos de correo en una lista. El archivo se almacena y se pone en cola para su procesamiento asíncrono — el endpoint devuelve un ImportJobId inmediatamente.
Tipo de solicitud: multipart/form-data
Campos de formulario obligatorios:
IdClient (entero) — su ID de cliente de MailproApiKey (cadena) — su clave de APIListId (entero) — ID de la lista de destino. También se acepta el alias heredado AddressBookId.file (binario) — el archivo CSV o XLSX que se va a cargarOpcional:
WebhookUrl (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:
Email — no distingue mayúsculas y minúsculas)Scope OAuth : 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 |
|---|---|---|---|
ListId | integer | sí | ID de la lista de destino. También se acepta el alias heredado AddressBookId. |
file | string (binary) | sí | Archivo CSV o XLSX (UTF-8, máx. 50 MB) |
WebhookUrl | string (uri) | URL de devolución de llamada invocada cuando finaliza el procesamiento |
Respuestas
| Código | Descripción |
|---|---|
200 | Archivo aceptado y puesto en cola |
400 | Ningún archivo cargado o falta ListId |
401 | Credenciales no válidas |
500 | Error del servidor o de almacenamiento |
Ejemplo 200
{
"Result": "OK",
"ImportJobId": 13,
"InternalName": "230575-20260420140221-contacts.csv"
}
Suscriba su servidor a notificaciones de eventos en tiempo real. Mailpro envía mediante POST una carga 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, 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": [
"email.delivered",
"email.bounced"
]
}
],
"total": 1
}
/webhooksCrear un webhook
Crea una nueva suscripción de webhook. La respuesta contiene un secret que se muestra una sola vez — guárdelo de inmediato en el servidor. Úselo para verificar la firma HMAC de cada carga útil entrante.
Límites: máximo 20 webhooks por cuenta, máximo 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 eventos a los que suscribirse (véase el catálogo anterior). Utilice ["*"] para suscribirse a todos los eventos de esta API. |
description | string |
Ejemplo
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Integración con Slack"
}
Respuestas
| Código | Descripción |
|---|---|
201 | Webhook creado — el secret solo se devuelve aquí |
400 | URL, lista de eventos no válidas o límite superado |
401 | Credenciales no válidas |
Ejemplo 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"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 | Establezca true para reactivar 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
Encola un evento ping inmediato (o cualquier otro tipo de evento mediante el campo del cuerpo eventType) a su endpoint. Útil para verificar la accesibilidad y la verificación de firmas 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 envío |
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 antiguo de inmediato. El nuevo secreto se devuelve una sola vez en la respuesta — guárdelo. A partir de ese momento, todas las entregas se firmarán con el nuevo secreto.
Utilice esta función si sospecha que su secreto ha sido 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 intentos de entrega
Devuelve el historial de intentos de envío de este webhook (retención de 30 días). Útil para la depuración — qué eventos se enviaron, códigos de estado recibidos, recuentos de reintentos, 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 (los más recientes primero) |
404 | Webhook no encontrado |
/webhooks/{id}/deliveries/{deliveryId}/replayReenviar una entrega
Encola un nuevo intento de entrega con la misma carga útil que el original. Útil para volver a desencadenar una entrega fallida tras corregir su endpoint. Se crea una NUEVA fila Webhook_Delivery (la original se conserva para auditoría). El reenvío sigue la política de reintentos estándar (mismo calendario de retroceso, 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 | Reenvío puesto en cola |
404 | Webhook o entrega no encontrados |
Rebotes y bajas de la cuenta: listar, añadir, eliminar.
/suppression/bounces.{format}Listar los rebotes de la cuenta
Los más recientes primero. El total está en la cabecera X-Total-Count.
Scope OAuth : email:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
type | query | string: hard, soft | hard o soft | |
source | query | string | Origen del rebote: list, contact, api o smtp | |
email | query | string | Dirección exacta | |
dateFrom | query | string (date-time) | A partir de esta fecha | |
dateTo | query | string (date-time) | Hasta esta fecha | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Rebotes devueltos |
400 | type debe ser hard o soft |
401 | Credenciales no válidas |
Ejemplo 200
{
"bounces": [
{
"Id": 5521,
"Source": "contact",
"BounceType": "hard",
"Email": "[email protected]",
"Date": "2026-10-12T08:30:00",
"DiagCode": "550 5.1.1 User unknown",
"IdList": 101
}
]
}
/suppression/bounces/{Id}/del.{format}Eliminar un rebote
Source y Type son obligatorios, tal como los devuelve /suppression/bounces: un Id por sí solo no es único.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Id | path | integer (int64) | sí | Id del rebote |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
Source | string | sí | list, contact, api o smtp |
Type | string: hard, soft | sí | hard o soft |
Respuestas
| Código | Descripción |
|---|---|
200 | Rebote eliminado |
400 | Falta Source o Type |
401 | Credenciales no válidas |
404 | Rebote no encontrado |
Ejemplo 200
{
"Result": "OK",
"Id": 5521,
"Restored": false
}
/suppression/bounces/{Id}/restore.{format}Volver a poner en sus listas un contacto con rebote duro
Solo para un rebote duro con el origen contact.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Id | path | integer (int64) | sí | Id del rebote |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto repuesto |
401 | Credenciales no válidas |
404 | Rebote duro de un contacto no encontrado o dirección ya no activa |
Ejemplo 200
{
"Result": "OK",
"Id": 5521,
"Restored": true
}
/suppression/unsubscribers.{format}Listar las bajas de la cuenta
Los más recientes primero. El total está en la cabecera X-Total-Count.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
source | query | string | Origen de la baja: contact, list, smtp, api o api3 | |
email | query | string | Dirección exacta | |
dateFrom | query | string (date-time) | A partir de esta fecha | |
dateTo | query | string (date-time) | Hasta esta fecha | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Bajas devueltas |
401 | Credenciales no válidas |
Ejemplo 200
{
"unsubscribers": [
{
"Id": 9012,
"Source": "api",
"Email": "[email protected]",
"Date": "2026-10-20T16:05:00",
"ListName": null,
"Comment": "Asked by phone"
}
]
}
/suppression/unsubscribers/add.{format}Añadir una baja
Sin ListId, la dirección se da de baja de toda la cuenta. Con ListId, solo de esa lista de bajas.
Scope OAuth : 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 |
|---|---|---|---|
Email | string | sí | Dirección que dar de baja |
Comment | string | Comentario libre | |
ListId | integer (int64) | Lista de bajas de la cuenta (opcional) |
Respuestas
| Código | Descripción |
|---|---|
200 | Hecho. AlreadyUnsubscribed es true cuando la dirección ya estaba dada de baja. |
400 | Se requiere una dirección válida |
401 | Credenciales no válidas |
404 | ListId no es una lista de bajas de esta cuenta |
Ejemplo 200
{
"Result": "OK",
"AlreadyUnsubscribed": false
}
/suppression/unsubscribers/{Id}/del.{format}Eliminar una baja
Source es obligatorio, tal como lo devuelve /suppression/unsubscribers: un Id por sí solo no es único.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
format | path | string: json, xml | sí | Formato de respuesta |
Id | path | integer (int64) | sí | Id de la baja |
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
Source | string | sí | contact, list, smtp, api o api3 |
Respuestas
| Código | Descripción |
|---|---|
200 | Baja eliminada |
400 | Source es obligatorio |
401 | Credenciales no válidas |
404 | Baja no encontrada |
Ejemplo 200
{
"Result": "OK",
"Removed": 9012
}