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

FieldNotes
messagesRequired. system, user, assistant roles. Text only for now โ€” image parts are rejected.
modelUse notrack-uncensored.
streamtrue for SSE. stream_options.include_usage is always on.
max_tokensCap on the completion. Prompt + completion must fit the 32,768-token window.
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, nPassed 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, functionsNot supported yet. Ask for JSON in the prompt if you need structure.

Limits & response headers

LimitValueWhen exceeded
Concurrent requests per key4429 concurrency
Requests per minute per key120429 rate_limit
Context window (prompt + completion)32,768 tokens400 context_limit โ€” trim history and retry
Daily spend per key (optional)set by you on the keys page402 key_daily_cap until 00:00 UTC

Every successful response carries:

HeaderMeaning
X-Request-IdQuote it when writing to support; it is the only thing we keep about a request.
X-NoTrack-Balance-USDYour credit before this request was charged, in dollars.
X-RateLimit-Limit-RequestsRequests per minute allowed for this key.
X-RateLimit-Limit-ConcurrencyParallel requests allowed for this key.
X-NoTrack-Content-FlagOnly 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" } }
HTTPtypeWhat to do
400bodyInvalid JSON or no messages.
400context_limitPrompt too long for the 32,768-token window. Drop older turns.
400content_policy + X-NoTrack-Content-Flag: minor_in_sexual_contextThe scene reads as sexual and a character reads as a minor. Make the characters unambiguously adult and resend; not billed.
401auth, invalid_key, key_revoked, key_expiredFix or replace the key.
402no_creditBalance is zero. Top up; requests resume immediately.
402key_daily_capThis key hit the daily ceiling you set. Raise it or wait for 00:00 UTC.
403content_policy + X-NoTrack-Content-Flag: child_safetyRefused and not billed. See Content policy.
429rate_limit, concurrencyBack off and retry; respect the two X-RateLimit-* headers.
502upstreamThe model did not answer. Retry with backoff; not billed.
503billing, safetyA 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.

Persona โ€” bare model or NoTrack's character

Every key has a style, chosen on the keys page and switchable at any time:

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.

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

Questions or a request id to look at: support ยท [email protected].