Documentación interactiva · Portal de desarrolladores · Especificación OpenAPI · EN · FR · DE · IT · PT · ES

Mailpro™ CRM API v3 : Referencia

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.

Autenticación

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.

> 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).

Método 1 — OAuth 2.0 (recomendado para integraciones)

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).

EndpointURL
AuthorizeGET https://api.mailpro.com/oauth/authorize
Token / RefreshPOST https://api.mailpro.com/oauth/token
JWKS (verificación de firmas)GET https://api.mailpro.com/oauth/.well-known/jwks
DiscoveryGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Emisor (el claim iss de cada token): https://api.mailpro.com/oauth/.

Grants admitidos

Vida útil de los tokens

TokenTTL
Token de acceso (JWT RS256)20 minutos
Refresh token (deslizante, un solo uso)30 días
Código de autorización60 segundos

Authorization Code + PKCE: paso a paso

   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
   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": "…" }

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.

Pruebe OAuth 2.0 en pocos minutos — inicio rápido

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.

Método 2 — Bearer JWT (heredado)

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.

Método 3 — IdClient + ApiKey (más sencillo)

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.

Endpoint de token (grant password)

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Endpoint de token (grant client_credentials)

POST /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.

Scopes OAuth 2.0

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.

ScopePermite
contacts:readConsultar sus contactos, listas, etiquetas, segmentos y campos personalizados.
contacts:writeCrear, editar y eliminar sus contactos, listas, etiquetas y campos personalizados.
email:sendEnviar correos electrónicos transaccionales y de campaña en su nombre.
email:readConsultar estadísticas de entrega, aperturas, clics y el historial de rebotes.
email:templates:readConsultar sus plantillas de correo electrónico (asunto, cuerpo HTML y texto plano).
email:templates:writeCrear, editar y eliminar sus plantillas de correo electrónico.
sms:sendEnviar mensajes SMS transaccionales y de campaña en su nombre.
sms:readConsultar el saldo de créditos SMS y el historial de mensajes.
sms:contacts:readConsultar su agenda telefónica de SMS.
sms:contacts:writeCrear, editar y eliminar entradas en su agenda telefónica de SMS.
webhooks:manageSuscribirse, editar y eliminar endpoints de webhook de su cuenta.
account:readConsultar los créditos, los límites y el estado de la suscripción de su cuenta.

Aplicación de scopes por endpoint

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:

EndpointsScope 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 segmentocontacts: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 /Tagcontacts: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).

Formato de los datos

Paginación

Misma regla en las tres API de Mailpro (Email v2, CRM v3, SMS): 5000 elementos por página, por defecto y como máximo.

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.

Códigos de error de negocio

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:

Códigos de estado devueltos

CódigoSignificado
400Solicitud mal formada (JSON no válido, mensaje que supera el límite de partes SMS)
401Credenciales ausentes, no válidas o caducadas
402Créditos insuficientes para realizar el envío
403Permitido por sus credenciales, pero rechazado — cuenta bloqueada para el envío de SMS
404El objeto referenciado no existe (contacto, lista, etiqueta, campo, campaña)
406Violación de una regla de negocio de contacto (ver la lista anterior)
422Entrada 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.

Formato del número de teléfono

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álidoNo válido
+41794849980 — E.164 internacional0612345678 — formato nacional (con 0 inicial)
0041 79 484 99 80 — prefijo 00 + espacios41'794'849'80 — apóstrofos (no se eliminan)
+33 6-12-34-56-78 — + con guionestel=0041794849980 — caracteres adicionales
41794849980 — dígitos sin prefijo1234567 — demasiado corto (< 8 dígitos)

Reglas:

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.

Límites

RecursoLímite
Etiquetas por cuenta1000
Listas por cuenta1000
Campos personalizados por cuenta50
Peticiones API mensuales por cuenta50 000 (5× los créditos de correo electrónico de la suscripción)

Seguimiento de entrega (emails transaccionales)

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.

statusSignificado¿Final?
queuedAceptado, en espera de envío.no
scheduledProgramado para más tarde (date_planned).no
sentEntregado por nuestros servidores, aún sin respuesta del servidor del destinatario.no
deliveredAceptado por el servidor del destinatario (diag_code = su respuesta SMTP).sí
bouncedRechazado. bounce_type: hard = dirección no válida o rechazo definitivo; soft = rechazo tras nuevos intentos (buzón lleno, servidor inaccesible…).sí
not_foundIdentificador desconocido o que no pertenece a su cuenta.sí

Consultar sin entrar en bucle

Los estados se conservan durante 365 días.

Webhooks

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.

Cómo funciona

> ⏱ 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.

Envoltorio del payload

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]", "...": "..." }
}
CampoFormatoDescripción
idevt_ + 32 hexIdentificador ú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).
createdSegundos Unix UTCIncluido en la firma HMAC.
apiVersion"v3"API de Mailpro que ha publicado el evento.
account.idintSu ID de cliente de Mailpro.
account.namestringNombre de su cuenta (útil para depurar en el lado cliente).
dataobjectPayload del evento: la forma depende de type (véase el catálogo a continuación).

Catálogo de eventos

EventoDisparadorForma de data
pingPrueba mediante POST /Webhook/{id}/test{ message }
contact.createdPOST /Contact{ id, email, firstName, lastName, createdAt }
contact.updatedPUT /Contact/{id}{ id, email, firstName, lastName, updatedAt, changes }
contact.deletedDELETE /Contact/{id}{ id, email, deletedAt }
list.contact_addedContacto añadido a una lista{ listId, listName, contactId, contactEmail, addedAt }
list.contact_removedContacto eliminado de una lista{ listId, listName, contactId, contactEmail, removedAt }
tag.appliedEtiqueta aplicada a un contacto{ tag, contactId, contactEmail, appliedAt }
tag.removedEtiqueta retirada{ tag, contactId, contactEmail, removedAt }
segment.matchedUn contacto entra en un segmento{ segmentId, segmentName, contactId, contactEmail, matchedAt }
email.processedEnvío aceptado por el pipeline{ messageId, email, campaignId, processedAt }
email.deliveredUn 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.openedPixel de seguimiento activado{ messageId, email, campaignId, openedAt, ip, userAgent }
email.clickedClic en un enlace con seguimiento{ messageId, email, campaignId, clickedAt, url, ip, userAgent }
email.bouncedRebote hard o soft{ messageId, email, campaignId, bouncedAt, bounceType, reason }
email.spam_reportReclamación FBL{ messageId, email, campaignId, reportedAt }
email.unsubscribedClic en el enlace de baja{ messageId, email, campaignId, unsubscribedAt }
email.droppedRechazado antes del envío{ messageId, email, campaignId, droppedAt, reason }
campaign.startedComienza el envío{ campaignId, name, totalRecipients, startedAt }
campaign.finishedTodos los destinatarios procesados{ campaignId, name, totalSent, totalFailed, finishedAt }
import.startedTrabajo de importación iniciado{ importId, fileName, totalRows, startedAt }
import.progressAl 25/50/75 %{ importId, fileName, processedRows, totalRows, progressPct }
import.completedImportación correcta{ importId, fileName, totalRows, addedCount, updatedCount, errorCount, completedAt }
import.failedError fatal durante la importación{ importId, fileName, errorMessage, failedAt }

Suscríbase a todos los eventos de esta API pasando ["*"] en el array events.

Firma HMAC

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:

Node.js
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'));
}
PHP
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']);
}
Python
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'])
C#
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"]));
}

Reintentos y desactivación automática

IntentoEspera antes del siguiente intento
1 → 210 segundos
2 → 31 minuto
3 → 45 minutos
4 → 530 minutos
5 → 62 horas
6 → 76 horas
7abandonado (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.

Éxito = HTTP 2xx

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ímites

LímiteValor
Webhooks por cuenta20
Eventos suscritos por webhook50
Tamaño máximo del payload256 KB
Timeout HTTP por intento10 segundos
Retención del historial de entregas30 días

Índice

Authentication

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).

POST /token

Obtener 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.

Tipos de concesión admitidos
Tipo de concesiónCaso de uso
passwordIntegración estándar: nombre de usuario + clave de API
refresh_tokenRenueva un token de acceso a punto de caducar sin volver a autenticarse
client_credentialsDe servidor a servidor solo con el ID de cliente
zapier / automateio / microsoft-flowIntegraciones de plataformas de terceros
Duración del token

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).

Almacenamiento seguro de tokens

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)

NombreTipoObligatorioDescripción
grant_typestring: password, refresh_token, client_credentials, zapier, automateio, microsoft-flowsíTipo de concesión de autenticación
usernamestringTu nombre de usuario de Mailpro (correo electrónico). Obligatorio para la concesión password.
passwordstringTu clave de API de Mailpro (formato GUID). Obligatoria para la concesión password.
refresh_tokenstringToken de actualización anterior. Obligatorio para la concesión refresh_token.
client_idstringTu ID de cliente de Mailpro (entero). Obligatorio para la concesión client_credentials.

Respuestas

CódigoDescripción
200Token emitido correctamente
400Credenciales 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."
}

Account

Recupera el perfil de la cuenta, el saldo de créditos y los detalles de la suscripción.

GET /Account/Me

Obtener detalles de la cuenta

Devuelve los detalles del perfil y la configuración de la cuenta de Mailpro autenticada.

Respuestas

CódigoDescripción
200Detalles de la cuenta devueltos correctamente
401Token no válido o caducado

GET /Account/Credits

Obtener el saldo de créditos

Devuelve el saldo de créditos restantes de correo electrónico y SMS de la cuenta.

Respuestas

CódigoDescripción
200Saldo de créditos devuelto correctamente
401Token no válido o caducado

Ejemplo 200

{
  "email_credits": 48500,
  "sms_credits": 1200
}

GET /Account/SubscriptionEndDate

Obtener la fecha de fin de la suscripción

Devuelve la fecha de caducidad de la suscripción actual de Mailpro.

Respuestas

CódigoDescripción
200Fecha de fin de la suscripción devuelta correctamente
401Token no válido o caducado

GET /Account/Limits

Obtener la cuota mensual de la API

Devuelve la cuota mensual de solicitudes de la API para el cliente autenticado.

Cálculo de la cuota: el límite se calibra a partir de los créditos de la suscripción de correo electrónico (normalmente, 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:

Qué es GRATUITO (no consume créditos):

Respuestas

CódigoDescripción
200Instantánea de la cuota
401Token no válido o caducado
404No 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).

Contact

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.

POST /Contact

Crear un contacto

Crea un nuevo contacto del CRM con campos personalizados, asignaciones de listas y etiquetas opcionales.

Obligatorio:

Los 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)

NombreTipoObligatorioDescripción
emailstringsíDirección de correo electrónico del contacto (obligatoria, debe ser única)
phone_numberstringNú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).
listsarray of ListRefsíListas a las que asignar este contacto. Es obligatoria al menos una lista.
tagsarray of TagRefEtiquetas que asignar a este contacto (opcional)
custom_fieldsarray of FieldValueValores 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ódigoDescripción
200Contacto creado correctamente
400Formato de correo electrónico no válido
401Token no válido o caducado
406Infracció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"
}

POST /Contact/Multiple

Importar 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ódigoDescripción
200Importación masiva completada (consulta el array errors para ver los fallos parciales)
400Entrada no válida
401Token no válido o caducado
406Infracció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": []
}

GET /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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto (de POST /Contact o GET /List/{id}/Contact)
includeTagsquerybooleanEstablece en true para incluir las asignaciones de etiquetas del contacto en la respuesta
includeListsquerybooleanEstablece en true para incluir las pertenencias a listas del contacto en la respuesta

Respuestas

CódigoDescripción
200Contacto devuelto correctamente
401Token no válido o caducado
404Contacto 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
    }
  ]
}

PUT /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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
emailstringsíDirección de correo electrónico del contacto (obligatoria, debe ser única)
phone_numberstringNú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).
listsarray of ListRefsíListas a las que asignar este contacto. Es obligatoria al menos una lista.
tagsarray of TagRefEtiquetas que asignar a este contacto (opcional)
custom_fieldsarray of FieldValueValores de los campos personalizados de este contacto (opcional)

Respuestas

CódigoDescripción
200Contacto actualizado correctamente
401Token no válido o caducado
404Contacto no encontrado
422Error de validación (formato de correo, número de teléfono, tipo de valor de campo no coincidente)

Ejemplo 200

{
  "Result": "Successful operation"
}

DELETE /Contact/{id}

Eliminar un contacto

Elimina un contacto del CRM de forma permanente.

Scope OAuth : contacts:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto

Respuestas

CódigoDescripción
200Contacto eliminado correctamente
401Token no válido o caducado
404Contacto no encontrado

GET /Contact/{id}/Activity

Actividad 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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síGUID del contacto

Respuestas

CódigoDescripción
200Actividad devuelta
401Token no válido o caducado
404El 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"
    }
  ]
}

PUT /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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto
tagidpathinteger (int64)síID de la etiqueta (de GET /Tag)

Respuestas

CódigoDescripción
200Etiqueta asignada correctamente
401Token no válido o caducado
404Contacto o etiqueta no encontrados

DELETE /Contact/{id}/Tag/{tagid}

Eliminar etiqueta de contacto

Elimina la asignación de una etiqueta de un contacto.

Scope OAuth : contacts:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto
tagidpathinteger (int64)síID de la etiqueta

Respuestas

CódigoDescripción
200Etiqueta eliminada correctamente
401Token no válido o caducado
404Contacto o etiqueta no encontrados

PUT /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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto
listidpathinteger (int64)síID de la lista (de GET /List)

Respuestas

CódigoDescripción
200Contacto añadido a la lista correctamente
401Token no válido o caducado
404Contacto, lista no encontrada, o el contacto había cancelado la suscripción a esta lista

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathstring (uuid)síUUID del contacto
listidpathinteger (int64)síID de la lista

Respuestas

CódigoDescripción
200Contacto eliminado de la lista correctamente
401Token no válido o caducado
404Contacto o lista no encontrados

List

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.

GET /List

Listar 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

NombreDóndeTipoObligatorioDescripción
namequerystringFiltrar por nombre de lista (coincidencia parcial)
dateCreationFromquerystring (date-time)Filtrar por fecha de creación (desde, ISO 8601)
dateCreationToquerystring (date-time)Filtrar por fecha de creación (hasta, ISO 8601)
numberOfRecordsqueryintegerElementos por página — 5000 por defecto y como máximo
pageNumberqueryintegerNúmero de página, basado en 1
sortByNamequerybooleanEstablece en true para ordenar alfabéticamente por nombre
includeTotalContactsquerybooleanEstablece en true para incluir el recuento total_contacts en cada resultado

Respuestas

CódigoDescripción
200Listas devueltas correctamente
401Token no válido o caducado

Ejemplo 200

[
  {
    "id": 101,
    "name": "Newsletter subscribers",
    "total_contacts": 4521,
    "date_creation": "2025-01-15T10:30:00"
  }
]

POST /List

Crear 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)

NombreTipoObligatorioDescripción
namestringsíNombre visible de la lista

Ejemplo

{
  "name": "Spring Campaign 2026"
}

Respuestas

CódigoDescripción
200Lista creada correctamente
401Token no válido o caducado
406Se ha alcanzado el límite de listas (1000)

Ejemplo 200

{
  "id": 102,
  "name": "Spring Campaign 2026",
  "date_creation": "2026-04-14T12:00:00"
}

GET /List/{id}

Obtener una lista de contactos

Devuelve los detalles de una lista de contactos concreta.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la lista

Respuestas

CódigoDescripción
200Lista devuelta correctamente
401Token no válido o caducado
404Lista no encontrada

PUT /List/{id}

Actualizar una lista de contactos

Renombra una lista de contactos existente.

Scope OAuth : contacts:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la lista

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
namestringsíNombre visible de la lista

Ejemplo

{
  "name": "Newsletter subscribers — Europe"
}

Respuestas

CódigoDescripción
200Lista actualizada correctamente
401Token no válido o caducado
404Lista no encontrada

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la lista

Respuestas

CódigoDescripción
200Lista eliminada correctamente
401Token no válido o caducado
404Lista no encontrada
406La lista está siendo utilizada por un flujo de trabajo de automatización activo

GET /List/{id}/Contact

Listar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la lista
emailquerystringFiltrar por correo electrónico (coincidencia parcial)
numberOfRecordsqueryintegerElementos por página — 5000 por defecto y como máximo
pageNumberqueryinteger
sortByEmailquerybooleanOrdenar alfabéticamente por correo electrónico
includeTagsquerybooleanIncluir las asignaciones de etiquetas en los resultados
includeListsquerybooleanIncluir las pertenencias a listas en los resultados

Respuestas

CódigoDescripción
200Contactos devueltos correctamente
401Token no válido o caducado
404Lista no encontrada o ningún contacto coincide con los criterios

GET /List/{listId}/Unsubscribers

Listar 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

NombreDóndeTipoObligatorioDescripción
listIdpathinteger (int64)síID de la lista

Respuestas

CódigoDescripción
200Lista de cancelaciones de suscripción devuelta correctamente
401Token no válido o caducado
404Lista no encontrada

Tag

Gestiona etiquetas para clasificar y segmentar contactos. Las etiquetas son rótulos planos (p. ej. «VIP», «Inactivos», «B2B»). Máximo 1000 etiquetas por cuenta.

GET /Tag

Listar etiquetas

Devuelve todas las etiquetas de la cuenta.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
namequerystringFiltrar por nombre (coincidencia parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Respuestas

CódigoDescripción
200Etiquetas devueltas correctamente
401Token no válido o caducado

Ejemplo 200

[
  {
    "id": 5,
    "name": "VIP customers"
  },
  {
    "id": 6,
    "name": "Newsletter openers"
  }
]

POST /Tag

Crear una etiqueta

Crea una nueva etiqueta. Máximo 1000 etiquetas por cuenta.

Scope OAuth : contacts:write

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
namestringsíNombre visible de la etiqueta

Ejemplo

{
  "name": "VIP customers"
}

Respuestas

CódigoDescripción
200Etiqueta creada correctamente
401Token no válido o caducado
406Se ha alcanzado el límite de etiquetas (1000)

GET /Tag/{id}

Obtener una etiqueta

Devuelve una etiqueta concreta por su ID.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la etiqueta

Respuestas

CódigoDescripción
200Etiqueta devuelta correctamente
401Token no válido o caducado
404Etiqueta no encontrada

PUT /Tag/{id}

Actualizar una etiqueta

Renombra una etiqueta existente.

Scope OAuth : contacts:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
namestringsíNombre visible de la etiqueta

Ejemplo

{
  "name": "VIP customers — updated"
}

Respuestas

CódigoDescripción
200Etiqueta actualizada correctamente
401Token no válido o caducado
404Etiqueta no encontrada

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Etiqueta eliminada correctamente
401Token no válido o caducado
404Etiqueta no encontrada
406La etiqueta está siendo utilizada por un flujo de trabajo de automatización activo

GET /Tag/{id}/Contact

Listar contactos con una etiqueta

Devuelve los contactos a los que se les ha asignado una etiqueta concreta.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID de la etiqueta
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Contactos devueltos correctamente
401Token no válido o caducado
404Etiqueta no encontrada

Field

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.

GET /Field

Listar 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

NombreDóndeTipoObligatorioDescripción
namequerystringFiltrar por nombre de campo
idFieldTypequeryintegerFiltrar por ID de tipo de campo
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Respuestas

CódigoDescripción
200Campos personalizados devueltos correctamente
401Token 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"
  }
]

POST /Field

Crear 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)

NombreTipoObligatorioDescripción
namestringsíNombre visible del campo
id_field_typeintegersí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_keystringsíClave de variable de la plantilla, para insertar el campo en un mensaje
sortintegerOrden 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ódigoDescripción
200Campo creado correctamente
401Token no válido o caducado
406Se ha alcanzado el límite de campos (50)

GET /Field/Types

Listar 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ódigoDescripción
200Tipos de campo devueltos correctamente
401Token no válido o caducado

GET /Field/{id}

Obtener un campo personalizado

Devuelve la definición y los metadatos de un campo personalizado concreto.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del campo

Respuestas

CódigoDescripción
200Campo devuelto correctamente
401Token no válido o caducado
404Campo no encontrado

PUT /Field/{id}

Actualizar un campo personalizado

Actualiza el nombre o la clave de personalización de un campo personalizado.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
namestringsíNombre visible del campo
id_field_typeintegersí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_keystringsíClave de variable de la plantilla, para insertar el campo en un mensaje
sortintegerOrden de visualización (0 a 255). Obligatorio para modificar un campo (PUT /Field/{id}).

Respuestas

CódigoDescripción
200Campo actualizado correctamente
401Token no válido o caducado
404Campo no encontrado

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Campo eliminado correctamente
401Token no válido o caducado
404Campo no encontrado

Campaign

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.

GET /Campaign

Listar campañas

Devuelve una lista paginada de las campañas de correo electrónico de la cuenta.

Parámetros

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Campañas devueltas correctamente
401Token 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
  }
]

GET /Campaign/{id}

Obtener una campaña

Devuelve la configuración y el resumen de estadísticas de una campaña concreta.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Campaña devuelta correctamente
401Token no válido o caducado
404Campaña no encontrada

PUT /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
campaign_titlestringNombre visible de la campaña
date_plannedstring (date-time)Hora de envío programada (ISO 8601). Omítela para enviar de inmediato.

Respuestas

CódigoDescripción
200Campaña actualizada correctamente
401Token no válido o caducado
404Campaña no encontrada

DELETE /Campaign/{id}

Eliminar una campaña

Cancela y elimina permanentemente una campaña por su identificador.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Campaña eliminada correctamente
401Token no válido o caducado
404Campaña no encontrada

GET /Campaign/Scheduled

Listar 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

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Lista de campañas programadas
401Token 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
  }
]

POST /Campaign/{id}/Cancel

Cancelar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Campaña cancelada
401Token no válido o caducado
409Ya enviada o no encontrada

Ejemplo 200

{
  "result": "ok",
  "cancelled": 5001
}

PATCH /Campaign/{id}/Reschedule

Reprogramar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
date_plannedstring (date-time)Nombre del campo principal.
PlanDatestring (date-time)Alias heredado aceptado por compatibilidad con versiones anteriores.
scheduled_timestring (date-time)Alias heredado aceptado por compatibilidad con versiones anteriores.

Respuestas

CódigoDescripción
200Campaña reprogramada
400Falta la fecha: proporciona uno de date_planned / PlanDate / scheduled_time
401Token no válido o caducado
409Ya enviada

Ejemplo 200

{
  "result": "ok",
  "id": 5001,
  "date_planned": "2026-12-31T14:30:00"
}

GET /Campaign/{id}/ByHour

Estadísticas por hora

Devuelve el desglose por hora de aperturas y clics de la campaña.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Estadísticas por hora devueltas correctamente
401Token no válido o caducado

GET /Campaign/{id}/ByDay

Estadísticas por día

Devuelve el desglose diario de aperturas y clics de la campaña.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Estadísticas diarias devueltas correctamente
401Token no válido o caducado

GET /Campaign/{id}/Openings

Listar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
emailquerystringFiltrar por correo electrónico del destinatario
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Lista de aperturas devuelta correctamente
401Token no válido o caducado

GET /Campaign/{id}/Clicks

Listar los clics en enlaces

Devuelve una lista paginada de los contactos que han hecho clic en un enlace de la campaña.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Lista de clics devuelta correctamente
401Token no válido o caducado

GET /Campaign/{id}/HardBounces

Listar los rebotes definitivos

Devuelve las direcciones de correo electrónico que han generado un rebote definitivo durante esta campaña.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Lista de rebotes definitivos devuelta correctamente
401Token no válido o caducado

Listar los enlaces rastreados

Devuelve los datos de rendimiento de clics de cada enlace rastreado de la campaña.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
linkquerystringFiltrar por URL del enlace (coincidencia parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Estadísticas de enlaces devueltas correctamente
401Token no válido o caducado

GET /Campaign/{id}/OS

Estadísticas por SO / dispositivo

Devuelve el desglose de aperturas y clics por sistema operativo y tipo de dispositivo.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Estadísticas de SO devueltas correctamente
401Token no válido o caducado

GET /Campaign/{id}/EmailClients

Estadísticas por cliente de correo electrónico

Devuelve el desglose de aperturas por cliente de correo electrónico (Gmail, Outlook, Apple Mail…).

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Estadísticas de clientes de correo electrónico devueltas correctamente
401Token no válido o caducado

GET /Campaign/{id}/Countries

Estadísticas por país

Devuelve la distribución geográfica de aperturas y clics.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Estadísticas por país devueltas correctamente
401Token no válido o caducado

Send

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.

POST /Send/Mail

Enviar 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)

NombreTipoObligatorioDescripción
id_sender_emailintegerID de la dirección de correo del remitente (de GET /SenderEmail). Obligatorio.
emailstringDirecció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_contactstring (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.
subjectstringAsunto del correo electrónico (máx. 255 caracteres). Obligatorio.
body_htmlstringContenido HTML en línea. Proporciona este O id_message. Si se proporcionan ambos, id_message tiene prioridad.
id_messageintegerID de una plantilla de mensaje guardada (de GET /Message). Proporciona este O body_html.
reply_tostringDirección de respuesta (por defecto, la dirección del remitente)
fieldsarray of FieldValueCampos de personalización (solo se usan con email en línea, no con id_contact)
date_plannedstring (date-time)Programa el envío para una fecha futura. Omítelo para enviar de inmediato.
attachmentsarray of EmailAttachmentArchivos 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_filesbooleanfalse (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ódigoDescripción
200Correo electrónico enviado o programado correctamente
400Formato de correo electrónico no válido o falta un campo obligatorio
401Token no válido o caducado
404Remitente, mensaje o contacto no encontrados; o el destinatario ha cancelado la suscripción
422Error 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"
}

GET /Send/{id}/Status

Obtener 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síEl id_single_send devuelto por POST /Send/Mail.

Respuestas

CódigoDescripción
200Estado de entrega actual
401Token no válido o caducado
404No 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
}

POST /Send/Campaign

Enviar campaña de correo electrónico

Envía una campaña masiva de correo electrónico a una o varias listas de contactos.

Obligatorio:

Segmento: 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)

NombreTipoObligatorioDescripción
id_messageintegersíID de la plantilla de mensaje que se va a usar (de GET /Message)
id_sender_emailintegersíID de la dirección del remitente (de GET /SenderEmail)
id_email_reply_tointegerID 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.
listsarray of ListRefsíListas de contactos destinatarias (se requiere al menos una)
id_segmentintegerFiltra los destinatarios mediante un segmento guardado (opcional)
campaign_titlestringsíNombre visible de esta campaña (máx. 150 caracteres)
date_plannedstring (date-time)Hora de envío programada (ISO 8601). Omítela para enviar de inmediato.
id_automationintegerVincula 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ódigoDescripción
200Campaña programada o enviada correctamente
401Token no válido o caducado
402Créditos insuficientes
404Mensaje, remitente, lista o segmento no encontrados; o créditos insuficientes
422Tí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
}

GET /Send

Listar envíos programados

Devuelve la lista de campañas de correo electrónico pendientes de envío (programadas, aún no procesadas).

Parámetros

NombreDóndeTipoObligatorioDescripción
subjectMessagequerystringFiltrar por asunto (coincidencia parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Envíos pendientes devueltos correctamente
401Token no válido o caducado

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del envío (de GET /Send)

Respuestas

CódigoDescripción
200Envío programado cancelado correctamente
401Token no válido o caducado
404Envío programado no encontrado

GET /Send/Mail/Scheduled

Listar 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ódigoDescripción
200Correos programados devueltos
401Token no válido o caducado

Ejemplo 200

[
  {
    "id_single_send": 880123,
    "email": "[email protected]",
    "subject": "Your invoice",
    "date_planned": "2026-12-01T09:00:00"
  }
]

POST /Send/Mail/{id}/Cancel

Cancelar un correo individual programado

Cancela el correo mientras no haya salido.

Scope OAuth : email:send

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síid_single_send devuelto por POST /Send/Mail

Respuestas

CódigoDescripción
200Correo cancelado
401Token no válido o caducado
409Envío no encontrado o ya realizado

Ejemplo 200

{
  "result": "ok",
  "cancelled": 880123
}

PATCH /Send/Mail/{id}/Reschedule

Reprogramar un correo individual programado

Cambia la fecha de envío. La nueva fecha debe ser futura y estar dentro de 90 días. También se acepta POST.

Scope OAuth : email:send

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síid_single_send devuelto por POST /Send/Mail

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
date_plannedstring (date-time)síNueva fecha de envío (ISO 8601)

Respuestas

CódigoDescripción
200Correo reprogramado
400Falta la fecha
401Token no válido o caducado
409Enví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"
}

Sender Addresses

Gestiona las direcciones de remitente validadas. Solo las direcciones verificadas pueden utilizarse como From.

GET /SenderEmail

Listar direcciones de remitente

Devuelve las direcciones de remitente validadas configuradas para la cuenta.

Parámetros

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Direcciones de remitente devueltas correctamente
401Token no válido o caducado

Ejemplo 200

[
  {
    "id": 201,
    "email": "[email protected]",
    "sender_name": "Your Company Newsletter",
    "is_validated": true
  }
]

POST /SenderEmail

Añadir una dirección de remitente

Añade la dirección con los mismos controles que la aplicación y le envía un correo de validación. Se puede utilizar una vez que se haga clic en el enlace de ese correo. Una cuenta puede tener hasta 25 remitentes, validados o pendientes.

Scope OAuth : email:templates:write

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
emailstringsíDirección del remitente
sender_namestringsíNombre mostrado a los destinatarios

Respuestas

CódigoDescripción
200Dirección añadida. domain_has_mx es false cuando el dominio no tiene registro MX.
400Falta email o sender_name
401Token no válido o caducado
422Direcció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.
503No disponible temporalmente, inténtelo de nuevo

Ejemplo 200

{
  "result": "ok",
  "confirmation_sent": true,
  "domain_has_mx": true
}

POST /SenderEmail/{id}/ResendValidation

Enviar de nuevo el correo de validación

Para una dirección que aún espera la validación.

Scope OAuth : email:templates:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathintegersíid_sender_email de GET /SenderEmail

Respuestas

CódigoDescripción
200Correo enviado de nuevo
401Token no válido o caducado
404Remitente no encontrado
409Este remitente ya está validado
503No disponible temporalmente, inténtelo de nuevo

Ejemplo 200

{
  "result": "ok",
  "confirmation_sent": true
}

GET /SenderEmail/{id}/Authentication

Comprobar el dominio de un remitente (SPF, DKIM, DMARC, MX)

Comprueba el dominio en directo en el DNS y devuelve los registros que hay que publicar. Solo lectura. El DKIM se activa en la aplicación: dkim_settings_url abre la pantalla correcta.

Scope OAuth : email:templates:read

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathintegersíid_sender_email de GET /SenderEmail

Respuestas

CódigoDescripción
200Estado del dominio. spf.recommended_record se crea a partir de su registro actual: publíquelo solo si spf.change_needed es true.
401Token no válido o caducado
404Remitente no encontrado
503No 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"
}

History

Consulta el registro de envíos de correo electrónico y SMS pasados.

GET /History/Email

Listar 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

NombreDóndeTipoObligatorioDescripción
subjectMessagequerystringFiltrar por asunto (coincidencia parcial)
idCampaignqueryintegerFiltrar por ID de campaña
includeBodyHTMLquerybooleanIncluir el cuerpo HTML completo en la respuesta (más lento)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Historial de correo electrónico devuelto correctamente
401Token no válido o caducado

GET /History/SMS

Listar el historial de envíos de SMS

Devuelve el registro de envíos de SMS pasados de la cuenta.

Parámetros

NombreDóndeTipoObligatorioDescripción
dateSendquerystring (date-time)Filtrar a partir de esta fecha (ISO 8601)
dateSendEndquerystring (date-time)Filtrar hasta esta fecha (ISO 8601)
phoneNumberquerystringFiltrar por teléfono del destinatario (parcial)
typequeryintegerFiltro de tipo de SMS
statusCodequeryintegerFiltro de código de estado DLR
sortByStatusqueryboolean
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Historial de SMS devuelto correctamente
401Token no válido o caducado

Segment

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.

GET /Segment

Listar segmentos

Devuelve todos los segmentos dinámicos guardados de la cuenta.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Segmentos devueltos correctamente
401Token no válido o caducado

GET /Segment/{id}/Contact

Listar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del segmento
id_listqueryinteger (int64)Limitar a esta lista (opcional)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Contactos devueltos
401Token no válido o caducado
404Segmento o lista no encontrados

GET /Segment/{id}/Count

Contar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del segmento
id_listqueryinteger (int64)Limitar a esta lista (opcional)

Respuestas

CódigoDescripción
200Número de contactos
401Token no válido o caducado
404Segmento o lista no encontrados

Ejemplo 200

{
  "total": 1250
}

GET /Segment/{id}/contact/{contactId}/check

Comprobar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del segmento
contactIdpathstring (uuid)síGUID del contacto

Respuestas

CódigoDescripción
200Devuelve el resultado de la coincidencia
401Token no válido o caducado
404Segmento o contacto no encontrados

SMS

Envía mensajes SMS a contactos individuales o a listas de contactos completas. Utiliza el campo phone_number de cada contacto.

POST /Sms/SingleSMS

Enviar 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)

NombreTipoObligatorioDescripción
phone_numberstringsí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.
messagestringsíTexto del SMS (máx. 160 caracteres con codificación estándar)
date_plannedstring (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ódigoDescripción
200SMS enviado o programado correctamente
401Token no válido o caducado
422Formato de número de teléfono no válido

POST /Sms/Campaign

Enviar 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)

NombreTipoObligatorioDescripción
listsarray of ListRefsíListas de contactos destinatarias (utiliza el campo phone_number de cada contacto)
messagestringsíTexto del SMS
date_plannedstring (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ódigoDescripción
200Campaña de SMS enviada o programada correctamente
401Token no válido o caducado

GET /Sms

Listar el historial de SMS

Devuelve el registro de envíos de SMS (tanto individuales como de campaña) de la cuenta.

Parámetros

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Historial de SMS devuelto correctamente
401Token no válido o caducado

DELETE /Sms/{id}

Cancelar un SMS programado

Cancela un envío de SMS programado pendiente.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síID del envío de SMS

Respuestas

CódigoDescripción
200SMS programado cancelado correctamente
401Token no válido o caducado
404Envío de SMS no encontrado

GET /Sms/Scheduled

Listar 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

NombreDóndeTipoObligatorioDescripción
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Envíos de SMS programados devueltos correctamente
401Token no válido o caducado

POST /Sms/{id}/Cancel

Cancelar un SMS programado

Cancela un envío de SMS programado solo si aún no ha sido enviado.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathintegersíID del envío de SMS

Respuestas

CódigoDescripción
200SMS programado cancelado correctamente
401Token no válido o caducado
409Envío de SMS no encontrado, no perteneciente al cliente o ya enviado

PATCH /Sms/{id}/Reschedule

Reprogramar 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

NombreDóndeTipoObligatorioDescripción
idpathintegersíID del envío de SMS

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
date_plannedstring (date-time)Nombre del campo principal.
PlanDatestring (date-time)Alias heredado aceptado por compatibilidad con versiones anteriores.
scheduled_timestring (date-time)Alias heredado aceptado por compatibilidad con versiones anteriores.

Respuestas

CódigoDescripción
200SMS programado reprogramado correctamente
400Falta la fecha: proporciona uno de date_planned / PlanDate / scheduled_time
401Token no válido o caducado
409Reprogramación fallida (no encontrado, ya enviado o fecha fuera de rango)

Folders

Organiza las plantillas de mensajes en carpetas.

GET /FolderList

Listar las carpetas de listas

Devuelve las carpetas utilizadas para organizar las listas de contactos.

Parámetros

NombreDóndeTipoObligatorioDescripción
namequerystringFiltrar por nombre de carpeta (parcial)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Carpetas de listas devueltas correctamente
401Token no válido o caducado

GET /FolderList/{id}

Obtener una carpeta de listas

Devuelve los detalles de una carpeta de listas por su ID.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathintegersíID de la carpeta

Respuestas

CódigoDescripción
200Carpeta devuelta correctamente
401Token no válido o caducado
404Carpeta no encontrada

GET /FolderMessage

Listar carpetas de mensajes

Devuelve las carpetas utilizadas para organizar las plantillas de mensajes de correo electrónico.

Parámetros

NombreDóndeTipoObligatorioDescripción
namequerystringFiltrar por nombre de carpeta
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Carpetas de mensajes devueltas correctamente
401Token no válido o caducado

Import

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.

POST /Import/Upload

Subir 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:

Opcional:

Formato de archivo:

Cuerpo de la solicitud (multipart/form-data)

NombreTipoObligatorioDescripción
id_listinteger (int64)síID de la lista de destino
filestring (binary)síArchivo CSV o XLSX (UTF-8, máx. 50 MB)
json_match_fieldsstringsíCorrespondencia JSON entre las columnas del archivo y los campos del contacto
webhook_urlstring (uri)URL de callback invocada cuando finaliza el procesamiento

Respuestas

CódigoDescripción
200Archivo aceptado y puesto en cola
400Ningún archivo subido, falta id_list, o json_match_fields ausente / no válido
401Token no válido o caducado
500Error del servidor o del almacenamiento

Ejemplo 200

{
  "result": "OK",
  "import_job_id": 14,
  "internal_name": "230575-20260420142615-contacts.csv"
}

Webhooks

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.

GET /Webhook

Listar webhooks

Devuelve todos los webhooks configurados en la cuenta autenticada.

Respuestas

CódigoDescripción
200Array de webhooks
401Token no válido o caducado

POST /Webhook

Crear 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)

NombreTipoObligatorioDescripción
urlstring (uri)síPunto de conexión HTTPS (HTTP se rechaza en producción)
eventsarray of stringsíLista de tipos de evento a los que suscribirse (consulta el catálogo anterior). Usa ["*"] para suscribirte a todos los eventos de esta API.
descriptionstringDescripció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ódigoDescripción
201Webhook creado: el secret solo se devuelve aquí
400URL no válida, lista de eventos no válida o límite excedido
401Token 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"
}

GET /Webhook/{id}

Obtener un webhook

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200El webhook
404Webhook no encontrado

PUT /Webhook/{id}

Actualizar un webhook

Actualización parcial: solo se modifican los campos enviados.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanEstablece true para volver a habilitar un webhook desactivado automáticamente una vez corregido tu punto de conexión.

Respuestas

CódigoDescripción
200Webhook actualizado
400Carga útil no válida
404Webhook no encontrado

DELETE /Webhook/{id}

Eliminar un webhook

Elimina permanentemente el webhook y todo su historial de entregas.

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
204Eliminado
404Webhook no encontrado

POST /Webhook/{id}/test

Enviar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Cuerpo de la solicitud (application/json)

NombreTipoObligatorioDescripción
eventTypestringSobrescribe el tipo de evento (debe estar suscrito por este webhook). ping siempre funciona.

Ejemplo

{
  "eventType": "ping"
}

Respuestas

CódigoDescripción
202Evento puesto en cola para su envío
404Webhook no encontrado

Ejemplo 202

{
  "deliveryId": 1234,
  "eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "eventType": "ping"
}

POST /Webhook/{id}/rotate-secret

Rotar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí

Respuestas

CódigoDescripción
200Nuevo secreto (visible una sola vez)
404Webhook no encontrado

Ejemplo 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /Webhook/{id}/deliveries

Listar 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
limitqueryinteger
cursorqueryinteger (int64)Cursor de paginación (= último ID de entrega visto). Devuelve las entregas con id < cursor.

Respuestas

CódigoDescripción
200Array de intentos de entrega (los más recientes primero)
404Webhook no encontrado

POST /Webhook/{id}/deliveries/{deliveryId}/replay

Reproducir 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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)sí
deliveryIdpathinteger (int64)sí

Respuestas

CódigoDescripción
202Reproducción puesta en cola
404Webhook o entrega no encontrados

Suppression

Rebotes y bajas de la cuenta: listar, añadir, eliminar.

GET /Suppression/Bounces

Listar los rebotes de la cuenta

Los más recientes primero. El total está en la cabecera X-Total-Count.

Scope OAuth : email:read

Parámetros

NombreDóndeTipoObligatorioDescripción
typequerystring: hard, softhard o soft
sourcequerystringOrigen del rebote: list, contact, api o smtp
emailquerystringDirección exacta
dateFromquerystring (date-time)A partir de esta fecha
dateToquerystring (date-time)Hasta esta fecha
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Rebotes devueltos
400type debe ser hard o soft
401Token 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
  }
]

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síid del rebote
sourcequerystringsílist, contact, api o smtp
typequerystring: hard, softsíhard o soft

Respuestas

CódigoDescripción
200Rebote eliminado
400Falta source o type
401Token no válido o caducado
404Rebote no encontrado

Ejemplo 200

{
  "result": "ok",
  "id": 5521,
  "restored": false
}

POST /Suppression/Bounces/{id}/Restore

Volver a poner en sus listas un contacto con rebote duro

Solo para un rebote duro con el origen contact.

Scope OAuth : contacts:write

Parámetros

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síid del rebote

Respuestas

CódigoDescripción
200Contacto repuesto
401Token no válido o caducado
404Rebote duro de un contacto no encontrado o dirección ya no activa

Ejemplo 200

{
  "result": "ok",
  "id": 5521,
  "restored": true
}

GET /Suppression/Unsubscribers

Listar las bajas de la cuenta

Los más recientes primero. El total está en la cabecera X-Total-Count.

Scope OAuth : contacts:read

Parámetros

NombreDóndeTipoObligatorioDescripción
sourcequerystringOrigen de la baja: contact, list, smtp, api o api3
emailquerystringDirección exacta
dateFromquerystring (date-time)A partir de esta fecha
dateToquerystring (date-time)Hasta esta fecha
numberOfRecordsqueryinteger
pageNumberqueryinteger

Respuestas

CódigoDescripción
200Bajas devueltas
401Token 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"
  }
]

POST /Suppression/Unsubscribers

Añ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)

NombreTipoObligatorioDescripción
emailstringsíDirección que dar de baja
commentstringComentario libre
id_listinteger (int64)Lista de bajas de la cuenta (opcional)

Respuestas

CódigoDescripción
200Hecho. already_unsubscribed es true cuando la dirección ya estaba dada de baja.
400Se requiere una dirección válida
401Token no válido o caducado
404id_list no es una lista de bajas de esta cuenta

Ejemplo 200

{
  "result": "ok",
  "already_unsubscribed": false
}

DELETE /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

NombreDóndeTipoObligatorioDescripción
idpathinteger (int64)síid de la baja
sourcequerystringsícontact, list, smtp, api o api3

Respuestas

CódigoDescripción
200Baja eliminada
400source es obligatorio
401Token no válido o caducado
404Baja no encontrada

Ejemplo 200

{
  "result": "ok",
  "removed": 9012
}