Documentation
Référence de l'API Frontière AI
L'API Frontière AI est une passerelle compatible OpenAI vers un catalogue sélectionné de modèles open-source puissants hébergés en Europe. Pointez votre SDK ou client HTTP existant vers l'URL de base ci-dessous, authentifiez-vous avec une clé API de votre dashboard, et chaque modèle en ligne est disponible via le même endpoint — chacun étiqueté souverain UE ou accès rapide, pour toujours savoir quelle juridiction sert vos données.
Vue d'ensemble
L'API implémente le contrat chat-completions d'OpenAI. Si votre code parle déjà à OpenAI — via le SDK officiel Python ou JavaScript, LangChain, ou un simple client HTTP — vous ne changez que deux choses : l'URL de base et la clé. Une seule clé donne accès à tout le catalogue.
Machine-readable OpenAPI spec: /openapi.json (OpenAPI 3.1).
https://getfrontiereai.eu/api/v1Deux endpoints :
POST /chat/completions | Appeler un modèle (streaming supporté) |
GET /models | Lister le catalogue — public, aucune clé requise |
Authentification
Chaque appel au endpoint de chat porte votre clé API dans l'en-tête Authorization. Les clés se créent dans le dashboard, section Clés API — la valeur complète (sk-front-…) n'est affichée qu'une fois à la création, ensuite seulement son préfixe. Créez une clé par environnement ou par application ; chacune se révoque indépendamment sans toucher aux autres.
Authorization: Bearer sk-front-…Gardez vos clés côté serveur (variables d'environnement, gestionnaire de secrets) — jamais dans du code client ni un dépôt public. Si une clé fuite, révoquez-la depuis le dashboard et créez-en une nouvelle ; l'ancienne cesse de fonctionner immédiatement.
Démarrage rapide
Le même appel en trois langages. Les exemples Python et JavaScript utilisent le SDK OpenAI officiel (pip install openai / npm install openai) — aucune librairie spécifique à Frontière AI n'est nécessaire.
curl https://getfrontiereai.eu/api/v1/chat/completions \
-H "Authorization: Bearer $FRONTIERE_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "Bonjour"}]
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://getfrontiereai.eu/api/v1",
api_key=os.environ["FRONTIERE_KEY"],
)
reply = client.chat.completions.create(
model="glm-5.2",
messages=[{"role": "user", "content": "Bonjour"}],
)
print(reply.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://getfrontiereai.eu/api/v1",
apiKey: process.env.FRONTIERE_KEY,
});
const reply = await client.chat.completions.create({
model: "glm-5.2",
messages: [{ role: "user", content: "Bonjour" }],
});
console.log(reply.choices[0].message.content);Essayer un modèle sans écrire de code
Votre espace client contient une console : une fenêtre de discussion sur le même catalogue, par le même routage UE, au même prix au token. Elle sert à répondre à « quel modèle, avec quel prompt système et quels paramètres ? » avant de câbler quoi que ce soit — chaque réponse affiche le modèle, le nombre de tokens et le montant exact débité.
Une fois qu'un prompt se comporte comme vous voulez, la console traduit le modèle, les paramètres et le prompt courants en un appel curl, Python ou JavaScript prêt à coller contre cette API. Les conversations restent dans votre navigateur, pas sur nos serveurs, tant que vous ne synchronisez pas explicitement un fil sur votre compte.
Chat completions
https://getfrontiereai.eu/api/v1/chat/completionsEnvoyez une conversation, recevez la réponse du modèle. Champs du corps de requête :
| Champ | Type | Description |
|---|---|---|
model | string — requis | Un identifiant de modèle en ligne du catalogue, ex. glm-5.2 (voir Modèles ci-dessous). |
messages | array — requis | La conversation : une liste d'objets {role, content} avec les rôles system, user et assistant, au format OpenAI. |
stream | boolean | true streame la réponse en server-sent events (voir Streaming). |
max_tokens | integer | Plafond de tokens de complétion. Sur les modèles de raisonnement, la réflexion compte dedans — omettez-le ou prévoyez au moins ~1 000 (voir Modèles de raisonnement). |
temperature, top_p, stop, … | divers | Paramètres d'échantillonnage OpenAI standard, transmis tels quels au provider qui sert le modèle. |
Le corps de la requête est transmis au provider qui héberge le modèle : les paramètres OpenAI standard se comportent exactement comme documentés par OpenAI. Les champs qu'un provider donné ne supporte pas sont ignorés par ce provider.
La réponse est un objet chat.completion standard. Le bloc usage est ce qui est décompté de votre solde — au token près, tokens de raisonnement inclus sur les modèles de raisonnement :
{
"id": "chatcmpl-…",
"object": "chat.completion",
"model": "glm-5.2",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Bonjour ! Comment puis-je aider ?" },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 9, "completion_tokens": 42, "total_tokens": 51 }
}Streaming
Passez "stream": true et la réponse arrive en server-sent events — des chunks data: portant le delta incrémental, terminés par data: [DONE]. C'est le même format que chez OpenAI : les helpers de streaming des SDK fonctionnent tels quels.
stream = client.chat.completions.create(
model="llama-3.3-70b",
messages=[{"role": "user", "content": "Bonjour"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")Frontière AI active toujours stream_options.include_usage en amont : le dernier chunk data avant [DONE] porte l'objet usage (et un tableau choices vide). C'est ce chunk qui permet de facturer exactement les appels streamés — ne soyez pas surpris de le voir si vous parsez le flux à la main.
Modèles
https://getfrontiereai.eu/api/v1/modelsLe catalogue est servi en direct par GET /api/v1/models — public, aucune clé requise. Il ne liste que les modèles en ligne : ce que vous y découvrez est appelable immédiatement ; ajoutez ?include=all pour obtenir aussi les entrées « coming soon ». Chaque entrée porte les champs OpenAI (id, object, created, owned_by), context_length et pricing (prix client en euros par million de tokens, en entrée et en sortie) quand ils sont vérifiés, plus quatre champs propres à Frontière AI : status ("live" ou "coming-soon"), sovereign (booléen), tool_calling (booléen, présent uniquement là où nous l'avons mesuré par un appel réel — filtrez dessus avant de bâtir un agent) et note (avertissement d'usage, quand il y en a un).
{
"object": "list",
"data": [
{
"id": "glm-5.2",
"object": "model",
"created": 1786022547,
"owned_by": "Zhipu / Z.ai",
"label": "GLM-5.2 (Zhipu/Z.ai)",
"provider": "scaleway",
"status": "live",
"sovereign": true,
"tool_calling": true,
"pricing": {
"currency": "EUR",
"input_per_million": 2.52,
"output_per_million": 7.7
},
"note": "Reasoning model — thinks before answering. Omit max_tokens or allow at least ~1,000."
}
]
}sovereign: true signifie que la société qui exploite l'infrastructure n'a aucun contrôle capitalistique ou juridictionnel non-UE (principe SecNumCloud) — OVHcloud, Scaleway, ou serveurs UE dédiés. Les modèles servis via une infrastructure américaine (même en région UE) sont étiquetés accès rapide, jamais souverain — vous filtrez à chaque appel, en toute connaissance de cause.
| Modèle | Identifiant model | Hébergement | Statut |
|---|---|---|---|
| Qwen3 235B (instruct) | qwen3-235b | Souverain UE | live |
| Qwen3.5 397B (multimodal) | qwen3.5-397b | Souverain UE | live |
| GLM-5.2 (Zhipu/Z.ai) | glm-5.2 | Souverain UE | live |
| DeepSeek V4 Flash 0731 (1M contexte) | deepseek-v4-flash-0731 | Souverain UE | live |
| Llama 3.3 70B | llama-3.3-70b | Souverain UE | live |
| Qwen3.6 27B (multimodal) | qwen3.6-27b | Souverain UE | live |
| Qwen3.5 9B (rapide, économique) | qwen3.5-9b | Souverain UE | live |
| Qwen3 32B | qwen3-32b | Souverain UE | live |
| Qwen3 Coder 30B | qwen3-coder-30b | Souverain UE | live |
| Qwen2.5-VL 72B (vision) | qwen2.5-vl-72b | Souverain UE | live |
| GPT-OSS 120B (OpenAI) | gpt-oss-120b | Souverain UE | live |
| GPT-OSS 20B (OpenAI) | gpt-oss-20b | Souverain UE | live |
| Mistral Small 3.2 24B | mistral-small-3.2-24b | Souverain UE | live |
| Kimi K3 (2,8T paramètres, 1M contexte) | kimi-k3 | Accès rapide (US) | live |
| Kimi K3 — variante souveraine UE | kimi-k3-souverain | Souverain UE | Bientôt disponible |
| Muse Spark 1.1 (1M contexte) | muse-spark-1.1 | Accès rapide (US) | live |
| Muse Spark 1.2 (1M contexte) | muse-spark-1.2 | Accès rapide (US) | live |
| GLM-5.3 Flash (Zhipu/Z.ai) | glm-5.3-flash | Accès rapide (US) | live |
| Qwen3.8 Max (2,4T, 1M contexte) | qwen3.8-max | Accès rapide (US) | live |
| Qwen3.8 27B (multimodal) | qwen3.8-27b | Souverain UE | live |
| Qwen3.8 Flash (Qwen) | qwen3.8-flash | Accès rapide (US) | live |
| DeepSeek R1 (671B MoE) | deepseek-r1 | Accès rapide (US) | live |
| DeepSeek V4 Pro (345B MoE) | deepseek-v4-pro | Accès rapide (US) | live |
| DeepSeek R1 (Distill Qwen 32B) | deepseek-r1-distill-qwen-32b | Accès rapide (US) | live |
| DeepSeek R1 (Distill Qwen 14B) | deepseek-r1-distill-qwen-14b | Accès rapide (US) | live |
| GLM-5.3 (Zhipu/Z.ai) | glm-5.3 | Accès rapide (US) | live |
| Gemma 3 27B (Google) | gemma-3-27b | Accès rapide (US) | live |
| DeepSeek V4.1 Flash (552B MoE, 1M contexte) | deepseek-v4.1-flash | Accès rapide (US) | live |
Notes par modèle
glm-5.2— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.deepseek-v4-flash-0731— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.qwen2.5-vl-72b— Modèle de vision — son provider refuse les appels d'outils par une 400 : il ne peut pas servir d'agent. À utiliser pour l'analyse d'images, pas pour le function calling.kimi-k3— Modèle de raisonnement. Le premier appel après une période d'inactivité peut prendre quelques minutes de préchauffage — ensuite il répond en quelques secondes.muse-spark-1.1— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.muse-spark-1.2— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.glm-5.3-flash— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.qwen3.8-27b— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.deepseek-r1— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.deepseek-r1-distill-qwen-32b— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.deepseek-r1-distill-qwen-14b— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.glm-5.3— Modèle de raisonnement — réfléchit avant de répondre. Omettez max_tokens ou prévoyez au moins ~1 000.deepseek-v4.1-flash— Modèle multimodal de raisonnement (texte + images). Le premier appel après une période d'inactivité peut prendre du temps de préchauffage. Omettez max_tokens ou prévoyez une large marge pour le raisonnement.
Les prix au token de chaque modèle en ligne sont listés sur le catalogue de modèles. Appeler un modèle « coming soon » renvoie HTTP 409 — et enregistre votre intérêt : demander un modèle est la meilleure façon de voter pour sa priorité. Un identifiant inconnu renvoie 404 avec un renvoi vers le catalogue.
Erreurs
Les erreurs sont en JSON, au format OpenAI — un objet error avec un message lisible et un type stable sur lequel brancher votre code :
{
"error": {
"message": "Insufficient credit balance. Top up your account from the dashboard.",
"type": "insufficient_credit"
}
}| Statut | type | Signification |
|---|---|---|
| 400 | invalid_request | Le corps n'est pas du JSON valide ou le champ model manque. |
| 401 | invalid_api_key | Clé API absente, malformée ou révoquée dans l'en-tête Authorization. |
| 402 | insufficient_credit | Votre solde prépayé est à zéro. Rechargez depuis le dashboard pour reprendre. |
| 404 | model_not_found | L'identifiant de modèle n'est pas au catalogue — listez les identifiants valides via GET /api/v1/models. |
| 409 | model_not_live | Le modèle existe mais est encore « coming soon ». Choisissez un modèle en ligne. |
| 502 | upstream_error | Le provider a renvoyé une réponse illisible. Réessayez ; signalez-le si ça persiste. |
| 503 | provider_not_configured | Aucun identifiant provider pour ce modèle sur cette instance. |
Les erreurs côté provider (rate limit, modèle surchargé, paramètre invalide pour ce provider) sont relayées telles quelles, avec leur statut et leur corps d'origine — ce que vous obtiendriez en appelant le provider directement.
Crédit & facturation
Frontière AI est prépayé : vous rechargez un solde (dès 10 €, via Stripe, dans le dashboard) et chaque appel réussi le décrémente. Pas d'abonnement, pas de carte enregistrée, pas de facture en fin de mois — quand le solde atteint zéro, les appels renvoient 402 et rien d'autre ne se passe.
La facturation est exacte au token, calculée depuis l'objet usage que le provider rapporte pour votre appel : les prompt tokens au tarif input du modèle, les completion tokens (tokens de raisonnement inclus) au tarif output. Quand un provider sert une partie de votre prompt depuis son cache et le rapporte (usage.prompt_tokens_details.cached_tokens), ces tokens sont facturés au tarif cache du modèle, moins cher.
Votre dashboard affiche le solde, l'historique de facturation par appel (tokens in/out et prix de chaque appel) et l'historique des recharges. Le prix de chaque appel est débité au moment où le provider renvoie son usage — appels streamés compris, via le chunk usage final.
Modèles de raisonnement
glm-5.2 et kimi-k3 réfléchissent avant de répondre : cette réflexion consomme des tokens de complétion (facturés en output) avant qu'aucun texte visible ne soit produit. Avec un max_tokens trop petit, tout le budget peut partir en raisonnement — la réponse revient alors avec content: null et finish_reason « length », ce qui ressemble à une réponse vide. Omettez max_tokens ou prévoyez au moins ~1 000.
kimi-k3 tourne en plus à l'échelle zéro entre deux usages : le premier appel après une période d'inactivité peut prendre quelques minutes de préchauffage, ensuite il répond en quelques secondes. Il est servi via une infrastructure américaine et étiqueté accès rapide — vérifiez le champ sovereign si la juridiction compte pour votre usage.
Le raisonnement prend aussi du temps horloge : sur un prompt substantiel, glm-5.2 peut réfléchir plusieurs minutes avant que la réponse complète soit prête. Réglez généreusement le timeout de votre client HTTP (beaucoup d'outils coupent bien avant la minute — le module HTTP de Make.com, par exemple, coupe à 40 secondes si vous ne l'augmentez pas), ou mieux, utilisez le streaming : le premier chunk arrive en moins d'une seconde et la connexion reste active pendant toute la génération.
Embeddings
POST /api/v1/embeddings transforme du texte en vecteurs, avec la même authentification et la même facturation prépayée que le chat. Le corps de requête suit celui d'OpenAI : model, et input sous forme de chaîne ou de tableau de chaînes. La réponse est un objet de type list dont data porte un embedding par entrée, dans l'ordre d'envoi.
curl https://getfrontiereai.eu/api/v1/embeddings \
-H "Authorization: Bearer $FRONTIERE_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bge-m3",
"input": ["Premier document", "Second document"]
}'Les modèles d'embedding forment leur propre catalogue — un modèle de chat envoyé ici répond 404, et un modèle d'embedding envoyé à /chat/completions aussi. GET /api/v1/models?kind=embedding ne rend que les valides ; chaque entrée du catalogue porte par ailleurs un champ kind ("chat" ou "embedding"), de quoi les distinguer en un seul appel.
| Modèle | Dimensions | Contexte |
|---|---|---|
bge-m3 | 1024 | 8192 |
bge-multilingual-gemma2 | 3584 | 8192 |
qwen3-embedding-8b | 4096 | 40960 |
Choisissez d'abord selon dimensions : la longueur du vecteur fait partie de votre schéma de stockage, et changer de modèle plus tard oblige à recalculer tous les vecteurs conservés. La facturation ne compte que les tokens d'entrée — un embedding ne produit aucun token de sortie, il n'y a donc pas de tarif de sortie.
Serveur MCP
Frontière AI expose un endpoint Model Context Protocol (MCP) qui donne aux agents IA (Claude Code, Codex, Cursor, Roo Code, Continue, etc.) un accès programmatique complet à l'API Frontière AI. Tout client compatible MCP se connecte avec une seule URL et peut parcourir le catalogue, lancer de l'inférence, créer des embeddings et vérifier le solde du compte — le tout en JSON-RPC 2.0 standard.
Connectez le client MCP de votre agent à l'URL de l'endpoint ci-dessous. L'endpoint utilise un HTTP stateless : chaque requête POST est un appel JSON-RPC 2.0 autonome avec une réponse synchrone — pas de flux SSE, pas d'état de session. L'authentification se fait en envoyant votre clé API dans l'en-tête Authorization de chaque requête (ex. Authorization: Bearer sk-front-...). Les outils de lecture (requêtes catalogue) fonctionnent sans clé ; les outils d'inférence et de solde en exigent une.
Le serveur MCP expose huit outils : trois pour la découverte du catalogue (list_models, get_model, search_models — aucune authentification requise) et cinq pour les opérations authentifiées (chat_completion relaie une requête de chat vers la gateway avec facturation au token, create_embedding génère des vecteurs à partir de texte, check_balance renvoie votre solde de crédit actuel, et web_search / web_fetch donnent à l'agent un accès web live via un provider de recherche UE). Une page dédiée détaille l'installation et chaque outil.
https://getfrontiereai.eu/api/mcpTransport: POST with application/json — JSON-RPC 2.0, stateless (no SSE, no sessions).
Available tools
| Tool | Description |
|---|---|
list_models | Lister tous les modèles avec filtres optionnels : filter (live/coming-soon/sovereign), provider, kind (chat/embedding), includeComingSoon |
get_model | Obtenir les détails d'un modèle par son slug : tarification, vendeur, licence, paramètres, souveraineté, données de conformité |
search_models | Rechercher des modèles par mot-clé dans slug, nom, vendeur, provider et modalité |
chat_completion | Exécuter de l'inférence sur tout modèle en ligne. Supporte temperature, max_tokens, tool calling. Facturation au token (mêmes tarifs que l'API REST) |
create_embedding | Générer des embeddings de texte pour RAG/recherche sémantique. Supporte chaîne ou tableau en entrée. Facturation au token |
check_balance | Vérifier le solde de crédit prépayé actuel en EUR (aucun paramètre requis) |
web_search | Recherche web live (Linkup, UE) renvoyant jusqu'à 8 résultats avec le texte complet de chaque page — couvert par notre quota de recherche, non débité sur votre solde |
web_fetch | Lire une page web en markdown propre (Linkup, UE) — pour approfondir l'URL d'un résultat de recherche |
Intégrations
Tout ce qui parle le protocole OpenAI fonctionne en changeant la base URL et la clé — SDK, LangChain, frameworks d'agents, outils no-code. Certaines plateformes demandent quelques étapes spécifiques, et les agents exigent en plus l'appel d'outils, que nous avons mesuré modèle par modèle :
Intégrations : plateformes d'agents, matrice d'appel d'outils, limites connues →
FAQ
Puis-je essayer un modèle sans écrire de code ?
Oui — votre espace client contient une console web qui interroge le même catalogue, par le même routage UE, au même prix au token que l'API. Elle sert à arrêter un modèle, un prompt système et des paramètres, puis à générer l'appel curl, Python ou JavaScript correspondant. Les conversations restent dans votre navigateur tant que vous ne synchronisez pas explicitement un fil sur votre compte.
Puis-je utiliser le SDK OpenAI officiel ?
Oui. L'API implémente le contrat chat-completions d'OpenAI : pointez base_url vers l'API Frontière AI et passez votre clé en api_key — les SDK officiels Python et JavaScript, et les outils construits dessus, fonctionnent tels quels.
Que se passe-t-il quand mon crédit atteint zéro ?
Les appels renvoient HTTP 402 (insufficient_credit) et ne sont plus servis. Rien d'autre ne se passe — pas de découvert, pas de prélèvement automatique. Rechargez depuis le dashboard pour reprendre.
Comment savoir si un modèle est souverain UE ?
Chaque modèle porte un booléen sovereign dans GET /api/v1/models et un badge sur le catalogue. sovereign: true signifie aucun contrôle capitalistique ou juridictionnel non-UE sur l'opérateur (principe SecNumCloud) ; les modèles servis via une infrastructure américaine sont toujours étiquetés accès rapide, jamais souverain.
Pourquoi ma réponse est-elle revenue vide ?
Vous avez probablement appelé un modèle de raisonnement (glm-5.2, kimi-k3) avec un max_tokens trop petit : tout le budget est parti en réflexion et content est revenu null avec finish_reason « length ». Omettez max_tokens ou prévoyez au moins ~1 000.
Prêt pour votre premier appel ?
Créez un compte, rechargez dès 10 €, collez deux lignes — tout le catalogue derrière une seule clé.
Créer un compte