BestPrivateAI API — riferimento
Un endpoint compatibile OpenAI, un modello, una chiave. Se il tuo codice parla già con /v1/chat/completions, cambia l'URL di base e la chiave e parlerà con noi.
URL di base e autenticazione
Base URL: https://api.bestprivateai.com/v1
Header: Authorization: Bearer sk-…
Le chiavi si creano su la pagina delle chiavi. Una chiave viene mostrata una sola volta, alla creazione; noi conserviamo un hash e le sue ultime sei cifre. Inviala solo via HTTPS e solo nell'header Authorization — mai in un URL.
Tutto è JSON (Content-Type: application/json). Le risposte usano lo schema OpenAI, quindi gli SDK ufficiali openai e ogni client compatibile con OpenAI funzionano senza modifiche.
Modelli
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
C'è un solo modello, notrack-uncensored: la nostra versione companion, eseguita sul nostro hardware. Qualunque cosa passi come model viene instradata a esso; usa l'id pubblico affinché i tuoi log corrispondano ai nostri.
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
}
Risposta — la forma standard, con conteggi reali dei token in usage (è su questo che vieni fatturato):
{
"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 }
}
Il tuo system prompt governa la conversazione. Anteponiamo esattamente una riga — l'identità del modello (che è notrack-uncensored, creato da BestPrivateAI) — e nulla altro: nessuna regola, nessun filtro sugli argomenti. Il tuo messaggio di sistema la segue e decide persona, stile e tutto il resto. L'unica eccezione è in Policy sui contenuti.
Streaming
Imposta "stream": true e leggi i server-sent events, esattamente come con OpenAI. L'ultimo chunk contiene usage (lo includiamo sempre, che tu lo richieda o no con stream_options), poi 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]
Parametri
| Campo | Note |
|---|---|
messages | Obbligatorio. Ruoli system, user, assistant. Solo testo per ora — le parti immagine vengono rifiutate. |
model | Usa notrack-uncensored. |
stream | true per SSE. stream_options.include_usage è sempre attivo. |
max_tokens | Limite sulla completion. Prompt + completion devono rientrare nella finestra di 64,000 token. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | Passato al modello come in OpenAI. Se non invii temperature usiamo 0.85, come la nostra chat. n > 1 moltiplica il costo dell'output. |
tools, tool_choice | Supportati: auto, none, required, o una funzione con nome. La risposta contiene tool_calls e finish_reason: "tool_calls"; rinvia il risultato come messaggio role: "tool". Con i tool presenti, una risposta in streaming arriva come un unico chunk per chiamata invece che token per token. |
response_format | {"type": "json_object"} è supportato (indica nel prompt quale JSON vuoi). json_schema e il campo legacy functions non lo sono. |
Limiti e header di risposta
| Limite | Valore | Se superato |
|---|---|---|
| Richieste simultanee per chiave | 8 | 429 concurrency |
| Richieste al minuto per chiave | 300 | 429 rate_limit |
| Finestra di contesto (prompt + completion) | 64,000 token | 400 context_limit — riduci la cronologia e riprova |
| Spesa giornaliera per chiave (opzionale) | impostata da te sulla pagina delle chiavi | 402 key_daily_cap fino alle 00:00 UTC |
Ogni risposta riuscita contiene:
| Header | Significato |
|---|---|
X-Request-Id | Cita questo valore quando scrivi al supporto; è l'unica cosa che conserviamo di una richiesta. |
X-NoTrack-Balance-USD | Il tuo credito prima che questa richiesta è stato addebitato, in dollari. |
X-RateLimit-Limit-Requests | Richieste al minuto consentite per questa chiave. |
X-RateLimit-Limit-Concurrency | Richieste parallele consentite per questa chiave. |
X-NoTrack-Content-Flag | Solo in caso di rifiuto per contenuto: minor_in_sexual_context o child_safety. |
Errori
Gli errori sono JSON con un type stabile; il message è per gli esseri umani e può cambiare.
{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
| HTTP | type | Cosa fare |
|---|---|---|
| 400 | body | JSON non valido o messages assente. |
| 400 | context_limit | Prompt troppo lungo per la finestra di 64,000 token. Rimuovi i turni più vecchi. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | La scena si legge come sessuale e un personaggio si legge come minorenne. Rendi i personaggi inequivocabilmente adulti e rinvia; non fatturato. |
| 401 | auth, invalid_key, key_revoked, key_expired | Correggi o sostituisci la chiave. |
| 402 | no_credit | Il saldo è zero. Ricarica; le richieste riprendono immediatamente. |
| 402 | key_daily_cap | Questa chiave ha raggiunto il tetto giornaliero che hai impostato. Alzalo o attendi le 00:00 UTC. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | Rifiutato e non fatturato. Vedi Policy sui contenuti. |
| 429 | rate_limit, concurrency | Rallenta e riprova; rispetta i due header X-RateLimit-*. |
| 502 | upstream | Il modello non ha risposto. Riprova con backoff; non fatturato. |
| 503 | billing, safety | Una nostra dipendenza è inattiva. Riprova in pochi secondi; non fatturato. |
Fatturazione
Credito prepagato, addebitato per token in base al reale usage di ogni risposta: $0.25 per 1M di token di input, $1.00 per 1M di token di output. L'input è tutto ciò che invii (system prompt, cronologia, il nuovo messaggio); l'output è ciò che scrive il modello.
- La tua prima chiave arriva con $0.50 di credito gratuito, valido per 7 giorni — sufficiente per integrare e testare. Per una chiave è necessaria un'e-mail confermata (è lì che arriva l'avviso "il credito si sta esaurendo"). Il credito a pagamento non scade mai.
- Il credito non scade, non c'è abbonamento e nulla si rinnova da solo. Ricarica con carta o in USDT/USDC sulla pagina delle chiavi.
- Non viene addebitato nulla per le richieste rifiutate (
4xx) o fallite (5xx). Una richiesta viene fatturata una sola volta, dopo la risposta, in base al suoX-Request-Id. - Il saldo si esaurisce →
402 no_creditfinché non ricarichi. Imposta un tetto giornaliero su ogni chiave così una chiave compromessa non può svuotare l'account. - I crediti possono essere rimborsati se non utilizzati entro 24 ore dall'acquisto, oppure applicati in seguito a un piano. Vedi Crediti e rimborsi.
Persona — modello nudo o il personaggio di BestPrivateAI
Ogni chiave ha uno stile, scelto sulla pagina delle chiavi e modificabile in qualsiasi momento:
- Puro (predefinito) — il tuo system prompt è l'intero prompt. Aggiungiamo una riga di identità e nulla altro.
- Persona BestPrivateAI — il personaggio e lo stile della chat su bestprivateai.com: diretto, senza filtri, senza moralismi, risponde nella lingua dell'utente. Stesso modello, stesso prezzo, stessa policy sui contenuti; cambia solo il prompt che precede i tuoi messaggi. Il tuo system message lo segue comunque e può adattarlo.
Una richiesta può sovrascrivere l'impostazione della chiave, con un campo o con un suffisso del modello (per i client che possono impostare solo un nome di modello):
{ "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
Nomi delle persona: notrack (il personaggio semplice), concise, detailed, creative (le stesse varianti offerte dalla chat), bare. L'header di risposta X-NoTrack-Persona indica quale è stata applicata.
Policy sui contenuti
Non aggiungiamo nessun system prompt e non eseguiamo nessun filtro sugli argomenti. Narrativa per adulti, temi cupi, linguaggio forte, violenza nella finzione — il modello risponde come scritto. Una regola è applicata nel codice e non può essere disattivata: qualsiasi contenuto sessuale che coinvolga un minore viene rifiutato.
403 child_safety— la richiesta cercava contenuto sessuale che coinvolge un minore. Rifiutato, non fatturato, registrato come evento di sicurezza.400 minor_in_sexual_context— la scena è sessuale e un personaggio si legge come minorenne (età dichiarata, ambientazione scolastica, inquadramento "ragazza/ragazzo"). Non è un divieto: rendi età e inquadramento inequivocabilmente adulti e rinvia.
403 ripetuti su una chiave portano alla chiusura della chiave, poi dell'account. Il testo completo è nella Acceptable Use policy.
Privacy
Prompt e completion non vengono scritti su disco — né dal gateway, né dai server del modello. Ciò che conserviamo per ogni richiesta è l'id della richiesta, l'id della chiave, i conteggi dei token e il prezzo, perché è ciò su cui si basa la fattura. I rifiuti per sicurezza vengono registrati per categoria, senza il testo. Nessun fornitore di modelli terzo vede mai il tuo traffico: il modello è eseguito su hardware che noleggiamo e controlliamo noi.
Client e SDK
Il sito BestPrivateAI e l'app BestPrivateAI sono la nostra chat — non hanno un campo per una chiave API e non lo avranno mai. Una chiave serve per programmi altri: incollala in uno dei client sottostanti, oppure nel tuo codice.
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 attivo. Mantieni la dimensione del contesto entro 64,000 token.
Chatbox
Settings → Model Provider → Add → Add Custom Provider, modalità OpenAI API Compatible → incolla l'URL di base e la chiave, poi aggiungi notrack-uncensored come modello.
NextChat
Settings → attiva Custom Endpoint (compatibile OpenAI) → URL di base e chiave, poi digita il nome del modello nel campo modello.
Cherry Studio
Settings → Model Providers → Add Provider → digita OpenAI → URL di base e chiave, poi "Add model" → notrack-uncensored.
LobeChat
Settings → AI Service Provider → OpenAI → attiva custom API endpoint, incolla l'URL di base e la chiave, e aggiungi il modello alla lista dei modelli.
Qualsiasi altro client
LangChain, LlamaIndex, Open WebUI, Continue, le impostazioni proxy di JanitorAI, curl — qualsiasi client con un'opzione "compatibile OpenAI" o "URL di base personalizzato".
La formulazione dei menu sopra cambia tra le versioni delle app — se un'etichetta non corrisponde esattamente, cerca l'impostazione che menziona "custom", "OpenAI-compatible" o "base URL".
Se un client non si connette
- 401 / "invalid API key" — la chiave non è arrivata. Verifica che il client invii
Authorization: Bearer sk-…con la chiave intera, prefisso incluso. - 404 / endpoint sconosciuto — i client non sono coerenti su se aggiungere
/v1da soli. Sehttps://api.bestprivateai.com/v1restituisce 404, provahttps://api.bestprivateai.comcome URL di base invece (o viceversa). - "The Responses API is not supported yet" — alcuni client più recenti usano di default la Responses API di OpenAI. Noi serviamo solo Chat Completions; passa il client a quella modalità.
- Elenco modelli vuoto — alcuni client lo popolano solo dopo una verifica valida della chiave. Digita
notrack-uncensoredmanualmente. - Non succede nulla in un client Ollama / llama.cpp — questi parlano un proprio protocollo, non compatibile OpenAI. Usa invece uno dei client sopra.
Chiavi
- Fino a 20 chiavi attive per account. Assegna a ogni app la sua chiave e il suo tetto giornaliero.
- Data di scadenza opzionale; revocare una chiave la blocca immediatamente e non può essere annullato — emettine una nuova.
- La pagina delle chiavi mostra la spesa per chiave, l'ultimo utilizzo e i totali a 30 giorni dell'account.
Domande o un id di richiesta da controllare: supporto · bestprivateai.com/support.