API de BestPrivateAI — referencia
Un endpoint compatible con OpenAI, un modelo, una clave. Si tu código ya habla con /v1/chat/completions, cambia la URL base y la clave, y hablará con nosotros.
URL base y autenticación
Base URL: https://api.bestprivateai.com/v1
Header: Authorization: Bearer sk-…
Las claves se crean en la página de claves. Una clave se muestra una sola vez, al crearla; nosotros guardamos un hash y sus últimos seis caracteres. Envíala solo por HTTPS y solo en la cabecera Authorization, nunca en una URL.
Todo es JSON (Content-Type: application/json). Las respuestas usan el esquema de OpenAI, así que los SDKs oficiales de openai y cualquier cliente compatible con OpenAI funcionan sin cambios.
Modelos
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
Hay un solo modelo, notrack-uncensored: nuestro propio ajuste, alojado en nuestro propio hardware. Lo que pases como model se enruta a él; usa el id público para que tus registros coincidan con los nuestros.
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
}
Respuesta: la forma estándar, con recuentos de tokens reales en usage (es lo que se te factura):
{
"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 }
}
Tu system prompt rige la conversación. Anteponemos exactamente una línea: la identidad del modelo (que es notrack-uncensored, hecho por BestPrivateAI) y nada más: sin reglas, sin filtro de temas. Tu mensaje de sistema la sigue y decide la persona, el estilo y todo lo demás. La única excepción está en Política de contenido.
Streaming
Activa "stream": true y lee los server-sent events, igual que con OpenAI. El fragmento final lleva usage (siempre lo incluimos, lo pidas o no con stream_options), y luego 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]
Parámetros
| Campo | Notas |
|---|---|
messages | Obligatorio. Roles system, user, assistant. Solo texto por ahora: las partes de imagen se rechazan. |
model | Usa notrack-uncensored. |
stream | true para SSE. stream_options.include_usage está siempre activo. |
max_tokens | Tope de la completion. El prompt + la completion deben caber en la ventana de 64,000 tokens. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | Se pasa al modelo igual que en OpenAI. Si no envías temperature usamos 0.85, lo mismo que en nuestro chat. n > 1 multiplica el costo de salida. |
tools, tool_choice | Compatibles: auto, none, required, o una función con nombre. La respuesta lleva tool_calls y finish_reason: "tool_calls"; devuelve el resultado como un mensaje role: "tool". Con tools presentes, una respuesta en streaming llega como un fragmento por llamada, no token por token. |
response_format | {"type": "json_object"} es compatible (indica en el prompt qué JSON quieres). json_schema y el campo heredado functions no lo son. |
Límites y cabeceras de respuesta
| Límite | Valor | Al excederse |
|---|---|---|
| Solicitudes simultáneas por clave | 8 | 429 concurrency |
| Solicitudes por minuto por clave | 300 | 429 rate_limit |
| Ventana de contexto (prompt + completion) | 64,000 tokens | 400 context_limit — recorta el historial y reintenta |
| Gasto diario por clave (opcional) | definido por ti en la página de claves | 402 key_daily_cap hasta las 00:00 UTC |
Toda respuesta correcta lleva:
| Cabecera | Significado |
|---|---|
X-Request-Id | Cítala al escribir a soporte; es lo único que conservamos de una solicitud. |
X-NoTrack-Balance-USD | Tu saldo antes de que se cobrara esta solicitud, en dólares. |
X-RateLimit-Limit-Requests | Solicitudes por minuto permitidas para esta clave. |
X-RateLimit-Limit-Concurrency | Solicitudes paralelas permitidas para esta clave. |
X-NoTrack-Content-Flag | Solo en un rechazo de contenido: minor_in_sexual_context o child_safety. |
Errores
Los errores son JSON con un type estable; el message es para humanos y puede cambiar.
{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
| HTTP | type | Qué hacer |
|---|---|---|
| 400 | body | JSON inválido o sin messages. |
| 400 | context_limit | Prompt demasiado largo para la ventana de 64,000 tokens. Elimina turnos antiguos. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | La escena se lee como sexual y un personaje se lee como menor de edad. Haz que los personajes sean inequívocamente adultos y reenvía; no se cobra. |
| 401 | auth, invalid_key, key_revoked, key_expired | Corrige o reemplaza la clave. |
| 402 | no_credit | El saldo es cero. Recarga; las solicitudes se reanudan de inmediato. |
| 402 | key_daily_cap | Esta clave alcanzó el tope diario que fijaste. Súbelo o espera a las 00:00 UTC. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | Rechazada y no cobrada. Consulta Política de contenido. |
| 429 | rate_limit, concurrency | Reduce el ritmo y reintenta; respeta las dos cabeceras X-RateLimit-*. |
| 502 | upstream | El modelo no respondió. Reintenta con backoff; no se cobra. |
| 503 | billing, safety | Una dependencia nuestra está caída. Reintenta en unos segundos; no se cobra. |
Facturación
Crédito prepago, cobrado por token según el usage real de cada respuesta: $0.25 por 1M de tokens de entrada, $1.00 por 1M de tokens de salida. La entrada es todo lo que envías (system prompt, historial, el mensaje nuevo); la salida es lo que escribe el modelo.
- Tu primera clave viene con $0.50 de crédito gratis, válido durante 7 días — suficiente para integrar y probar. Se necesita un correo confirmado para una clave (es adonde llega el aviso de "se está agotando el crédito"). El crédito de pago nunca caduca.
- El crédito no caduca, no hay suscripción y nada se renueva solo. Recarga con tarjeta o en USDT/USDC en la página de claves.
- No se cobra nada por las solicitudes rechazadas (
4xx) ni por las fallidas (5xx). Una solicitud se cobra una sola vez, después de la respuesta, con clave en suX-Request-Id. - Se agota el saldo →
402 no_credithasta que recargues. Fija un tope diario en cada clave para que una clave filtrada no pueda vaciar la cuenta. - Los créditos se pueden reembolsar si no se usan en las 24 horas posteriores a la compra, o aplicarse más adelante a un plan. Consulta Créditos y reembolsos.
Persona: modelo puro o el personaje de BestPrivateAI
Cada clave tiene un estilo, elegido en la página de claves y cambiable en cualquier momento:
- Puro (predeterminado): tu system prompt es todo el prompt. Añadimos una línea de identidad y nada más.
- Persona BestPrivateAI: el personaje y el estilo del chat en bestprivateai.com: directo, sin filtros, sin moralizar, responde en el idioma del usuario. Mismo modelo, mismo precio, misma política de contenido; solo cambia el prompt que precede a tus mensajes. Tu propio mensaje de sistema la sigue y puede ajustarla.
Una solicitud puede anular la configuración de la clave, con un campo o con un sufijo en el modelo (para clientes que solo pueden fijar un nombre de modelo):
{ "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
Nombres de persona: notrack (el personaje simple), concise, detailed, creative (las mismas variantes que ofrece el chat), bare. La cabecera de respuesta X-NoTrack-Persona indica cuál se aplicó.
Política de contenido
No añadimos ningún system prompt ni aplicamos filtro de temas. Ficción para adultos, temas oscuros, lenguaje fuerte, violencia en la ficción: el modelo responde tal como se escribió. Una regla se aplica en el código y no se puede desactivar: se rechaza cualquier contenido sexual que involucre a un menor.
403 child_safety: la solicitud buscaba contenido sexual que involucrara a un menor. Rechazada, no cobrada, registrada como evento de seguridad.400 minor_in_sexual_context: la escena es sexual y un personaje se lee como menor de 18 años (edad indicada, entorno escolar, encuadre de "niña/niño"). No es una prohibición: haz que las edades y el encuadre sean inequívocamente adultos y reenvía.
Los 403 repetidos en una clave llevan a que se cierre la clave y luego la cuenta. El texto completo está en la política de uso aceptable.
Privacidad
Los prompts y las completions no se escriben en disco: ni en el gateway, ni en los servidores del modelo. Lo que conservamos por solicitud es el id de solicitud, el id de la clave, los recuentos de tokens y el precio, porque es lo que compone la factura. Los rechazos de seguridad se registran por categoría, sin el texto. Ningún proveedor de modelos externo ve jamás tu tráfico: el modelo se ejecuta en hardware que alquilamos y controlamos.
Clientes y SDKs
El sitio web de BestPrivateAI y la app de BestPrivateAI son nuestro propio chat: no tienen campo para una clave de API y nunca lo tendrán. Una clave es para programas externos: pégala en uno de los clientes de abajo, o en tu propio código.
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 activado. Mantén el tamaño de contexto en 64,000 tokens o menos.
Chatbox
Settings → Model Provider → Add → Add Custom Provider, modo OpenAI API Compatible → pega la URL base y la clave, y luego añade notrack-uncensored como modelo.
NextChat
Settings → activa Custom Endpoint (compatible con OpenAI) → URL base y clave, y luego escribe el nombre del modelo en el campo de modelo.
Cherry Studio
Settings → Model Providers → Add Provider → escribe OpenAI → URL base y clave, y luego "Add model" → notrack-uncensored.
LobeChat
Settings → AI Service Provider → OpenAI → activa custom API endpoint, pega la URL base y la clave, y añade el modelo a la lista de modelos.
Cualquier otro
LangChain, LlamaIndex, Open WebUI, Continue, la configuración de proxy de JanitorAI, curl: cualquier cliente con una opción "OpenAI-compatible" o "custom base URL".
El texto de los menús arriba cambia entre versiones de la app; si una etiqueta no coincide exactamente, busca la opción que mencione "custom", "OpenAI-compatible" o "base URL".
Si un cliente no conecta
- 401 / "invalid API key": la clave nunca llegó. Confirma que el cliente envía
Authorization: Bearer sk-…con la clave completa, prefijo incluido. - 404 / endpoint desconocido: los clientes no coinciden en si añaden
/v1por su cuenta. Sihttps://api.bestprivateai.com/v1da 404, pruebahttps://api.bestprivateai.comcomo URL base (o al revés). - "The Responses API is not supported yet": algunos clientes más nuevos usan por defecto la Responses API de OpenAI. Nosotros solo servimos Chat Completions; cambia el cliente a ese modo.
- Lista de modelos vacía: algunos clientes solo la rellenan después de validar la clave. Escribe
notrack-uncensoreda mano. - No pasa nada en un cliente de Ollama / llama.cpp: esos hablan su propio protocolo, no compatible con OpenAI. Usa uno de los clientes de arriba en su lugar.
Claves
- Hasta 20 claves activas por cuenta. Da a cada app su propia clave y su propio tope diario.
- Fecha de caducidad opcional; revocar una clave la detiene de inmediato y no se puede deshacer: emite una nueva en su lugar.
- La página de claves muestra el gasto por clave, el último uso y los totales de 30 días de la cuenta.
Preguntas o un id de solicitud para revisar: soporte · bestprivateai.com/support.