Jeton Bearer
Promptix authentifie chaque requête API avec une clé API envoyée dans l'en-tête Authorization, selon le schéma Bearer. Aucun autre en-tête n'est nécessaire ; Content-Type: application/json est requis pour les corps de requête.
Authorization: Bearer sk_your_key_herecurl https://promptix.tn/api/v1/chat/completions \ -H "Authorization: Bearer $PROMPTIX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "openai/gpt-6-luna", "messages": [{"role": "user", "content": "ping"}]}'Les SDK OpenAI, le Vercel AI SDK et LangChain ajoutent cet en-tête pour vous à partir de l'option api_key / apiKey.
Clés API
Créez et gérez vos clés dans Tableau de bord → Clés API.
- Une clé se présente sous la forme
sk_suivi de 64 caractères hexadécimaux. - La clé complète n'est affichée qu'une fois, à sa création. Promptix ne conserve qu'une empreinte SHA-256 et les quatre derniers caractères : une clé perdue ne peut pas être récupérée. Révoquez-la et créez-en une nouvelle.
- Vous pouvez avoir jusqu'à 10 clés par compte. Utilisez-en une par projet ou par environnement (développement, production).
- Toutes les clés d'un compte puisent dans le même solde de crédits. Le tableau de bord indique pour chaque clé sa dernière utilisation, son nombre de requêtes et ses dépenses.
Stockez la clé dans une variable d'environnement plutôt que dans votre code :
export PROMPTIX_API_KEY="sk_your_key_here"Plafonds de dépenses mensuels
Chaque clé peut avoir un plafond mensuel facultatif en TND. Avant chaque requête, Promptix additionne ce que la clé a dépensé depuis le premier jour du mois en cours (UTC). Lorsque ce total atteint le plafond, la requête est refusée avec le code HTTP 402 et rien n'est facturé :
{ "error": { "message": "Monthly spend limit reached for this API key", "type": "insufficient_quota", "code": "key_monthly_limit" }}- La vérification a lieu avant le démarrage de la requête : celle qui franchit le plafond va donc à son terme et est facturée. Le plafond peut être dépassé, au plus, du coût d'une requête.
- La clé fonctionne à nouveau le premier jour du mois suivant, ou dès que vous relevez ou supprimez son plafond.
- Les autres clés du compte ne sont pas concernées.
Fixez un plafond pour chaque clé utilisée par un script, un projet client ou une fonctionnalité publique. Il limite les dégâts d'un bug, d'une boucle ou d'une fuite de clé.
Rotation et révocation des clés
Pour faire tourner une clé, créez-en une nouvelle, déployez-la, puis révoquez l'ancienne depuis le tableau de bord. Une clé révoquée ou désactivée est refusée avec le code 401. La révocation prend effet en une minute environ, car la passerelle garde brièvement en cache les clés validées.
Erreurs d'authentification
Si l'en-tête Authorization est absent ou ne commence pas par Bearer :
{ "error": "Missing or invalid API key"}Si la clé est inconnue, révoquée ou rattachée à un compte désactivé :
{ "error": "Invalid API key or inactive user"}La liste complète figure dans Erreurs et limites.
Protéger vos clés
- Appelez Promptix depuis votre serveur. Ne placez jamais une clé dans une page web, une application mobile ou une extension de navigateur.
- Ne versionnez pas vos clés. Ajoutez
.envà.gitignoreet utilisez le gestionnaire de secrets de votre hébergeur. - Utilisez des clés distinctes par environnement et par projet, chacune avec un plafond mensuel.
- En cas de fuite, révoquez la clé immédiatement dans le tableau de bord.
Un proxy minimal côté serveur, pour que le navigateur ne voie jamais la clé :
// app/api/ask/route.ts (Next.js): the browser calls your route, never Promptix directlyimport OpenAI from 'openai'; const client = new OpenAI({ baseURL: 'https://promptix.tn/api/v1', apiKey: process.env.PROMPTIX_API_KEY, // server-side environment variable}); export async function POST(req: Request) { const { question } = await req.json(); const completion = await client.chat.completions.create({ model: 'openai/gpt-6-luna', messages: [{ role: 'user', content: String(question).slice(0, 4000) }], max_tokens: 500, }); return Response.json({ answer: completion.choices[0].message.content });}