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ôle | Valeur | Description |
|---|---|---|
Owner | 0 | Accès complet, facturation, possibilité de transférer la propriété |
Admin | 1 | Accès complet sauf la facturation et le transfert de propriété |
Member | 2 | Envoi d'e-mails, gestion des domaines, consultation des analyses |
Viewer | 3 | Accè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.
| Permission | Owner | Admin | Member | Viewer |
|---|---|---|---|---|
| Envoyer des e-mails | Oui | Oui | Oui | Non |
| Gérer les domaines | Oui | Oui | Oui | Non |
| Gérer les abonnés | Oui | Oui | Oui | Non |
| Consulter les analyses | Oui | Oui | Oui | Oui |
| Créer/faire tourner les clés API | Oui | Oui | Oui | Non |
| Supprimer les clés API / domaines / webhooks | Oui | Oui | Non | Non |
| Créer/modifier les webhooks | Oui | Oui | Oui | Non |
| Modifier les paramètres (y compris le suivi) | Oui | Oui | Oui | Non |
| Inviter des membres | Oui | Oui | Non | Non |
| Retirer des membres | Oui | Oui | Non | Non |
| Mettre à jour les rôles | Oui | Oui | Non | Non |
| Gérer la facturation | Oui | Non | Non | Non |
| Transférer la propriété | Oui | Non | Non | Non |
| Supprimer l'espace de travail | Oui | Non | Non | Non |
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/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
}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
| Statut | Description |
|---|---|
active | Membre actif de l'équipe |
suspended | Suspendu par un administrateur |
Statuts des invitations
Renvoyés sous forme de chaînes en minuscules :
| Statut | Description |
|---|---|
pending | En attente d'acceptation |
accepted | Invitation acceptée |
expired | Invitation expirée (7 jours) |
revoked | Invitation révoquée (pas "cancelled") |
Inviter un membre de l'équipe
POST https://api.mail.land/v1/account/team/invite{
"email": "[email protected]",
"role": 2
}| Champ | Type | Requis | Description |
|---|---|---|---|
email | string | Oui | Adresse e-mail à inviter |
role | int | Oui | Rôle à attribuer (1–3, impossible d'inviter en tant que 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 }'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}/acceptPour 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.
{
"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!"}'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}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]"
}Gérer les invitations
Annuler une invitation
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..."Renvoie 204 No Content en cas de succès.
Renvoyer une invitation
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..."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{
"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 }'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}/suspendUn 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.
| Champ | Valeurs |
|---|---|
reason | offboarding, compromise, abuse, other |
credentialDecision | revoke, keep, transfer |
transferToMemberId | Obligatoire lorsque credentialDecision vaut transfer |
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}/reactivatecurl -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_f6g7h8i9j0Comme pour la suspension, credentialDecision est obligatoire lorsque le membre possède une clé API active ; sinon l'appel renvoie 400 CREDENTIAL_DECISION_REQUIRED.
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{
"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" }'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
| Statut | Code | Description |
|---|---|---|
400 | VALIDATION_FAILED | E-mail ou rôle invalide |
400 | INVALID_REQUEST | Plus de 50 invitations en attente pour cet espace de travail |
400 | CREDENTIAL_DECISION_REQUIRED | La cible de suspension/retrait possède des clés API actives et credentialDecision n'a pas été fourni |
400 | CREDENTIAL_TRANSFER_TARGET_INVALID | credentialDecision: transfer avec un transferToMemberId manquant ou invalide |
403 | FORBIDDEN | Permissions insuffisantes pour cette action |
404 | RESOURCE_NOT_FOUND | Membre ou invitation introuvable |
400 | PLAN_LIMIT_REACHED | Le workspace a atteint la limite de places de son plan (invitation, acceptation, réactivation ou première connexion SSO) |
409 | CONFLICT | L'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
- Espaces de travail : gérer les paramètres de l'espace de travail
- Authentification : authentification et sessions
- Facturation : gestion des abonnements et des paiements