Toutes les routes sont sous https://. Portées : usage:read pour l’utilisation, audit:read pour le journal. Il n’existe pas de portée d’écriture pour ces domaines.
UtilisationLien vers la section Utilisation
Ce qui est comptéLien vers la section Ce qui est compté
| Mesure | Description |
|---|---|
requests | Demandes : une par réponse de conversation, image, vidéo ou service (recherche web, ordinateur, voix, musique). Les tâches de fond (titres, suggestions) ne comptent pas. |
tokens_in, tokens_out, tokens | Jetons des réponses des modèles : entrée, sortie, total. Les images, vidéos et services n’en ont pas. |
share, token_share, request_share | Part, en pourcentage, de l’utilisation de l’organisation (ou des groupes choisis). |
month_pct | Part de sa limite du mois que le membre a déjà utilisée, maintenant, quelle que soit la période demandée. |
usage_scope vaut workspace quand l’organisation compte l’utilisation de ses membres, personal quand chaque membre utilise sa propre allocation : les chiffres sont alors vides.
Période et périmètreLien vers la section Période et périmètre
| Paramètre | Description |
|---|---|
date_from, date_to | Secondes Unix ; date_to est exclu. Par défaut, les 30 derniers jours. 366 jours au plus. |
group_id | Ne compter que les membres de ce groupe (sauf pour /). |
Une période invalide répond 400 (« Période invalide : 366 jours au plus. »). Les réponses rendent date_from et date_to effectifs, et scope : org (toute l’organisation), managed_groups (les groupes que le créateur de la clé gère, sans adresses e-mail) ou self (le créateur seul).
Totaux de la périodeLien vers la section Totaux de la période
GET / · usage:read
curl "https://chat.realmoon.ai/api/v1/orgs/$ORG_ID/usage/summary?date_from=1759622400&date_to=1762214400" \
-H "Authorization: Bearer $MOONAI_ADMIN_KEY"import os
import time
import requests
now = int(time.time())
r = requests.get(
f"https://chat.realmoon.ai/api/v1/orgs/{os.environ['ORG_ID']}/usage/summary",
headers={"Authorization": f"Bearer {os.environ['MOONAI_ADMIN_KEY']}"},
params={"date_from": now - 30 * 86400, "date_to": now},
timeout=30,
)
r.raise_for_status()
summary = r.json()
print(summary["current"]["requests"], summary["near_limit"])const now = Math.floor(Date.now() / 1000);
const url = new URL(`https://chat.realmoon.ai/api/v1/orgs/${process.env.ORG_ID}/usage/summary`);
url.search = new URLSearchParams({ date_from: now - 30 * 86400, date_to: now });
const r = await fetch(url, { headers: { Authorization: `Bearer ${process.env.MOONAI_ADMIN_KEY}` } });
if (!r.ok) throw new Error(await r.text());
const summary = await r.json();
console.log(summary.current.requests, summary.near_limit);{
"date_from": 1759622400,
"date_to": 1762214400,
"current": { "members": 380, "active_members": 295, "requests": 18422, "tokens_in": 91200000, "tokens_out": 6100000, "tokens": 97300000 },
"previous": { "members": 379, "active_members": 280, "requests": 17003, "tokens_in": 85000000, "tokens_out": 5700000, "tokens": 90700000 },
"month_pct_avg": 37.4,
"near_limit": 4,
"days": [{ "day": "2026-10-05", "requests": 512, "active": 81, "tokens_in": 2500000, "tokens_out": 170000 }],
"usage_scope": "workspace",
"scope": "org",
"can_export": true
}previous couvre la période précédente de même durée. near_limit compte les membres à 90 % ou plus de leur limite du mois. days (jours de l’heure de Paris) n’est rendu que pour une période de 92 jours au plus.
Par membreLien vers la section Par membre
GET /usage · usage:read
| Paramètre | Description |
|---|---|
q | Partie du nom ou de l’adresse. |
sort | requests (par défaut), usage, month_pct, name, last_request ou tokens. |
page, limit | 50 par défaut, 200 au plus. |
Chaque élément : user_id, name, email, profile_image_url, role, last_active_at, last_request_at, requests, share, month_pct, tokens_in, tokens_out, tokens, token_share. La réponse ajoute totals pour tout le périmètre.
Par groupeLien vers la section Par groupe
GET / · usage:read
Paramètres : q, sort (requests, usage, tokens, active, members, name), page, limit. Chaque élément : id, name, kind (static ou dynamic), members, active_members, requests, share, tokens_in, tokens_out, tokens, token_share. Un membre de plusieurs groupes compte dans chacun : la somme des parts peut dépasser 100.
Par modèleLien vers la section Par modèle
GET / · usage:read
Jusqu’à 100 modèles, avec model_id (le modèle qui a répondu), name, kind, requests, share, request_share et les jetons. model_id vaut image ou video (kind: ) pour les créations d’images et de vidéos ; les services ne figurent pas ici.
Exporter en CSVLien vers la section Exporter en CSV
GET / · usage:read
view vaut members (par défaut), groups ou models ; date_from, date_to et group_id s’appliquent. Le fichier est en UTF-8 avec BOM, séparé par des virgules ; une cellule qui commence par =, +, - ou @ est précédée d’une apostrophe. Les adresses e-mail n’y figurent qu’avec un périmètre org. L’export est inscrit au journal.
Journal d’auditLien vers la section Journal d’audit
Chaque action d’administration est inscrite au journal de l’organisation, avec son auteur : un membre, une clé d’administration (api_key:<id>) ou Moon AI.
FiltresLien vers la section Filtres
| Paramètre | Description |
|---|---|
action | Un ou plusieurs codes d’action séparés par des virgules (50 au plus). |
actor_id | Un membre, api_key:<id>, ou __platform__ pour Moon AI. |
target_id | La personne visée, ou tout identifiant présent dans le détail (groupe, étiquette, rôle). |
q | Texte cherché dans le détail et dans le nom ou l’adresse de la personne visée. |
date_from, date_to | Secondes Unix ; date_to exclu. |
include_switches | true pour voir aussi les changements de workspace (cachés par défaut). |
Lire le journalLien vers la section Lire le journal
GET /audit · audit:read
curl "https://chat.realmoon.ai/api/v1/orgs/$ORG_ID/audit?action=org_member_remove&limit=20" \
-H "Authorization: Bearer $MOONAI_ADMIN_KEY"import os
import requests
r = requests.get(
f"https://chat.realmoon.ai/api/v1/orgs/{os.environ['ORG_ID']}/audit",
headers={"Authorization": f"Bearer {os.environ['MOONAI_ADMIN_KEY']}"},
params={"action": "org_member_remove", "limit": 20},
timeout=30,
)
r.raise_for_status()
for line in r.json()["items"]:
print(line["created_at"], line["actor"]["name"], line["action"])const url = new URL(`https://chat.realmoon.ai/api/v1/orgs/${process.env.ORG_ID}/audit`);
url.search = new URLSearchParams({ action: 'org_member_remove', limit: 20 });
const r = await fetch(url, { headers: { Authorization: `Bearer ${process.env.MOONAI_ADMIN_KEY}` } });
if (!r.ok) throw new Error(await r.text());
for (const line of (await r.json()).items) console.log(line.created_at, line.actor.name, line.action);{
"items": [
{
"id": 918273,
"action": "org_group_members_add",
"created_at": 1762209000,
"actor": { "id": "api_key:7c1e2a4b-6d8f-4a0c-9e2b-4d6f8a0c2e4b", "name": "Synchro annuaire", "email": null, "kind": "api_key" },
"target": null,
"object": { "type": "group", "id": "<id de groupe>", "name": "Professeurs" },
"count": 3,
"changes": null,
"before": null,
"after": { "group_id": "<id de groupe>", "user_ids": ["<id 1>", "<id 2>", "<id 3>"] },
"ip": "203.0.113.10",
"user_agent": "curl/8.5.0",
"people": [{ "id": "<id 1>", "name": "Léa Dupont" }]
}
],
"total": 1,
"page": 1,
"limit": 50,
"can_export": true
}| Champ | Description |
|---|---|
actor.kind | member, api_key, platform (Moon AI) ou system (tâche automatique). |
target | La personne visée ; deleted: si son compte n’existe plus. |
object | L’objet touché : groupe, étiquette, rôle, membre, règles, domaine, serveur MCP, modèle ou ressource. |
changes | Liste {path, (40 au plus) pour les règles, réglages, rôles et statuts. |
before, after | Le détail brut de l’action. |
people | Les 5 premières personnes touchées, quand l’action en vise plusieurs. |
Pour les actions qu’un membre fait sur son propre compte, l’adresse IP, le navigateur et le détail ne sont pas rendus. Les lignes de Moon AI n’ont pas d’adresse IP.
Actions et auteurs présentsLien vers la section Actions et auteurs présents
GET / · audit:read
Rend actions (chaque code présent et son nombre de lignes) et actors (200 auteurs au plus, les plus actifs d’abord), pour construire des filtres.
Exporter le journalLien vers la section Exporter le journal
GET / · audit:read
CSV des lignes qui correspondent aux filtres, 50 000 au plus, les plus récentes d’abord. Colonnes : Date, Action, Libellé, Auteur, E-mail , Personne , Objet, Détails, Adresse IP. L’export est lui-même inscrit au journal.
Voir aussiLien vers la section Voir aussi
- Utilisation et journal, dans l’administration
- Webhooks, pour recevoir les événements au fil de l’eau