API docs
unfiltered.sh speaks the OpenAI Chat Completions API. If a tool lets you set a base URL and an API key, it works with unfiltered.sh.
Quick start
- Create an account, add credit with SOL or USDC, and buy a seat (a slot plus a speed).
- Copy the API key shown after purchase. It is shown once.
- Call the API during your slot with these settings:
- Base URL
https://api.unfiltered.sh/v1- Model
deepseek-v4.1-flash- Auth
Authorization: Bearer YOUR_API_KEY- Endpoints
POST /v1/chat/completions,GET /v1/models
Models
Use the model id in the model field of each request. GET /v1/models lists what your seat can use.
| Model | Model id | Context | Features | Status |
|---|---|---|---|---|
| DeepSeek V4.1 Flash | deepseek-v4.1-flash | Published at launch | 50–250 tok/s; one Ultra seat up to 450 tok/s | At launchAvailable |
| GLM-5.3 | Announced at launch | TBA | Larger model for harder tasks | Coming soon |
DeepSeek V4.1 Flash is a community "abliterated" build of an open-weight mixture-of-experts model (refusal behaviour removed). We did not train it.
Examples
curl
curl https://api.unfiltered.sh/v1/chat/completions \
-H "Authorization: Bearer $UNFILTERED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Explain how a TLS handshake works."}],
"stream": true
}'
Python
Uses the official openai package (pip install openai).
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unfiltered.sh/v1", api_key=os.environ["UNFILTERED_API_KEY"])
stream = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Write a haiku about GPUs."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
JavaScript
Plain fetch, no SDK needed (Node 18+ or a browser backend; never put your key in public front-end code).
const res = await fetch("https://api.unfiltered.sh/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.UNFILTERED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "deepseek-v4.1-flash",
messages: [{ role: "user", content: "Summarise the CAP theorem in 3 lines." }],
}),
});
const data = await res.json();
console.log(data.choices[0].message.content);
With the openai npm package: new OpenAI({ baseURL: "https://api.unfiltered.sh/v1", apiKey }), then the same calls as above.
Limits
- Slot window. A key works only between its slot's start and end time. Before the start you get
block_not_started, after the endblock_ended. Requests still streaming when the slot ends may be cut off. - One request at a time per seat. Your speed is reserved for one stream. A second parallel request gets HTTP 429
concurrency_limit; queue requests on your side or buy a second seat. - Speed. Your chosen tok/s is a per-request target for generated tokens. Responses carry an
x-seat-tpsheader; if the cluster is overloaded you may seex-speed-degraded: true, and missed speed is credited back. - Unlimited tokens, with fair-use guards. You are not billed per token. To protect other seats there is a per-minute request limit, a maximum output length per request, and a very high per-seat output safety cap that normal use does not reach.
- No logs. Prompts and outputs are never stored. Only token counts and timings are kept for billing and speed stats.
- Acceptable use. Requests that break the Acceptable Use Policy are blocked with
policy_violation.
Errors
Errors use the OpenAI shape: {"error": {"message", "type", "code"}}.
| HTTP | code | Meaning |
|---|---|---|
| 401 | invalid_api_key | Missing or unknown key. |
| 403 | block_not_started / block_ended | Outside your slot window. |
| 403 | seat_inactive / block_cancelled | Seat disabled, or slot cancelled (credit is returned). |
| 429 | concurrency_limit | Another request on this seat is still running. |
| 429 | rate_limit / block_token_cap | Fair-use guard reached. |
| 400 | invalid_request / policy_violation | Malformed request, or blocked by the AUP. |
Use it with coding agents
Any agent that supports an "OpenAI-compatible" provider works. Use the base URL, your seat key and the model id above. Because a seat runs one request at a time, turn off parallel sub-agents or set concurrency to 1.
Freedom agent coming soon
Our own coding app, built on T3 Code, with unfiltered.sh built in: log in with your account number, pick a seat, start coding. No setup.
Aider
export OPENAI_API_BASE=https://api.unfiltered.sh/v1
export OPENAI_API_KEY=YOUR_API_KEY
aider --model openai/deepseek-v4.1-flash
Cline, Roo Code, Kilo Code (VS Code)
Settings → API Provider: OpenAI Compatible. Base URL https://api.unfiltered.sh/v1, API key = your seat key, Model ID deepseek-v4.1-flash.
Continue
models:
- name: unfiltered.sh
provider: openai
model: deepseek-v4.1-flash
apiBase: https://api.unfiltered.sh/v1
apiKey: YOUR_API_KEY
Anything else
Set the environment variables OPENAI_BASE_URL=https://api.unfiltered.sh/v1 and OPENAI_API_KEY=YOUR_API_KEY; most tools built on the OpenAI SDKs pick them up.