Aller au contenu principal
Documentation

API Moon AI.

Une API compatible OpenAI, paiement à l'usage en euros : une clé par workspace, les modèles publics, Moon 6 et les modèles auto-hébergés, recharge et factures, anonymisation Moon Blur avant l'envoi au modèle.

API Moon AI v1

Compatible OpenAI, paiement à l'usage en euros.

Démarrer en 30 secondes

Moon AI expose une API d'inférence compatible avec le SDK OpenAI. Pointez n'importe quel client OpenAI sur l'URL de base ci-dessous avec votre clé, et vous appelez les modèles depuis vos propres applications. La facturation est 100 % à l'usage : vous rechargez un solde en euros pour votre workspace, sans abonnement.

  • URL de base : https://api.realmoon.ai/v1
  • Authentification : Authorization: Bearer sk-moon-... (ou l'en-tête x-api-key).
  • Les clés se créent depuis le portail chat.realmoon.ai/settings/developer (propriétaire ou admin du workspace). La clé en clair n'est affichée qu'une seule fois à la création.

Confidentialité : Moon AI ne conserve pas le contenu des requêtes API et anonymise les données sensibles (Moon Blur) avant l'envoi au modèle. Détail complet dans la politique de confidentialité.

SDK & installation

L'API est compatible OpenAI : utilisez le SDK officiel OpenAI de votre langage, en pointant le base_url sur https://api.realmoon.ai/v1 et la clé sur votre clé sk-moon-. Aucun SDK propriétaire à installer.

Python

pip install openai

Node.js / TypeScript

npm install openai

Variables d'environnement

Conservez la clé dans une variable d'environnement, jamais en dur dans le code ni dans un dépôt Git.

export OPENAI_API_KEY="sk-moon-..."
export OPENAI_BASE_URL="https://api.realmoon.ai/v1"

Avec ces deux variables, les SDK OpenAI (Python, Node) sont configurés sans argument supplémentaire : OpenAI() suffit.

Exemples

curl

curl https://api.realmoon.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-moon-..." \
  -H "Content-Type: application/json" \
  -d '{"model": "anthropic/claude-haiku-4.5", "messages": [{"role": "user", "content": "Bonjour"}]}'

Python (SDK openai)

from openai import OpenAI

client = OpenAI(
    base_url="https://api.realmoon.ai/v1",
    api_key="sk-moon-...",
)

resp = client.chat.completions.create(
    model="anthropic/claude-haiku-4.5",
    messages=[{"role": "user", "content": "Bonjour"}],
)
print(resp.choices[0].message.content)

Le streaming (stream=True) est supporté et renvoyé en SSE OpenAI standard.

Endpoints

Méthode Chemin Description
POST/v1/chat/completionsComplétion de chat compatible OpenAI (streaming + non-streaming).
GET/v1/modelsCatalogue des modèles disponibles, avec les prix.
GET/v1/creditsSolde du workspace.
GET/v1/generation?id=Coût + métadonnées d'une requête passée (en-tête X-Moon-Request-Id).

Les modèles exposés sont ceux qui sont actifs et publics dans Moon AI : les grands modèles du marché (OpenAI, Anthropic, Google, Mistral, Meta…) et les modèles maison Moon (Moon 6), tous servis par Moon AI. Les modèles à accès restreint ne sont jamais exposés.

Streaming

Passez stream: true pour recevoir la réponse en Server-Sent Events (SSE) au format OpenAI standard. Le coût final est réconcilié à la fin du flux.

Python

from openai import OpenAI

client = OpenAI(base_url="https://api.realmoon.ai/v1", api_key="sk-moon-...")

stream = client.chat.completions.create(
    model="anthropic/claude-haiku-4.5",
    messages=[{"role": "user", "content": "Ecris un haiku."}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Vision (entrée image)

Les modèles compatibles vision acceptent le format multimodal OpenAI : un message dont le content est une liste de parties text et image_url.

resp = client.chat.completions.create(
    model="google/gemini-2.5-flash",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Decris cette image."},
            {"type": "image_url", "image_url": {"url": "https://..."}},
        ],
    }],
)

Tous les modèles ne supportent pas la vision : utilisez un modèle multimodal (par exemple google/gemini-2.5-flash). Le catalogue /v1/models liste les modèles disponibles.

Gestion des erreurs

Enveloppe au format OpenAI, à la racine du corps : {"error": {"message", "type", "code", "param"}}. Les SDK OpenAI la lisent directement (e.code, e.type, e.param). Les refus du modèle (400, 429) sont relayés sans le nom du fournisseur, ses liens ni ses identifiants.

HTTP code Signification
400invalid_request, invalid_value, missing_required_parameterCorps ou paramètre refusé ; param le nomme.
400context_length_exceededLe modèle juge la requête trop longue pour sa fenêtre de contexte ; son explication suit.
400unsupported_parameter, no_available_routeLe modèle refuse un paramètre ou la requête, avec son explication.
401invalid_api_keyClé absente, inconnue, révoquée ou expirée.
402insufficient_creditsSolde trop bas pour cette requête : rechargez le workspace.
402spend_cap_exceeded, hold_exceeds_capUn plafond de dépense (workspace ou clé) est atteint.
403ip_not_allowedIP appelante hors de la liste autorisée de la clé.
403missing_scopeLa clé n'a pas le scope inference.
404model_not_foundLe modèle n'est pas servi par l'API (param: "model").
404unknown_urlPoint d'accès inexistant.
413moon_blur_payload_too_largeUn texte dépasse 500 000 caractères, trop long pour l'analyse Moon Blur : rien n'est envoyé ni retenu.
429rate_limit_exceededTrop de requêtes pour cette clé (600 par minute) ; Retry-After indique quand réessayer.
429model_rate_limitedLe modèle reçoit trop de requêtes en ce moment ; rien n'est facturé.
429credits_held_in_progressVos requêtes en cours retiennent plus de crédits qu'elles n'en utiliseront ; réessayez dans un instant ou fixez max_tokens.
503pricing_unavailablePrix du modèle momentanément inconnu (on refuse plutôt que mal facturer).
503moon_blur_unavailableMoon Blur a échoué sur la requête : elle n'est pas envoyée au modèle et rien n'est retenu.
503billing_unavailable, service_unavailableRéessayez plus tard.
502 à 504upstream_error, upstream_timeoutLe fournisseur a échoué. Rien n'est facturé s'il n'a rien produit.

Clés, idempotence & plafonds

Chaque clé porte :

  • scopes : inference est requis pour appeler /v1/chat/completions.
  • plafond de dépense (optionnel) : un plafond en euros par fenêtre glissante (heure, jour ou mois).
  • liste d'IP autorisées (optionnel) : plages CIDR ; les autres IP sont rejetées.
  • expiration (optionnel) : la clé cesse de fonctionner après sa date d'expiration.

Chaque complétion est facturée une seule fois contre une clé de requête dérivée côté serveur : une nouvelle tentative réseau ne double-facture jamais la même requête en cours.

Facturation à l'usage

  • Vous rechargez le montant en euros de votre choix (frais de recharge + TVA au paiement, via Stripe). Chaque recharge génère une facture PDF avec numéro légal et détail HT / TVA, consultable depuis le portail.
  • Chaque requête est pré-débitée au pire cas puis réconciliée au coût réel après la réponse : vous ne payez que ce que vous avez réellement consommé.
  • Les prix sont une marge sur le prix du modèle en amont ; ils peuvent évoluer avec lui. Le coût exact d'une requête est toujours disponible via /v1/generation?id=.
  • Recharge automatique (optionnelle) : rechargez automatiquement quand le solde passe sous un seuil que vous définissez, sur une carte enregistrée.
  • Plafonds de dépense par heure / jour / mois pour borner la dépense du workspace.

Prêt à intégrer ?

Créez votre clé et rechargez votre workspace depuis le portail développeur.