Une clé de workspace (moai_org_…) appelle le chat de Moon AI au nom d’un workspace d’équipe : la requête se déroule dans ce workspace, avec ses modèles, ses règles et sa limite d’utilisation.
Points d’accès ouvertsLien vers la section Points d’accès ouverts
Une clé de workspace n’atteint que ces chemins, sur https:// :
| Méthode et chemin | Rôle |
|---|---|
POST / ou / | Une réponse du chat, au format Chat Completions d’OpenAI. |
GET / ou / | Les modèles que la clé peut utiliser. |
POST / ou / | Une réponse au format Messages d’Anthropic. |
Tout autre chemin répond 403 . Sur les deux chemins au format Anthropic, l’en-tête x-api-key est accepté à la place de Authorization: .
Envoyer un messageLien vers la section Envoyer un message
POST /
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
model | chaîne | oui | Un identifiant rendu par GET /. |
messages | liste | oui | Les messages, au format d’OpenAI (role, content). |
stream | booléen | non | true pour recevoir la réponse en flux (événements SSE). |
curl https://chat.realmoon.ai/api/chat/completions \
-H "Authorization: Bearer $MOONAI_ORG_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-haiku-4.5",
"messages": [{"role": "user", "content": "Résume la politique de congés en trois points."}],
"stream": false
}'import os
import requests
r = requests.post(
"https://chat.realmoon.ai/api/chat/completions",
headers={"Authorization": f"Bearer {os.environ['MOONAI_ORG_KEY']}"},
json={
"model": "anthropic/claude-haiku-4.5",
"messages": [{"role": "user", "content": "Résume la politique de congés en trois points."}],
"stream": False,
},
timeout=120,
)
r.raise_for_status()
print(r.json()["choices"][0]["message"]["content"])const r = await fetch('https://chat.realmoon.ai/api/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MOONAI_ORG_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'anthropic/claude-haiku-4.5',
messages: [{ role: 'user', content: 'Résume la politique de congés en trois points.' }],
stream: false,
}),
});
if (!r.ok) throw new Error(await r.text());
const data = await r.json();
console.log(data.choices[0].message.content);La réponse suit le format d’OpenAI : choices[0].message.content porte le texte.
Au nom de quiLien vers la section Au nom de qui
- La clé agit au nom de la personne qui l’a créée, avec le rôle de membre, jamais avec des droits d’administrateur.
- Elle reste rattachée au workspace de la clé, quel que soit le workspace ouvert par cette personne dans l’application.
- L’utilisation compte dans la limite de cette personne dans ce workspace.
Ce que la clé n’utilise pasLien vers la section Ce que la clé n’utilise pas
Pour qu’une clé ne puisse rien lire de privé, une requête faite avec elle :
- n’a ni fichiers joints, ni outils, ni serveurs d’outils ;
- n’utilise ni la mémoire, ni les connecteurs, ni les dossiers de la personne ;
- ne choisit que parmi les modèles publics de la plateforme et ceux partagés avec le workspace, jamais un modèle ou un agent privé de la personne ni une connexion directe (
Model).not found
Quand la clé cesse de fonctionnerLien vers la section Quand la clé cesse de fonctionner
| Situation | Réponse |
|---|---|
| Clé inconnue ou expirée | 401 |
| Le créateur n’est plus propriétaire ou administrateur actif du workspace : la clé est révoquée définitivement, même s’il le redevient | 401 |
| Le compte du créateur est suspendu | 403 |
| Le forfait du workspace n’inclut plus l’accès à l’API | 403 |
| Chemin hors de la liste | 403 |
| Lecture impossible côté serveur | 503, réessayez |
Supprimer le workspace rend aussi ses clés inutilisables.
Gérer les clésLien vers la section Gérer les clés
Ces routes s’appellent avec la session d’un propriétaire ou d’un administrateur du workspace connecté à Moon AI, jamais avec une clé.
Créer une cléLien vers la section Créer une clé
POST /
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
name | chaîne | oui | Le nom de la clé, gardé sur 128 caractères. |
expires_in_days | entier | non | Durée de validité, de 1 à 3 650 jours. Absent : la clé n’expire pas. |
{
"id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
"org_id": "8c1f2a4e-5b6d-4e7f-9a0b-1c2d3e4f5a6b",
"name": "Intranet",
"key": "moai_org_…",
"key_prefix": "moai_org_3f9a",
"expires_at": 1801296000,
"created_at": 1793520000
}La clé complète (key) n’est rendue que dans cette réponse.
| Statut | Code ou message | Cause |
|---|---|---|
| 400 | « Un nom est requis. » | name vide. |
| 400 | org_api_key_personal_workspace | Le workspace est personnel. |
| 403 | org_api_key_plan_required | Le forfait du workspace n’inclut pas l’accès à l’API. |
| 409 | org_api_key_limit | Le workspace a déjà 25 clés actives. |
Lister les clésLien vers la section Lister les clés
GET /
Rend les clés non révoquées, sans leur valeur :
[
{
"id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
"org_id": "8c1f2a4e-5b6d-4e7f-9a0b-1c2d3e4f5a6b",
"name": "Intranet",
"key_prefix": "moai_org_3f9a",
"created_by": "3f2b9c1d-7e4a-4b8c-9d0e-1f2a3b4c5d6e",
"last_used_at": 1793606400,
"expires_at": 1801296000,
"revoked_at": null,
"created_at": 1793520000,
"updated_at": 1793520000
}
]Révoquer une cléLien vers la section Révoquer une clé
DELETE /
Rend {"success": , ou 404 si la clé n’existe pas dans ce workspace. La révocation est définitive.
Chaque création et chaque révocation est inscrite au journal d’audit de l’organisation.