cerber

A trust-first, multi-provider AI gateway. Speaks the OpenAI and Anthropic API dialects, pools multiple accounts per provider, and routes each request to the right upstream.

Base URL
https://cerber.ihatebot.com  ·  /v1 for OpenAI SDKs  ·  /llm.md (agent guide)  ·  /dashboard  ·  /chat

Contents

AuthenticationAPI endpointsTwo dialectsModel routing & aliasesAutomatic fallbackRate limits & budgetsRequest headersProviders & modelsAdmin APIObservabilityExamplesTrust principles

Authentication

API endpoints

Method & pathDialectWhat it does
POST /v1/chat/completionsOpenAIChat for every provider incl. Claude. Supports streaming + fallback.
POST /v1/messagesAnthropicNative Anthropic Messages, transparent passthrough (streaming).
POST /v1/messages/count_tokensAnthropicToken counting via pooled credentials.
POST /v1/embeddingsOpenAIEmbeddings, passthrough to the provider serving the model.
POST /v1/completionsOpenAILegacy text completions, passthrough.
POST /v1/responsesOpenAIResponses API, passthrough (streaming).
POST /v1/images/generationsOpenAIImage generation (e.g. grok-imagine-*, gpt-image-*).
GET /v1/modelsOpenAIList discovered model ids per provider.
GET /llm.mdConcise agent-facing usage guide (markdown).
GET /docsThis reference.
GET /healthzLiveness probe.

Embeddings/completions/responses are served only by OpenAI-compatible providers (OpenAI/Grok/ollama). A model that routes to Anthropic, or an unknown model, → 400; a provider lacking the capability → 501.

Two dialects, one gateway

Point an OpenAI SDK at https://cerber.ihatebot.com/v1 or an Anthropic SDK at https://cerber.ihatebot.com. cerber translates OpenAI⇄Anthropic and OpenAI⇄Gemini under the hood, so you can call a Claude model through the OpenAI endpoint and get OpenAI-shaped responses, or use the native Anthropic endpoint for byte-faithful passthrough.

Model routing & aliases

Just set model; cerber routes by name:

Model prefixProvider
gpt*, o1*, o3*, o4*, chatgpt*OpenAI
gemini*Gemini
grok*xAI (Grok)
claude*Anthropic
(discovered local names)ollama / vLLM

Configured routing prefixes and discovered model names take precedence; an unmatched model → 400.

Automatic fallback (OpenAI endpoint)

On /v1/chat/completions, if the model fails with a retryable error — provider 5xx, or every account rate-limited/unavailable — cerber retries the next model in a fallback chain before any bytes are sent. A 4xx client error is returned as-is, and a stream already in progress is never re-attempted.

Per-request override: header X-Cerber-Fallback: model2,model3 (each routed like any model, so it can cross providers).

No server-side chains configured on this instance; use the header.

Rate limits & budgets

A managed key may carry a rolling cost budget (USD, from configured model pricing) and rate limits (requests & tokens per window). On exhaustion you get:

StatusMeaning
402Cost budget exhausted for the window.
429Request or token rate limit exceeded.

Windows are rolling: minute / hour / day / week / month. Counters persist across restarts. Streamed responses currently count requests but not cost/tokens.

Request headers

HeaderEffect
Authorization: Bearer <KEY>Client API key (or x-api-key).
X-Cerber-Cred: oauth|key|<name>Pin which pooled credential serves the request; omit to rotate.
X-Cerber-Fallback: m2,m3Per-request fallback chain (OpenAI endpoint).
X-Cerber-Management: <KEY>Management key for /admin/* (if configured).
anthropic-version, anthropic-betaPassed through to Anthropic on the native endpoint.

Providers & models on this instance

anthropic (3 models)

claude-haiku-4-5-20251001claude-opus-4-8claude-sonnet-5

arliai (59 models)

GLM-4.6-Derestricted-v5GLM-4.7Gemma-4-31B-Claude-4.6-Opus-Reasoning-DistilledGemma-4-31B-Cognitive-UnshackledGemma-4-31B-DarkIdolGemma-4-31B-FabledGemma-4-31B-GarnetGemma-4-31B-GarnetV2Gemma-4-31B-GembrainGemma-4-31B-Gembrain-uncensored-hereticGemma-4-31B-GemopusGemma-4-31B-K1-v5Gemma-4-31B-Larkspur-v0.5Gemma-4-31B-Mero-Artemis-v0.3.1Gemma-4-31B-MeroMeroGemma-4-31B-Musica-v1Gemma-4-31B-QueenGemma-4-31B-SDFT-Heretic-RPGemma-4-31B-Sphinsikus-ChronistGemma-4-31B-itMistral-Medium-3.5-128BQwen3.5-27B-AnkoQwen3.5-27B-BlueStar-DerestrictedQwen3.5-27B-BlueStar-Derestricted-LiteQwen3.5-27B-BlueStar-v2-DerestrictedQwen3.5-27B-BlueStar-v2-Derestricted-LiteQwen3.5-27B-BlueStar-v3-DerestrictedQwen3.5-27B-BlueStar-v3-Derestricted-LiteQwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-DerestrictedQwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-Derestricted-LiteQwen3.5-27B-Dark-Nexus-v3.0-DerestrictedQwen3.5-27B-Dark-Nexus-v3.0-Derestricted-LiteQwen3.5-27B-DerestrictedQwen3.5-27B-InfracelestialQwen3.5-27B-Marvin-DPO-V2-DerestrictedQwen3.5-27B-Marvin-DPO-V2-Derestricted-LiteQwen3.5-27B-Marvin-V2-DerestrictedQwen3.5-27B-Marvin-V2-Derestricted-LiteQwen3.5-27B-Musica-v1Qwen3.5-27B-NaNovel-DerestrictedQwen3.5-27B-NaNovel-Derestricted-LiteQwen3.5-27B-Omega-Evolution-v2.0-DerestrictedQwen3.5-27B-Omega-Evolution-v2.0-Derestricted-LiteQwen3.5-27B-Omega-Evolution-v2.2-DerestrictedQwen3.5-27B-Omega-Evolution-v2.2-Derestricted-LiteQwen3.5-27B-Omnimerge-v2-DerestrictedQwen3.5-27B-Omnimerge-v2-Derestricted-LiteQwen3.5-27B-Queen-DerestrictedQwen3.5-27B-Queen-Derestricted-LiteQwen3.5-27B-QuettaLLMs-Koreasoner-V3-DerestrictedQwen3.5-27B-QuettaLLMs-Koreasoner-V3-Derestricted-LiteQwen3.5-27B-RpRMax-v1Qwen3.5-27B-Vivid-DurianQwen3.5-27B-Writer-DerestrictedQwen3.5-27B-Writer-Derestricted-LiteQwen3.5-27B-Writer-V2-DerestrictedQwen3.5-27B-Writer-V2-Derestricted-LiteQwen3.5-27B-earica-DerestrictedQwen3.5-27B-earica-Derestricted-Lite

gemini (39 models)

antigravity-preview-05-2026deep-research-max-preview-04-2026deep-research-preview-04-2026deep-research-pro-preview-12-2025gemini-2.0-flashgemini-2.0-flash-001gemini-2.0-flash-litegemini-2.0-flash-lite-001gemini-2.5-computer-use-preview-10-2025gemini-2.5-flashgemini-2.5-flash-imagegemini-2.5-flash-litegemini-2.5-flash-preview-ttsgemini-2.5-progemini-2.5-pro-preview-ttsgemini-3-flash-previewgemini-3-pro-imagegemini-3-pro-image-previewgemini-3-pro-previewgemini-3.1-flash-imagegemini-3.1-flash-image-previewgemini-3.1-flash-litegemini-3.1-flash-lite-imagegemini-3.1-flash-lite-previewgemini-3.1-flash-tts-previewgemini-3.1-pro-previewgemini-3.1-pro-preview-customtoolsgemini-3.5-flashgemini-flash-latestgemini-flash-lite-latestgemini-omni-flash-previewgemini-pro-latestgemini-robotics-er-1.5-previewgemini-robotics-er-1.6-previewgemma-4-26b-a4b-itgemma-4-31b-itlyria-3-clip-previewlyria-3-pro-previewnano-banana-pro-preview

grok (10 models)

grok-4.20-0309-non-reasoninggrok-4.20-0309-reasoninggrok-4.20-multi-agent-0309grok-4.3grok-4.5grok-build-0.1grok-imagine-imagegrok-imagine-image-qualitygrok-imagine-videogrok-imagine-video-1.5

ollama

Use this provider's standard model names (routed by the prefixes above).

openai

Use this provider's standard model names (routed by the prefixes above).

Admin API

⚠ No management key configured — /admin/* currently accepts any valid client key. Set access.management_key for multi-tenant deployments, otherwise a capped key could lift its own limits.

Method & pathWhat it does
GET /admin/statsUsage snapshot (JSON): totals, per-credential, per-model, hourly series, total cost.
GET /admin/requestsRecent per-request log (newest first): time, client, IP, User-Agent, provider, model, account, tokens, cost. Filters: ?model= ?provider= ?credential= ?client=; paginate with ?limit= & ?offset= (returns total).
GET /admin/usage.csvUsage export (CSV).
GET /admin/accountsPooled credentials: state, health, usage.
GET /admin/providersProvider health + discovered models.
POST /admin/accounts/{name}/enable|disableToggle a credential at runtime.
GET /admin/keysList managed client keys (redacted, with limits + window usage).
GET /admin/keys/{name}/usagePer-key cumulative usage: totals + cost + per-model breakdown (which models, tokens, money).
POST /admin/keysMint a key; the secret is shown once.
POST /admin/keys/{name}/enable|disableToggle a client key.
DELETE /admin/keys/{name}Delete a client key.
POST /admin/keys/{name}/limitsSet budget/rate limits (access.Limits JSON; empty = unlimited).

Observability

Examples

OpenAI dialect (curl)

curl https://cerber.ihatebot.com/v1/chat/completions \
  -H 'Authorization: Bearer $KEY' -H 'Content-Type: application/json' \
  -d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"hi"}]}'

With per-request fallback

curl https://cerber.ihatebot.com/v1/chat/completions \
  -H 'Authorization: Bearer $KEY' -H 'X-Cerber-Fallback: gpt-4o,gemini-2.0-flash' \
  -d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"hi"}]}'

Anthropic dialect (curl)

curl https://cerber.ihatebot.com/v1/messages \
  -H 'Authorization: Bearer $KEY' -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  -d '{"model":"claude-sonnet-5","max_tokens":256,"messages":[{"role":"user","content":"hi"}]}'

OpenAI Python SDK

from openai import OpenAI
client = OpenAI(base_url="https://cerber.ihatebot.com/v1", api_key="$KEY")
client.chat.completions.create(model="claude-sonnet-5",
    messages=[{"role":"user","content":"hi"}])

Trust principles

cerber · github.com/tggo/cerber