Documentación interactiva · Portal de desarrolladores · Especificación OpenAPI · EN · FR · DE · IT · PT · ES
URL base : https://api.mailpro.com/v3
La API CRM v3 de Mailpro™ le permite gestionar mediante programación contactos, listas, etiquetas, campos personalizados, plantillas de correo electrónico y campañas, y enviar tanto correos electrónicos de marketing en masa como correos transaccionales individuales, así como SMS.
Todos los endpoints (excepto POST /token y los endpoints de OAuth) aceptan tres métodos de autenticación. Utilice el que mejor se adapte a su stack.
POST /token. Tiene aspecto de OAuth, pero está vinculado a una única credencial de cuenta y no admite scopes.> Los métodos heredados Bearer JWT e IdClient+ApiKey no aplican scopes: conservan > acceso completo a todos los endpoints a los que ya podían acceder. Únicamente los > tokens de acceso OAuth 2.0 están sujetos a las comprobaciones de scope por endpoint > indicadas más abajo en cada operación (un token sin el scope adecuado recibe > 403 insufficient_scope).
Mailpro opera un único servidor de autorización OAuth 2.0 para todas sus APIs, expuesto en una superficie única e independiente de la versión: https://api.mailpro.com/oauth/. Un servidor, un token: el mismo token de acceso funciona en CRM v3, Email v2 y SMS. Los endpoints a los que un token puede llamar se rigen por los scopes del token, no por la URL base de la API que invoque. No existe ningún endpoint OAuth por versión (no hay /v3/oauth, /v2/oauth ni /sms/oauth).
| Endpoint | URL |
|---|---|
| Authorize | GET https://api.mailpro.com/oauth/authorize |
| Token / Refresh | POST https://api.mailpro.com/oauth/token |
| JWKS (verificación de firmas) | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Emisor (el claim iss de cada token): https://api.mailpro.com/oauth/.
Grants admitidos
authorization_code + PKCE (code_challenge_method=S256 es obligatorio): el flujo de consentimiento «Connect Mailpro» en el navegador. Devuelve un token de acceso y un refresh token rotativo.client_credentials: máquina a máquina, sin usuario. Devuelve únicamente un token de acceso.refresh_token: intercambia un refresh token por un nuevo par acceso/refresh. Los refresh tokens rotan: cada uso invalida el anterior.Vida útil de los tokens
| Token | TTL |
|---|---|
| Token de acceso (JWT RS256) | 20 minutos |
| Refresh token (deslizante, un solo uso) | 30 días |
| Código de autorización | 60 segundos |
Authorization Code + PKCE: paso a paso
code_verifier (43 a 128 caracteres aleatorios) y code_challenge = base64url(sha256(code_verifier)). GET https://api.mailpro.com/oauth/authorize
?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https://yourapp.example.com/callback
&scope=contacts:read contacts:write
&state=RANDOM_CSRF_TOKEN
&code_challenge=CODE_CHALLENGE
&code_challenge_method=S256
?code=…&state=…. Verifique state (protección CSRF). POST https://api.mailpro.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE
&redirect_uri=https://yourapp.example.com/callback
&client_id=YOUR_CLIENT_ID&code_verifier=CODE_VERIFIER
{ "access_token": "eyJ…", "token_type": "Bearer",
"expires_in": 1200, "refresh_token": "…" }
Authorization: Bearer ACCESS_TOKEN.grant_type=refresh_token y almacene el nuevo refresh token (el anterior queda inutilizado).client_credentials
POST https://api.mailpro.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET&scope=contacts:read email:send
El mismo token de acceso OAuth también es aceptado por las APIs Email v2 (api.mailpro.com/v2) y SMS (api.mailpro.com/sms): autentíquese una vez, llame a cualquier API. Catálogo completo de scopes: véase Scopes OAuth 2.0 más abajo.
La forma más rápida de probar OAuth es el grant client_credentials (servidor a servidor, sin navegador, sin usuario). Necesita un par client_id / client_secret (solicítelo a su contacto de Mailpro o créelo en Ajustes → Acceso a la API). Sustituya los marcadores de posición de más abajo: nunca incluya un secreto real en su repositorio.
1. Obtenga un token de acceso
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=contacts:read"
{ "access_token": "eyJhbGciOiJSUzI1Ni…", "token_type": "Bearer",
"expires_in": 1200 }
2. Llame a un endpoint de recurso con el token
curl https://api.mailpro.com/v3/List \
-H "Authorization: Bearer eyJhbGciOiJSUzI1Ni…"
El mismo token también funciona en Email v2 (…/v2/…) y SMS (…/sms/…), siempre que incluya el scope que cada endpoint requiera. Un token sin el scope necesario será rechazado con 403 insufficient_scope.
«Connect Mailpro» interactivo (authorization_code + PKCE): cuando actúe en nombre de un *usuario* (Zapier/Make/n8n, aplicaciones partner), redirija al usuario a GET https://api.mailpro.com/oauth/authorize con response_type=code, client_id, redirect_uri, scope, state, code_challenge y code_challenge_method=S256; el usuario otorga su consentimiento; usted intercambia el code devuelto en POST https://api.mailpro.com/oauth/token con el code_verifier correspondiente. Recorrido completo más arriba; scopes en Scopes OAuth 2.0 más abajo.
> Los tokens son JWT RS256: los tokens de acceso tienen una vida de 20 minutos > y los refresh tokens, 30 días (deslizante, de un solo uso: cada renovación rota el token). > Verifique las firmas frente al JWKS en > https://api.mailpro.com/oauth/.well-known/jwks y valide el scope de > cada petición contra la matriz de scopes que figura más abajo.
Authorization: Bearer <access_token>
Obtenga un token mediante POST /token (véase más abajo). Válido por defecto durante 30 días; utilice grant_type=refresh_token para renovarlo sin volver a autenticarse. Es más sencillo de configurar, pero está vinculado a una única credencial de cuenta y no admite scopes ni puede entregarse a un tercero: para cualquier integración instalable, opte por OAuth 2.0.
Envíe su ID de cliente y su clave de API como cabeceras HTTP (recomendado) o como parámetros de consulta:
IdClient: 12345
ApiKey: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Las mismas credenciales que las APIs v2 / SMS: cópielas y péguelas desde Ajustes → Acceso a la API. Sin paso de intercambio de tokens. Se recomienda la forma con cabeceras, ya que las URL quedan registradas en IIS, Cloudflare y proxies.
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
username: su nombre de usuario de Mailpro (correo electrónico)password: su clave de API (GUID), disponible en Ajustes → Acceso a la APIPOST /token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID
> El token emitido por POST /v3/token también es válido en la API Email v2 > (api.mailpro.com/v2) y en la API SMS (api.mailpro.com/sms). Autentíquese > una sola vez y llame a cualquier API.
Cuando su aplicación solicita un token de acceso OAuth, declara un conjunto de scopes: permisos que definen con precisión lo que el token puede hacer. El usuario ve una descripción en lenguaje claro de cada scope solicitado en la pantalla de consentimiento. Los scopes se separan por espacios en el parámetro scope (scope=contacts:read email:send). Solicite únicamente lo que necesite.
Los scopes siguen el patrón <recurso>:<acción> y son jerárquicamente independientes: contacts:write no implica contacts:read; solicite ambos si los necesita.
| Scope | Permite |
|---|---|
contacts:read | Consultar sus contactos, listas, etiquetas, segmentos y campos personalizados. |
contacts:write | Crear, editar y eliminar sus contactos, listas, etiquetas y campos personalizados. |
email:send | Enviar correos electrónicos transaccionales y de campaña en su nombre. |
email:read | Consultar estadísticas de entrega, aperturas, clics y el historial de rebotes. |
email:templates:read | Consultar sus plantillas de correo electrónico (asunto, cuerpo HTML y texto plano). |
email:templates:write | Crear, editar y eliminar sus plantillas de correo electrónico. |
sms:send | Enviar mensajes SMS transaccionales y de campaña en su nombre. |
sms:read | Consultar el saldo de créditos SMS y el historial de mensajes. |
sms:contacts:read | Consultar su agenda telefónica de SMS. |
sms:contacts:write | Crear, editar y eliminar entradas en su agenda telefónica de SMS. |
webhooks:manage | Suscribirse, editar y eliminar endpoints de webhook de su cuenta. |
account:read | Consultar los créditos, los límites y el estado de la suscripción de su cuenta. |
Las comprobaciones de scope son activas y se aplican por endpoint para los tokens emitidos por OAuth (la autenticación heredada queda exenta). Cada operación de esta referencia indica el scope requerido bajo el apartado Authorization. Resumen para la superficie CRM v3:
| Endpoints | Scope requerido |
|---|---|
GET /Contact/{id}, GET /List, GET /List/{id}, GET /List/{id}/Contact, GET /List/{listId}/Unsubscribers, GET /Tag, GET /Tag/{id}, GET /Tag/{id}/Contact, GET /Segment, comprobación de pertenencia a segmento | contacts:read |
POST /Contact, POST /Contact/Multiple, PUT/DELETE /Contact/{id}, añadir/quitar etiqueta o lista en un contacto, POST/PUT/DELETE /List, POST/PUT/DELETE /Tag | contacts:write |
> Los endpoints de esta especificación que no aparecen más arriba (por ejemplo, GET /Field, > campañas, envío transaccional, envío de SMS, plantillas de mensajes, información de cuenta) > son hoy accesibles con cualquier token válido: aún no se aplican controles de scope sobre ellos > en la superficie CRM v3. Las APIs Email v2 y SMS aplican adicionalmente controles propios > a sus endpoints de envío / plantillas / contactos / cuenta (véanse esas especificaciones).
Un rechazo por scope devuelve 403 con { "error": "insufficient_scope", "required_scope": "…" } (RFC 6750 §3.1).
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).includeBodyHTML=true) devuelven 10 elementos por página por defecto.200 con una lista vacía []. 404 significa que el propio recurso (lista, etiqueta, segmento, campaña…) no existe.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.
Las infracciones de reglas de negocio devuelven HTTP 406 con un cuerpo JSON:
{ "Message": "Contact cannot be created. Email cannot be empty." }
Causas habituales de 406:
Email cannot be empty: el correo electrónico es obligatorioEmail has an invalid format: no es una dirección de correo electrónico válidaA contact already exist with the same Email: violación de unicidad de correo electrónicoThe email address was unsubscribed permanently: dirección en lista negraThe email address has identified has a hard bounce: la dirección ha rebotadoThe email address has identified has a spam trap: spam trap detectadoAt least one List is necessary: los contactos deben pertenecer al menos a una listaOne or more lists have reached the contact limit: máximo de 1 M de contactos por listaInvalid Phone Number: error de formato del número de teléfonoInvalid country code for Phone Number: prefijo de país no admitidoLength exceeded for Phone Number (12): número de teléfono demasiado largo| Código | Significado |
|---|---|
400 | Solicitud mal formada (JSON no válido, mensaje que supera el límite de partes SMS) |
401 | Credenciales ausentes, no válidas o caducadas |
402 | Créditos insuficientes para realizar el envío |
403 | Permitido por sus credenciales, pero rechazado — cuenta bloqueada para el envío de SMS |
404 | El objeto referenciado no existe (contacto, lista, etiqueta, campo, campaña) |
406 | Violación de una regla de negocio de contacto (ver la lista anterior) |
422 | Entrada rechazada por la validación, o límite de cuenta alcanzado |
> Cambio: algunos de estos casos devolvían antes 404. Los créditos > insuficientes ahora devuelven 402, los errores de validación y los límites > de cuenta devuelven 422, y una cuenta bloqueada para SMS devuelve 403. > 404 ahora solo se usa para «este objeto no existe», de forma coherente con > la API SMS. Si su integración se basa en 404 para esos casos, actualícela > con los códigos anteriores.
Los números de teléfono se normalizan automáticamente. Puede enviarlos en numerosos 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 (con 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 — dígitos sin prefijo | 1234567 — demasiado corto (< 8 dígitos) |
Reglas:
+, 00 o sin prefijo0)-, punto ., barra /, paréntesis ( ), guion bajo _, NBSP=, ;, + dentro del número, etc.) → rechazado41794849980)Particularidades del Contact v3: el campo phone_number de un Contact está actualmente limitado a 12 dígitos tras la normalización (frente a 15 en los endpoints SMS independientes). Los números de países como Alemania (13), Brasil (13) o móviles de Italia (12-13) pueden ser rechazados en /v3/Contact con Length exceeded for Phone Number (12). Esta restricción heredada podrá relajarse en una próxima versión.
| Recurso | Límite |
|---|---|
| Etiquetas por cuenta | 1000 |
| Listas por cuenta | 1000 |
| Campos personalizados por cuenta | 50 |
| Peticiones API mensuales por cuenta | 50 000 (5× los créditos de correo electrónico de la suscripción) |
Cada email enviado de forma unitaria (POST /Send/Mail, la API Email v2, 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/Mail contiene id_single_send.email.delivered y email.bounced envían el estado final a su servidor en cuanto se conoce, sin ninguna consulta.GET /Send/{id}/Status 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 (date_planned). | no |
sent | Entregado por nuestros servidores, aún sin respuesta del servidor del destinatario. | no |
delivered | Aceptado por el servidor del destinatario (diag_code = su respuesta SMTP). | sí |
bounced | Rechazado. bounce_type: 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 date_planned.Los estados se conservan durante 365 días.
Mailpro™ puede notificar a su servidor en tiempo real cuando se producen determinados eventos en su cuenta (se crea un contacto, se entrega un correo electrónico, finaliza una campaña, etc.). Al estilo de Stripe: su URL recibe un POST firmado con HMAC-SHA256 en cuanto el evento se desencadena.
Cada evento enviado a su webhook cuenta como 1 petición en su cuota de peticiones a la API.
POST /Webhook. La respuesta contiene un secret que se muestra una sola vez (al estilo de Stripe / GitHub): consérvelo.secret (fragmentos de código más abajo).> ⏱ 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 esa ventana puede que los eventos aún no coincidan con su nueva suscripción > (o que sigan coincidiendo con una que acaba de eliminarse). 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": "contact.created",
"created": 1748194800,
"apiVersion": "v3",
"account": { "id": 12345, "name": "ACME Corp" },
"data": { "id": "...", "email": "[email protected]", "...": "..." }
}
| Campo | Formato | Descripción |
|---|---|---|
id | evt_ + 32 hex | Identificador único del evento: utilícelo como clave de idempotencia por su parte. |
type | <dominio>.<verbo> | Tipo de evento canónico (por ejemplo, email.delivered, contact.created). |
created | Segundos Unix UTC | Incluido en la firma HMAC. |
apiVersion | "v3" | API de Mailpro que ha publicado el evento. |
account.id | int | Su ID de cliente de Mailpro. |
account.name | string | Nombre de su cuenta (útil para depurar en el lado cliente). |
data | object | Payload del evento: la forma depende de type (véase el catálogo a continuación). |
| Evento | Disparador | Forma de data |
|---|---|---|
ping | Prueba mediante POST /Webhook/{id}/test | { message } |
contact.created | POST /Contact | { id, email, firstName, lastName, createdAt } |
contact.updated | PUT /Contact/{id} | { id, email, firstName, lastName, updatedAt, changes } |
contact.deleted | DELETE /Contact/{id} | { id, email, deletedAt } |
list.contact_added | Contacto añadido a una lista | { listId, listName, contactId, contactEmail, addedAt } |
list.contact_removed | Contacto eliminado de una lista | { listId, listName, contactId, contactEmail, removedAt } |
tag.applied | Etiqueta aplicada a un contacto | { tag, contactId, contactEmail, appliedAt } |
tag.removed | Etiqueta retirada | { tag, contactId, contactEmail, removedAt } |
segment.matched | Un contacto entra en un segmento | { segmentId, segmentName, contactId, contactEmail, matchedAt } |
email.processed | Envío aceptado por el pipeline | { 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 | Pixel de seguimiento activado | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Clic en un enlace con seguimiento | { messageId, email, campaignId, clickedAt, url, ip, userAgent } |
email.bounced | Rebote hard o soft | { 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 el envío | { campaignId, name, totalRecipients, startedAt } |
campaign.finished | Todos los destinatarios procesados | { campaignId, name, totalSent, totalFailed, finishedAt } |
import.started | Trabajo de importación iniciado | { importId, fileName, totalRows, startedAt } |
import.progress | Al 25/50/75 % | { importId, fileName, processedRows, totalRows, progressPct } |
import.completed | Importación correcta | { importId, fileName, totalRows, addedCount, updatedCount, errorCount, completedAt } |
import.failed | Error fatal durante la importación | { importId, fileName, errorMessage, failedAt } |
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: contact.created
X-Mailpro-Attempt: 1
Para verificar:
t y v1 de la cabecera.|now - t| > 300 (ventana de protección contra reenvío 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 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 (entrega marcada como failed) |
Tras 10 fallos consecutivos en el mismo webhook, este se desactiva automáticamente (isActive: false) y usted recibe un correo electrónico de notificación. Vuelva a activarlo con PUT /Webhook/{id} una vez que su endpoint esté reparado.
Consideramos su webhook como correcto únicamente si devuelve un estado en 200-299. Cualquier 3xx/4xx/5xx o un timeout (> 10 s) se contabiliza como un fallo y desencadena reintentos. Si su endpoint está definitivamente fuera de servicio, devuelva 410 Gone explícitamente: 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 |
Obtén un token JWT Bearer para autenticar todas las demás llamadas a la API. El endpoint de token admite varios tipos de concesión: password, refresh_token, client_credentials y las integraciones de terceros (zapier, automateio, microsoft-flow).
/tokenObtener un token de acceso
Obtiene un token JWT Bearer mediante credenciales de cliente. Envía el access_token devuelto como Authorization: Bearer <token> en todas las solicitudes posteriores.
| Tipo de concesión | Caso de uso |
|---|---|
password | Integración estándar: nombre de usuario + clave de API |
refresh_token | Renueva un token de acceso a punto de caducar sin volver a autenticarse |
client_credentials | De servidor a servidor solo con el ID de cliente |
zapier / automateio / microsoft-flow | Integraciones de plataformas de terceros |
Usa grant_type=refresh_token para obtener un token de acceso nuevo sin volver a autenticarte: tu SDK debería hacerlo automáticamente cuando al token de acceso le quede poco tiempo de validez (estrategia típica: actualizar cuando queden menos de 24 h).
Incluso con una vigencia de 30 días, cualquier persona que obtenga un access_token puede suplantar a tu cuenta hasta que caduque. Almacena los tokens en un almacén de secretos del servidor (Vault, AWS Secrets Manager, Azure Key Vault, variables de entorno en un host bastionado). Nunca incrustes un token en:
Si se filtra un token, revócalo desde la configuración de tu cuenta de Mailpro y solicita uno nuevo.
Cuerpo de la solicitud (application/x-www-form-urlencoded)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials, zapier, automateio, microsoft-flow | sí | Tipo de concesión de autenticación |
username | string | Tu nombre de usuario de Mailpro (correo electrónico). Obligatorio para la concesión password. | |
password | string | Tu clave de API de Mailpro (formato GUID). Obligatoria para la concesión password. | |
refresh_token | string | Token de actualización anterior. Obligatorio para la concesión refresh_token. | |
client_id | string | Tu ID de cliente de Mailpro (entero). Obligatorio para la concesión client_credentials. |
Respuestas
| Código | Descripción |
|---|---|
200 | Token emitido correctamente |
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."
}
Recupera el perfil de la cuenta, el saldo de créditos y los detalles de la suscripción.
/Account/MeObtener detalles de la cuenta
Devuelve los detalles del perfil y la configuración de la cuenta de Mailpro autenticada.
Respuestas
| Código | Descripción |
|---|---|
200 | Detalles de la cuenta devueltos correctamente |
401 | Token no válido o caducado |
/Account/CreditsObtener el saldo de créditos
Devuelve el saldo de créditos restantes de correo electrónico y SMS de la cuenta.
Respuestas
| Código | Descripción |
|---|---|
200 | Saldo de créditos devuelto correctamente |
401 | Token no válido o caducado |
Ejemplo 200
{
"email_credits": 48500,
"sms_credits": 1200
}
/Account/SubscriptionEndDateObtener la fecha de fin de la suscripción
Devuelve la fecha de caducidad de la suscripción actual de Mailpro.
Respuestas
| Código | Descripción |
|---|---|
200 | Fecha de fin de la suscripción devuelta correctamente |
401 | Token no válido o caducado |
/Account/LimitsObtener 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, créditos_de_suscripción × 5). Para un plan de 10 000 correos/mes, esto genera un presupuesto mensual de 50 000 solicitudes. La correspondencia exacta la establece el proceso de facturación en el alta de la suscripción y 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 (cada llamada = 1 crédito, sea cual sea el resultado: tanto los 2xx como la mayoría de los errores de negocio 4xx cuentan).contact.created enviado a tu webhook suscrito = 1 crédito además de la llamada a la API que lo desencadenó).Qué es GRATUITO (no consume créditos):
/health (monitorización).401 (fallo de autenticación), 403 (prohibido) o 429 (limitadas por tasa).Respuestas
| Código | Descripción |
|---|---|
200 | Instantánea de la cuota |
401 | Token no válido o caducado |
404 | No se ha encontrado ningún registro de cuota para esta cuenta (cuenta recién creada que nunca ha realizado una llamada a la API; la fila se creará en la primera solicitud autenticada). |
CRUD completo de los contactos del CRM. Los contactos almacenan una dirección de correo electrónico, un número de teléfono opcional, valores de campos personalizados y pertenecen a una o varias Listas. También pueden etiquetarse con Etiquetas. Los ID de contacto son UUID.
/ContactCrear un contacto
Crea un nuevo contacto del CRM con campos personalizados, asignaciones de listas y etiquetas opcionales.
Obligatorio:
email: debe ser único en la cuentalists: al menos una asignación de lista es obligatoriaLos números de teléfono aceptan +41…, 0041… o 41… con o sin separadores (máx. 12 dígitos en Contact; consulta Formato del número de teléfono en la descripción de la API).
Los campos personalizados se identifican por su id (de GET /Field). Los valores se validan según el tipo del campo.
Scope OAuth : contacts:write
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
email | string | sí | Dirección de correo electrónico del contacto (obligatoria, debe ser única) |
phone_number | string | Número de teléfono: acepta +41…, 0041… o 41… con o sin separadores.
Debe comenzar por un código de país válido. Máximo 12 dígitos en Contact
(consulta Formato del número de teléfono en la descripción de la API
para las reglas completas).
| |
lists | array of ListRef | sí | Listas a las que asignar este contacto. Es obligatoria al menos una lista. |
tags | array of TagRef | Etiquetas que asignar a este contacto (opcional) | |
custom_fields | array of FieldValue | Valores de los campos personalizados de este contacto (opcional) |
Ejemplo
{
"email": "[email protected]",
"phone_number": "+41791234567",
"lists": [
{
"id": 101
}
],
"tags": [
{
"id": 5
}
],
"custom_fields": [
{
"id": 1,
"value": "Alice"
},
{
"id": 2,
"value": "Dupont"
}
]
}
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto creado correctamente |
400 | Formato de correo electrónico no válido |
401 | Token no válido o caducado |
406 | Infracción de regla de negocio (consulta la descripción para la lista completa) |
Ejemplo 406
{
"Message": "Contact cannot be created. A contact already exist with the same Email"
}
/Contact/MultipleImportar contactos (en masa)
Crea hasta 1000 contactos en una sola solicitud para una importación masiva eficiente. La respuesta incluye una lista de los contactos creados correctamente y una lista de errores correspondientes a los contactos que no se pudieron crear (p. ej. correo electrónico duplicado, datos no válidos).
Nota: las listas y etiquetas utilizadas en importaciones masivas no deben estar vinculadas a flujos de trabajo de automatización activos. Si lo están, toda la importación se rechaza con HTTP 406.
Scope OAuth : contacts:write
Cuerpo de la solicitud (application/json)
Ejemplo
[
{
"email": "[email protected]",
"lists": [
{
"id": 101
}
],
"custom_fields": [
{
"id": 1,
"value": "Alice"
}
]
},
{
"email": "[email protected]",
"lists": [
{
"id": 101
}
],
"custom_fields": [
{
"id": 1,
"value": "Bob"
}
]
}
]
Respuestas
| Código | Descripción |
|---|---|
200 | Importación masiva completada (consulta el array errors para ver los fallos parciales) |
400 | Entrada no válida |
401 | Token no válido o caducado |
406 | Infracción de regla de negocio (p. ej. conflicto de automatización, límite de listas alcanzado) |
Ejemplo 200
{
"Added": [
{
"Email": "[email protected]",
"Id": "550e8400-e29b-41d4-a716-446655440000"
},
{
"Email": "[email protected]",
"Id": "660e8400-e29b-41d4-a716-446655440001"
}
],
"Errors": []
}
/Contact/{id}Obtener un contacto
Devuelve los detalles de un contacto específico. Usa includeTags=true para devolver también las etiquetas asignadas al contacto. Usa includeLists=true para devolver también las listas a las que pertenece el contacto.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto (de POST /Contact o GET /List/{id}/Contact) |
includeTags | query | boolean | Establece en true para incluir las asignaciones de etiquetas del contacto en la respuesta | |
includeLists | query | boolean | Establece en true para incluir las pertenencias a listas del contacto en la respuesta |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto devuelto correctamente |
401 | Token no válido o caducado |
404 | Contacto no encontrado |
Ejemplo 200
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"phone_number": "41791234567",
"custom_fields": [
{
"id": 1,
"value": "Alice"
},
{
"id": 2,
"value": "Dupont"
}
],
"tags": [
{
"id": 5
}
],
"lists": [
{
"id": 101
}
]
}
/Contact/{id}Actualizar un contacto
Actualiza el correo electrónico, el número de teléfono, los campos personalizados, las asignaciones de listas y las etiquetas de un contacto. El cuerpo de la solicitud reemplaza los datos actuales del contacto: incluye todas las listas y etiquetas a las que quieras que el contacto siga estando asignado.
Obligatorio en el cuerpo: email y al menos una entrada lists.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
email | string | sí | Dirección de correo electrónico del contacto (obligatoria, debe ser única) |
phone_number | string | Número de teléfono: acepta +41…, 0041… o 41… con o sin separadores.
Debe comenzar por un código de país válido. Máximo 12 dígitos en Contact
(consulta Formato del número de teléfono en la descripción de la API
para las reglas completas).
| |
lists | array of ListRef | sí | Listas a las que asignar este contacto. Es obligatoria al menos una lista. |
tags | array of TagRef | Etiquetas que asignar a este contacto (opcional) | |
custom_fields | array of FieldValue | Valores de los campos personalizados de este contacto (opcional) |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto actualizado correctamente |
401 | Token no válido o caducado |
404 | Contacto no encontrado |
422 | Error de validación (formato de correo, número de teléfono, tipo de valor de campo no coincidente) |
Ejemplo 200
{
"Result": "Successful operation"
}
/Contact/{id}Eliminar un contacto
Elimina un contacto del CRM de forma permanente.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto eliminado correctamente |
401 | Token no válido o caducado |
404 | Contacto no encontrado |
/Contact/{id}/ActivityActividad de un contacto en 90 días
Correos recibidos, abiertos y con clics, cliente de correo preferido y últimas campañas del contacto.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | GUID del contacto |
Respuestas
| Código | Descripción |
|---|---|
200 | Actividad devuelta |
401 | Token no válido o caducado |
404 | El contacto solicitado no existe |
Ejemplo 200
{
"period_days": 90,
"email_received": 12,
"email_opened": 7,
"email_clicked": 2,
"favorite_email_client": "Gmail",
"last_campaigns": [
{
"id": 5001,
"name": "Spring Sale 2026",
"date": "2026-10-01T09:00:00"
}
]
}
/Contact/{id}/Tag/{tagid}Añadir etiqueta a contacto
Asigna una etiqueta a un contacto. Si la etiqueta ya está asignada, la operación no produce ningún efecto.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
tagid | path | integer (int64) | sí | ID de la etiqueta (de GET /Tag) |
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta asignada correctamente |
401 | Token no válido o caducado |
404 | Contacto o etiqueta no encontrados |
/Contact/{id}/Tag/{tagid}Eliminar etiqueta de contacto
Elimina la asignación de una etiqueta de un contacto.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
tagid | path | integer (int64) | sí | ID de la etiqueta |
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta eliminada correctamente |
401 | Token no válido o caducado |
404 | Contacto o etiqueta no encontrados |
/Contact/{id}/List/{listid}Añadir contacto a lista
Añade un contacto a una lista concreta. Devuelve HTTP 404 si el contacto había cancelado previamente la suscripción a esta lista.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
listid | path | integer (int64) | sí | ID de la lista (de GET /List) |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto añadido a la lista correctamente |
401 | Token no válido o caducado |
404 | Contacto, lista no encontrada, o el contacto había cancelado la suscripción a esta lista |
/Contact/{id}/List/{listid}Eliminar contacto de una lista
Elimina un contacto de una lista concreta. El contacto en sí no se elimina.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | UUID del contacto |
listid | path | integer (int64) | sí | ID de la lista |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto eliminado de la lista correctamente |
401 | Token no válido o caducado |
404 | Contacto o lista no encontrados |
Gestiona las listas de contactos. Las listas agrupan contactos para campañas y segmentación. Máximo 1000 listas por cuenta (mismo límite en las tres API de Mailpro y en la app). Máximo 1 000 000 de contactos por lista.
/ListListar las listas de contactos
Devuelve todas las listas de contactos de la cuenta. Filtra por nombre o fecha de creación. Ordena alfabéticamente con sortByName=true. Incluye el número total de contactos por lista con includeTotalContacts=true.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
name | query | string | Filtrar por nombre de lista (coincidencia parcial) | |
dateCreationFrom | query | string (date-time) | Filtrar por fecha de creación (desde, ISO 8601) | |
dateCreationTo | query | string (date-time) | Filtrar por fecha de creación (hasta, ISO 8601) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo | |
pageNumber | query | integer | Número de página, basado en 1 | |
sortByName | query | boolean | Establece en true para ordenar alfabéticamente por nombre | |
includeTotalContacts | query | boolean | Establece en true para incluir el recuento total_contacts en cada resultado |
Respuestas
| Código | Descripción |
|---|---|
200 | Listas devueltas correctamente |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 101,
"name": "Newsletter subscribers",
"total_contacts": 4521,
"date_creation": "2025-01-15T10:30:00"
}
]
/ListCrear una lista de contactos
Crea una nueva lista de contactos. Máximo 1000 listas por cuenta.
Scope OAuth : contacts:write
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | sí | Nombre visible de la lista |
Ejemplo
{
"name": "Spring Campaign 2026"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Lista creada correctamente |
401 | Token no válido o caducado |
406 | Se ha alcanzado el límite de listas (1000) |
Ejemplo 200
{
"id": 102,
"name": "Spring Campaign 2026",
"date_creation": "2026-04-14T12:00:00"
}
/List/{id}Obtener una lista de contactos
Devuelve los detalles de una lista de contactos concreta.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la lista |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista devuelta correctamente |
401 | Token no válido o caducado |
404 | Lista no encontrada |
/List/{id}Actualizar una lista de contactos
Renombra una lista de contactos existente.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la lista |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | sí | Nombre visible de la lista |
Ejemplo
{
"name": "Newsletter subscribers — Europe"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Lista actualizada correctamente |
401 | Token no válido o caducado |
404 | Lista no encontrada |
/List/{id}Eliminar una lista de contactos
Elimina una lista de contactos de forma permanente. Los contactos en sí no se eliminan: solo se elimina su pertenencia a esta lista. Las listas utilizadas por flujos de trabajo de automatización activos no pueden eliminarse.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la lista |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista eliminada correctamente |
401 | Token no válido o caducado |
404 | Lista no encontrada |
406 | La lista está siendo utilizada por un flujo de trabajo de automatización activo |
/List/{id}/ContactListar contactos de una lista
Devuelve los contactos que pertenecen a una lista concreta. Filtra por correo electrónico o fecha de adición. Incluye etiquetas y pertenencias a listas con los indicadores correspondientes.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la lista |
email | query | string | Filtrar por correo electrónico (coincidencia parcial) | |
numberOfRecords | query | integer | Elementos por página — 5000 por defecto y como máximo | |
pageNumber | query | integer | ||
sortByEmail | query | boolean | Ordenar alfabéticamente por correo electrónico | |
includeTags | query | boolean | Incluir las asignaciones de etiquetas en los resultados | |
includeLists | query | boolean | Incluir las pertenencias a listas en los resultados |
Respuestas
| Código | Descripción |
|---|---|
200 | Contactos devueltos correctamente |
401 | Token no válido o caducado |
404 | Lista no encontrada o ningún contacto coincide con los criterios |
/List/{listId}/UnsubscribersListar los que han cancelado la suscripción
Devuelve los contactos que han cancelado la suscripción a una lista concreta.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
listId | path | integer (int64) | sí | ID de la lista |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de cancelaciones de suscripción devuelta correctamente |
401 | Token no válido o caducado |
404 | Lista no encontrada |
Gestiona etiquetas para clasificar y segmentar contactos. Las etiquetas son rótulos planos (p. ej. «VIP», «Inactivos», «B2B»). Máximo 1000 etiquetas por cuenta.
/TagListar etiquetas
Devuelve todas las etiquetas de la cuenta.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
name | query | string | Filtrar por nombre (coincidencia parcial) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer | ||
sortByName | query | boolean |
Respuestas
| Código | Descripción |
|---|---|
200 | Etiquetas devueltas correctamente |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 5,
"name": "VIP customers"
},
{
"id": 6,
"name": "Newsletter openers"
}
]
/TagCrear una etiqueta
Crea una nueva etiqueta. Máximo 1000 etiquetas por cuenta.
Scope OAuth : contacts:write
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | sí | Nombre visible de la etiqueta |
Ejemplo
{
"name": "VIP customers"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta creada correctamente |
401 | Token no válido o caducado |
406 | Se ha alcanzado el límite de etiquetas (1000) |
/Tag/{id}Obtener una etiqueta
Devuelve una etiqueta concreta por su ID.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la etiqueta |
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta devuelta correctamente |
401 | Token no válido o caducado |
404 | Etiqueta no encontrada |
/Tag/{id}Actualizar una etiqueta
Renombra una etiqueta existente.
Scope OAuth : contacts:write
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 |
|---|---|---|---|
name | string | sí | Nombre visible de la etiqueta |
Ejemplo
{
"name": "VIP customers — updated"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta actualizada correctamente |
401 | Token no válido o caducado |
404 | Etiqueta no encontrada |
/Tag/{id}Eliminar una etiqueta
Elimina una etiqueta de forma permanente. La etiqueta se elimina de todos los contactos. Las etiquetas utilizadas por flujos de trabajo de automatización activos no pueden eliminarse.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Etiqueta eliminada correctamente |
401 | Token no válido o caducado |
404 | Etiqueta no encontrada |
406 | La etiqueta está siendo utilizada por un flujo de trabajo de automatización activo |
/Tag/{id}/ContactListar contactos con una etiqueta
Devuelve los contactos a los que se les ha asignado una etiqueta concreta.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID de la etiqueta |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Contactos devueltos correctamente |
401 | Token no válido o caducado |
404 | Etiqueta no encontrada |
Gestiona campos personalizados de contacto. Los campos te permiten almacenar datos adicionales en cada contacto (p. ej. nombre, ciudad, nivel de fidelización). Máximo 50 campos por cuenta. Tipos de campo: text, number, date.
/FieldListar campos personalizados
Devuelve todos los campos personalizados de contacto definidos para la cuenta. Usa los valores id devueltos al crear o actualizar contactos.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
name | query | string | Filtrar por nombre de campo | |
idFieldType | query | integer | Filtrar por ID de tipo de campo | |
numberOfRecords | query | integer | ||
pageNumber | query | integer | ||
sortByName | query | boolean |
Respuestas
| Código | Descripción |
|---|---|
200 | Campos personalizados devueltos correctamente |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 1,
"name": "first_name",
"personalisation_key": "first_name",
"field_type": "text"
},
{
"id": 2,
"name": "last_name",
"personalisation_key": "last_name",
"field_type": "text"
}
]
/FieldCrear un campo personalizado
Crea un nuevo campo personalizado de contacto. Máximo 50 campos por cuenta. Usa el id devuelto al asignar valores a los contactos.
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | sí | Nombre visible del campo |
id_field_type | integer | sí | ID del tipo de campo (tipos disponibles mediante GET /Field/Types):
- 1 = texto
- 2 = número entero
- 3 = fecha y hora
- 4 = sí / no
- 12 = número decimal
|
personalize_key | string | sí | Clave de variable de la plantilla, para insertar el campo en un mensaje |
sort | integer | Orden de visualización (0 a 255). Obligatorio para modificar un campo (PUT /Field/{id}). |
Ejemplo
{
"name": "First name",
"id_field_type": 1,
"personalize_key": "first_name"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Campo creado correctamente |
401 | Token no válido o caducado |
406 | Se ha alcanzado el límite de campos (50) |
/Field/TypesListar los tipos de campo
Devuelve los identificadores de tipo de campo disponibles para usar al crear un campo personalizado. Tipos habituales: 1 = texto, 2 = número, 3 = fecha.
Respuestas
| Código | Descripción |
|---|---|
200 | Tipos de campo devueltos correctamente |
401 | Token no válido o caducado |
/Field/{id}Obtener un campo personalizado
Devuelve la definición y los metadatos de un campo personalizado concreto.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del campo |
Respuestas
| Código | Descripción |
|---|---|
200 | Campo devuelto correctamente |
401 | Token no válido o caducado |
404 | Campo no encontrado |
/Field/{id}Actualizar un campo personalizado
Actualiza el nombre o la clave de personalización de un campo personalizado.
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 |
|---|---|---|---|
name | string | sí | Nombre visible del campo |
id_field_type | integer | sí | ID del tipo de campo (tipos disponibles mediante GET /Field/Types):
- 1 = texto
- 2 = número entero
- 3 = fecha y hora
- 4 = sí / no
- 12 = número decimal
|
personalize_key | string | sí | Clave de variable de la plantilla, para insertar el campo en un mensaje |
sort | integer | Orden de visualización (0 a 255). Obligatorio para modificar un campo (PUT /Field/{id}). |
Respuestas
| Código | Descripción |
|---|---|
200 | Campo actualizado correctamente |
401 | Token no válido o caducado |
404 | Campo no encontrado |
/Field/{id}Eliminar un campo personalizado
Elimina un campo personalizado de forma permanente y borra su valor de todos los contactos. Esta acción no se puede deshacer.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Campo eliminado correctamente |
401 | Token no válido o caducado |
404 | Campo no encontrado |
Consulta las estadísticas de campaña y gestiona las campañas programadas. Las campañas pueden editarse o eliminarse hasta 5 minutos antes de la hora de envío programada.
/CampaignListar campañas
Devuelve una lista paginada de las campañas de correo electrónico de la cuenta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Campañas devueltas correctamente |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 8001,
"title": "Spring Newsletter April 2026",
"date_planned": "2026-04-20T09:00:01",
"count_open": 1823,
"count_sent": 4521,
"count_click": 342,
"count_badmail": 12,
"count_unsubscription": 8,
"count_clicking_users": 289,
"count_complaints": 1,
"spam_trap": 0,
"deliverability_score": 98
}
]
/Campaign/{id}Obtener una campaña
Devuelve la configuración y el resumen de estadísticas de una campaña concreta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña devuelta correctamente |
401 | Token no válido o caducado |
404 | Campaña no encontrada |
/Campaign/{id}Actualizar una campaña
Actualiza el título o la fecha de envío de una campaña programada. Las campañas solo pueden modificarse hasta 5 minutos antes de la hora de envío programada.
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 |
|---|---|---|---|
campaign_title | string | Nombre visible de la campaña | |
date_planned | string (date-time) | Hora de envío programada (ISO 8601). Omítela para enviar de inmediato. |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña actualizada correctamente |
401 | Token no válido o caducado |
404 | Campaña no encontrada |
/Campaign/{id}Eliminar una campaña
Cancela y elimina permanentemente una campaña por su identificador.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña eliminada correctamente |
401 | Token no válido o caducado |
404 | Campaña no encontrada |
/Campaign/ScheduledListar mis campañas programadas
Devuelve las campañas con date_planned en el futuro que aún no han sido enviadas. Ordenadas por date_planned de forma ascendente.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de campañas programadas |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 5001,
"id_client": 12345,
"subject": "Spring Sale 2026",
"date_planned": "2026-05-01T09:00:00",
"title": "Spring Sale",
"id_campaign": 7001,
"id_list": 101,
"id_segment": null,
"number_email": 1250
}
]
/Campaign/{id}/CancelCancelar una campaña programada
Cancela una campaña programada en el futuro. Devuelve 409 Conflict si la campaña ya se ha enviado o no existe.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña cancelada |
401 | Token no válido o caducado |
409 | Ya enviada o no encontrada |
Ejemplo 200
{
"result": "ok",
"cancelled": 5001
}
/Campaign/{id}/RescheduleReprogramar una campaña programada
Actualiza la fecha de envío prevista de una campaña programada. La nueva fecha debe estar en el futuro y dentro de los 90 días.
Nombre del campo en el cuerpo: la API acepta date_planned (snake_case, principal) así como los alias heredados PlanDate y scheduled_time. Proporciona uno cualquiera de ellos: se utiliza el primero que no sea nulo.
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 |
|---|---|---|---|
date_planned | string (date-time) | Nombre del campo principal. | |
PlanDate | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. | |
scheduled_time | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. |
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña reprogramada |
400 | Falta la fecha: proporciona uno de date_planned / PlanDate / scheduled_time |
401 | Token no válido o caducado |
409 | Ya enviada |
Ejemplo 200
{
"result": "ok",
"id": 5001,
"date_planned": "2026-12-31T14:30:00"
}
/Campaign/{id}/ByHourEstadísticas por hora
Devuelve el desglose por hora de aperturas y clics de la campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas por hora devueltas correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/ByDayEstadísticas por día
Devuelve el desglose diario de aperturas y clics de la campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas diarias devueltas correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/OpeningsListar las aperturas de correo electrónico
Devuelve una lista paginada de los contactos que han abierto el correo electrónico de la campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
email | query | string | Filtrar por correo electrónico del destinatario | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de aperturas devuelta correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/ClicksListar los clics en enlaces
Devuelve una lista paginada de los contactos que han hecho clic en un enlace de la campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
email | query | string | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de clics devuelta correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/HardBouncesListar los rebotes definitivos
Devuelve las direcciones de correo electrónico que han generado un rebote definitivo durante esta campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
email | query | string | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Lista de rebotes definitivos devuelta correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/LinksListar los enlaces rastreados
Devuelve los datos de rendimiento de clics de cada enlace rastreado de la campaña.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | |
link | query | string | Filtrar por URL del enlace (coincidencia parcial) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas de enlaces devueltas correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/OSEstadísticas por SO / dispositivo
Devuelve el desglose de aperturas y clics por sistema operativo y tipo de dispositivo.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas de SO devueltas correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/EmailClientsEstadísticas por cliente de correo electrónico
Devuelve el desglose de aperturas por cliente de correo electrónico (Gmail, Outlook, Apple Mail…).
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas de clientes de correo electrónico devueltas correctamente |
401 | Token no válido o caducado |
/Campaign/{id}/CountriesEstadísticas por país
Devuelve la distribución geográfica de aperturas y clics.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí |
Respuestas
| Código | Descripción |
|---|---|
200 | Estadísticas por país devueltas correctamente |
401 | Token no válido o caducado |
Envía campañas masivas de correo electrónico (a listas de contactos) y correos transaccionales individuales. Las campañas pueden programarse o enviarse de inmediato.
/Send/MailEnviar correo electrónico transaccional
Envía un correo electrónico transaccional puntual a un único destinatario.
Destinatario: proporciona email (dirección en línea) O id_contact (contacto del CRM), no ambos. Usar id_contact habilita la personalización automática con los valores de los campos personalizados del contacto.
Contenido: proporciona body_html (HTML en línea) O id_message (plantilla guardada), no ambos. Si se proporcionan ambos, id_message tiene prioridad.
Obligatorio: id_sender_email, subject y uno de (email o id_contact), y uno de (body_html o id_message).
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_sender_email | integer | ID de la dirección de correo del remitente (de GET /SenderEmail). Obligatorio. | |
email | string | Dirección de correo del destinatario (en línea). Indica esto O id_contact.
Si se indican ambos, id_contact tiene prioridad.
La parte local (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.
| |
id_contact | string (uuid) | ID del contacto del CRM destinatario. Proporciona este O email.
Usar id_contact habilita la personalización con los valores de los
campos personalizados del contacto.
| |
subject | string | Asunto del correo electrónico (máx. 255 caracteres). Obligatorio. | |
body_html | string | Contenido HTML en línea. Proporciona este O id_message.
Si se proporcionan ambos, id_message tiene prioridad.
| |
id_message | integer | ID de una plantilla de mensaje guardada (de GET /Message).
Proporciona este O body_html.
| |
reply_to | string | Dirección de respuesta (por defecto, la dirección del remitente) | |
fields | array of FieldValue | Campos de personalización (solo se usan con email en línea, no con id_contact) | |
date_planned | string (date-time) | Programa el envío para una fecha futura. Omítelo para enviar de inmediato. | |
attachments | array of EmailAttachment | Archivos adjuntos opcionales (máx. 5). Cada elemento es un objeto con un filename y un content codificado en Base64. Límites: 10 MB por archivo y 15 MB en total, medidos tras la decodificación Base64. 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). | |
keep_in_my_files | 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.
|
Ejemplo
{
"id_sender_email": 201,
"email": "[email protected]",
"subject": "Your order #12345 has shipped",
"body_html": "<p>Hello {{first_name}}, your order is on its way!</p>",
"reply_to": "[email protected]",
"fields": [
{
"id": 1,
"value": "Alice"
}
],
"attachments": [
{
"filename": "invoice.pdf",
"content": "JVBERi0xLjQKJVBERi0xLjQK..."
}
]
}
Respuestas
| Código | Descripción |
|---|---|
200 | Correo electrónico enviado o programado correctamente |
400 | Formato de correo electrónico no válido o falta un campo obligatorio |
401 | Token no válido o caducado |
404 | Remitente, mensaje o contacto no encontrados; o el destinatario ha cancelado la suscripción |
422 | Error de validación (asunto demasiado largo, cuerpo y mensaje vacíos a la vez, etc.) |
Ejemplo 200
{
"message": "Successful operation",
"id_single_send": 8001
}
Ejemplo 404
{
"Message": "Not enough credit available"
}
/Send/{id}/StatusObtener el estado de entrega de un correo transaccional
Devuelve el estado de entrega actual de un correo transaccional enviado con POST /Send/Mail. Pase el id_single_send que devolvió esa llamada.
Valores posibles: delivered (aceptado por el servidor del destinatario, véase diag_code), bounced (rechazado — bounce_type: 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, date_planned 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.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | El id_single_send devuelto por POST /Send/Mail. |
Respuestas
| Código | Descripción |
|---|---|
200 | Estado de entrega actual |
401 | Token no válido o caducado |
404 | No se encontró ningún envío transaccional con este id para este cliente |
Ejemplo 200
{
"id_single_send": 8001,
"email": "[email protected]",
"status": "delivered",
"date_planned": "2026-04-15T14:30:00",
"status_date": "2026-04-15T14:30:07",
"diag_code": "2.0.0 (success)",
"bounce_type": null
}
/Send/CampaignEnviar campaña de correo electrónico
Envía una campaña masiva de correo electrónico a una o varias listas de contactos.
Obligatorio:
id_message: la plantilla que se va a enviar (de GET /Message)id_sender_email: la dirección del remitente (de GET /SenderEmail)lists: al menos una lista de contactos destinatariacampaign_title: etiqueta para el seguimiento de estadísticasSegmento: filtra opcionalmente a los destinatarios mediante un segmento guardado (id_segment). El segmento filtra los contactos dentro de las listas especificadas.
Programación: establece date_planned en una fecha/hora ISO 8601 futura. Las campañas pueden editarse o cancelarse hasta 5 minutos antes de la hora programada.
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_message | integer | sí | ID de la plantilla de mensaje que se va a usar (de GET /Message) |
id_sender_email | integer | sí | ID de la dirección del remitente (de GET /SenderEmail) |
id_email_reply_to | integer | ID de la dirección del remitente para respuestas (obtenido con GET /SenderEmail). Debe ser una de las direcciones de remitente de su cuenta; de lo contrario, la solicitud se rechaza. Por defecto: id_sender_email. | |
lists | array of ListRef | sí | Listas de contactos destinatarias (se requiere al menos una) |
id_segment | integer | Filtra los destinatarios mediante un segmento guardado (opcional) | |
campaign_title | string | sí | Nombre visible de esta campaña (máx. 150 caracteres) |
date_planned | string (date-time) | Hora de envío programada (ISO 8601). Omítela para enviar de inmediato. | |
id_automation | integer | Vincula este envío a un flujo de trabajo de automatización (opcional) |
Ejemplo
{
"id_message": 501,
"id_sender_email": 201,
"lists": [
{
"id": 101
}
],
"campaign_title": "Spring Newsletter April 2026",
"date_planned": "2026-04-20T09:00:00"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña programada o enviada correctamente |
401 | Token no válido o caducado |
402 | Créditos insuficientes |
404 | Mensaje, remitente, lista o segmento no encontrados; o créditos insuficientes |
422 | Título de campaña vacío o demasiado largo (máx. 150 caracteres) |
Ejemplo 200
{
"Message": "Successful operation. Campaigns can be edited or deleted until 5 minutes prior to send.",
"IdCampaign": 8001
}
/SendListar envíos programados
Devuelve la lista de campañas de correo electrónico pendientes de envío (programadas, aún no procesadas).
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
subjectMessage | query | string | Filtrar por asunto (coincidencia parcial) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Envíos pendientes devueltos correctamente |
401 | Token no válido o caducado |
/Send/{id}Cancelar un envío programado
Cancela y elimina un envío de correo electrónico programado que aún no se haya procesado. No se pueden cancelar envíos que se estén procesando en ese momento.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del envío (de GET /Send) |
Respuestas
| Código | Descripción |
|---|---|
200 | Envío programado cancelado correctamente |
401 | Token no válido o caducado |
404 | Envío programado no encontrado |
/Send/Mail/ScheduledListar los correos individuales programados
Devuelve los correos individuales enviados con POST /Send/Mail y una fecha futura que aún no han salido. Las campañas se listan con GET /Campaign/Scheduled.
Scope OAuth : email:send
Respuestas
| Código | Descripción |
|---|---|
200 | Correos programados devueltos |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id_single_send": 880123,
"email": "[email protected]",
"subject": "Your invoice",
"date_planned": "2026-12-01T09:00:00"
}
]
/Send/Mail/{id}/CancelCancelar un correo individual programado
Cancela el correo mientras no haya salido.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | id_single_send devuelto por POST /Send/Mail |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo cancelado |
401 | Token no válido o caducado |
409 | Envío no encontrado o ya realizado |
Ejemplo 200
{
"result": "ok",
"cancelled": 880123
}
/Send/Mail/{id}/RescheduleReprogramar 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 POST.
Scope OAuth : email:send
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | id_single_send devuelto por POST /Send/Mail |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
date_planned | string (date-time) | sí | Nueva fecha de envío (ISO 8601) |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo reprogramado |
400 | Falta la fecha |
401 | Token no válido o caducado |
409 | Envío no encontrado, ya realizado o fecha fuera de los límites |
Ejemplo 200
{
"result": "ok",
"id": 880123,
"date_planned": "2026-12-15T09:00:00"
}
Gestiona las direcciones de remitente validadas. Solo las direcciones verificadas pueden utilizarse como From.
/SenderEmailListar direcciones de remitente
Devuelve las direcciones de remitente validadas configuradas para la cuenta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Direcciones de remitente devueltas correctamente |
401 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 201,
"email": "[email protected]",
"sender_name": "Your Company Newsletter",
"is_validated": true
}
]
/SenderEmailAñ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
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
email | string | sí | Dirección del remitente |
sender_name | string | sí | Nombre mostrado a los destinatarios |
Respuestas
| Código | Descripción |
|---|---|
200 | Dirección añadida. domain_has_mx es false cuando el dominio no tiene registro MX. |
400 | Falta email o sender_name |
401 | Token no válido o caducado |
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",
"confirmation_sent": true,
"domain_has_mx": true
}
/SenderEmail/{id}/ResendValidationEnviar 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 |
|---|---|---|---|---|
id | path | integer | sí | id_sender_email de GET /SenderEmail |
Respuestas
| Código | Descripción |
|---|---|
200 | Correo enviado de nuevo |
401 | Token no válido o caducado |
404 | Remitente no encontrado |
409 | Este remitente ya está validado |
503 | No disponible temporalmente, inténtelo de nuevo |
Ejemplo 200
{
"result": "ok",
"confirmation_sent": true
}
/SenderEmail/{id}/AuthenticationComprobar 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: dkim_settings_url abre la pantalla correcta.
Scope OAuth : email:templates:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer | sí | id_sender_email de GET /SenderEmail |
Respuestas
| Código | Descripción |
|---|---|
200 | Estado del dominio. spf.recommended_record se crea a partir de su registro actual: publíquelo solo si spf.change_needed es true. |
401 | Token no válido o caducado |
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",
"recommended_record": "v=spf1 include:spf.mailpro.com -all",
"change_needed": 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"
},
"dkim_settings_url": "https://app.mailpro.com/dkim/list?d=example.com"
}
Consulta el registro de envíos de correo electrónico y SMS pasados.
/History/EmailListar el historial de envíos de correo electrónico
Devuelve el registro de envíos de correo electrónico pasados de la cuenta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
subjectMessage | query | string | Filtrar por asunto (coincidencia parcial) | |
idCampaign | query | integer | Filtrar por ID de campaña | |
includeBodyHTML | query | boolean | Incluir el cuerpo HTML completo en la respuesta (más lento) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Historial de correo electrónico devuelto correctamente |
401 | Token no válido o caducado |
/History/SMSListar el historial de envíos de SMS
Devuelve el registro de envíos de SMS pasados de la cuenta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
dateSend | query | string (date-time) | Filtrar a partir de esta fecha (ISO 8601) | |
dateSendEnd | query | string (date-time) | Filtrar hasta esta fecha (ISO 8601) | |
phoneNumber | query | string | Filtrar por teléfono del destinatario (parcial) | |
type | query | integer | Filtro de tipo de SMS | |
statusCode | query | integer | Filtro de código de estado DLR | |
sortByStatus | query | boolean | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Historial de SMS devuelto correctamente |
401 | Token no válido o caducado |
Gestiona segmentos dinámicos: reglas de filtrado guardadas que seleccionan automáticamente contactos en función de valores de campos, comportamiento o pertenencia a listas.
/SegmentListar segmentos
Devuelve todos los segmentos dinámicos guardados de la cuenta.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Segmentos devueltos correctamente |
401 | Token no válido o caducado |
/Segment/{id}/ContactListar los contactos de un segmento
Con id_list, devuelve solo los contactos de esa lista que entran en el segmento: los que alcanzaría una campaña lista + segmento. El total está en la cabecera X-Total-Count.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del segmento |
id_list | query | integer (int64) | Limitar a esta lista (opcional) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Contactos devueltos |
401 | Token no válido o caducado |
404 | Segmento o lista no encontrados |
/Segment/{id}/CountContar los contactos de un segmento
Solo el número, para conocer de antemano el tamaño de un envío. Con id_list, cuenta solo los contactos de esa lista que entran en el segmento.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del segmento |
id_list | query | integer (int64) | Limitar a esta lista (opcional) |
Respuestas
| Código | Descripción |
|---|---|
200 | Número de contactos |
401 | Token no válido o caducado |
404 | Segmento o lista no encontrados |
Ejemplo 200
{
"total": 1250
}
/Segment/{id}/contact/{contactId}/checkComprobar si un contacto coincide con un segmento
Comprueba si un contacto concreto (por GUID) coincide actualmente con las reglas de un segmento dado. Útil para activar lógica de automatización bajo demanda.
Scope OAuth : contacts:read
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del segmento |
contactId | path | string (uuid) | sí | GUID del contacto |
Respuestas
| Código | Descripción |
|---|---|
200 | Devuelve el resultado de la coincidencia |
401 | Token no válido o caducado |
404 | Segmento o contacto no encontrados |
Envía mensajes SMS a contactos individuales o a listas de contactos completas. Utiliza el campo phone_number de cada contacto.
/Sms/SingleSMSEnviar un único SMS
Envía un único SMS a un número de teléfono directamente. Útil para mensajes transaccionales (OTP, confirmaciones de pedido, alertas). El número de teléfono acepta +41…, 0041… o 41… con o sin separadores; consulta Formato del número de teléfono en la descripción de la API para ver las entradas aceptadas/rechazadas.
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
phone_number | string | sí | Número de teléfono del destinatario: acepta +41…, 0041… o 41… con o sin separadores. Consulta Formato del número de teléfono en la descripción de la API. |
message | string | sí | Texto del SMS (máx. 160 caracteres con codificación estándar) |
date_planned | string (date-time) | Programa el envío. Omítelo para enviar de inmediato. |
Ejemplo
{
"phone_number": "+41791234567",
"message": "Your verification code is 9473. Valid for 10 minutes."
}
Respuestas
| Código | Descripción |
|---|---|
200 | SMS enviado o programado correctamente |
401 | Token no válido o caducado |
422 | Formato de número de teléfono no válido |
/Sms/CampaignEnviar campaña de SMS
Envía un mensaje SMS al campo phone_number de todos los contactos de una o varias listas. Los contactos sin número de teléfono se omiten.
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
lists | array of ListRef | sí | Listas de contactos destinatarias (utiliza el campo phone_number de cada contacto) |
message | string | sí | Texto del SMS |
date_planned | string (date-time) | Programa el envío. Omítelo para enviar de inmediato. |
Ejemplo
{
"lists": [
{
"id": 101
}
],
"message": "Flash sale today — 20% off. Shop at mailpro.com",
"date_planned": "2026-04-20T10:00:00"
}
Respuestas
| Código | Descripción |
|---|---|
200 | Campaña de SMS enviada o programada correctamente |
401 | Token no válido o caducado |
/SmsListar el historial de SMS
Devuelve el registro de envíos de SMS (tanto individuales como de campaña) de la cuenta.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Historial de SMS devuelto correctamente |
401 | Token no válido o caducado |
/Sms/{id}Cancelar un SMS programado
Cancela un envío de SMS programado pendiente.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | ID del envío de SMS |
Respuestas
| Código | Descripción |
|---|---|
200 | SMS programado cancelado correctamente |
401 | Token no válido o caducado |
404 | Envío de SMS no encontrado |
/Sms/ScheduledListar envíos de SMS programados
Devuelve los envíos de SMS con un date_planned futuro (aún no enviados), ordenados por fecha de forma ascendente.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Envíos de SMS programados devueltos correctamente |
401 | Token no válido o caducado |
/Sms/{id}/CancelCancelar un SMS programado
Cancela un envío de SMS programado solo si aún no ha sido enviado.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer | sí | ID del envío de SMS |
Respuestas
| Código | Descripción |
|---|---|
200 | SMS programado cancelado correctamente |
401 | Token no válido o caducado |
409 | Envío de SMS no encontrado, no perteneciente al cliente o ya enviado |
/Sms/{id}/RescheduleReprogramar un SMS programado
Actualiza la fecha de envío prevista de un SMS programado. La nueva fecha debe estar en el futuro y dentro de los 90 días. Falla si el SMS ya ha sido enviado.
Nombre del campo en el cuerpo: la API acepta date_planned (snake_case, principal) así como los alias heredados PlanDate y scheduled_time. Proporciona uno cualquiera de ellos.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer | sí | ID del envío de SMS |
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
date_planned | string (date-time) | Nombre del campo principal. | |
PlanDate | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. | |
scheduled_time | string (date-time) | Alias heredado aceptado por compatibilidad con versiones anteriores. |
Respuestas
| Código | Descripción |
|---|---|
200 | SMS programado reprogramado correctamente |
400 | Falta la fecha: proporciona uno de date_planned / PlanDate / scheduled_time |
401 | Token no válido o caducado |
409 | Reprogramación fallida (no encontrado, ya enviado o fecha fuera de rango) |
Organiza las plantillas de mensajes en carpetas.
/FolderListListar las carpetas de listas
Devuelve las carpetas utilizadas para organizar las listas de contactos.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
name | query | string | Filtrar por nombre de carpeta (parcial) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Carpetas de listas devueltas correctamente |
401 | Token no válido o caducado |
/FolderList/{id}Obtener una carpeta de listas
Devuelve los detalles de una carpeta de listas por su ID.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer | sí | ID de la carpeta |
Respuestas
| Código | Descripción |
|---|---|
200 | Carpeta devuelta correctamente |
401 | Token no válido o caducado |
404 | Carpeta no encontrada |
/FolderMessageListar carpetas de mensajes
Devuelve las carpetas utilizadas para organizar las plantillas de mensajes de correo electrónico.
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
name | query | string | Filtrar por nombre de carpeta | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Respuestas
| Código | Descripción |
|---|---|
200 | Carpetas de mensajes devueltas correctamente |
401 | Token no válido o caducado |
Sube un archivo CSV o XLSX para importar contactos a una lista de forma masiva. El archivo se pone en cola para su procesamiento asíncrono: realiza el seguimiento del proceso mediante el import_job_id devuelto o el callback opcional webhook_url.
/Import/UploadSubir un archivo de contactos (CSV / XLSX) para una importación masiva
Sube un archivo CSV o XLSX para importar contactos a una lista. El archivo se almacena y se pone en cola para su procesamiento asíncrono: el endpoint devuelve un import_job_id de inmediato.
Tipo de solicitud: multipart/form-data
Campos de formulario obligatorios:
id_list (entero): ID de la lista de destinofile (binario): el archivo CSV o XLSX que se va a subirjson_match_fields (cadena, JSON): qué columna del archivo va a qué campo del contacto. email_position = columna del e-mail, numerada desde 0 (obligatorio), phone_position = columna del número de móvil o -1, fields = ID de los demás campos (ver GET /Field), fields_position = columna de cada uno de ellos, update_fields = actualizar los contactos existentes. Correspondencia ausente o no válida: respuesta 400, no se crea ninguna importación.Opcional:
webhook_url (cadena): URL HTTPS llamada cuando finaliza el procesamiento. Recibe una carga útil JSON con el estado final (éxito / fallo) y los recuentos de filas importadas / omitidas / no válidas.Formato de archivo:
UTF-8json_match_fieldsCuerpo de la solicitud (multipart/form-data)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_list | integer (int64) | sí | ID de la lista de destino |
file | string (binary) | sí | Archivo CSV o XLSX (UTF-8, máx. 50 MB) |
json_match_fields | string | sí | Correspondencia JSON entre las columnas del archivo y los campos del contacto |
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 | Ningún archivo subido, falta id_list, o json_match_fields ausente / no válido |
401 | Token no válido o caducado |
500 | Error del servidor o del almacenamiento |
Ejemplo 200
{
"result": "OK",
"import_job_id": 14,
"internal_name": "230575-20260420142615-contacts.csv"
}
Suscribe tu servidor a notificaciones de eventos en tiempo real. Mailpro publica una carga útil JSON firmada con HMAC en tu URL en cuanto se produce el evento suscrito. Consulta la sección «Webhooks» en 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.
/WebhookListar webhooks
Devuelve todos los webhooks configurados en la cuenta autenticada.
Respuestas
| Código | Descripción |
|---|---|
200 | Array de webhooks |
401 | Token no válido o caducado |
/WebhookCrear un webhook
Crea una nueva suscripción a webhook. La respuesta contiene un secret que solo se muestra una vez: guárdalo de inmediato en el servidor. Úsalo para verificar la firma HMAC de todas las cargas útiles entrantes.
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í | Punto de conexión HTTPS (HTTP se rechaza en producción) |
events | array of string | sí | Lista de tipos de evento a los que suscribirse (consulta el catálogo anterior). Usa ["*"] para suscribirte a todos los eventos de esta API. |
description | string | Descripción libre para tu propia referencia |
Ejemplo
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced",
"contact.created"
],
"description": "Integración con Slack"
}
Respuestas
| Código | Descripción |
|---|---|
201 | Webhook creado: el secret solo se devuelve aquí |
400 | URL no válida, lista de eventos no válida o límite excedido |
401 | Token no válido o caducado |
Ejemplo 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced",
"contact.created"
],
"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"
}
/Webhook/{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 |
/Webhook/{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 | Establece true para volver a habilitar un webhook desactivado automáticamente una vez corregido tu punto de conexión. |
Respuestas
| Código | Descripción |
|---|---|
200 | Webhook actualizado |
400 | Carga útil no válida |
404 | Webhook no encontrado |
/Webhook/{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 |
/Webhook/{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) a tu punto de conexión. Útil para verificar 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 | Sobrescribe el tipo de evento (debe estar suscrito por este webhook). ping siempre funciona. |
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"
}
/Webhook/{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: guárdalo. Todas las entregas a partir de ese momento se firmarán con el nuevo secreto.
Utiliza esta opción si sospechas que tu 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"
}
/Webhook/{id}/deliveriesListar intentos de entrega
Devuelve el historial de intentos de envío de este webhook (retención de 30 días). Útil para depuración: qué eventos se enviaron, qué códigos de estado se recibieron, 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 | Array de intentos de entrega (los más recientes primero) |
404 | Webhook no encontrado |
/Webhook/{id}/deliveries/{deliveryId}/replayReproducir una entrega
Pone en cola un nuevo intento de entrega con la misma carga útil que el original. Útil para volver a desencadenar una entrega fallida tras corregir tu punto de conexión. Se crea una NUEVA fila Webhook_Delivery (el original se conserva con fines de auditoría). La reproducción sigue la política de reintentos estándar (10s → 1min → 5min → 30min → 2h → 6h → 24h, después se abandona).
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 encontrados |
Rebotes y bajas de la cuenta: listar, añadir, eliminar.
/Suppression/BouncesListar 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 |
|---|---|---|---|---|
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 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 5521,
"source": "contact",
"type": "hard",
"email": "[email protected]",
"date": "2026-10-12T08:30:00",
"diag_code": "550 5.1.1 User unknown",
"id_list": 101
}
]
/Suppression/Bounces/{id}Eliminar un rebote
source y type son obligatorios, tal como los devuelve GET /Suppression/Bounces: un id por sí solo no es único.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | id del rebote |
source | query | string | sí | list, contact, api o smtp |
type | query | string: hard, soft | sí | hard o soft |
Respuestas
| Código | Descripción |
|---|---|
200 | Rebote eliminado |
400 | Falta source o type |
401 | Token no válido o caducado |
404 | Rebote no encontrado |
Ejemplo 200
{
"result": "ok",
"id": 5521,
"restored": false
}
/Suppression/Bounces/{id}/RestoreVolver 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 |
|---|---|---|---|---|
id | path | integer (int64) | sí | id del rebote |
Respuestas
| Código | Descripción |
|---|---|
200 | Contacto repuesto |
401 | Token no válido o caducado |
404 | Rebote duro de un contacto no encontrado o dirección ya no activa |
Ejemplo 200
{
"result": "ok",
"id": 5521,
"restored": true
}
/Suppression/UnsubscribersListar 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 |
|---|---|---|---|---|
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 | Token no válido o caducado |
Ejemplo 200
[
{
"id": 9012,
"source": "api3",
"email": "[email protected]",
"date": "2026-10-20T16:05:00",
"list_name": null,
"comment": "Asked by phone"
}
]
/Suppression/UnsubscribersAñadir una baja
Sin id_list, la dirección se da de baja de toda la cuenta. Con id_list, solo de esa lista de bajas.
Scope OAuth : contacts:write
Cuerpo de la solicitud (application/json)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
email | string | sí | Dirección que dar de baja |
comment | string | Comentario libre | |
id_list | integer (int64) | Lista de bajas de la cuenta (opcional) |
Respuestas
| Código | Descripción |
|---|---|
200 | Hecho. already_unsubscribed es true cuando la dirección ya estaba dada de baja. |
400 | Se requiere una dirección válida |
401 | Token no válido o caducado |
404 | id_list no es una lista de bajas de esta cuenta |
Ejemplo 200
{
"result": "ok",
"already_unsubscribed": false
}
/Suppression/Unsubscribers/{id}Eliminar una baja
source es obligatorio, tal como lo devuelve GET /Suppression/Unsubscribers: un id por sí solo no es único.
Scope OAuth : contacts:write
Parámetros
| Nombre | Dónde | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | integer (int64) | sí | id de la baja |
source | query | string | sí | contact, list, smtp, api o api3 |
Respuestas
| Código | Descripción |
|---|---|
200 | Baja eliminada |
400 | source es obligatorio |
401 | Token no válido o caducado |
404 | Baja no encontrada |
Ejemplo 200
{
"result": "ok",
"removed": 9012
}