API BestPrivateAI — référence
Un endpoint compatible OpenAI, un modèle, une clé. Si votre code parle déjà à /v1/chat/completions, changez l'URL de base et la clé, et il nous parlera.
URL de base et authentification
Base URL: https://api.bestprivateai.com/v1
Header: Authorization: Bearer sk-…
Les clés sont créées sur la page des clés. Une clé n'est affichée qu'une fois, à la création ; nous stockons un hash et ses six derniers caractères. Envoyez-la uniquement en HTTPS et uniquement dans l'en-tête Authorization — jamais dans une URL.
Tout est en JSON (Content-Type: application/json). Les réponses utilisent le schéma d'OpenAI, si bien que les SDKs officiels openai et tout client compatible OpenAI fonctionnent sans modification.
Modèles
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
Il n'y a qu'un modèle, notrack-uncensored : notre propre variante, servie sur notre propre matériel. Ce que vous passez comme model y est routé ; utilisez l'id public pour que vos journaux correspondent aux nôtres.
Chat completions
POST /v1/chat/completions
{
"model": "notrack-uncensored",
"messages": [
{ "role": "system", "content": "You are Mira, a wry bartender in 1920s Berlin." },
{ "role": "user", "content": "Evening. What's good tonight?" }
],
"max_tokens": 400,
"temperature": 0.9
}
Réponse — la forme standard, avec de vrais comptages de tokens dans usage (c'est ce sur quoi vous êtes facturé) :
{
"id": "chatcmpl-…", "object": "chat.completion", "model": "notrack-uncensored",
"choices": [ { "index": 0, "finish_reason": "stop",
"message": { "role": "assistant", "content": "…" } } ],
"usage": { "prompt_tokens": 41, "completion_tokens": 118, "total_tokens": 159 }
}
Votre system prompt régit la conversation. Nous ajoutons exactement une ligne en préambule — l'identité du modèle (qu'il s'agit de notrack-uncensored, fait par BestPrivateAI) — et rien d'autre : aucune règle, aucun filtre de sujet. Votre message système la suit et décide de la persona, du style et de tout le reste. La seule exception se trouve dans Politique de contenu.
Streaming
Définissez "stream": true et lisez les server-sent events, exactement comme avec OpenAI. Le dernier fragment porte usage (nous l'incluons toujours, que vous demandiez stream_options ou non), puis data: [DONE].
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Ev"}}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"ening"}}]}
…
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":41,"completion_tokens":118,"total_tokens":159}}
data: [DONE]
Paramètres
| Champ | Notes |
|---|---|
messages | Obligatoire. Rôles system, user, assistant. Texte uniquement pour l'instant — les parties image sont rejetées. |
model | Utilisez notrack-uncensored. |
stream | true pour le SSE. stream_options.include_usage est toujours actif. |
max_tokens | Plafond sur la completion. Le prompt + la completion doivent tenir dans la fenêtre de 64,000 tokens. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | Transmis au modèle comme chez OpenAI. Si vous n'envoyez pas de temperature, nous utilisons 0,85, comme pour notre chat. n > 1 multiplie le coût de sortie. |
tools, tool_choice | Pris en charge : auto, none, required, ou une fonction nommée. La réponse porte tool_calls et finish_reason: "tool_calls" ; renvoyez le résultat sous forme de message role: "tool". Avec des tools présents, une réponse en streaming arrive comme un fragment par appel plutôt que token par token. |
response_format | {"type": "json_object"} est pris en charge (indiquez dans le prompt le JSON souhaité). json_schema et le champ historique functions ne le sont pas. |
Limites et en-têtes de réponse
| Limite | Valeur | En cas de dépassement |
|---|---|---|
| Requêtes simultanées par clé | 8 | 429 concurrency |
| Requêtes par minute par clé | 300 | 429 rate_limit |
| Fenêtre de contexte (prompt + completion) | 64,000 tokens | 400 context_limit — réduisez l'historique et réessayez |
| Dépense quotidienne par clé (facultatif) | définie par vous sur la page des clés | 402 key_daily_cap jusqu'à 00:00 UTC |
Toute réponse réussie porte :
| En-tête | Signification |
|---|---|
X-Request-Id | Citez-le en écrivant au support ; c'est la seule chose que nous conservons d'une requête. |
X-NoTrack-Balance-USD | Votre crédit avant que cette requête soit facturée, en dollars. |
X-RateLimit-Limit-Requests | Requêtes par minute autorisées pour cette clé. |
X-RateLimit-Limit-Concurrency | Requêtes parallèles autorisées pour cette clé. |
X-NoTrack-Content-Flag | Uniquement en cas de refus de contenu : minor_in_sexual_context ou child_safety. |
Erreurs
Les erreurs sont en JSON avec un type stable ; le message est destiné aux humains et peut changer.
{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
| HTTP | type | Que faire |
|---|---|---|
| 400 | body | JSON invalide ou messages absent. |
| 400 | context_limit | Prompt trop long pour la fenêtre de 64,000 tokens. Supprimez les échanges les plus anciens. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | La scène se lit comme sexuelle et un personnage se lit comme mineur. Rendez les personnages sans ambiguïté adultes et renvoyez ; non facturé. |
| 401 | auth, invalid_key, key_revoked, key_expired | Corrigez ou remplacez la clé. |
| 402 | no_credit | Le solde est à zéro. Recharger ; les requêtes reprennent immédiatement. |
| 402 | key_daily_cap | Cette clé a atteint le plafond quotidien que vous avez fixé. Augmentez-le ou attendez 00:00 UTC. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | Refusé et non facturé. Voir Politique de contenu. |
| 429 | rate_limit, concurrency | Ralentissez et réessayez ; respectez les deux en-têtes X-RateLimit-*. |
| 502 | upstream | Le modèle n'a pas répondu. Réessayez avec un backoff ; non facturé. |
| 503 | billing, safety | Une de nos dépendances est en panne. Réessayez dans quelques secondes ; non facturé. |
Facturation
Crédit prépayé, facturé par token à partir du usage réel de chaque réponse : $0.25 par 1M de tokens en entrée, $1.00 par 1M de tokens en sortie. L'entrée, c'est tout ce que vous envoyez (system prompt, historique, le nouveau message) ; la sortie, c'est ce que le modèle écrit.
- Votre première clé est fournie avec $0.50 de crédit gratuit, valable 7 jours — suffisant pour intégrer et tester. Un e-mail confirmé est nécessaire pour une clé (c'est là que va l'avis « le crédit s'épuise »). Le crédit payant n'expire jamais.
- Le crédit n'expire pas, il n'y a pas d'abonnement et rien ne se renouvelle seul. Rechargez par carte ou en USDT/USDC sur la page des clés.
- Rien n'est facturé pour les requêtes refusées (
4xx) ni pour celles ayant échoué (5xx). Une requête est facturée une seule fois, après la réponse, en se basant sur sonX-Request-Id. - Le solde s'épuise →
402 no_creditjusqu'à ce que vous rechargiez. Fixez un plafond quotidien sur chaque clé pour qu'une clé compromise ne puisse pas vider le compte. - Les crédits peuvent être remboursés s'ils ne sont pas utilisés dans les 24 heures suivant l'achat, ou être appliqués ultérieurement à un abonnement. Voir Crédits et remboursements.
Persona — modèle nu ou personnage de BestPrivateAI
Chaque clé a un style, choisi sur la page des clés et modifiable à tout moment :
- Brut (par défaut) — votre system prompt est tout le prompt. Nous ajoutons une ligne d'identité et rien d'autre.
- Persona BestPrivateAI — le personnage et le style du chat sur bestprivateai.com : direct, sans filtre, sans moralisation, répond dans la langue de l'utilisateur. Même modèle, même prix, même politique de contenu ; seul le prompt placé avant vos messages change. Votre propre message système la suit toujours et peut l'ajuster.
Une requête peut outrepasser le réglage de la clé, soit avec un champ, soit avec un suffixe de modèle (pour les clients qui ne peuvent définir qu'un nom de modèle) :
{ "model": "notrack-uncensored", "notrack": { "persona": "notrack" }, "messages": [ … ] }
{ "model": "notrack-uncensored:notrack", "messages": [ … ] } // same thing, by model name
{ "model": "notrack-uncensored:bare", "messages": [ … ] } // force the bare model on a persona key
Noms de persona : notrack (le personnage simple), concise, detailed, creative (les mêmes variantes que propose le chat), bare. L'en-tête de réponse X-NoTrack-Persona indique celle qui a été appliquée.
Politique de contenu
Nous n'ajoutons aucun system prompt et n'appliquons aucun filtre de sujet. Fiction adulte, thèmes sombres, langage cru, violence dans la fiction — le modèle répond tel qu'il est écrit. Une règle est appliquée dans le code et ne peut pas être désactivée : tout contenu sexuel impliquant un mineur est refusé.
403 child_safety— la requête recherchait du contenu sexuel impliquant un enfant. Refusé, non facturé, enregistré comme un événement de sécurité.400 minor_in_sexual_context— la scène est sexuelle et un personnage se lit comme ayant moins de 18 ans (âge indiqué, cadre scolaire, tournure « fille/garçon »). Ce n'est pas une interdiction : rendez les âges et le cadre sans ambiguïté adultes et renvoyez.
Des 403 répétés sur une clé entraînent la fermeture de la clé, puis du compte. Le texte complet se trouve dans la politique d'utilisation acceptable.
Confidentialité
Les prompts et les completions ne sont écrits sur aucun disque — ni par la passerelle, ni par les serveurs du modèle. Ce que nous conservons par requête, c'est l'id de la requête, l'id de la clé, les comptages de tokens et le prix, car c'est ce qui compose la facture. Les refus de sécurité sont journalisés par catégorie, sans le texte. Aucun fournisseur de modèle tiers ne voit jamais votre trafic : le modèle s'exécute sur du matériel que nous louons et contrôlons.
Clients et SDKs
Le site BestPrivateAI et l'application BestPrivateAI sont notre propre chat — ils n'ont pas de champ pour une clé API et n'en auront jamais. Une clé est destinée à des programmes externes : collez-la dans l'un des clients ci-dessous, ou dans votre propre code.
Python
from openai import OpenAI
client = OpenAI(base_url="https://api.bestprivateai.com/v1", api_key="sk-…")
stream = client.chat.completions.create(model="notrack-uncensored",
messages=[{"role": "user", "content": "Hello"}], stream=True)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
Node.js
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.bestprivateai.com/v1", apiKey: process.env.API_KEY });
const r = await client.chat.completions.create({ model: "notrack-uncensored",
messages: [{ role: "user", content: "Hello" }] });
console.log(r.choices[0].message.content);
SillyTavern
API Connections → API : Chat Completion → Source : Custom (OpenAI-compatible) → Custom Endpoint https://api.bestprivateai.com/v1 → Custom API Key → Connect → Model notrack-uncensored. Streaming activé. Gardez la taille du contexte à 64,000 tokens ou moins.
Chatbox
Settings → Model Provider → Add → Add Custom Provider, mode OpenAI API Compatible → collez l'URL de base et la clé, puis ajoutez notrack-uncensored comme modèle.
NextChat
Settings → activez Custom Endpoint (compatible OpenAI) → URL de base et clé, puis saisissez le nom du modèle dans le champ modèle.
Cherry Studio
Settings → Model Providers → Add Provider → tapez OpenAI → URL de base et clé, puis « Add model » → notrack-uncensored.
LobeChat
Settings → AI Service Provider → OpenAI → activez custom API endpoint, collez l'URL de base et la clé, et ajoutez le modèle à la liste des modèles.
Tout autre client
LangChain, LlamaIndex, Open WebUI, Continue, les réglages de proxy de JanitorAI, curl — tout client avec une option « compatible OpenAI » ou « URL de base personnalisée ».
Le texte des menus ci-dessus change selon les versions de l'application — si un libellé ne correspond pas exactement, cherchez le réglage qui mentionne « custom », « OpenAI-compatible » ou « base URL ».
Si un client ne se connecte pas
- 401 / « invalid API key » — la clé n'est jamais arrivée. Vérifiez que le client envoie
Authorization: Bearer sk-…avec la clé entière, préfixe inclus. - 404 / endpoint inconnu — les clients ne sont pas d'accord sur l'ajout de
/v1eux-mêmes. Sihttps://api.bestprivateai.com/v1renvoie 404, essayezhttps://api.bestprivateai.comcomme URL de base à la place (ou l'inverse). - « The Responses API is not supported yet » — certains clients plus récents utilisent par défaut la Responses API d'OpenAI. Nous ne servons que Chat Completions ; basculez le client sur ce mode.
- Liste de modèles vide — certains clients ne la remplissent qu'après une vérification de clé valide. Saisissez
notrack-uncensoredà la main. - Rien ne se passe dans un client Ollama / llama.cpp — ceux-ci parlent leur propre protocole, non compatible OpenAI. Utilisez plutôt l'un des clients ci-dessus.
Clés
- Jusqu'à 20 clés actives par compte. Donnez à chaque application sa propre clé et son propre plafond quotidien.
- Date d'expiration facultative ; révoquer une clé l'arrête immédiatement et c'est irréversible — émettez-en une nouvelle à la place.
- La page des clés affiche la dépense par clé, la dernière utilisation et les totaux sur 30 jours du compte.
Des questions, ou un id de requête à examiner : support · bestprivateai.com/support.