MailLandDocs
Cuenta

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

RolValorDescripción
Owner0Acceso completo, facturación, puede transferir la propiedad
Admin1Acceso completo excepto facturación y transferencia de propiedad
Member2Enviar correos, administrar dominios, ver análisis
Viewer3Acceso 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.

PermisoOwnerAdminMemberViewer
Enviar correosSíSíSíNo
Administrar dominiosSíSíSíNo
Administrar suscriptoresSíSíSíNo
Ver análisisSíSíSíSí
Crear/rotar claves APISíSíSíNo
Eliminar claves API / dominios / webhooksSíSíNoNo
Crear/editar webhooksSíSíSíNo
Editar configuración (incl. seguimiento)SíSíSíNo
Invitar miembrosSíSíNoNo
Eliminar miembrosSíSíNoNo
Actualizar rolesSíSíNoNo
Administrar facturaciónSíNoNoNo
Transferir propiedadSíNoNoNo
Eliminar espacio de trabajoSíNoNoNo

Resumen del equipo

Obtenga los miembros actuales del equipo y las invitaciones pendientes:

GET https://api.mail.land/v1/account/team
List team members
curl https://api.mail.land/v1/account/team \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Team overview response
{
  "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

EstadoDescripción
activeMiembro activo del equipo
suspendedSuspendido por un administrador

Estados de las invitaciones

Se devuelven como cadenas en minúsculas:

EstadoDescripción
pendingEsperando aceptación
acceptedInvitación aceptada
expiredInvitación expirada (7 días)
revokedInvitación revocada (no "cancelled")

Invitar a un miembro del equipo

POST https://api.mail.land/v1/account/team/invite
Invite request
{
  "email": "[email protected]",
  "role": 2
}
CampoTipoRequeridoDescripción
emailstringSíDirección de correo electrónico a invitar
roleintSíRol a asignar (1–3, no se puede invitar como Owner)
Invite a team member
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}/accept

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

Solicitud de aceptación de invitación (usuario nuevo)
{
  "fullName": "New Member",
  "password": "SecureP@ssw0rd!"
}
Aceptar una invitación
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}
Obtener información de la invitación
curl "https://api.mail.land/invitations/invitation-token-from-email"
Invitation info response
{
  "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}
Cancel an invitation
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}/resend
Resend an invitation
curl -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
Update role request
{
  "role": 1
}
Update member role
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}/suspend

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

CampoValores
reasonoffboarding, compromise, abuse, other
credentialDecisionrevoke, keep, transfer
transferToMemberIdObligatorio cuando credentialDecision es transfer
Suspend a member
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}/reactivate
Unsuspend a member
curl -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_f6g7h8i9j0

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

Remove a member
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
Transfer ownership request
{
  "newOwnerMemberId": "mbr_f6g7h8i9j0"
}
Transfer ownership
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

EstadoCódigoDescripción
400VALIDATION_FAILEDCorreo o rol inválido
400INVALID_REQUESTMás de 50 invitaciones pendientes para este espacio de trabajo
400CREDENTIAL_DECISION_REQUIREDEl objetivo de suspensión/eliminación posee claves API activas y no se envió credentialDecision
400CREDENTIAL_TRANSFER_TARGET_INVALIDcredentialDecision: transfer con transferToMemberId ausente o inválido
403FORBIDDENPermisos insuficientes para esta acción
404RESOURCE_NOT_FOUNDMiembro o invitación no encontrados
400PLAN_LIMIT_REACHEDEl workspace alcanzó el límite de cupos de su plan (invitar, aceptar, reactivar o primer inicio de sesión por SSO)
409CONFLICTEl 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

En esta página