Documentation
Pick your tool, paste the config, get back to work.
The two things you need
Get a key.
Shown once only. If you lose it, revoke it and create another one.
Create keyPoint your SDK at the right base URL.
Base URL for each SDK SDK Base URL openaihttps://api.cerberusapp.cc/v1anthropichttps://api.cerberusapp.ccThe Anthropic SDK appends /v1 on its own. Writing it twice gets you a silent 404.
Your tool
Claude Code3 steps
Paste this into your settings file.
~/.claude/settings.json{ "env": { "ANTHROPIC_BASE_URL": "https://api.cerberusapp.cc", "ANTHROPIC_API_KEY": "PASTE_YOUR_KEY", "ANTHROPIC_MODEL": "claude-sonnet-5" } }On Windows the file lives at %USERPROFILE%\.claude\settings.json.
Or skip the file and export the variables.
export ANTHROPIC_BASE_URL="https://api.cerberusapp.cc" export ANTHROPIC_API_KEY="PASTE_YOUR_KEY" export ANTHROPIC_MODEL="claude-sonnet-5"Start the tool.
claude
Codex2 steps
Add the provider to your config file.
~/.codex/config.tomlmodel = "claude-sonnet-5" model_provider = "cerbero" [model_providers.cerbero] name = "Cerbero" base_url = "https://api.cerberusapp.cc/v1" env_key = "CERBERO_API_KEY" wire_api = "responses"Export the key under that same name.
export CERBERO_API_KEY="PASTE_YOUR_KEY"
OpenCode2 steps
Add the provider to your config file.
~/.config/opencode/opencode.json{ "$schema": "https://opencode.ai/config.json", "provider": { "cerbero": { "npm": "@ai-sdk/openai-compatible", "name": "Cerbero", "options": { "baseURL": "https://api.cerberusapp.cc/v1", "apiKey": "PASTE_YOUR_KEY" }, "models": { "claude-sonnet-5": {} } } } }Restart and pick the Cerbero model.
curl · Anthropic Messages1 step
Drop your key in and run it.
curl https://api.cerberusapp.cc/v1/messages \
-H "x-api-key: PASTE_YOUR_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5","max_tokens":1024,"messages":[{"role":"user","content":"Write a haiku about the sea"}]}'Both x-api-key and Authorization: Bearer work; the version header goes in either one.
curl · OpenAI Chat Completions1 step
Drop your key in and run it.
curl https://api.cerberusapp.cc/v1/chat/completions \
-H "Authorization: Bearer PASTE_YOUR_KEY" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"Write a haiku about the sea"}]}'Python1 step
Install the SDK and copy the example.
pip install openaicerbero.py
from openai import OpenAI
client = OpenAI(
api_key="PASTE_YOUR_KEY",
base_url="https://api.cerberusapp.cc/v1",
)
r = client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "Write a haiku about the sea"}],
)
print(r.choices[0].message.content)Node1 step
Install the SDK and copy the example.
npm install openaicerbero.mjs
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "PASTE_YOUR_KEY",
baseURL: "https://api.cerberusapp.cc/v1",
});
const r = await client.chat.completions.create({
model: "claude-sonnet-5",
messages: [{ role: "user", content: "Write a haiku about the sea" }],
});
console.log(r.choices[0].message.content);The .mjs extension matters: without it, Node rejects the import.
Models
8 models| Model | Plans |
|---|---|
claude-sonnet-5 | basicproenterprise |
claude-sonnet-5-uncensored | basicproenterprise |
gemini-3.8-flash | basicproenterprise |
gemini-3.7-flash | basicproenterprise |
gemini-3.6-flash | basicproenterprise |
gemini-imagen | basicproenterprisefree |
gemini-3.6-flash-uncensored | basicproenterprise |
claude-opus-4-6-Free | free |
Reference
| Route | Header | Format |
|---|---|---|
| POST /v1/messages | x-api-keyAuthorization: Beareranthropic-version | Anthropic Messages |
| POST /v1/chat/completions | Authorization: Bearer | OpenAI Chat Completions |
| POST /v1/responses | Authorization: Bearer | OpenAI Responses |
/v1/complete does not exist: it returns 404. Use /v1/messages.
| Code | What happened | What to do |
|---|---|---|
| 429 | Quota used up. | Wait for the window to free requests up, or move up a plan. |
| 403 | The model is not in your plan. | Pick another one from the table above, or move up a plan. |
The quota is a rolling 24-hour window: every request frees up 24 hours after you made it, not at midnight.
Service status