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 .
Toutes les routes sont sous https://. 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 ). 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 membreLien vers la section Lire le compte d’un membre
GET / · members:read
{
"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 membreLien vers la section Déconnecter un membre
POST / · 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": (sessions Moon CLI fermées), ou {"scope": .
Réinitialiser la double authentificationLien vers la section Réinitialiser la double authentification
POST / · 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": .
Envoyer un code de réinitialisation du mot de passeLien vers la section Envoyer un code de réinitialisation du mot de passe
POST / · 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": .
| 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’adresseLien vers la section Changer le nom ou l’adresse
PATCH / · 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": . 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 compteLien vers la section Désactiver et réactiver un compte
POST / · 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": .
POST / · security:write · compte géré
Lève une désactivation faite par cette organisation, et seulement celle-là. Réponse : {"disabled": .
| 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 membreLien vers la section Départ d’un membre
Lister ce qu’il possèdeLien vers la section Lister ce qu’il possède
GET / · members:read
{
"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ésactiverLien vers la section Transférer, retirer, désactiver
POST / · 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). |
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}'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())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": (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 comptesLien vers la section Exigences des comptes
Lire les exigencesLien vers la section Lire les exigences
GET / · security:read
{
"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 exigencesLien vers la section Modifier les exigences
PUT / · 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 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 ).
Lister les membres non conformesLien vers la section Lister les membres non conformes
GET / · 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 mondeLien vers la section Déconnecter tout le monde
POST / · 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": .
Ce que l’organisation demande au créateur de la cléLien vers la section Ce que l’organisation demande au créateur de la clé
GET / · 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é.