API développeur

Vos scripts, nos modèles.

Une clé, un endpoint compatible avec les clients OpenAI existants, et votre solde de Vena Tokens comme unique unité de facturation. Incluse aux paliers Pro et Expert.

En trois minutes

Ce qu'il faut savoir avant d'écrire une ligne.

Il faut un palier Pro ou Expert
La clé est incluse à partir de Pro. Un compte gratuit ou Starter reçoit 403 PREMIUM_REQUIRED, à la création comme à l'appel.
Les appels débitent VOTRE portefeuille
Chaque appel consomme des Vena Tokens sur le solde du propriétaire de la clé, aux mêmes multiplicateurs que le chat. Rien n'est facturé séparément.
Le secret ne s'affiche qu'une fois
Nous n'en stockons que l'empreinte : nous sommes techniquement incapables de vous la réafficher. Perdue, une clé se remplace par une rotation.
Une clé exposée est bornée, pas illimitée
Cadence par clé, coupe-circuit sur le volume et sur la dépense. Au-delà, la clé se désactive seule et vous recevez un e-mail.
Authentification

Un en-tête, et rien d'autre.

La clé se présente dans l'en-tête HTTP Authorization, en schéma Bearer. Aucun autre canal n'est accepté.

Exemple d'en-tête
Authorization: Bearer vena_sk_VOTRE_CLE

Quatre règles, et elles sont toutes de sécurité

  • Jamais dans une URL. Un paramètre de requête se retrouve dans les journaux d'accès du serveur, dans ceux du proxy, dans l'en-tête Referer et dans l'historique du navigateur. Nous refusons ce mode d'authentification : il répond 401.
  • Jamais dans du JavaScript de navigateur. L'API ne publie aucune configuration CORS, précisément pour empêcher cet usage : une clé dans une page web est une clé publiée.
  • Une clé par environnement. 5 clés actives par compte : de quoi séparer production, recette et poste de développement, et couper l'une sans couper les autres.
  • La révocation est immédiate. Elle prend effet à l'appel suivant, sans délai de propagation ni cache.
Endpoints

Deux routes, et c'est tout.

URL de basehttps://api.venalabs.example/api/ai/v1
Endpoints
MéthodeCheminRôlePortée requise
GET/api/ai/v1/modelsLe catalogue des modèles, avec la classe, le multiplicateur et les poids appliqués. Aucun coût : c'est la route qui sert à estimer avant d'appeler.MODELS
POST/api/ai/v1/chat/completionsUne complétion, streamée ou non selon le champ stream. C'est la seule route qui dépense.CHAT
Premier appel

Copiez, collez, exécutez.

Le format d'entrée est celui des clients OpenAI : la plupart des SDK existants fonctionnent en changeant l'URL de base et la clé.

curl
curl https://api.venalabs.example/api/ai/v1/chat/completions \
  -H "Authorization: Bearer vena_sk_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "vena-eco",
    "messages": [{"role": "user", "content": "Résume ce texte en trois points."}],
    "max_tokens": 500
  }'
Réponse

Deux comptabilités, servies ensemble.

Le bloc usage porte les tokens du MODÈLE (ceux que tout client OpenAI sait déjà lire) et, préfixés vena_, ce qui a réellement été prélevé sur votre portefeuille. Les deux nombres diffèrent d'un facteur 1 à 80 selon la classe : les confondre est ce qui produit une facture surprise.

200 OK
{
  "id": "3f2a1c8e-…",
  "object": "chat.completion",
  "model": "vena-eco",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "…" },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 412,
    "completion_tokens": 168,
    "total_tokens": 580,
    "vena_tokens_charged": 271,
    "vena_model_class": "ECO",
    "vena_multiplier": 1,
    "vena_balance_after": 7999729,
    "vena_usage_missing": false
  }
}

Les champs qui nous sont propres

  • vena_tokens_charged — Vena Tokens réellement débités, multiplicateur appliqué. C'est le nombre qui compte.
  • vena_model_class — la classe appliquée (ECO, STANDARD, ADVANCED, FRONTIER).
  • vena_multiplier — le multiplicateur en vigueur au moment du devis.
  • vena_balance_after — votre solde utilisable après ce débit, pour tenir un compteur sans second appel.
  • vena_usage_missing — vrai si notre passerelle n'a pas pu confirmer la consommation et que le débit repose sur un repli. Ces mouvements sont identifiés et remboursables.

Champs d'entrée pris en compte

model, messages, max_tokens et stream. Tout autre champ est ignoré en silence : nous préférons l'ignorer que le déclarer sans l'honorer — régler une température qui ne changerait rien serait pire qu'une absence.

Streaming

Des lignes data:, puis [DONE].

Avec stream à true, la réponse arrive en Server-Sent Events, au protocole des SDK OpenAI : des fragments data: sans nom d'événement, un fragment final portant finish_reason et le bloc usage complet, puis la sentinelle data: [DONE].

text/event-stream
data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"}}]}

data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Trois "}}]}

data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"vena_tokens_charged":271,"vena_balance_after":7999729}}

data: [DONE]

Un commentaire de maintien de connexion (: hb) est envoyé toutes les 200 ms. Les clients SSE l'ignorent ; il est indispensable derrière un proxy, qui coupe une connexion inactive au bout de 30 à 60 secondes.

Si vous coupez la connexion en cours de génération, vous êtes débité de ce que le modèle a réellement produit — pas de ce que vous avez reçu, pas de la réservation. Les deux autres bases de calcul sont fausses, l'une dans un sens, l'autre dans l'autre.

Ce que ça coûte

Estimez votre facture avant le premier appel.

Un appel ne coûte pas un nombre de tokens : il coûte un nombre de Vena Tokens, qui dépend de la classe du modèle. Voici tout ce qu'il faut pour le calculer vous-même.

La formule, en entier

coût = plafond_supérieur( (tokens_entrée × 0,25 + tokens_sortie × 1,0) × multiplicateur )

L'arrondi supérieur est appliqué une seule fois, en bout de formule. La sortie pèse quatre fois l'entrée, ce qui reflète le rapport des prix fournisseurs. Les tokens de raisonnement comptent en sortie ; ceux servis depuis un cache comptent en entrée.

Les multiplicateurs par classe

ECO
×1
STANDARD
×5
ADVANCED
×25
FRONTIER
×80

Modifiables par l'administration. Une modification s'applique au prochain devis, jamais rétroactivement : chaque mouvement de votre journal fige les poids et le multiplicateur qui lui ont été appliqués. La route /models sert toujours les valeurs en vigueur.

Un exemple concret

Un appel de 2 000 tokens d'entrée et 800 tokens de sortie coûte 1 300 Vena Tokens en classe Éco, 6 500 en Standard, 32 500 en Avancé et 104 000 en Frontier. Sur le quota mensuel Pro (8 M), cela représente environ 6 150 appels en Éco, ou 77 en Frontier.

Ordres de grandeur, arrondis, donnés à titre indicatif : votre consommation réelle dépend de la longueur de vos échanges. Seul le champ vena_tokens_charged de chaque réponse fait foi.

Dans quel ordre vos tokens sont consommés

Votre solde se compose de trois poches : les tokens gagnés en terminant des cours, le quota mensuel de votre abonnement, et les recharges achetées. La consommation se fait par date d'expiration croissante — la poche qui expire le plus tôt part la première.

Cet ordre est le seul qui ne vous soit jamais défavorable : on ne laisse jamais expirer des tokens qu'on aurait pu consommer.

Les recharges achetées sont valables 365 jours et les tokens gagnés en cours 90 jours. Le quota mensuel de l'abonnement expire à la fin de la période, sans report.

Plafonds par requête

Un appel d'abonné est plafonné à 8 000 tokens de sortie. Ce plafond borne le coût du pire appel : il vous protège d'une génération qui part en boucle, et nous d'une facture fournisseur imprévisible. Un max_tokens supérieur est accepté puis ramené à ce plafond.

Limites et garde-fous

Ce qui arrête une clé fuitée.

Votre solde borne la dépense totale, jamais le débit. Une clé publiée par erreur dans un dépôt Git respecterait parfaitement votre quota tout en le vidant en une nuit. Trois garde-fous s'en chargent.

Cadence par clé — 60 appels/minute

Au-delà, 429 RATE_LIMITED avec un en-tête Retry-After. La clé reste vivante : ralentir n'est pas condamner. Un client correct recule au premier refus.

Cadence par compte — 30 appels/minute

Elle s'applique à tout ce que le compte consomme, chat compris. Posséder cinq clés ne multiplie donc pas le débit autorisé : c'est ce plafond-là qui fait foi.

Coupe-circuit — la clé se désactive seule

Sur une fenêtre de 10 minutes, trois signaux sont surveillés et un seul suffit : le volume d'appels, l'entêtement après refus, et surtout la dépense. Au-delà, la clé passe en SUSPENDED, les appels suivants reçoivent 401, et vous recevez un e-mail nommant la clé concernée et le motif.

Une clé désactivée ne se réactive pas. Si son secret circule, le réactiver rouvrirait la porte : la réponse correcte est une rotation, qui produit un nouveau secret et tue l'ancien.

Codes d'erreur

Ce que vous recevez, et pourquoi.

Les erreurs sont au format VenaLabs, pas au format OpenAI : {code, message, details}. C'est délibéré — un refus pour solde insuffisant doit se distinguer sans ambiguïté d'un incident quelconque, et le format OpenAI ne connaît pas cette notion.

Codes d'erreur
StatutCodeQuandQue faire
400VALIDATION_ERRORCorps de requête invalide. details porte un message par champ.Corrigez le champ signalé.
400MODEL_UNKNOWNModèle inexistant ou retiré du catalogue.Relisez /models : c'est la seule liste qui fasse foi.
401API_KEY_INVALIDClé inconnue, révoquée, désactivée ou hors portée. Les quatre cas renvoient exactement la même réponse.Vérifiez la clé, puis créez-en une nouvelle depuis vos réglages.
402INSUFFICIENT_TOKENSLe solde ne couvre pas le devis de cet appel. Rien n'est appelé, rien n'est débité.Achetez une recharge, ou attendez le renouvellement de votre quota.
402QUOTA_EXCEEDEDUn plafond d'offre est atteint.Consultez details pour la limite concernée et la date de réinitialisation.
403PREMIUM_REQUIREDLe palier du compte n'ouvre plus l'API développeur.Reprenez un abonnement Pro ou Expert. Les clés existantes redeviennent utilisables aussitôt.
403MODEL_NOT_ALLOWEDLa classe demandée n'est pas ouverte au palier du compte.Changez de classe, ou changez de palier.
413CONTEXT_TOO_LARGELa conversation dépasse la fenêtre de contexte du modèle.Raccourcissez l'historique, ou choisissez un modèle à plus grand contexte.
429RATE_LIMITEDCadence dépassée, ou coupe-circuit déclenché. details.keyDisabled vaut true dans le second cas.Respectez Retry-After. Si la clé a été désactivée, faites une rotation.
503AI_UNAVAILABLELa passerelle d'inférence est momentanément indisponible.Réessayez. Rien n'a été débité : un appel qui n'a pas abouti est intégralement rendu.
Ce que cette API ne fait pas

Les limites, dites tout de suite.

  • Un seul choix par appel : le champ n n'est pas supporté.
  • Ni outils, ni appels de fonctions, ni sorties structurées : le champ tools est ignoré.
  • Ni images, ni fichiers en entrée : messages ne prend que du texte.
  • Ni température, ni top_p : ces réglages ne sont pas exposés tant qu'ils ne sont pas honorés.
  • Les identifiants de modèles sont des identifiants VenaLabs. Ils ne nomment pas de fournisseur.