MailLandDocs
Compte

Gestion d'équipe

Invitez des membres d'équipe, attribuez des rôles et gérez les permissions au sein de votre espace de travail

Collaborez avec votre équipe en invitant des membres dans votre espace de travail. Chaque membre se voit attribuer un rôle qui détermine ses permissions.

Rôles

RôleValeurDescription
Owner0Accès complet, facturation, possibilité de transférer la propriété
Admin1Accès complet sauf la facturation et le transfert de propriété
Member2Envoi d'e-mails, gestion des domaines, consultation des analyses
Viewer3Accès en lecture seule à toutes les ressources

Permissions des rôles

Member n'est pas en lecture seule et n'est pas exclu de la gestion des clés : il peut créer et modifier presque tout. Seule la suppression des clés API, des domaines et des webhooks, ainsi que l'administration de l'équipe et de la propriété, est réservée à Admin.

PermissionOwnerAdminMemberViewer
Envoyer des e-mailsOuiOuiOuiNon
Gérer les domainesOuiOuiOuiNon
Gérer les abonnésOuiOuiOuiNon
Consulter les analysesOuiOuiOuiOui
Créer/faire tourner les clés APIOuiOuiOuiNon
Supprimer les clés API / domaines / webhooksOuiOuiNonNon
Créer/modifier les webhooksOuiOuiOuiNon
Modifier les paramètres (y compris le suivi)OuiOuiOuiNon
Inviter des membresOuiOuiNonNon
Retirer des membresOuiOuiNonNon
Mettre à jour les rôlesOuiOuiNonNon
Gérer la facturationOuiNonNonNon
Transférer la propriétéOuiNonNonNon
Supprimer l'espace de travailOuiNonNonNon

Vue d'ensemble de l'équipe

Obtenez les membres actuels de l'équipe et les invitations en attente :

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
}

Il n'y a pas de id, userId, firstName/lastName, roleName/statusName, invitedBy, memberCount ni invitationCount dans cette réponse : utilisez plutôt les noms de champs ci-dessus. maxMembers reflète le plan du workspace : 10 en Free et Pro, illimité en Max. Une place est un membre actif (le owner inclus) ou une invitation en attente non expirée ; les membres suspendus ainsi que les invitations expirées, révoquées ou acceptées ne comptent pas. À la limite, inviter, accepter, réactiver ou une première connexion SSO renvoient tous 400 PLAN_LIMIT_REACHED. Rétrograder un plan ne retire ni ne suspend jamais personne : cela bloque seulement les nouvelles admissions tant que le workspace dépasse sa nouvelle limite.

Statuts des membres

StatutDescription
activeMembre actif de l'équipe
suspendedSuspendu par un administrateur

Statuts des invitations

Renvoyés sous forme de chaînes en minuscules :

StatutDescription
pendingEn attente d'acceptation
acceptedInvitation acceptée
expiredInvitation expirée (7 jours)
revokedInvitation révoquée (pas "cancelled")

Inviter un membre de l'équipe

POST https://api.mail.land/v1/account/team/invite
Invite request
{
  "email": "[email protected]",
  "role": 2
}
ChampTypeRequisDescription
emailstringOuiAdresse e-mail à inviter
roleintOuiRôle à attribuer (1–3, impossible d'inviter en tant que 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 }'

L'utilisateur invité reçoit un e-mail contenant un lien pour accepter l'invitation. Les invitations expirent après 7 jours.

Accepter une invitation

Il existe une unique route publique pour accepter une invitation : elle n'est pas versionnée (/v1 ne fait pas partie du chemin) et est identifiée par le token d'invitation, pas par un id :

POST https://api.mail.land/invitations/{token}/accept

Pour un utilisateur MailLand existant, connectez-vous d'abord avec l'e-mail invité, puis appelez cette route avec un corps vide ou minimal, firstName/lastName/password ne sont pas nécessaires. Pour un tout nouvel utilisateur, fournissez fullName et password dans le même appel pour créer le compte et accepter en une seule étape.

Requête d'acceptation d'invitation (nouvel utilisateur)
{
  "fullName": "New Member",
  "password": "SecureP@ssw0rd!"
}
Accepter une invitation
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!"}'

Il n'existe pas de POST /v1/account/team/invitations/{id}/accept, pas de route /accept-public séparée, et pas de GET /v1/team/invitations/{id}?token=. L'acceptation "utilisateur existant" comme "nouvel utilisateur" passe par ce seul endpoint public /invitations/{token}/accept (Controllers/Public/InvitationsController.cs).

Obtenir les informations de l'invitation

Récupérez les détails de l'invitation avant de l'accepter (public, sans authentification, identifié par le token, pas /v1) :

GET https://api.mail.land/invitations/{token}
Obtenir les informations de l'invitation
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]"
}

Gérer les invitations

Annuler une invitation

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

Renvoie 204 No Content en cas de succès.

Renvoyer une invitation

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

Le renvoi d'une invitation réinitialise le délai d'expiration de 7 jours.

Mettre à jour le rôle d'un membre

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 }'

Seuls les Owners et les Admins peuvent mettre à jour les rôles. Vous ne pouvez pas modifier votre propre rôle ni promouvoir quelqu'un au rang de Owner (utilisez le transfert de propriété à la place).

Les Admins ne peuvent gérer que les rôles Member/Viewer : ils ne peuvent pas promouvoir un membre en Admin ni modifier le rôle d'un autre Admin. Seul l'Owner peut le faire.

Suspendre et réactiver

Suspendre temporairement l'accès d'un membre :

POST https://api.mail.land/v1/account/team/members/{id}/suspend

Un corps { reason?, credentialDecision?, transferToMemberId? } contrôle ce qui arrive aux clés API de ce membre pendant la suspension. credentialDecision n'est obligatoire que lorsque le membre possède au moins une clé API active : l'omettre dans ce cas renvoie 400 CREDENTIAL_DECISION_REQUIRED, avec les clés exposées listées dans details. Sinon, tout le corps peut être omis.

ChampValeurs
reasonoffboarding, compromise, abuse, other
credentialDecisionrevoke, keep, transfer
transferToMemberIdObligatoire lorsque credentialDecision vaut transfer
Suspend a member
curl -X POST https://api.mail.land/v1/account/team/members/{id}/suspend \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Réactiver un membre suspendu :

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

Les membres suspendus ne peuvent plus se connecter à l'espace de travail ; leurs clés API suivent la décision de credential prise lors de la suspension : avec keep, les clés du membre continuent de fonctionner.

Retirer un membre

DELETE https://api.mail.land/v1/account/team/members/{id}

Le retrait accepte la même décision de credential, sous forme de paramètres de requête :

DELETE https://api.mail.land/v1/account/team/members/{id}?reason=offboarding&credentialDecision=revoke&transferToMemberId=mbr_f6g7h8i9j0

Comme pour la suspension, credentialDecision est obligatoire lorsque le membre possède une clé API active ; sinon l'appel renvoie 400 CREDENTIAL_DECISION_REQUIRED.

Remove a member
curl -X DELETE https://api.mail.land/v1/account/team/members/{id} \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Le membre est retiré de l'espace de travail et perd immédiatement l'accès à toutes ses ressources.

Transférer la propriété

Transférer la propriété de l'espace de travail à un autre membre :

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" }'

Le transfert de propriété est irréversible. Le propriétaire actuel est rétrogradé au rang d'Admin, et le membre cible devient le nouveau propriétaire.

La cible doit être un Admin actif (pas un Member ni un Viewer).

Réponses d'erreur

StatutCodeDescription
400VALIDATION_FAILEDE-mail ou rôle invalide
400INVALID_REQUESTPlus de 50 invitations en attente pour cet espace de travail
400CREDENTIAL_DECISION_REQUIREDLa cible de suspension/retrait possède des clés API actives et credentialDecision n'a pas été fourni
400CREDENTIAL_TRANSFER_TARGET_INVALIDcredentialDecision: transfer avec un transferToMemberId manquant ou invalide
403FORBIDDENPermissions insuffisantes pour cette action
404RESOURCE_NOT_FOUNDMembre ou invitation introuvable
400PLAN_LIMIT_REACHEDLe workspace a atteint la limite de places de son plan (invitation, acceptation, réactivation ou première connexion SSO)
409CONFLICTL'utilisateur est déjà membre, ou a déjà une invitation en attente

Il n'existe pas de code MEMBER_ALREADY_EXISTS : "déjà membre" comme "invitation déjà existante" renvoient 409 CONFLICT.

POST /v1/account/team/leave (quitter soi-même l'espace de travail) et GET /v1/account/team/me (votre propre enregistrement d'adhésion) existent également et ne sont pas documentés ailleurs sur cette page.

Étapes suivantes

Sur cette page