Get your key

Unfiltered AI API: Endpoint, Headers and First Request

An unfiltered ai api is a normal HTTP API to a language model that is tuned not to refuse lawful adult requests. This page is the quick reference: the endpoint, the headers, a first request, what comes back and which limits apply.

A glass pipeline carrying data packets from a terminal block to a server tower, showing a first API request

Summary

  1. Base URL https://api.unfilteredai.cc/v1, header Authorization: Bearer <key>, model ID uncensored.
  2. Three endpoints for work: /v1/chat/completions, /v1/responses and /v1/models.
  3. Each response carries X-Balance-USD, X-Request-Id and rate limit headers.
  4. 429 means a limit was hit: read the error code and retry after a pause.

Quick reference

ItemValue
Base URLhttps://api.unfilteredai.cc/v1
AuthAuthorization: Bearer <key>
Model IDuncensored
ChatPOST /v1/chat/completions
ResponsesPOST /v1/responses
ModelsGET /v1/models
BalanceGET /v1/balance or GET /v1/dashboard/billing/credit_grants
Context window100,000 tokens, prompt plus completion
Max request body8 MB

You get a key on the API key page after signing up with Google or with email and password.

Your first request

Export the key, then send a chat completion. The variable name below is only a convention; use any name you like.

export API_KEY="paste-your-key-here"

curl https://api.unfilteredai.cc/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "system", "content": "Answer plainly and briefly."},
      {"role": "user", "content": "List three uses for a hosted text model."}
    ],
    "max_tokens": 200
  }'

Leave out max_tokens and the reply can use the rest of the window. It is optional, but setting it is a good habit while you are testing, because it caps the cost of a runaway answer.

What the response looks like

The body follows the OpenAI chat completion format. The values below are illustrative:

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "choices": [
    {
      "index": 0,
      "message": {"role": "assistant", "content": "1. Drafting fiction. 2. Summarising notes. 3. Powering a chat feature."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 38, "completion_tokens": 21, "total_tokens": 59}
}

Read choices[0].message.content for the text and usage for what you were billed on. Add -i to curl to see the headers:

  • X-Request-Id: quote it when you contact support.
  • X-Balance-USD: your remaining credit after this request.
  • X-RateLimit-Limit-Requests and X-RateLimit-Limit-Concurrency: the limits for your key.

Same call, other endpoints

The Responses endpoint takes input instead of messages:

curl https://api.unfilteredai.cc/v1/responses \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "uncensored", "input": "Write one sentence about autumn."}'

Check which models your key sees, and your balance:

# the model ID you will see here is: uncensored
curl https://api.unfilteredai.cc/v1/models -H "Authorization: Bearer $API_KEY"
curl https://api.unfilteredai.cc/v1/balance -H "Authorization: Bearer $API_KEY"

Streaming

Set "stream": true and add -N to curl so output is not buffered. The reply arrives as server-sent events, one JSON chunk per line prefixed with data:, and usage is reported at the end.

curl -N https://api.unfilteredai.cc/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"uncensored","stream":true,"messages":[{"role":"user","content":"Count to five."}]}'

Tool calling (tools, tool_choice, streamed tool_calls, results as role: "tool") and JSON mode (response_format set to {"type":"json_object"}) work as in the OpenAI API. The parameters temperature, top_p, stop, seed and the penalties are passed through. More detail is in the documentation.

Limits and 429 errors

A full key allows 8 concurrent requests and 300 requests per minute. A trial key allows 2 concurrent and 60 per minute. When you go over, the API answers HTTP 429 with one of two error codes:

  • rate_limited: too many requests per minute. Wait for the minute window to pass.
  • concurrency: too many requests at once. Wait for one to finish.

The API also returns 429 with a Retry-After: 5 header during temporary overload. Wait that many seconds. A streamed request keeps its concurrency slot until the stream ends, so close connections you no longer need.

Failed or refused requests are not charged.

Python and Node versions

The same request through the official SDKs:

import os
from openai import OpenAI

client = OpenAI(base_url="https://api.unfilteredai.cc/v1", api_key=os.environ["API_KEY"])
r = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "List three uses for a hosted text model."}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://api.unfilteredai.cc/v1", apiKey: process.env.API_KEY });
const r = await client.chat.completions.create({
  model: "uncensored",
  messages: [{ role: "user", content: "List three uses for a hosted text model." }],
});
console.log(r.choices[0].message.content);

If you prefer a raw HTTP client, send the same JSON body with the same two headers, Authorization and Content-Type: application/json.

Tool calling in a raw request

Tools are declared in the request and the model replies with a tool_calls entry when it wants one run. Execute the function yourself, then send the result back as a message with role: "tool" and the matching tool_call_id.

curl https://api.unfilteredai.cc/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "What is the weather in Oslo?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Current weather for a city",
        "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}
      }
    }],
    "tool_choice": "auto"
  }'

The model does not run anything. It only proposes a call, and your code decides whether to carry it out.

Common first-request mistakes

  • Wrong path. Use /v1/chat/completions under the base host. A missing /v1 is the most frequent cause of a failed first call.
  • Missing Content-Type. Send application/json with a JSON body.
  • Bad key format. The header is Authorization: Bearer, then a space, then the key. Check for stray quotes or a trailing newline copied with the key.
  • Wrong model ID. Use uncensored exactly.
  • Oversized body. The limit is 8 MB per request.
  • Key in front-end code. Anyone can read it. Call the API from your server and regenerate the key on the key page if it leaks; the old key stops working at once.

Request parameters you will use most

FieldPurpose
modelAlways uncensored
messagesSystem, user, assistant and tool messages in order
max_tokensOptional cap on the reply length
temperature, top_pRandomness of the output
stopStrings that end the reply when the model produces them
seedRepeatable sampling for tests
streamSend tokens as they are produced
response_format{"type":"json_object"} for JSON mode

The penalties, frequency_penalty and presence_penalty, are passed through as well. Messages are stateless, so send the whole conversation you want the model to see each time. Keep the total below the 100,000-token window.

Keys and who can see them

Treat the key like a password. On the key page you can regenerate it whenever you want, and the old one stops working immediately. Accounts that have topped up can hold up to 5 keys, give each a label, and revoke any one of them, so a script, a staging server and a production service can each have their own. There is no need to contact support to replace a key.

Trial keys are limited to 2 concurrent requests and 60 per minute, and the $0.50 trial credit is valid for 7 days. Use it to run the calls on this page before you top up.

What it is, and what it costs

The endpoint serves one open-weight model, run by an independent provider and tuned to answer without content refusals for lawful adult use. It is not the official API of any model vendor and it is not a router across vendors. It is text only: no images, audio, video, embeddings or fine-tuning. One hard limit applies: no sexual content involving minors. Prompts are not used for training.

Price is $0.15 per 1M input tokens and $0.50 per 1M output tokens, pay as you go from prepaid credit that never expires. The example request above, with 38 prompt tokens and 21 completion tokens, costs 38 x $0.15 / 1M + 21 x $0.50 / 1M = $0.0000057 + $0.0000105 = $0.0000162. Top-ups run from $20 to $500 in crypto, USDT on TRC20 or USDC on Base; see pricing for the bonus tiers. New users can claim $0.50 of trial credit, valid for 7 days, to run these calls first.

Common questions

Do I need a special SDK?

No. Any HTTP client works, and so do the official OpenAI SDKs once you set the base URL to https://api.unfilteredai.cc/v1.

How do I check my remaining credit?

Read the X-Balance-USD header on any response, or call GET /v1/balance or the OpenAI-style credit_grants endpoint.

What does a 429 error mean?

You hit a limit. The code rate_limited means too many requests per minute, concurrency means too many at once, and a Retry-After of 5 means temporary overload.

Is there a trial?

Yes. After sign-up you can claim $0.50 of trial credit with one click on the API key page. It is valid for 7 days and needs no card.

Get your API key

Register, grab the token, update the endpoint. That is it.

Get your key