Administración de Equipo
Invite miembros del equipo, asigne roles y administre permisos dentro de su espacio de trabajo
Colabore con su equipo invitando miembros a su espacio de trabajo. A cada miembro se le asigna un rol que determina sus permisos.
Roles
| Rol | Valor | Descripción |
|---|---|---|
Owner | 0 | Acceso completo, facturación, puede transferir la propiedad |
Admin | 1 | Acceso completo excepto facturación y transferencia de propiedad |
Member | 2 | Enviar correos, administrar dominios, ver análisis |
Viewer | 3 | Acceso de solo lectura a todos los recursos |
Permisos por rol
Member no es de solo lectura ni está excluido de la gestión de claves: puede crear y editar casi todo. Solo eliminar claves API, dominios y webhooks, además de la administración del equipo y la propiedad, es exclusivo de Admin.
| Permiso | Owner | Admin | Member | Viewer |
|---|---|---|---|---|
| Enviar correos | Sí | Sí | Sí | No |
| Administrar dominios | Sí | Sí | Sí | No |
| Administrar suscriptores | Sí | Sí | Sí | No |
| Ver análisis | Sí | Sí | Sí | Sí |
| Crear/rotar claves API | Sí | Sí | Sí | No |
| Eliminar claves API / dominios / webhooks | Sí | Sí | No | No |
| Crear/editar webhooks | Sí | Sí | Sí | No |
| Editar configuración (incl. seguimiento) | Sí | Sí | Sí | No |
| Invitar miembros | Sí | Sí | No | No |
| Eliminar miembros | Sí | Sí | No | No |
| Actualizar roles | Sí | Sí | No | No |
| Administrar facturación | Sí | No | No | No |
| Transferir propiedad | Sí | No | No | No |
| Eliminar espacio de trabajo | Sí | No | No | No |
Resumen del equipo
Obtenga los miembros actuales del equipo y las invitaciones pendientes:
GET https://api.mail.land/v1/account/teamcurl https://api.mail.land/v1/account/team \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"members": [
{
"publicId": "mbr_a1b2c3d4e5",
"email": "[email protected]",
"fullName": "John Doe",
"role": "owner",
"status": "active",
"joinedAt": "2026-01-15T08:00:00Z",
"invitedByEmail": null,
"isCurrentUser": true
},
{
"publicId": "mbr_f6g7h8i9j0",
"email": "[email protected]",
"fullName": "Jane Smith",
"role": "admin",
"status": "active",
"joinedAt": "2026-01-20T10:00:00Z",
"invitedByEmail": "[email protected]",
"isCurrentUser": false
}
],
"pendingInvitations": [
{
"publicId": "inv_k1l2m3n4o5",
"email": "[email protected]",
"role": "member",
"status": "pending",
"createdAt": "2026-02-17T08:00:00Z",
"expiresAt": "2026-02-24T08:00:00Z",
"invitedByEmail": "[email protected]",
"invitedByName": "John Doe",
"isExpired": false
}
],
"totalMembers": 2,
"totalPendingInvitations": 1,
"maxMembers": 10
}No hay id, userId, firstName/lastName, roleName/statusName, invitedBy, memberCount ni invitationCount en esta respuesta: use los nombres de campo anteriores. maxMembers refleja el plan del workspace: 10 en Free y Pro, ilimitado en Max. Un cupo es un miembro activo (incluido el owner) o una invitación pendiente sin expirar; los miembros suspendidos y las invitaciones expiradas, revocadas o aceptadas no cuentan. Al llegar al límite, invitar, aceptar, reactivar o el primer inicio de sesión por SSO devuelven 400 PLAN_LIMIT_REACHED. Bajar de plan nunca elimina ni suspende a nadie: solo bloquea nuevas incorporaciones mientras el workspace supere el nuevo límite.
Estados de los miembros
| Estado | Descripción |
|---|---|
active | Miembro activo del equipo |
suspended | Suspendido por un administrador |
Estados de las invitaciones
Se devuelven como cadenas en minúsculas:
| Estado | Descripción |
|---|---|
pending | Esperando aceptación |
accepted | Invitación aceptada |
expired | Invitación expirada (7 días) |
revoked | Invitación revocada (no "cancelled") |
Invitar a un miembro del equipo
POST https://api.mail.land/v1/account/team/invite{
"email": "[email protected]",
"role": 2
}| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Dirección de correo electrónico a invitar |
role | int | Sí | Rol a asignar (1–3, no se puede invitar como Owner) |
curl -X POST https://api.mail.land/v1/account/team/invite \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]", "role": 2 }'El usuario invitado recibe un correo electrónico con un enlace para aceptar la invitación. Las invitaciones expiran después de 7 días.
Aceptar una invitación
Existe una única ruta pública para aceptar una invitación: no está versionada (/v1 no forma parte de la ruta) y se identifica por el token de invitación, no por un id:
POST https://api.mail.land/invitations/{token}/acceptPara un usuario existente de MailLand, inicie sesión primero con el correo invitado y luego llame a esta ruta con un cuerpo vacío o mínimo, no se necesitan firstName/lastName/password. Para un usuario completamente nuevo, envíe fullName y password en la misma llamada para crear la cuenta y aceptar en un solo paso.
{
"fullName": "New Member",
"password": "SecureP@ssw0rd!"
}curl -X POST https://api.mail.land/invitations/invitation-token-from-email/accept \
-H "Content-Type: application/json" \
-d '{"fullName": "New Member", "password": "SecureP@ssw0rd!"}'No existe POST /v1/account/team/invitations/{id}/accept, ni una ruta /accept-public separada, ni GET /v1/team/invitations/{id}?token=. Tanto la aceptación de "usuario existente" como la de "usuario nuevo" pasan por este único endpoint público /invitations/{token}/accept (Controllers/Public/InvitationsController.cs).
Obtener información de la invitación
Recupere los detalles de la invitación antes de aceptarla (público, sin autenticación, identificado por el token, no /v1):
GET https://api.mail.land/invitations/{token}curl "https://api.mail.land/invitations/invitation-token-from-email"{
"tenantName": "My Company",
"role": "member",
"invitedByName": "John Doe",
"expiresAt": "2026-02-24T08:00:00Z",
"isExpired": false,
"alreadyAccepted": false,
"existingUserEmail": "[email protected]"
}Administrar invitaciones
Cancelar una invitación
DELETE https://api.mail.land/v1/account/team/invitations/{id}curl -X DELETE https://api.mail.land/v1/account/team/invitations/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Devuelve 204 No Content cuando tiene éxito.
Reenviar una invitación
POST https://api.mail.land/v1/account/team/invitations/{id}/resendcurl -X POST https://api.mail.land/v1/account/team/invitations/{id}/resend \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Reenviar una invitación restablece el período de expiración de 7 días.
Actualizar el rol de un miembro
PATCH https://api.mail.land/v1/account/team/members/{id}/role{
"role": 1
}curl -X PATCH https://api.mail.land/v1/account/team/members/{id}/role \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "role": 1 }'Solo los Owners y Admins pueden actualizar roles. No puede cambiar su propio rol ni promover a alguien a Owner (utilice la transferencia de propiedad en su lugar).
Los Admins solo pueden gestionar roles de Member/Viewer: no pueden ascender a un miembro a Admin ni cambiar el rol de otro Admin. Solo el Owner puede hacerlo.
Suspender y reactivar
Suspender temporalmente el acceso de un miembro:
POST https://api.mail.land/v1/account/team/members/{id}/suspendUn cuerpo { reason?, credentialDecision?, transferToMemberId? } controla qué sucede con las claves API de ese miembro mientras está suspendido. credentialDecision es obligatorio solo cuando el miembro posee al menos una clave API activa: omitirlo en ese caso devuelve 400 CREDENTIAL_DECISION_REQUIRED, con las claves expuestas listadas en details. En caso contrario, se puede omitir todo el cuerpo.
| Campo | Valores |
|---|---|
reason | offboarding, compromise, abuse, other |
credentialDecision | revoke, keep, transfer |
transferToMemberId | Obligatorio cuando credentialDecision es transfer |
curl -X POST https://api.mail.land/v1/account/team/members/{id}/suspend \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Restaurar un miembro suspendido:
POST https://api.mail.land/v1/account/team/members/{id}/reactivatecurl -X POST https://api.mail.land/v1/account/team/members/{id}/reactivate \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Los miembros suspendidos no pueden iniciar sesión en el espacio de trabajo; sus claves API siguen la decisión de credenciales tomada al suspenderlos: con keep, las claves del miembro siguen funcionando.
Eliminar un miembro
DELETE https://api.mail.land/v1/account/team/members/{id}La eliminación acepta la misma decisión de credenciales, como parámetros de consulta:
DELETE https://api.mail.land/v1/account/team/members/{id}?reason=offboarding&credentialDecision=revoke&transferToMemberId=mbr_f6g7h8i9j0Al igual que con la suspensión, credentialDecision es obligatorio cuando el miembro posee una clave API activa; de lo contrario, la llamada devuelve 400 CREDENTIAL_DECISION_REQUIRED.
curl -X DELETE https://api.mail.land/v1/account/team/members/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."El miembro es eliminado del espacio de trabajo y pierde inmediatamente el acceso a todos sus recursos.
Transferir propiedad
Transferir la propiedad del espacio de trabajo a otro miembro:
POST https://api.mail.land/v1/account/team/transfer-ownership{
"newOwnerMemberId": "mbr_f6g7h8i9j0"
}curl -X POST https://api.mail.land/v1/account/team/transfer-ownership \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "newOwnerMemberId": "mbr_f6g7h8i9j0" }'La transferencia de propiedad es irreversible. El propietario actual es degradado a Admin y el miembro seleccionado se convierte en el nuevo Owner.
El objetivo debe ser un Admin activo (no un Member ni un Viewer).
Respuestas de error
| Estado | Código | Descripción |
|---|---|---|
400 | VALIDATION_FAILED | Correo o rol inválido |
400 | INVALID_REQUEST | Más de 50 invitaciones pendientes para este espacio de trabajo |
400 | CREDENTIAL_DECISION_REQUIRED | El objetivo de suspensión/eliminación posee claves API activas y no se envió credentialDecision |
400 | CREDENTIAL_TRANSFER_TARGET_INVALID | credentialDecision: transfer con transferToMemberId ausente o inválido |
403 | FORBIDDEN | Permisos insuficientes para esta acción |
404 | RESOURCE_NOT_FOUND | Miembro o invitación no encontrados |
400 | PLAN_LIMIT_REACHED | El workspace alcanzó el límite de cupos de su plan (invitar, aceptar, reactivar o primer inicio de sesión por SSO) |
409 | CONFLICT | El usuario ya es miembro, o ya tiene una invitación pendiente |
No existe el código MEMBER_ALREADY_EXISTS: tanto "ya es miembro" como "la invitación ya existe" devuelven 409 CONFLICT.
POST /v1/account/team/leave (abandonar el espacio de trabajo usted mismo) y GET /v1/account/team/me (su propio registro de membresía) también existen y no están documentados en otra parte de esta página.
Próximos pasos
- Espacios de trabajo: administrar la configuración del espacio de trabajo
- Autenticación: autenticación y sesiones
- Facturación: gestión de suscripciones y pagos