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
- 24 de oct. de 2026
Abre TrekMail en Claude, elige Connect, inicia sesión y autoriza el acceso. No necesitas crear un token de API. Revisa los permisos o desconecta la aplicación en Agentes de IA y API, Tokens, Aplicaciones conectadas.
Tu propia marca White Label: usa la dirección MCP de tu panel de marca y pon al conector el nombre de tu marca. Añádelo como custom connector; la página pública de TrekMail inicia sesión en TrekMail y no sustituye la conexión de tu marca.
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.
Leer correo con una sola clave
En Pro y Agency, elige Leer correo al crear una clave API. El permiso explícito es mailboxes:messages:read; mailboxes:read solo muestra direcciones y datos de configuración. Elige todos los buzones para incluir los actuales y futuros, o limita el acceso a dominios y buzones concretos. Las claves existentes no reciben permisos nuevos automáticamente.
Usa la clave de cuenta con las rutas GET de abajo. Enviar, eliminar o cambiar datos sigue requiriendo credenciales y permisos de mensajes separados. El MCP alojado acepta OAuth, no tm_live_ ni tm_msg_. El error de tipo de token indica al agente la ruta o autorización correcta.
GET /api/v1/mailboxes/{mailbox}/messages
GET /api/v1/mailboxes/{mailbox}/folders
GET /api/v1/mailboxes/{mailbox}/messages/{uid}
GET /api/v1/mailboxes/{mailbox}/messages/{uid}/raw
GET /api/v1/mailboxes/{mailbox}/messages/{uid}/attachments/{index}
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 Agentes de IA y API, Registro de auditoría.
- 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.
- Contraseñas de aplicación: administra contraseñas independientes para IMAP, SMTP, calendarios y contactos, y elige qué contraseñas aceptan las apps de correo. No sustituyen los tokens Bearer de la API ni los tokens de la API de mensajes. Consulta Contraseñas de aplicación por API y MCP.
- 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 Agentes de IA y API, Tokens, Crear token y envíalo comoAuthorization: Bearer …. Consulta Crear y administrar tokens de API. - ¿Es tu primera vez con la API? Haz clic en Iniciar recorrido en la parte superior de la página Agentes de IA y 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 Agentes de IA y API, en Referencia rápida. 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. Los envíos de mensajes son la excepción cuando su entrega falló (por un límite de envío, por ejemplo): la API ya no reproduce el 202 anterior, así que puedes volver a enviar el mismo mensaje más tarde con el mismo contenido. Si envías tu propio X-Request-Id, usa uno nuevo para ese intento: la API también trata como repetido un envío del mismo buzón con el mismo X-Request-Id, así que con el anterior solo recibirás la entrega original fallida y no se enviará nada. Un reintento de un envío que sigue pendiente o que ya se entregó recibe la respuesta original.
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 comprueban cada elemento con asignación propia frente a lo que queda en el momento de crearlo: se crean los que caben, y los que ya no caben fallan uno a uno con el motivo storage_pool_exceeded (207 éxito parcial, o 422 si fallan todos). En un dominio con un límite de almacenamiento de cliente de White Label, un tamaño fijo también debe caber en lo que le queda a ese límite: una creación o invitación individual devuelve 422 client_storage_limit_exceeded con limit_mb, allocated_mb, available_mb y requested_mb en details (una clave restringida a algunos dominios solo recibe available_mb y requested_mb cuando el límite también cubre un dominio fuera de su alcance), y un elemento masivo falla con el motivo client_storage_limit_exceeded. 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.
Para cambiar un buzón existente, envía PATCH /api/v1/mailboxes/{id}/storage con storage_allocation_mb en un tamaño fijo en MB, o en null para almacenamiento compartido. Requiere mailboxes:write y un Idempotency-Key, funciona con buzones activos y pausados, y hace las mismas comprobaciones que Editar almacenamiento en el panel: storage_pool_exceeded cuando el espacio libre de la cuenta no alcanza y, en un dominio con límite de almacenamiento de cliente, client_storage_limit_exceeded, o client_storage_below_usage cuando el nuevo tamaño es menor que lo que el buzón ya almacena. El almacenamiento compartido nunca se rechaza por su tamaño. Un buzón en Eliminados recientemente o en proceso de eliminación devuelve 422 mailbox_unavailable. La herramienta MCP es set_mailbox_storage.
Los límites de almacenamiento de cliente de White Label están bajo /api/v1/white-label/client-limits; consulta Gestionar equipos White Label con API y MCP. Una clave restringida a algunos dominios solo ve su parte de la cuenta en GET /api/v1/account: usage cuenta solo sus dominios y buzones, limits.max_storage_mb es el límite del cliente cuando todos sus dominios comparten uno que no cubre ningún otro dominio, y client_limit contiene ese límite (id, storage_limit_mb, allocated_mb, used_bytes) o null. Los demás reciben la respuesta sin cambios.
Los buzones normales nuevos, incluidos los creados en bloque, mediante invitaciones o agentes de IA, siguen Configuración de la cuenta > Buzones nuevos > Las apps de correo necesitan contraseñas de aplicación, activado por defecto. Cambiarlo no modifica los buzones existentes. POST /api/v1/mailboxes permite elegir un client_auth_mode de app_password_only o password_or_app_password; si se omite, se aplica el ajuste de la cuenta. Los recursos de listado y detalle de buzones incluyen client_auth_mode y app_passwords_count (contraseñas de aplicación activas). Los buzones compartidos no tienen contraseñas de aplicación ni modo de inicio de sesión propios.
Las seis herramientas MCP para administrar contraseñas de aplicación son list_mailbox_app_passwords, create_mailbox_app_password, rotate_mailbox_app_password, revoke_mailbox_app_password, set_mailbox_client_auth_mode, update_account. update_account: Define new_mailbox_client_auth_mode para los buzones futuros; los existentes conservan su modo. Requiere mailboxes:write, un token o conector del propietario sin restricciones de recursos y TREKMAIL_ALLOW_DESTRUCTIVE=true en stdio autoalojado.
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.
La suspensión revoca permanentemente todas las contraseñas de aplicación. Restaurar el inicio de sesión no las recupera. También se revocan cuando un administrador define una nueva contraseña del buzón en el panel, por API o mediante un agente de IA, al recuperar la contraseña, convertir el buzón en compartido o moverlo a Eliminados recientemente. Restaurar un buzón eliminado no las recupera.
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 tiene su propia bandeja de equipo. can_read es Leer y can_send es Enviar como. Abrir carpetas compartidas requiere Leer. Enviar desde el buzón compartido con la Message API requiere ambos. No hay contraseña común, inicio de sesión separado ni roles de miembro.
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, access (read_send, read_only, send_only)) |
/api/v1/mailboxes/{id}/members |
POST | mailboxes:write |
Añadir un miembro, cuerpo {member_mailbox_id, can_read?, can_send?}. Ambos permisos son true por defecto. |
/api/v1/mailboxes/{id}/members/{member} |
PATCH | mailboxes:write |
Cambiar acceso; {can_read?, can_send?, custom_label?}. Leer solo se puede desactivar cuando el acceso de solo envío está disponible. |
/api/v1/mailboxes/{id}/members/{member} |
DELETE | mailboxes:write |
Retirar un miembro; al menos una persona debe mantener Leer. |
/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) |
Al volver a un buzón normal se quitan todos los miembros. Establece una nueva contraseña de webmail y crea contraseñas de aplicación para las apps de correo en la pestaña Seguridad.
Los cambios pueden devolver 422 no_access_left si ambos permisos quedarían desactivados, 422 send_only_disabled si el cambio solicitado del permiso Leer no está disponible, o 422 last_reader si la última persona activa que lee perdería acceso. Usa Quitar para quitar todo el acceso y da el permiso Leer a otro miembro activo antes de eliminar al último lector. Cada uno de estos errores devuelve también shared_mailbox_id, member_id si el miembro ya existe y un hint que indica la solicitud que lo resuelve.
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 Enviar como, las rutas exactas de Inbox/Sent/Archive/Junk y las operaciones permitidas. can_send es el permiso Enviar como 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.
shared_mailboxes.items[] solo incluye miembros con el permiso Leer cuando el acceso nativo a carpetas está habilitado. delegated_send_addresses es una lista aparte de direcciones del equipo disponibles en el campo De con id, email y display_name; puede estar vacía. No da acceso a carpetas ni comprueba que se pueda enviar. Estas direcciones no son identidades de la Message API. Usa los servidores devueltos, también en White Label, en vez de copiar el servidor de la plataforma.
Al eliminar un miembro, cambiar can_read / 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/{id}/storage |
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/message-tokens/{id} |
PATCH | 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/deliveries/{requestId} |
GET | messages:read (token de mensajes) |
/api/v1/messages/sending-limits |
GET | messages:read (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/account |
PATCH | mailboxes:write (solo el propietario, token sin restricciones de recursos; MCP: update_account) |
/api/v1/sending-limits |
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}/app-passwords |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/app-passwords |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/app-passwords/{appPasswordId}:rotate |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/app-passwords/{appPasswordId} |
DELETE | mailboxes:write |
/api/v1/mailboxes/{id}:client-auth-mode |
POST | mailboxes:write |
/api/v1/mailboxes:client-auth-mode |
POST | 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 (+ domains:create para crear dominios nuevos) |
/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?} |
/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 Enviar como 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.- Esta ruta cambia solo su propio dominio. Para convertir una ruta en el valor predeterminado de la cuenta (Convertir en predeterminado de la cuenta en el panel), usa
PUT /api/v1/smtp/defaultmás abajo; añadeapply_to_all: truepara cambiar también todos los dominios a ella (Aplicar a todos los dominios).
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.
Una clave limitada a algunos dominios o buzones recibe 403 token_resource_constrained de PUT /api/v1/smtp/default, de los antiguos PUT y DELETE /api/v1/smtp y al eliminar un perfil guardado, porque cada una de estas acciones cambia la ruta de dominios a los que quizá no tenga acceso. Una clave limitada a algunos dominios recibe la misma respuesta al editar un perfil que también usa un dominio fuera de su lista.
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 18 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, límites de almacenamiento de los clientes, 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 Gestionar 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?.
- 403 "account_sending_on_hold": el envío desde toda la cuenta queda retenido mientras TrekMail la revisa. La recepción y todos los demás endpoints siguen funcionando; volver a intentarlo no soluciona la retención. Contacta con el equipo de soporte para que la revise.
- 403 "mailbox_send_disabled": el envío está desactivado solo para este buzón. La lectura y todos los demás endpoints siguen funcionando; volver a intentarlo no lo soluciona. Lo habitual es que el buzón quede fuera de tu plan: su dominio supera el número de dominios que incluye el plan, o el buzón supera los buzones por dominio del plan (los dominios y buzones más antiguos siguen enviando). Ocurre después de cambiar a un plan más pequeño. También puede ser un buzón creado antes de que su dominio terminara la configuración. Mejorar el plan reactiva el envío al instante; después de eliminar los dominios o buzones sobrantes, o en cuanto el dominio termina la configuración, vuelve en un día. Si nada de esto aplica, contacta con el equipo de soporte.
- 403 "account_email_unverified": el envío está bloqueado hasta que el propietario de la cuenta verifique su correo de inicio de sesión. Las cuentas registradas a partir del 19 de febrero de 2026 tienen 7 días para hacerlo, y los mismos 7 días vuelven a empezar al sustituir un correo de inicio de sesión verificado por uno nuevo. La lectura y todos los demás endpoints siguen funcionando; volver a intentarlo no lo soluciona. Abre el enlace del correo de verificación o haz clic en Reenviar correo de verificación en la franja del panel; el envío vuelve a funcionar en cuanto se verifica la dirección. 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. Al alcanzar el límite diario de la API por buzón, la respuesta también esrate_limited, pero conretryableenfalse,dimensionenapi_mailbox_dailyy una hora enresets_at: volver a intentarlo antes no funcionará, así que espera hasta esa hora. - 429 "sending_limit_exceeded": se agotó uno de tus límites de envío.
dimensionindica cuál yresets_at, cuándo se renueva. Reintentar antes de esa hora no puede funcionar, por esoretryableesfalse.GET /api/v1/messages/sending-limitsindica enremaining_todaya cuántos destinatarios más puede enviar hoy el buzón. Cuando el límite más bajo es el total diario de la cuenta,limit_todayesnullyremaining_todaytambién lo es hasta que ese total se agota (entonces vale0); un token de operaciones consulta el total conGET /api/v1/sending-limits. Sidimensionesrecipients_per_message, divide el mensaje en varios más pequeños. En las primeras 24 horas después del primer pago de la cuenta, entre las causas estánew_payer, yGET /api/v1/sending-limitsindica enfull_limits_atel momento en que se aplican los límites completos del plan. Consulta Límites de envío por plan.
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.
Una respuesta 202 significa que el mensaje se aceptó, pero todavía no se envió. Los límites de envío se vuelven a comprobar cuando el mensaje sale de la cola, así que verifica el resultado con GET /api/v1/messages/deliveries/{request_id}, usando el request_id de la respuesta 202. Puede consultarlo cualquier token de mensajes del mismo buzón, no solo el que envió el mensaje; un request_id desconocido devuelve 404. Si un límite lo detuvo, status es failed y failure indica el límite (dimension) y cuándo se renueva (resets_at). Un mensaje cuyo envío falló puede enviarse de nuevo más tarde con el mismo contenido. Si envías tu propio X-Request-Id, usa uno nuevo, porque el anterior solo devuelve la entrega original. Un mensaje programado que alcanza un límite al llegar su hora queda retenido como limit_reached y se conserva durante 7 días: puedes listar estos mensajes con GET /api/v1/messages/scheduled?status=limit_reached, enviar uno más tarde asignándole un nuevo scheduled_for con PATCH /api/v1/messages/scheduled/{id} o eliminarlo con DELETE.
Artículos relacionados
Ve a guías cercanas que continúan el flujo de trabajo.