Descripción general de la API REST de TrekMail
Aprende cómo funciona la API REST de TrekMail: autenticación con tokens bearer, acceso según el plan, límites de velocidad y formatos de respuesta.
Detalles del artículo
Tipo, dificultad, planes e información de última actualización.
▼
Detalles del artículo
Tipo, dificultad, planes e información de última actualización.
- Tipo
- Referencia
- Dificultad
- Intermedio
- Planes
- Nano · Starter · Pro · Agency
- Última actualización
- 23 de ago. de 2026
La API de TrekMail te permite administrar dominios, buzones, reenvío, DNS, migraciones de correo electrónico y operaciones de webmail desde un cliente HTTP o un agente de IA. Esto incluye leer y enviar mensajes, borradores, programación, carpetas, contactos, calendarios, identidades, plantillas y remitentes bloqueados. Las solicitudes autenticadas usan un token bearer, las respuestas son JSON y la actividad de la API queda registrada para auditoría.
Qué obtienes
- API REST v1 con formato JSON para solicitudes y respuestas.
- Autenticación con token bearer: sin cookies ni sesiones para las llamadas autenticadas a la API.
- Claves de idempotencia en las operaciones de escritura que las requieren, para evitar trabajo duplicado durante los reintentos.
- Límite de velocidad por token con encabezados
Retry-After. - Registro de auditoría visible en el panel, en AI Agents & API → Audit Log.
- Servidor MCP con un catálogo filtrado según las credenciales, el transporte y la configuración de seguridad de la conexión actual. Por eso, una conexión limitada a un proyecto solo ve las herramientas que puede usar.
- Alias de dominio: conecta direcciones de solo recepción de un dominio secundario con las mismas partes locales de un dominio principal, con estados de entrega guardados y activos, además de eliminación segura. Consulta Alias de dominio mediante API y MCP.
- Arquitectura de dos tokens: tokens de operaciones separados para infraestructura y tokens de mensajes para operaciones completas de correo, como lectura, envío, borradores, programación, contactos, calendarios, identidades, plantillas y carpetas.
- Información sobre entregabilidad saliente y rebotes: obtén desde el panel el resumen de enviados, entregados, rebotes permanentes y rebotes temporales, además de los códigos y respuestas SMTP por destinatario. Consulta Entregabilidad y rebotes.
- Uso de almacenamiento del buzón:
list_mailboxesyget_mailboxdevuelvenused_mb,quota_mb,allocation_mbeis_pooled, para que un agente detecte buzones próximos a su límite sin acceder al panel. - Administración de White Label: revisa la configuración, gestiona el branding por dominio, invita clientes, controla roles y dominios, suspende o restaura el acceso y consulta la actividad mediante API o MCP. Consulta la guía de branding y la guía de administración de equipos.
API de Drive y automatización de archivos
Drive forma parte de la API pública. Incluye los espacios de Drive de la cuenta y de los buzones, el uso, la exploración de carpetas, las cargas, la administración de archivos y carpetas, la Papelera, las acciones masivas, los enlaces públicos para compartir, la administración de contraseñas de dispositivos de sincronización y el estado de solo lectura del complemento Drive Storage.
Drive usa once ámbitos de tokens de operaciones: drive:account:read, drive:account:write, drive:account:share, drive:account:purge, drive:mailbox:read, drive:mailbox:write, drive:mailbox:share, drive:mailbox:purge, drive:addon:read, drive:devices:read y drive:devices:write. Las acciones de facturación para el complemento Drive, como comprar, cambiar el tamaño y cancelar, siguen disponibles solo en el panel y no se exponen como operaciones de escritura de API o MCP.
Empieza con la descripción general de la API de Drive o la guía de inicio rápido de la API de Drive.
Arquitectura de dos tokens
La API usa dos tipos de token independientes. Puedes usar uno o ambos según tus necesidades:
| Tipo de token | Prefijo | Qué habilita |
|---|---|---|
| Token de operaciones | tm_live_ |
Herramientas de cuenta e infraestructura: White Label, dominios, DNS, buzones, invitaciones, Drive, migraciones, SMTP, tickets, facturación y Cloudflare |
| Token de mensajes | tm_msg_ |
Operaciones de webmail: mensajes, carpetas, archivos adjuntos, borradores, envío programado, informes de spam/ham, acciones masivas, contactos, grupos de contactos, calendario, asistentes de redacción, identidades, plantillas y remitentes bloqueados |
Los tokens de operaciones y los tokens de mensajes tienen ámbitos y límites de velocidad separados. Un solo agente puede usar ambos tokens al mismo tiempo configurándolos en el entorno del servidor MCP.
Los tokens de mensajes están disponibles en los planes Pro y Agency.
Antes de empezar
- Todos los planes tienen acceso a la API:
- Nano: Email Verifier. Añade un complemento Drive Storage para obtener acceso completo a la API y MCP de Drive.
- Starter: acceso completo a Drive y Email Verifier, y acceso de solo lectura al resto de las áreas de infraestructura. Usa el panel para esas acciones de escritura.
- Pro / Agency: acceso completo a la API base, incluidos los tokens de mensajes. Los ámbitos de White Label se añaden mientras su prueba o complemento de pago esté activo.
- ¿Vas a conectar un agente de IA? Añade
https://trekmail.net/mcpcomo servidor MCP remoto en cualquier cliente compatible. Si admite autorización mediante navegador, no se necesita un token manual. Consulta Conectar agentes de IA (MCP) para ver las opciones remotas, de CLI/escritorio, puente y alojamiento propio. - ¿Vas a crear tu propia integración? Crea un token
tm_live_en AI Agents & API → Tokens → Create token y envíalo comoAuthorization: Bearer …. Consulta Crear y administrar tokens de API. - ¿Es tu primera vez con la API? Haz clic en Start tour en la parte superior de la página AI Agents & API para ver una guía breve sobre métodos de conexión, administración de tokens, aplicaciones conectadas y el registro de auditoría.
Cómo funciona la autenticación
Cada solicitud debe incluir tu token en el encabezado Authorization:
Authorization: Bearer tm_live_abc123...
Los tokens de operaciones comienzan por tm_live_ y los tokens de mensajes por tm_msg_. Ambos se muestran una sola vez al crearlos y no pueden volver a mostrarse.
Si el token falta, fue revocado o caducó, la API devuelve 401 con el código de error unauthenticated.
URL base y control de versiones
Todos los endpoints se encuentran bajo:
https://trekmail.net/api/v1
La URL base aparece en tu panel AI Agents & API, en Quick Reference. La versión se encuentra en la ruta de la URL. Si alguna vez se introduce v2, v1 seguirá funcionando.
Formato de respuesta
Las respuestas correctas devuelven JSON con una clave data para recursos individuales o una lista paginada:
{
"data": [
{ "id": 1, "domain": "example.com", "status": "active" }
],
"links": { "next": "...", "prev": null },
"meta": { "current_page": 1, "last_page": 1, "total": 1 }
}
Las respuestas de error siguen una estructura coherente:
{
"error": {
"code": "unauthenticated",
"message": "Invalid or expired API token",
"hint": "Check that your token is correct and has not been revoked.",
"request_id": "req_abc123",
"retryable": false
}
}
Identificadores de solicitud
Cada respuesta incluye un encabezado X-Request-Id. También puedes enviar el tuyo mediante X-Request-Id en la solicitud. Se devolverá sin cambios y quedará registrado en el historial de auditoría.
Límites de velocidad
Cada token tiene un límite de velocidad por minuto. Cuando alcanzas el límite, la API devuelve 429 con un encabezado Retry-After que indica cuándo puedes volver a intentarlo.
Las operaciones destructivas (intenciones de eliminación) tienen un límite diario adicional por token y un tiempo de espera entre eliminaciones consecutivas.
Las operaciones de escritura de migraciones (iniciar, cancelar y reintentar) tienen un límite específico de 10 solicitudes por minuto y por token, además de un máximo de concurrencia para todo el servidor que devuelve 503 cuando se ejecutan demasiadas migraciones globalmente.
Los tokens de mensajes usan límites separados. Los valores predeterminados son 30 solicitudes de lectura por minuto y por token, 60 solicitudes de envío por minuto y por token, 5,000 lecturas correctas por día y por token, y 100 envíos por API al día en un buzón. Un segundo contador de seguridad para envíos tiene un valor predeterminado de 500 por token y por día; normalmente se aplica primero el límite inferior del buzón. Estas protecciones de la API no sustituyen los límites de SMTP administrado de tu plan ni los límites propios de un proveedor externo.
Idempotencia
Los endpoints que cambian el estado y están marcados como idempotentes requieren un encabezado Idempotency-Key. Esto incluye creaciones, actualizaciones, envíos y eliminaciones en las que un reintento automático podría duplicar el trabajo. Las acciones POST similares a lecturas, como detectar un proveedor o probar una conexión, no lo requieren; consulta la tabla de endpoints o la especificación OpenAPI. Si envías la misma clave con el mismo cuerpo, la API reproduce la respuesta original sin crear duplicados.
Idempotency-Key: create-mailbox-alice-2024
Si envías la misma clave con un cuerpo diferente, la API devuelve 409 Conflict.
Asignación de almacenamiento de buzones
Cada endpoint que crea un buzón o una invitación, POST /api/v1/mailboxes, /api/v1/mailboxes:bulk, /api/v1/mailboxes/invites, /api/v1/mailboxes/invites:bulk, acepta un entero opcional storage_allocation_mb.
| Valor | Significado |
|---|---|
Omitido (o null) |
El buzón usa el grupo compartido de la cuenta (valor predeterminado). |
| Entero positivo (MB) | El buzón tiene almacenamiento dedicado. Esa cantidad exacta se reserva del grupo de la cuenta solo para este buzón. |
Las asignaciones se validan comparándolas con el grupo activo menos los buzones dedicados existentes y las invitaciones dedicadas pendientes. Los endpoints masivos también validan la suma de las asignaciones del lote y rechazan todo el lote con 422 storage_pool_exceeded si se superaría la capacidad. El grupo se actualiza al eliminar un buzón dedicado, al canjear una invitación (la asignación pasa al nuevo buzón) y al caducar una invitación pendiente.
En las invitaciones, la asignación se registra en el código de acceso y se copia al nuevo buzón al canjearlo. Si en ese momento el grupo ya no admite la asignación solicitada (por ejemplo, otro administrador aumentó mientras tanto su asignación dedicada), el canje reduce de forma segura el nuevo buzón a almacenamiento compartido en lugar de fallar, y el destinatario ve un aviso en la página de confirmación.
Acceso de buzones a Drive
Cada buzón tiene un nivel drive_access que determina cuánto contenido de Drive puede usar en webmail la persona asociada. Se devuelve en el recurso del buzón y puede establecerse con PATCH /api/v1/mailboxes/{id} o, para varios buzones a la vez, con POST /api/v1/mailboxes:drive-access.
| Valor | Significado |
|---|---|
full |
Todo: la pestaña Drive, cargas y recursos compartidos, búsqueda de archivos y sincronización con un equipo. Es el valor predeterminado. |
attachments_only |
Sin Drive en webmail ni sincronización. El envío sigue funcionando; un archivo que supera el umbral de adjuntos se envía como enlace de descarga y esa copia se elimina al finalizar el período de retención. |
disabled |
Sin Drive, y un archivo que supera el umbral no puede adjuntarse. |
El almacenamiento se comparte en toda la cuenta, por lo que este control determina cuánto puede ocupar una sola persona con archivos.
Suspensión del inicio de sesión del buzón
Es posible suspender el inicio de sesión de un buzón mientras sigue recibiendo correo: se rechazan webmail, IMAP, SMTP y las contraseñas de dispositivos, y se cierran las sesiones abiertas, pero la entrega no cambia. Nada rebota y todo espera cuando se restaura el inicio de sesión. Configúralo con POST /api/v1/mailboxes/{id}:suspend-login (y :resume-login) o, para varios buzones, con POST /api/v1/mailboxes:login-access.
El recurso del buzón lo informa como login_suspended, login_suspended_at y login_suspended_reason. Consulta login_suspended para saber si la persona puede iniciar sesión y status para saber si el buzón funciona. Un buzón suspendido conserva active porque sigue aceptando correo. :pause es diferente: cambia status a disabled y también detiene la entrega.
Consulta Suspender el inicio de sesión de un buzón mediante API.
El endpoint masivo acepta exactamente un selector, mailbox_ids, domain_id o all, y devuelve lo que hizo:
{ "data": { "drive_access": "attachments_only", "matched": 24, "updated": 21, "skipped_shared": 3 } }
domain_id es el selector adecuado cuando un dominio corresponde a un cliente. Los buzones que ya tienen el nivel solicitado cuentan como matched, pero no como updated, por lo que es seguro repetir la llamada.
Los buzones compartidos se rechazan en el endpoint individual con 422 drive_access_not_applicable y el endpoint masivo los omite y contabiliza: no tienen un usuario propio de webmail, por lo que los miembros los abren con su propio nivel y un valor guardado en la fila compartida no cambiaría nada.
La restricción se aplica tanto a la API como a la interfaz. El espacio de Drive de un buzón restringido no aparece en GET /api/v1/drive/spaces, sus archivos responden con 404 al consultarlos por id y no se puede crear un dispositivo de sincronización para él.
Direcciones de reenvío
GET /api/v1/domains/{id}/forwarding-addresses devuelve más que la lista, porque hay dos aspectos de una dirección de reenvío que no se ven en la propia dirección:
{
"data": [ { "id": 8, "address": "sales@acme.com", "local_part": "sales",
"domain_id": 4, "recipients": ["team@example.net"], "is_active": true } ],
"limits": { "used": 1, "max": 100, "recipients_per_address": 15 },
"delivery": { "active": true, "requires_plan": "pro",
"paused_until": null, "paused_reason": null }
}
limits.maxse aplica por dominio y depende del plan: 100 en Pro, 300 en Agency y 25 guardadas pero inactivas en Nano o Starter.delivery.activeindica si estas reglas están moviendo correo ahora mismo. Esfalseen un plan inferior arequires_plany también esfalsemientraspaused_untiltenga un valor (la cuenta superó su tasa de envío por hora; consulta Límites de envío por plan). Una regla puede teneris_active: truey aun así no entregar mensajes, por lo que debes consultardelivery, no solois_active, antes de informar que el reenvío funciona.
Se permite crear reglas en un plan que no puede entregar y se devuelve 201: la regla queda guardada y empieza a funcionar al mejorar el plan. Esto coincide con el panel, que muestra esas reglas como guardadas e inactivas.
Los rechazos se devuelven como 422 con error.code establecido en validation_error o limit_exceeded: una dirección ya usada en el dominio, un destinatario del mismo dominio (que produciría un bucle), un dominio destinatario sin MX operativo o el presupuesto por dominio agotado.
Las operaciones POST y DELETE en estos endpoints requieren una Idempotency-Key; PATCH no la requiere.
Historial de entrega
GET /api/v1/domains/{id}/forwarding-addresses/{addressId}/log devuelve lo ocurrido realmente con el correo reciente, empezando por lo más nuevo:
{
"data": [
{ "id": 91, "occurred_at": "2026-07-27T09:12:04+00:00", "outcome": "delivered",
"from": "rfq@northgatesupply.com", "to": "sales@example.net",
"smtp_code": "2.0.0", "smtp_response": "250 2.0.0 OK" }
],
"address": "sales@acme.com",
"window": { "retention_days": 30, "max_events": 200 }
}
outcome puede ser delivered, deferred (fallo temporal, se siguen realizando reintentos), failed (el servidor del destinatario lo rechazó) o blocked. Este último significa que nuestro filtro de spam detuvo el mensaje antes del reenvío, por lo que nunca llegó al destinatario. Tratar blocked como un rebote haría que alguien investigara el servidor receptor por un problema ocurrido en el nuestro.
limit (1-200, valor predeterminado 100) es el único parámetro. La ventana es la retención del plan: 30 días en Agency y 7 en los demás. No hay eventos más antiguos que consultar porque los eventos reenviados se eliminan.
Buzones compartidos (de equipo)
Un buzón compartido es una bandeja de entrada de equipo, como support@ o sales@, que los miembros abren mediante su propia cuenta de buzón normal, en Webmail y, cuando el acceso nativo está habilitado, como una carpeta IMAP delegada. No hay una contraseña compartida ni un inicio de sesión separado. El acceso es uniforme: todos los miembros pueden leer, y un único indicador can_send controla si cada miembro puede responder como la dirección (true) o tiene acceso de solo lectura (false). No hay roles de miembros.
GET /api/v1/mailboxes y GET /api/v1/mailboxes/{id} ahora devuelven mailbox_type ("user" o "shared") y el booleano is_shared; los buzones compartidos también incluyen shared_member_count. Usa estos campos para distinguir una bandeja de equipo de una normal antes de llamar a los endpoints de miembros.
| Endpoint | Método | Ámbito requerido | Función |
|---|---|---|---|
/api/v1/mailboxes/{id}/members |
GET | mailboxes:read |
Enumera los miembros de un buzón compartido (cada uno: member_mailbox_id, email, can_read, can_send) |
/api/v1/mailboxes/{id}/members |
POST | mailboxes:write |
Añade un miembro, cuerpo {member_mailbox_id, can_send?} (can_send tiene el valor predeterminado true) |
/api/v1/mailboxes/{id}/members/{member} |
PATCH | mailboxes:write |
Cambia el acceso de respuesta de un miembro, cuerpo {can_send} |
/api/v1/mailboxes/{id}/members/{member} |
DELETE | mailboxes:write |
Elimina un miembro (un buzón compartido siempre conserva al menos uno) |
/api/v1/shared-mailboxes |
POST | mailboxes:create |
Crea un buzón compartido, cuerpo {domain_id, local_part, display_name, member_mailbox_ids[], storage_shared?, storage_mb?} |
/api/v1/mailboxes/{id}/convert-to-shared |
POST | mailboxes:write |
Convierte un buzón existente en uno compartido, cuerpo {member_mailbox_ids[]} (rota la contraseña anterior para impedir el inicio de sesión; devuelve 202 conversion_pending con reintento automático si la sincronización del backend aún no está confirmada) |
/api/v1/mailboxes/{id}/convert-to-regular |
POST | mailboxes:write |
Convierte un buzón compartido en uno normal, cuerpo {password} (elimina los miembros y establece una nueva contraseña de inicio de sesión) |
Los endpoints de miembros reutilizan tus ámbitos mailboxes:read / mailboxes:write existentes. No hay un ámbito independiente para buzones compartidos.
Para descubrir el acceso nativo desde aplicaciones de correo, llama a GET /api/v1/mailboxes/{member_mailbox_id}/client-setup para un buzón normal de miembro. Su objeto shared_mailboxes informa de la disponibilidad nativa duradera, la disponibilidad y el motivo efectivos de Send As, las rutas exactas de Inbox/Sent/Archive/Junk y las operaciones permitidas. can_send es el permiso Can reply asignado, no una prueba de que SMTP esté listo. El endpoint nunca devuelve una contraseña. Si se llama con el id del buzón compartido, devuelve 422 direct_login_unavailable porque la dirección compartida no puede autenticarse directamente.
Al eliminar un miembro, cambiar can_send o convertir un buzón compartido en normal, se sincronizan los permisos del servidor de correo cuando el acceso nativo está habilitado. Una respuesta 503 native_access_sync_failed permite reintentar y garantiza que la membresía, el permiso o el tipo de buzón no se modificaron, en lugar de aplicar parcialmente la operación.
Endpoints disponibles
Drive tiene su propia referencia y no se repite aquí; consulta la descripción general de la API de Drive. Los endpoints SMTP a nivel de cuenta que se conservan por compatibilidad con versiones anteriores se describen en Enrutamiento SMTP por dominio, en lugar de mostrarse como actuales.
| Endpoint | Método | Ámbito requerido |
|---|---|---|
/api/v1/domains |
GET | domains:read |
/api/v1/domains/{id} |
GET | domains:read |
/api/v1/domains/{id}/matching-addresses |
GET | domains:read |
/api/v1/domains/{id}/matching-addresses |
PUT | domains:write |
/api/v1/domains/{id}/matching-addresses |
DELETE | domains:write |
/api/v1/domains/{id}/dns-requirements |
GET | domains:dns:read |
/api/v1/domains/{id}/dns-recheck |
POST | domains:dns:recheck |
/api/v1/domains/{id}/spam-metrics |
GET | domains:read |
/api/v1/domains/{id}/spam-metrics/summary |
GET | domains:read |
/api/v1/domains/{id}/deliverability |
GET | domains:read |
/api/v1/domains/{id}/bounces |
GET | domains:read |
/api/v1/domains/{id}/signature |
GET | domains:read |
/api/v1/domains/{id}/forwarding-addresses |
GET | domains:read |
/api/v1/domains/{id}/forwarding-addresses/{addressId}/log |
GET | domains:read |
/api/v1/dns-checks/{id} |
GET | domains:dns:read |
/api/v1/mailboxes |
GET | mailboxes:read |
/api/v1/mailboxes |
POST | mailboxes:create |
/api/v1/mailboxes/{id} |
PATCH | mailboxes:write |
/api/v1/mailboxes/invites |
POST | mailboxes:invites:create |
/api/v1/mailboxes/invites:bulk |
POST | mailboxes:invites:create |
/api/v1/mailboxes:bulk |
POST | mailboxes:create |
/api/v1/mailboxes/{id}/forwarding |
GET | mailboxes:forwarding:read |
/api/v1/mailboxes/{id}/forwarding |
PUT | mailboxes:forwarding:write |
/api/v1/mailboxes/{id}/rules |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/rules |
POST | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/{ruleId} |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/rules/{ruleId} |
PUT | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/{ruleId} |
DELETE | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/reorder |
PATCH | mailboxes:rules:write |
/api/v1/mailboxes/{id}/auto-reply |
GET | mailboxes:auto-reply:read |
/api/v1/mailboxes/{id}/auto-reply |
PUT | mailboxes:auto-reply:write |
/api/v1/mailboxes/{id}/sieve |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/sieve |
PUT | mailboxes:rules:write |
/api/v1/mailboxes/{id}:delete-intent |
POST | mailboxes:delete |
/api/v1/delete-intents/{id}:confirm |
POST | mailboxes:delete |
/api/v1/me |
GET | (cualquier token de operaciones válido) |
/api/v1/mailboxes/{id}/message-tokens |
POST | mailboxes:message-tokens:manage |
/api/v1/mailboxes/{id}/message-tokens |
GET | mailboxes:message-tokens:manage |
/api/v1/message-tokens/{id} |
DELETE | mailboxes:message-tokens:manage |
/api/v1/messages |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid} |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/send |
POST | messages:send (token de mensajes) |
/api/v1/messages/_ping |
GET | messages:read (token de mensajes, diagnóstico) |
/api/v1/messages/{uid}/attachments/{index} |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid}/attachments |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid}/raw |
GET | messages:read (token de mensajes; devuelve raw_base64, encoding, content_type, size_bytes) |
/api/v1/messages/folders |
POST | messages:write (token de mensajes) |
/api/v1/messages/folders/{path} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/folders/{path} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/{uid}:spam |
POST | messages:write (token de mensajes) |
/api/v1/messages/{uid}:ham |
POST | messages:write (token de mensajes) |
/api/v1/messages/bulk |
POST | messages:write (token de mensajes) |
/api/v1/messages/folders:empty |
POST | messages:write (token de mensajes) |
/api/v1/messages/drafts |
POST | messages:write (token de mensajes); devuelve uid + uidvalidity |
/api/v1/messages/drafts/{uid} |
PUT | messages:write (token de mensajes); requiere el uidvalidity del borrador |
/api/v1/messages/scheduled |
POST | messages:send (token de mensajes) |
/api/v1/messages/scheduled |
GET | messages:read (token de mensajes) |
/api/v1/messages/scheduled/{id} |
PATCH | messages:send (token de mensajes) |
/api/v1/messages/scheduled/{id} |
DELETE | messages:send (token de mensajes) |
/api/v1/messages/contacts |
GET | messages:read (token de mensajes) |
/api/v1/messages/contacts |
POST | messages:write (token de mensajes) |
/api/v1/messages/contacts/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/contacts/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/contacts/import |
POST | messages:write (token de mensajes) |
/api/v1/messages/contacts/export |
GET | messages:read (token de mensajes) |
/api/v1/messages/contact-groups |
GET | messages:read (token de mensajes) |
/api/v1/messages/contact-groups/{id}/members |
GET | messages:read (token de mensajes) |
/api/v1/messages/external-accounts |
GET | messages:read (token de mensajes) |
/api/v1/messages/external-accounts |
POST | messages:write (token de mensajes) |
/api/v1/messages/external-accounts/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/external-accounts/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/external-accounts/detect |
POST | messages:read (token de mensajes) |
/api/v1/messages/external-accounts/test |
POST | messages:write (token de mensajes) |
/api/v1/messages/external-accounts/{id}/test |
POST | messages:write (token de mensajes) |
/api/v1/messages/_me |
GET | cualquier token de mensajes (introspección) |
/api/v1/messages/calendar/events |
GET | messages:read (token de mensajes) |
/api/v1/messages/calendar/events |
POST | messages:write (token de mensajes) |
/api/v1/messages/calendar/events/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/calendar/events/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/{uid}/reply |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid}/reply-all |
GET | messages:read (token de mensajes) |
/api/v1/messages/{uid}/forward |
GET | messages:read (token de mensajes) |
/api/v1/messages/contact-groups |
POST | messages:write (token de mensajes) |
/api/v1/messages/contact-groups/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/contact-groups/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/contact-groups/{id}/members |
POST | messages:write (token de mensajes) |
/api/v1/messages/contact-groups/{id}/members |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/identities |
GET | messages:read (token de mensajes) |
/api/v1/messages/identities |
POST | messages:write (token de mensajes) |
/api/v1/messages/identities/reply-policy |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/identities/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/identities/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/templates |
GET | messages:read (token de mensajes) |
/api/v1/messages/templates |
POST | messages:write (token de mensajes) |
/api/v1/messages/templates/{id} |
PATCH | messages:write (token de mensajes) |
/api/v1/messages/templates/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/blocked-senders |
GET | messages:read (token de mensajes) |
/api/v1/messages/blocked-senders |
POST | messages:write (token de mensajes) |
/api/v1/messages/blocked-senders/{id} |
DELETE | messages:write (token de mensajes) |
/api/v1/mailboxes/{id}/enable-imap |
POST | mailboxes:write (token de operaciones) |
/api/v1/migrations/test-connection |
POST | migrations:write |
/api/v1/migrations |
GET | migrations:read |
/api/v1/migrations/{id} |
GET | migrations:read |
/api/v1/migrations |
POST | migrations:write |
/api/v1/migrations/{id}:cancel |
POST | migrations:write |
/api/v1/migrations/{id}:retry |
POST | migrations:write |
/api/v1/migrations/{id} |
DELETE | migrations:write |
/api/v1/migrations/bulk/preview |
POST | migrations:write |
/api/v1/migrations/bulk |
POST | migrations:write |
/api/v1/migrations/bulk |
GET | migrations:read |
/api/v1/migrations/bulk/{batch} |
GET | migrations:read |
/api/v1/migrations/bulk/{batch}:cancel |
POST | migrations:write |
/api/v1/migrations/bulk/{batch}:retry |
POST | migrations:write |
/api/v1/migrations/bulk/{batch}:resume |
POST | migrations:write |
/api/v1/migrations/bulk/{batch} |
DELETE | migrations:write |
/api/v1/migrations/bulk/{batch}/jobs/{job}/password |
PATCH | migrations:write |
/api/v1/account |
GET | account:read |
/api/v1/billing/status |
GET | billing:read |
/api/v1/billing/invoices |
GET | billing:read |
/api/v1/domains |
POST | domains:create |
/api/v1/domains/{id} |
DELETE | domains:delete |
/api/v1/domains/{id}/catch-all |
PATCH | domains:write |
/api/v1/domains/{id}/mail-hosting |
PATCH | domains:write |
/api/v1/domains/{id}/forwarding-addresses |
POST | domains:write |
/api/v1/domains/{id}/forwarding-addresses/{addressId} |
PATCH | domains:write |
/api/v1/domains/{id}/forwarding-addresses/{addressId} |
DELETE | domains:write |
/api/v1/domains/{id}/dkim:retry |
POST | domains:write |
/api/v1/domains/{id}/note |
PATCH | domains:write |
/api/v1/domains/{id}/signature |
PATCH | domains:write |
/api/v1/domains/{id}/branding |
GET | domains:read |
/api/v1/domains/{id}/branding |
PATCH | domains:write |
/api/v1/domains/{id}/branding/logo/{slot} |
PUT | domains:write |
/api/v1/domains/{id}/branding/logo/{slot} |
DELETE | domains:write |
/api/v1/domains/{id}/branding/verify-dns |
POST | domains:write |
/api/v1/domains/{id}/branding/preview |
POST | domains:write |
/api/v1/domains/{id}/branding |
DELETE | domains:write |
/api/v1/domains:bulk-add |
POST | domains:create |
/api/v1/mailboxes/{id} |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/client-setup |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/apple-mail-profile |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/bounces |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/password |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/note |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}:pause |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:restore |
POST | mailboxes:delete |
/api/v1/mailboxes/{id}:resume |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:suspend-login |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:resume-login |
POST | mailboxes:write |
/api/v1/mailboxes:login-access |
POST | mailboxes:write |
/api/v1/mailboxes:drive-access |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/members |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/members |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/members/{member} |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}/members/{member} |
DELETE | mailboxes:write |
/api/v1/shared-mailboxes |
POST | mailboxes:create |
/api/v1/mailboxes/{id}/convert-to-shared |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/convert-to-regular |
POST | mailboxes:write |
/api/v1/tickets |
GET | tickets:read |
/api/v1/tickets/{id} |
GET | tickets:read |
/api/v1/tickets/{id}/messages |
GET | tickets:read |
/api/v1/tickets |
POST | tickets:write |
/api/v1/tickets/{id}:mark-seen |
POST | tickets:write |
/api/v1/tickets/{id}/reply |
POST | tickets:write |
/api/v1/tickets/{id}:close |
POST | tickets:write |
/api/v1/domains/{id}/smtp |
GET | smtp:read |
/api/v1/domains/{id}/smtp |
PUT | smtp:write |
/api/v1/domains/{id}/smtp/profiles |
GET | smtp:read |
/api/v1/domains/{id}/smtp/profiles |
POST | smtp:write |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
PUT | smtp:write |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
DELETE | smtp:write |
/api/v1/domains/{id}/smtp:test |
POST | smtp:write |
/api/v1/domains/{id}/smtp:test-status/{jobId} |
GET | smtp:read |
/api/v1/smtp/default |
GET | smtp:read |
/api/v1/smtp/default |
PUT | smtp:write |
/api/v1/smtp (heredado, compatibilidad anterior) |
GET | smtp:read |
/api/v1/smtp (heredado, compatibilidad anterior) |
PUT | smtp:write |
/api/v1/smtp/{id} (heredado, compatibilidad anterior) |
DELETE | smtp:write |
/api/v1/smtp:test (heredado, compatibilidad anterior) |
POST | smtp:write |
/api/v1/smtp:test-status/{jobId} (heredado, compatibilidad anterior) |
GET | smtp:read |
/api/v1/messages/{uid} |
DELETE | messages:write (token de mensajes) |
/api/v1/messages/{uid}:move |
POST | messages:write (token de mensajes) |
/api/v1/messages/folders |
GET | messages:read (token de mensajes) |
/api/v1/mailboxes/{id}/aliases |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/aliases |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/aliases/{aliasId} |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}/aliases/{aliasId} |
DELETE | mailboxes:write |
/api/v1/verify |
POST | verify:write |
/api/v1/verify/bulk |
POST | verify:write |
/api/v1/verify/bulk/{jobId} |
GET | verify:read |
/api/v1/verify/bulk/{jobId}/download |
GET | verify:read |
/api/v1/verify/credits |
GET | verify:read |
/api/v1/verify/bulk |
GET | verify:read |
/api/v1/verify/bulk/{jobId}/cancel |
POST | verify:write |
/api/v1/verify/bulk/{jobId} |
DELETE | verify:write |
/api/v1/cloudflare/validate-token |
POST | cloudflare:read |
/api/v1/cloudflare/zones |
POST | cloudflare:read |
/api/v1/cloudflare/connect |
POST | cloudflare:write |
/api/v1/cloudflare/preview |
POST | cloudflare:read |
/api/v1/cloudflare/apply |
POST | cloudflare:write |
/api/v1/cloudflare/tokens |
GET | cloudflare:read |
/api/v1/cloudflare/tokens/{id} |
DELETE | cloudflare:delete |
Los endpoints de Cloudflare siguen el mismo flujo que el panel: validar un token, enumerar zonas, conectar dominios, obtener una vista previa de los cambios de DNS y aplicarlos. Tanto /cloudflare/preview como /cloudflare/apply aceptan dos controles opcionales por dominio:
included_records, una lista de permitidos que indica qué registros se pueden modificar, organizada por ID de dominio:{ "123": ["mx_primary", "spf_record"] }. Los registros omitidos se saltan, por lo que puedes aplicar solo MX y SPF y volver más tarde para DKIM. Omite el campo para aplicar todos los registros.confirmed_conflicts, cuando la vista previa marca un registro que ya existe con otro valor, incluye aquí su ID de registro (con la misma forma{ domain_id: [record_ids] }) para autorizar su sustitución.
Los ID de registro (mx_primary, spf_record, dkim_primary, dmarc_main, …) proceden directamente de la respuesta de la vista previa, por lo que un agente típico llama primero a la vista previa y pasa a la aplicación los ID que desea:
POST /api/v1/cloudflare/apply
{
"domain_ids": [123],
"included_records": { "123": ["mx_primary", "spf_record"] },
"confirmed_conflicts": { "123": ["dmarc_main"] }
}
Enrutamiento SMTP por dominio y valor predeterminado de la cuenta
SMTP se configura por dominio. Cada dominio elige una de tres rutas: envío administrado por la plataforma, un perfil SMTP guardado (tu propio proveedor, reutilizable entre dominios) o "sin configurar". Un único valor predeterminado para toda la cuenta decide con qué ruta comienzan los nuevos dominios.
Endpoints por dominio (smtp:read / smtp:write):
| Endpoint | Método | Función |
|---|---|---|
/api/v1/domains/{id}/smtp |
GET | Ruta actual: smtp_mode, effective_smtp_mode, profile, effective_profile |
/api/v1/domains/{id}/smtp |
PUT | Establece la ruta, cuerpo {smtp_mode: platform|profile|not_configured|inherit, smtp_connection_id?, set_account_default?, apply_to_all?} |
/api/v1/domains/{id}/smtp/profiles |
GET | Enumera los perfiles SMTP guardados de la cuenta |
/api/v1/domains/{id}/smtp/profiles/{connectionId}/usage |
GET | Enumera los dominios y las direcciones Send As exactos que usan un perfil (sin credenciales) |
/api/v1/domains/{id}/smtp/profiles |
POST | Crea un perfil y lo usa para este dominio |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
PUT | Actualiza un perfil (afecta a todos los dominios que lo usan) |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
DELETE | Elimina un perfil (los dominios que lo usan se reasignan al valor predeterminado de la cuenta) |
/api/v1/domains/{id}/smtp:test |
POST | Prueba una ruta, devuelve {job_id, poll_url} |
/api/v1/domains/{id}/smtp:test-status/{jobId} |
GET | Consulta una tarea de prueba |
Algunas notas sobre el cuerpo de la ruta:
smtp_mode=platformselecciona el envío administrado;smtp_mode=profilerequieresmtp_connection_id;not_configuredborra la ruta.smtp_mode=inherithace que el dominio siga en tiempo real el valor predeterminado de la cuenta: cuando este cambia, el dominio cambia con él. La interfaz web siempre escribe rutas concretas, pero el backend sigue admitiendoinherit; por esoGETdevuelveeffective_smtp_mode, que muestra a qué se resuelve actualmenteinherit.set_account_default: truees el equivalente en la API al interruptor Make this the account default del panel (los nuevos dominios comienzan con esta ruta).apply_to_all: truees el botón Apply to all domains (un cambio único de todos los dominios a esta ruta).
Endpoints predeterminados para toda la cuenta (smtp:read / smtp:write):
| Endpoint | Método | Función |
|---|---|---|
/api/v1/smtp/default |
GET | Devuelve default_smtp_mode (null hasta que establezcas uno), effective_default_smtp_mode (la base del plan usada cuando no se configura), default_smtp_connection_id y profile |
/api/v1/smtp/default |
PUT | Establece el valor predeterminado, cuerpo {smtp_mode: platform|profile|not_configured, smtp_connection_id?, apply_to_all?} |
Al eliminar un perfil que era el predeterminado de la cuenta, este se restablece al valor base del plan.
Endpoints heredados. Los endpoints GET/PUT /api/v1/smtp a nivel de cuenta (y DELETE /api/v1/smtp/{id}, POST /api/v1/smtp:test, GET /api/v1/smtp:test-status/{jobId}) se mantienen por compatibilidad con versiones anteriores, pero ya no controlan el enrutamiento por dominio: usa los endpoints por dominio y /smtp/default anteriores. Las herramientas MCP heredadas get_smtp_config / update_smtp_config están obsoletas por el mismo motivo.
Branding White Label, clientes y acceso del equipo
El branding se configura por dominio con branding:read / branding:write. Un dominio usa su propia marca (mode=custom), hereda el valor predeterminado de la cuenta (mode=inherit) o está desactivado. Se requiere una prueba activa o un complemento de pago de White Label. Después de la cancelación, el propietario conserva acceso de recuperación de solo lectura durante el período de gracia mostrado. Lee los dns_records del dominio y publica exactamente esas entradas devueltas. No derives nombres de host ni destinos CNAME de un ejemplo.
| Endpoint | Método | Función |
|---|---|---|
/api/v1/domains/{id}/branding |
GET | Lee el branding: mode, white_label_addon_active, brand, hosts, los dns_records que se deben crear, cname_target y mail_zone |
/api/v1/domains/{id}/branding |
PATCH | Actualización por fusión parcial: mode, name, primary_color/accent_color, dashboard_enabled/dashboard_label, webmail_enabled/webmail_label, mail_zone_enabled, support_email, support_url, sender_email, scope |
/api/v1/domains/{id}/branding/logo/{slot} |
PUT | Carga un logotipo base64 (slot = light|dark|favicon; PNG/JPG, ICO para favicon, ≤1 MB, sin SVG). El scope=domain predeterminado requiere el modo custom; un scope=account_default explícito en un dominio inherit requiere un token sin restricciones. |
/api/v1/domains/{id}/branding/logo/{slot} |
DELETE | Elimina una ranura de logotipo. Usa las mismas reglas de ámbito de dominio/valor predeterminado de cuenta; DELETE recibe scope como parámetro de consulta. |
/api/v1/domains/{id}/branding/verify-dns |
POST | Pone en cola la verificación de DNS para los hosts de marca y la zona de correo de la marca |
/api/v1/domains/{id}/branding/preview |
POST | Crea una URL de vista previa de corta duración (422 no_brand si el branding no se ha establecido) |
/api/v1/domains/{id}/branding?scope=domain|all |
DELETE | Borra el branding de este dominio o de toda la cuenta |
PATCH es una fusión parcial, por lo que los campos omitidos se conservan. Si el branding está desactivado, envía mode para volver a activarlo. Un sender_email personalizado debe pertenecer a un dominio con una clave DKIM verificada. mail_zone_enabled ofrece aplicaciones de correo y sincronización DAV bajo el dominio propio de la marca. Pertenece a la marca y no a un solo dominio, por lo que necesita mode=custom o scope=account_default; un dominio inherit devuelve 422 inherited_brand. Lee mail_zone.dns_status, mail_zone.client_hosts_status, mail_zone.records, mail_zone.dav_url y mail_zone.dav_ready para seguir el aprovisionamiento y usar solo una dirección DAV lista. Para ver el flujo completo del agente, consulta la Guía de API y MCP para branding White Label.
La superficie White Label a nivel de cuenta añade 13 rutas bajo /api/v1/white-label: estado y progreso de configuración, un catálogo de acceso activo, listado de miembros y acciones de ciclo de vida, actividad de la cuenta e historial de acciones e inicios de sesión por miembro. Usa members:read, members:write y activity:read. El acceso siempre es la intersección entre la titularidad de la cuenta, la membresía actual de la persona, la concesión de credenciales y cualquier restricción de dominio. Consulta Administrar equipos White Label con API y MCP para ver la tabla de rutas y las transiciones de estado.
La especificación OpenAPI está disponible en /api/openapi.json para importarla en Postman, Insomnia o generadores de código.
Soluciones rápidas
- 401 "unauthenticated": comprueba que el encabezado
Authorization: Bearer <token>esté presente y que el token no haya sido revocado ni haya caducado. - 403 "plan_api_disabled": el ámbito solicitado no está incluido en tu plan. Nano incluye Email Verifier (y Drive si compraste el complemento Drive Storage). Mejora a Starter o superior para usar el resto de la API.
- 403 "token_scope_blocked_by_plan": tu token tiene ámbitos no disponibles en tu plan actual. Revoca el token y crea uno nuevo con ámbitos permitidos.
- 403 "scope_blocked_by_entitlement": una concesión de White Label guardada no está disponible porque el complemento está inactivo o la operación es una escritura durante el período de gracia. Reactiva White Label y vuelve a emitir o autorizar las credenciales.
- 403 "scope_blocked_by_membership": el rol actual del miembro es más limitado que la acción solicitada. Pide al propietario que lo cambie; volver a autorizar no puede ampliar la membresía por sí solo.
- 422 "missing_idempotency_key": añade un encabezado
Idempotency-Keya la operación de escritura indicada en la referencia del endpoint. - 403 "mailbox_sending_paused": se detuvo el envío desde ese buzón porque su correo saliente dejó de parecer propio de su titular, normalmente porque una contraseña cayó en manos equivocadas. La lectura, el listado y todos los demás endpoints siguen funcionando; solo se rechaza el envío y volver a intentarlo no soluciona el bloqueo. Es necesario cambiar la contraseña del buzón y luego el equipo de soporte volverá a activar el envío. Consulta ¿Por qué no puedo enviar correos electrónicos?.
- 429 límite de velocidad: espera el tiempo indicado en el encabezado
Retry-Afterantes de volver a intentarlo.
Envío de correo: cuerpo, encabezados y entregabilidad
POST /api/v1/messages/send recibe una solicitud con la forma {to, subject, body: {text, html}, attachments, reply_to_message_id, headers}.
body.textybody.htmlson opcionales, pero se requiere al menos uno. Si proporcionas solobody.text, generamos automáticamente una alternativa HTML usando párrafos<p>(las líneas en blanco separan párrafos; los saltos de línea individuales se convierten en<br>), para que el mensaje se muestre como un correo normal en todos los clientes modernos. Si necesitas texto monoespaciado, envía el literal<pre>...</pre>enbody.html.headerses un objeto opcional de encabezados salientes proporcionados por el usuario. La lista permitida esList-Unsubscribe,List-Unsubscribe-Post,Reply-Toy cualquier encabezado de seguimiento personalizadoX-*. Los demás nombres (From,Subject,Message-Id,Authentication-Results, etc.) son administrados por la plataforma y se rechazan con422. También se rechazan los valores que contienen CR/LF para evitar la inyección de encabezados. Los valores tienen un máximo de 998 caracteres según RFC 2822.- Para casos de envío masivo o automatización, consulta la sección Encabezados de entregabilidad para remitentes masivos para configurar
List-Unsubscribey el interruptorauto_list_unsubscribede toda la cuenta.
Artículos relacionados
Ve a guías cercanas que continúan el flujo de trabajo.