BestPrivateAI API — 레퍼런스
OpenAI 호환 엔드포인트 하나, 모델 하나, key 하나. 코드가 이미 /v1/chat/completions와 통신하고 있다면 base URL과 key만 바꾸면 당사와 통신하게 된다.
Base URL과 인증
Base URL: https://api.bestprivateai.com/v1
Header: Authorization: Bearer sk-…
key는 key 페이지에서 생성한다. key는 생성 시 한 번만 표시되며, 당사는 그 해시값과 마지막 6자리만 저장한다. key는 반드시 HTTPS로, 오직 Authorization 헤더로만 전송할 것 — URL에는 절대 넣지 말 것.
모든 것은 JSON(Content-Type: application/json)이다. 응답은 OpenAI 스키마를 따르므로 공식 openai SDK와 OpenAI 호환 클라이언트는 수정 없이 그대로 동작한다.
모델
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
모델은 notrack-uncensored 하나뿐이다: 당사가 자체적으로 튜닝한 컴패니언 모델로, 당사 자체 하드웨어에서 구동된다. model에 무엇을 넣어 보내든 이 모델로 라우팅된다. 로그를 당사와 맞추기 위해 공개 id를 사용할 것.
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
}
응답 — 표준 형식이며, usage에 실제 토큰 수가 들어간다(이 값이 결제 기준이다):
{
"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 }
}
대화를 지배하는 것은 사용자의 system prompt다. 당사는 정확히 한 줄만 앞에 추가한다 — 모델의 정체(BestPrivateAI이 만든 notrack-uncensored라는 사실)이며, 그 외에는 아무것도 추가하지 않는다: 규칙도, 주제 필터도 없다. 사용자의 system message가 그 뒤를 이어 페르소나, 스타일, 그 외 모든 것을 결정한다. 유일한 예외는 콘텐츠 정책에 있다.
스트리밍
"stream": true를 설정하고 OpenAI와 마찬가지로 server-sent events를 읽는다. 마지막 청크에는 usage가 들어간다(stream_options를 요청했는지 여부와 관계없이 항상 포함한다), 그 다음 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]
파라미터
| 필드 | 비고 |
|---|---|
messages | 필수. system, user, assistant 역할(role). 현재는 텍스트만 가능 — 이미지 파트는 거부된다. |
model | notrack-uncensored를 사용할 것. |
stream | SSE에는 true. stream_options.include_usage는 항상 켜져 있다. |
max_tokens | completion의 상한. prompt + completion은 64,000 토큰 윈도우 내에 들어와야 한다. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | OpenAI와 동일하게 모델로 그대로 전달된다. temperature를 보내지 않으면 당사 채팅과 동일한 0.85를 사용한다. n > 1은 output 비용을 배로 늘린다. |
tools, tool_choice | 지원: auto, none, required, 또는 이름이 지정된 함수. 응답에는 tool_calls와 finish_reason: "tool_calls"가 포함된다. 결과는 role: "tool" 메시지로 되돌려 보낼 것. tool이 있으면 스트리밍 응답은 토큰 단위가 아니라 호출당 한 청크로 도착한다. |
response_format | {"type": "json_object"}는 지원된다(원하는 JSON 형태를 prompt에서 지정할 것). json_schema와 레거시 functions 필드는 지원되지 않는다. |
한도와 응답 헤더
| 한도 | 값 | 초과 시 |
|---|---|---|
| key당 동시 요청 수 | 8 | 429 concurrency |
| key당 분당 요청 수 | 300 | 429 rate_limit |
| 컨텍스트 윈도우(prompt + completion) | 64,000 토큰 | 400 context_limit — 기록을 줄이고 재시도할 것 |
| key당 일일 지출 한도(선택) | key 페이지에서 직접 설정 | 402 key_daily_cap UTC 00:00까지 |
성공한 모든 응답에는 다음이 포함된다:
| 헤더 | 의미 |
|---|---|
X-Request-Id | support에 문의할 때 이 값을 인용할 것. 당사가 요청에 대해 보관하는 유일한 정보다. |
X-NoTrack-Balance-USD | 이 요청으로 청구된 크레딧 잔액 청구 전, 달러 단위. |
X-RateLimit-Limit-Requests | 이 key에 허용된 분당 요청 수. |
X-RateLimit-Limit-Concurrency | 이 key에 허용된 병렬 요청 수. |
X-NoTrack-Content-Flag | 콘텐츠 거부 시에만: minor_in_sexual_context 또는 child_safety. |
오류
오류는 안정적인 type를 가진 JSON이다. message는 사람이 읽기 위한 것으로 바뀔 수 있다.
{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
| HTTP | type | 해야 할 일 |
|---|---|---|
| 400 | body | JSON이 유효하지 않거나 messages가 없음. |
| 400 | context_limit | 64,000 토큰 윈도우에 비해 prompt가 너무 길다. 오래된 턴을 제거할 것. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | 장면이 성적으로 읽히고 등장인물이 미성년자로 읽힌다. 등장인물을 명확히 성인으로 만들어 다시 보낼 것; 청구되지 않음. |
| 401 | auth, invalid_key, key_revoked, key_expired | key를 수정하거나 교체할 것. |
| 402 | no_credit | 잔액이 0. 충전하면 요청이 즉시 재개된다. |
| 402 | key_daily_cap | 이 key가 설정한 일일 한도에 도달했다. 한도를 올리거나 UTC 00:00까지 기다릴 것. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | 거부되었으며 청구되지 않음. 콘텐츠 정책 참조. |
| 429 | rate_limit, concurrency | 속도를 줄이고 재시도할 것; 두 X-RateLimit-* 헤더를 준수할 것. |
| 502 | upstream | 모델이 응답하지 않았다. 백오프 후 재시도할 것; 청구되지 않음. |
| 503 | billing, safety | 당사의 의존 서비스 중 하나가 다운되었다. 몇 초 후 재시도할 것; 청구되지 않음. |
결제
선불 크레딧이며, 각 응답의 실제 usage를 기준으로 토큰 단위로 청구된다: input 100만 토큰당 $0.25, output 100만 토큰당 $1.00. input은 보내는 모든 것(system prompt, 기록, 새 메시지)이고, output은 모델이 작성한 것이다.
- 첫 key에는 $0.50의 무료 크레딧이 7일간 제공된다 — 연동과 테스트에 충분한 양이다. key를 만들려면 확인된 이메일이 필요하다("크레딧 소진 임박" 알림이 여기로 간다). 유료 크레딧은 만료되지 않는다.
- 크레딧은 만료되지 않고, 구독도 없으며, 자동으로 갱신되는 것도 없다. key 페이지에서 카드나 USDT/USDC로 충전할 수 있다.
- 거부된 요청(
4xx)이나 실패한 요청(5xx)에는 아무것도 청구되지 않는다. 요청은 응답 후 그X-Request-Id를 키로 하여 단 한 번만 청구된다. - 잔액이 소진되면 → 충전할 때까지
402 no_credit. 유출된 key가 계정을 비워버리지 못하도록 각 key에 일일 한도를 설정할 것. - 크레딧은 구매 후 24시간 이내에 사용하지 않았다면 환불받을 수 있으며, 이후에는 플랜에 적용할 수 있습니다. 자세한 내용은 크레딧 및 환불을 참고하세요.
페르소나 — 순수 모델 또는 BestPrivateAI의 캐릭터
각 key에는 스타일이 있으며, key 페이지에서 선택하고 언제든 전환할 수 있다:
- 순수 모델(기본값) — system prompt가 전체 prompt가 된다. 당사는 정체를 나타내는 한 줄만 추가하고 그 외에는 아무것도 추가하지 않는다.
- BestPrivateAI 페르소나 — bestprivateai.com의 채팅과 동일한 캐릭터와 스타일: 직설적이고, 필터 없고, 훈계하지 않으며, 사용자의 언어로 답한다. 모델도 같고, 가격도 같고, 콘텐츠 정책도 같다; 바뀌는 것은 메시지 앞에 붙는 prompt뿐이다. 사용자의 system message는 여전히 그 뒤를 따르며 이를 조정할 수 있다.
요청은 필드로, 또는 모델 이름만 설정할 수 있는 클라이언트를 위한 모델 suffix로 key의 설정을 재정의할 수 있다:
{ "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
페르소나 이름: notrack(기본 캐릭터), concise, detailed, creative(채팅에서 제공하는 것과 동일한 변형), bare. 응답 헤더 X-NoTrack-Persona가 어떤 것이 적용되었는지 알려준다.
콘텐츠 정책
당사는 어떤 system prompt도 추가하지 않고 어떤 주제 필터도 실행하지 않는다. 성인 소설, 어두운 주제, 강한 언어, 소설 속 폭력 — 모델은 쓰여진 대로 답한다. 코드로 강제되어 끌 수 없는 규칙이 하나 있다: 미성년자가 관련된 성적인 내용은 모두 거부된다.
403 child_safety— 요청이 아동이 관련된 성적 콘텐츠를 원했다. 거부되고, 청구되지 않으며, 안전 이벤트로 기록된다.400 minor_in_sexual_context— 장면이 성적이고 등장인물이 18세 미만으로 읽힌다(나이가 명시되거나, 학교 배경이거나, "소녀/소년" 식의 묘사). 영구 금지가 아니다: 나이와 묘사를 명확히 성인으로 만들어 다시 보낼 것.
한 key에서 403가 반복되면 해당 key가, 그 다음에는 계정이 폐쇄된다. 전체 내용은 Acceptable Use policy에 있다.
개인정보
prompt와 completion은 디스크에 기록되지 않는다 — 게이트웨이도, 모델 서버도 기록하지 않는다. 요청당 당사가 보관하는 것은 요청 id, key id, 토큰 수, 가격뿐이며, 이는 청구의 근거이기 때문이다. 안전 관련 거부는 텍스트 없이 카테고리별로 기록된다. 어떤 제3의 모델 제공업체도 사용자의 트래픽을 보는 일은 없다: 모델은 당사가 직접 임대하고 관리하는 하드웨어에서 구동된다.
클라이언트와 SDK
BestPrivateAI 웹사이트와 BestPrivateAI 앱은 당사 자체 채팅이며, API key를 입력할 필드가 없고 앞으로도 생기지 않을 것이다. key는 그 외 프로그램을 위한 것이다: 아래 클라이언트 중 하나에, 또는 사용자 본인의 코드에 붙여넣을 것.
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 켜기. 컨텍스트 크기는 64,000 토큰 이하로 유지할 것.
Chatbox
Settings → Model Provider → Add → Add Custom Provider, 모드 OpenAI API Compatible → base URL과 key를 붙여넣은 뒤 notrack-uncensored를 모델로 추가한다.
NextChat
Settings → Custom Endpoint(OpenAI 호환)을 켠다 → base URL과 key를 입력한 뒤 모델 필드에 모델 이름을 직접 입력한다.
Cherry Studio
Settings → Model Providers → Add Provider → OpenAI 입력 → base URL과 key를 입력한 뒤 "Add model" → notrack-uncensored.
LobeChat
Settings → AI Service Provider → OpenAI → custom API endpoint를 활성화하고, base URL과 key를 붙여넣은 뒤 모델을 모델 목록에 추가한다.
그 외 클라이언트
LangChain, LlamaIndex, Open WebUI, Continue, JanitorAI 프록시 설정, curl — "OpenAI 호환" 또는 "custom base URL" 옵션이 있는 모든 클라이언트.
위 메뉴 표기는 앱 버전에 따라 달라진다 — 라벨이 정확히 일치하지 않으면 "custom", "OpenAI-compatible", "base URL"을 언급하는 설정을 찾을 것.
클라이언트가 연결되지 않을 때
- 401 / "invalid API key" — key가 전달되지 않았다. 클라이언트가 prefix를 포함한 전체 key를
Authorization: Bearer sk-…로 보내는지 확인할 것. - 404 / 알 수 없는 엔드포인트 — 클라이언트마다
/v1를 자체적으로 붙이는지 여부가 다르다.https://api.bestprivateai.com/v1에서 404가 나면 대신https://api.bestprivateai.com를 base URL로 시도할 것(또는 그 반대로). - "The Responses API is not supported yet" — 일부 최신 클라이언트는 기본값으로 OpenAI의 Responses API를 사용한다. 당사는 Chat Completions만 제공하므로 클라이언트를 해당 모드로 전환할 것.
- 모델 목록이 비어 있음 — 일부 클라이언트는 유효한 key 확인 후에만 목록을 채운다.
notrack-uncensored를 직접 입력할 것. - Ollama / llama.cpp 클라이언트에서 아무 반응이 없음 — 이들은 OpenAI 호환이 아닌 자체 프로토콜을 사용한다. 대신 위 클라이언트 중 하나를 사용할 것.
key
- 계정당 최대 20개의 활성 key. 앱마다 별도의 key와 별도의 일일 한도를 부여할 것.
- 만료일은 선택 사항이다; key를 폐기하면 즉시 중지되며 되돌릴 수 없다 — 대신 새 key를 발급할 것.
- key 페이지에는 key별 지출, 마지막 사용, 계정의 30일 합계가 표시된다.
질문이나 확인이 필요한 요청 id가 있다면: support · bestprivateai.com/support.