NoTrack API β reference
One OpenAI-compatible endpoint, one model, one key. If your code already talks to
/v1/chat/completions, change the base URL and the key and it talks to us.
Base URL & authentication
Base URL: https://api.notrack.ai/v1
Header: Authorization: Bearer sk-notrack-β¦
Keys are created on the keys page. A key is shown once, at creation; we store a hash
and its last six characters. Send it only over HTTPS and only in the Authorization header β never in a URL.
Everything is JSON (Content-Type: application/json). Responses use the OpenAI schema, so the official
openai SDKs and every OpenAI-compatible client work unchanged.
Models
GET /v1/models
{ "object": "list",
"data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }
There is one model, notrack-uncensored: our own companion tune, served on our own hardware.
Whatever you pass as model is routed to it; use the public id so your logs match ours.
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
}
Response β the standard shape, with real token counts in usage (that is what you are billed on):
{
"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 }
}
Your system prompt governs the conversation. We prepend exactly one line β the model's identity (that it is notrack-uncensored, made by NoTrack) β and nothing else: no rules, no topic filter. Your system message follows it and decides persona, style and everything else. The one exception is in Content policy.
Streaming
Set "stream": true and read server-sent events, exactly as with OpenAI. The final chunk carries
usage (we always include it, whether or not you ask for stream_options), then 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]
Parameters
| Field | Notes |
|---|---|
messages | Required. system, user, assistant roles. Text only for now β image parts are rejected. |
model | Use notrack-uncensored. |
stream | true for SSE. stream_options.include_usage is always on. |
max_tokens | Cap on the completion. Prompt + completion must fit the 32,768-token window. |
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, n | Passed through to the model as in OpenAI. If you send no temperature we use 0.85, the same as our chat. n > 1 multiplies output cost. |
response_format, tools, functions | Not supported yet. Ask for JSON in the prompt if you need structure. |
Limits & response headers
| Limit | Value | When exceeded |
|---|---|---|
| Concurrent requests per key | 4 | 429 concurrency |
| Requests per minute per key | 120 | 429 rate_limit |
| Context window (prompt + completion) | 32,768 tokens | 400 context_limit β trim history and retry |
| Daily spend per key (optional) | set by you on the keys page | 402 key_daily_cap until 00:00 UTC |
Every successful response carries:
| Header | Meaning |
|---|---|
X-Request-Id | Quote it when writing to support; it is the only thing we keep about a request. |
X-NoTrack-Balance-USD | Your credit before this request was charged, in dollars. |
X-RateLimit-Limit-Requests | Requests per minute allowed for this key. |
X-RateLimit-Limit-Concurrency | Parallel requests allowed for this key. |
X-NoTrack-Content-Flag | Only on a content refusal: minor_in_sexual_context or child_safety. |
Errors
Errors are JSON with a stable type; the message is for humans and may change.
{ "error": { "type": "no_credit", "message": "no credit left on this account β top up at notrack.ai/api-keys" } }
| HTTP | type | What to do |
|---|---|---|
| 400 | body | Invalid JSON or no messages. |
| 400 | context_limit | Prompt too long for the 32,768-token window. Drop older turns. |
| 400 | content_policy + X-NoTrack-Content-Flag: minor_in_sexual_context | The scene reads as sexual and a character reads as a minor. Make the characters unambiguously adult and resend; not billed. |
| 401 | auth, invalid_key, key_revoked, key_expired | Fix or replace the key. |
| 402 | no_credit | Balance is zero. Top up; requests resume immediately. |
| 402 | key_daily_cap | This key hit the daily ceiling you set. Raise it or wait for 00:00 UTC. |
| 403 | content_policy + X-NoTrack-Content-Flag: child_safety | Refused and not billed. See Content policy. |
| 429 | rate_limit, concurrency | Back off and retry; respect the two X-RateLimit-* headers. |
| 502 | upstream | The model did not answer. Retry with backoff; not billed. |
| 503 | billing, safety | A dependency of ours is down. Retry in a few seconds; not billed. |
Billing
Prepaid credit, charged per token from the real usage of each response:
$0.25 per 1M input tokens, $1.00 per 1M output tokens.
Input is everything you send (system prompt, history, the new message); output is what the model writes.
- Your first key comes with $1 of free credit β enough to integrate and test.
- Credit does not expire, there is no subscription and nothing renews by itself. Top up by card or in USDT/USDC on the keys page; unused credit can be refunded within 14 days.
- Nothing is charged for refused requests (
4xx) or failed ones (5xx). A request is charged once, after the response, keyed on itsX-Request-Id. - Balance runs out β
402 no_credituntil you top up. Set a daily ceiling on each key so a leaked key cannot drain the account.
Persona β bare model or NoTrack's character
Every key has a style, chosen on the keys page and switchable at any time:
- Bare (default) β your system prompt is the whole prompt. We add one line of identity and nothing else.
- NoTrack persona β the character and style of the chat on notrack.ai: direct, unfiltered, no moralizing, answers in the user's language. Same model, same price, same content policy; only the prompt in front of your messages changes. Your own system message still follows it and can adjust it.
A request can override the key's setting, either with a field or with a model suffix (for clients that can only set a model name):
{ "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
Persona names: notrack (the plain character), concise, detailed, creative
(the same variants the chat offers), bare. The response header X-NoTrack-Persona says which one applied.
Content policy
We add no system prompt and run no topic filter. Adult fiction, dark themes, strong language, violence in fiction β the model answers as written. One rule is enforced in code and cannot be switched off: anything sexual involving a minor is refused.
403 child_safetyβ the request sought sexual content involving a child. Refused, not billed, logged as a safety event.400 minor_in_sexual_contextβ the scene is sexual and a character reads as under 18 (age stated, school setting, "girl/boy" framing). Not a ban: make ages and framing unambiguously adult and resend.
Repeated 403s on a key lead to the key, then the account, being closed. The full text is in the
Acceptable Use policy.
Privacy
Prompts and completions are not written to disk β not by the gateway, not by the model servers. What we keep per request is the request id, the key id, token counts and the price, because that is the bill. Safety refusals are logged by category, without the text. No third-party model provider ever sees your traffic: the model runs on hardware we rent and control.
Clients & SDKs
Python
from openai import OpenAI
client = OpenAI(base_url="https://api.notrack.ai/v1", api_key="sk-notrack-β¦")
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.notrack.ai/v1", apiKey: process.env.NOTRACK_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.notrack.ai/v1 β Custom API Key β Connect β Model notrack-uncensored. Streaming on.
Keep the context size at or below 32,768 tokens.
Anything else
LangChain, LlamaIndex, Open WebUI, Continue, JanitorAI proxy settings, curl β any client with an "OpenAI-compatible" or "custom base URL" option.
Keys
- Up to 20 active keys per account. Give each app its own key and its own daily ceiling.
- Optional expiry date; revoking a key stops it immediately and cannot be undone β issue a new one instead.
- The keys page shows per-key spend, last use and the account's 30-day totals.
Questions or a request id to look at: support Β· [email protected].