# Comptes des membres par l’API

> Lire le compte d’un membre, le déconnecter, réinitialiser sa double authentification, le désactiver, gérer son départ et les exigences des comptes par l’API.

Ces routes agissent sur le compte Moon AI d’un membre, au-delà de son adhésion. Les plus fortes (adresse, double authentification, mot de passe, désactivation) ne valent que pour un **compte géré** : un compte dont l’adresse est d’un domaine vérifié par l’organisation, ou qui a été créé par sa connexion unique ou son annuaire. Sur un compte qui appartient à la personne, elles répondent `409 not_managed_account`.

Toutes les routes sont sous `https://chat.realmoon.ai/api/v1/orgs/{org_id}`. Les actions sur un compte suivent les règles des membres : jamais le créateur de la clé, le propriétaire, un administrateur, ni un membre qui a plus de droits que la clé (`403 forbidden`). La personne concernée reçoit un e-mail pour chaque action, quand l’envoi d’e-mails est configuré.

## Lire le compte d’un membre

`GET /members/{user_id}/account` · `members:read`

```json
{
  "managed": true,
  "managed_reason": "domain",
  "member_status": "active",
  "account": {
    "name": "Camille Martin",
    "email": "camille.martin@ecole.fr",
    "status": "active",
    "disabled_by_org": false,
    "sign_in": ["password", "google"],
    "two_factor": { "enabled": true, "method": "totp", "backup_codes_remaining": 8 },
    "last_active_at": 1762332000,
    "created_at": 1756684800,
    "sessions_revoked_at": null,
    "two_factor_required": true
  },
  "devices": [
    { "kind": "cli", "label": "Moon CLI", "created_at": 1762300000, "last_active_at": 1762330000, "expires_at": 1764892000, "ip": "203.0.113.x" },
    { "kind": "web", "label": "Chrome · Windows", "created_at": 1762331000, "last_active_at": 1762331000, "expires_at": null, "ip": "2001:0db8:0001::" }
  ],
  "verified_domains": ["ecole.fr"],
  "blocked": null,
  "can": { "sign_out_org": true, "sign_out_account": true, "edit": true, "reset_2fa": true, "password_reset": true, "disable": true, "enable": false, "offboard": true, "transfer_private": true }
}
```

| Champ | Description |
| --- | --- |
| `managed_reason` | `domain`, `sso`, `scim` ou `null` (compte de la personne). |
| `account.status` | Statut du compte sur la plateforme ; `disabled_by_org` dit s’il a été désactivé par cette organisation. |
| `account.sign_in` | Moyens de connexion : `password`, les fournisseurs liés, `sso`. |
| `devices` | Sessions Moon CLI ouvertes sur l’organisation et, pour un compte géré, navigateurs connectés, adresse IP masquée. `null` quand la clé ne peut pas déconnecter ce membre. |
| `can` | Ce que la clé peut faire sur ce compte. |

## Déconnecter un membre

`POST /members/{user_id}/account/sign-out` · `members:write`

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `scope` | chaîne | non | `organization` (par défaut) : les sessions ne peuvent plus agir dans l’organisation ; les autres workspaces restent ouverts. `account` : toutes les sessions du compte, partout (compte géré ; demande aussi `security:read` ou `security:write`). |

Réponse : `{"scope": "organization", "signed_out": true, "cli_revoked": 2}` (sessions Moon CLI fermées), ou `{"scope": "account", "signed_out": true}`.

## Réinitialiser la double authentification

`POST /members/{user_id}/account/reset-2fa` · `security:write` · compte géré

Retire l’application d’authentification, le code par e-mail et les codes de secours ; la personne la configure de nouveau à sa prochaine connexion. Toutes ses sessions sont fermées. Réponse : `{"reset": true, "had_two_factor": true}`.

## Envoyer un code de réinitialisation du mot de passe

`POST /members/{user_id}/account/password-reset` · `security:write` · compte géré

Envoie à la personne un code à 6 chiffres valable 15 minutes ; il n’est jamais montré à l’organisation. Réponse : `{"sent": true, "email_hint": "c***@ecole.fr"}`.

| Statut | `code` | Cause |
| --- | --- | --- |
| 409 | `sso_required` | La connexion unique est obligatoire pour ce compte : il n’a pas de mot de passe. |
| 429 | `rate_limited` | Un code a déjà été demandé pour cette personne dans les 10 dernières minutes, même si l’envoi avait échoué. |
| 502 | `error` | L’e-mail n’a pas pu partir. |
| 503 | `smtp_unavailable` | L’envoi d’e-mails n’est pas configuré. |

## Changer le nom ou l’adresse

`PATCH /members/{user_id}/account` · `security:write` · compte géré

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne | non | 1 à 128 caractères. |
| `email` | chaîne | non | Une adresse d’un domaine vérifié par l’organisation. |

Réponse : `{"changed": ["email", "name"], "name": "…", "email": "…"}`. Une nouvelle adresse ferme toutes les sessions et devra être confirmée à la prochaine connexion ; l’ancienne et la nouvelle adresse sont prévenues.

| Statut | `code` | Cause |
| --- | --- | --- |
| 400 | `invalid_request` | Rien à modifier, nom vide ou trop long, adresse invalide. |
| 400 | `email_domain_not_verified` | L’adresse n’est pas d’un domaine vérifié par l’organisation. |
| 409 | `email_taken` | L’adresse est déjà utilisée par un autre compte. |

## Désactiver et réactiver un compte

`POST /members/{user_id}/account/disable` · `security:write` · compte géré

La personne ne peut plus se connecter nulle part ; elle reste membre. Toutes ses sessions sont fermées. Réponse : `{"disabled": true, "disabled_at": 1762339200}`.

`POST /members/{user_id}/account/enable` · `security:write` · compte géré

Lève une désactivation faite par cette organisation, et seulement celle-là. Réponse : `{"disabled": false}`.

| Statut | `code` | Cause |
| --- | --- | --- |
| 409 | `not_active` | Le compte n’est pas actif (désactivation). |
| 409 | `owns_workspace` | Le compte possède un autre workspace d’équipe avec des membres : transférez-le d’abord. |
| 409 | `not_disabled_by_org` | Le compte n’a pas été désactivé par cette organisation (réactivation). |
| 409 | `invalid_request` | L’organisation n’aurait plus d’administrateur actif. |

## Départ d’un membre

### Lister ce qu’il possède

`GET /members/{user_id}/resources` · `members:read`

```json
{
  "resources": {
    "agents": { "total": 2, "shared": 2 },
    "knowledge": { "total": 5, "shared": 3 },
    "notes": { "total": 12, "shared": 1 },
    "prompts": { "total": 4, "shared": 4 },
    "tools": { "total": 0, "shared": 0 }
  },
  "managed": true,
  "kinds": ["agents", "knowledge", "notes", "prompts", "tools"]
}
```

### Transférer, retirer, désactiver

`POST /members/{user_id}/offboard` · `members:write`

Fait dans l’ordre : le transfert des ressources, le retrait de l’organisation, la désactivation du compte. Tout est vérifié avant le premier changement.

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `transfer_to` | chaîne | avec `kinds` | Un membre actif qui reçoit les ressources. |
| `kinds` | liste | non | `agents`, `knowledge`, `notes`, `prompts`, `tools`. |
| `include_private` | booléen | non | Transférer aussi les ressources non partagées (compte géré ; demande `security:read` ou `security:write`). Sinon, seules les ressources partagées partent. |
| `remove` | booléen | non | `true` par défaut : retirer le membre de l’organisation. |
| `disable_account` | booléen | non | Désactiver le compte (compte géré ; demande `security:read` ou `security:write`). |

```bash title="cURL"
curl https://chat.realmoon.ai/api/v1/orgs/$ORG_ID/members/$USER_ID/offboard \
  -H "Authorization: Bearer $MOONAI_ADMIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transfer_to": "<id du successeur>", "kinds": ["knowledge", "prompts"], "remove": true}'
```

```python title="Python"
import os
import requests

BASE = f"https://chat.realmoon.ai/api/v1/orgs/{os.environ['ORG_ID']}"
HEADERS = {"Authorization": f"Bearer {os.environ['MOONAI_ADMIN_KEY']}"}

r = requests.post(
    f"{BASE}/members/{os.environ['USER_ID']}/offboard",
    headers=HEADERS,
    json={"transfer_to": os.environ["SUCCESSOR_ID"], "kinds": ["knowledge", "prompts"], "remove": True},
    timeout=60,
)
r.raise_for_status()
print(r.json())
```

```javascript title="JavaScript"
const BASE = `https://chat.realmoon.ai/api/v1/orgs/${process.env.ORG_ID}`;
const r = await fetch(`${BASE}/members/${process.env.USER_ID}/offboard`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.MOONAI_ADMIN_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ transfer_to: process.env.SUCCESSOR_ID, kinds: ['knowledge', 'prompts'], remove: true }),
});
if (!r.ok) throw new Error(await r.text());
console.log(await r.json());
```

Réponse : `{"transferred": {"knowledge": 3, "prompts": 4}, "removed": true, "account_disabled": false}` (avec `disabled_at` quand le compte a été désactivé). Les ressources transférées gardent leurs partages. Le retrait envoie l’événement `member.removed`.

| Statut | `code` | Cause |
| --- | --- | --- |
| 400 | `invalid_request` | Rien à faire, `kinds` sans `transfer_to`, aucun type connu, transfert à la personne elle-même. |
| 409 | `invalid_target` | `transfer_to` n’est pas un membre actif. |
| 409 | `not_managed_account` | `include_private` ou `disable_account` sur un compte qui appartient à la personne. |
| 409 | `invalid_request` | L’organisation n’aurait plus d’administrateur actif. |

## Exigences des comptes

### Lire les exigences

`GET /security/requirements` · `security:read`

```json
{
  "settings": { "require_2fa": true, "grace_until": 1763000000, "max_session_hours": 168, "sessions_valid_after": null, "updated_at": 1762339200, "updated_by": "3f2b9c1d-7e4a-4b8c-9d0e-1f2a3b4c5d6e" },
  "limits": { "grace_days_max": 90, "session_hours_min": 1, "session_hours_max": 2160 },
  "sso": { "configured": true, "active": true, "enforced": false },
  "verified_domains": ["ecole.fr"],
  "members": { "active": 120, "compliant": 97, "missing": 23 }
}
```

Un membre est conforme quand il a activé la double authentification, ou qu’il se connecte par la connexion unique obligatoire de l’organisation.

### Modifier les exigences

`PUT /security/requirements` · `security:write`

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `require_2fa` | booléen | non | Exiger la double authentification. `false` retire l’exigence et le délai. |
| `grace_days` | entier | non | Délai de grâce de 0 à 90 jours, compté à partir de maintenant. 0 ou absent à l’activation : exigence immédiate. |
| `max_session_hours` | entier | non | Durée maximale d’une session, de 1 à 2 160 heures ; `null` retire la limite. |

Envoyez au moins un champ ; un champ absent ne change pas. La réponse a la forme de la lecture, sans `members`. Exiger la double authentification tout de suite répond `409 actor_without_2fa` quand le créateur de la clé ne l’a pas activée lui-même. Un membre sans double authentification une fois le délai passé ne peut plus travailler dans l’organisation (`403 org_2fa_required`).

### Lister les membres non conformes

`GET /security/requirements/members` · `security:read`

Paramètres : `filter` (`missing`, par défaut, ou `all`), `page`, `limit`. Chaque élément : `user_id`, `name`, `email`, `last_active_at`, `two_factor`. La réponse ajoute `settings`, `active_members`, `compliant` et `missing`.

### Déconnecter tout le monde

`POST /security/sign-out-all` · `security:write`

Plus aucune session ouverte avant maintenant n’agit dans l’organisation : chacun se reconnecte, y compris le créateur de la clé. La clé, elle, continue de fonctionner. Réponse : `{"signed_out": true, "valid_after": 1762339200}`.

### Ce que l’organisation demande au créateur de la clé

`GET /me/requirements` · aucune portée

Rend `require_2fa`, `two_factor_enabled`, `two_factor_missing`, `grace_until`, `blocked`, `can_switch_out` et `max_session_hours` pour la personne qui a créé la clé.

## Voir aussi

- [Domaines](https://realmoon.ai/documentation/api-organisations/domaines/), qui rendent un compte géré
- [Membres](https://realmoon.ai/documentation/api-organisations/membres/)

---

Documentation Moon AI › API des organisations › Comptes des membres. Page : https://realmoon.ai/documentation/api-organisations/comptes/. Modifiée le 5 novembre 2026.

© 2026 Stellarr Studio SAS. Tous droits réservés. Moon AI, Moon Blur et Stellarr Studio sont des marques déposées à l’INPI.
