Endpoint Index
Every route the proxy serves. X in the auth column means "API key (Authorization: Bearer sk-… or x-api-key: sk-…)"; J means console JWT (Authorization: Bearer <jwt>); — means public.
LLM endpoints
| Method | Path | Auth | Protocol | Notes |
|---|---|---|---|---|
| POST | /v1/chat/completions | X | OpenAI | Chat Completions |
| POST | /v1/responses | X | Responses | JSON or SSE; background: true requires Redis |
| POST | /v1/responses/compact | X | Responses | Native passthrough first, local lossless packing fallback |
| GET | /v1/responses/{response_id} | X | Responses | Retrieve a stored response (24 h TTL) |
| DELETE | /v1/responses/{response_id} | X | Responses | Delete a stored response |
| POST | /v1/responses/{id}/cancel | X | Responses | Cancel a background response (409 if not cancellable) |
| GET | /v1/responses/{id}/input_items | X | Responses | limit 1–100 (default 20), order asc/desc, after cursor |
| POST | /v1/messages | X | Anthropic | Anthropic Messages |
| POST | /v1/messages/count_tokens | X | Anthropic | Native upstream count when available, otherwise a local o200k_base estimate |
| POST | /v1/embeddings | X | OpenAI | Embeddings |
| POST | /v1/systemone | X | System One | TypeSafe Jev evaluation (also via OpenRouter and local Ollama models). The named model must carry the supports_systemone flag, otherwise 400 invalid_request_error |
| POST | /v1/decisions | X | Decisions | OpenAI's Decisions endpoint (gpt-6-luna), also served by System One models through the proxy's bridge. Gated by the same supports_systemone flag |
| POST | /v1/images/generations | X | OpenAI | JSON body |
| POST | /v1/images/edits | X | OpenAI | JSON or multipart (image, image[], mask) |
| POST | /v1/audio/speech | X | OpenAI | Binary audio response |
| POST | /v1/audio/transcriptions | X | OpenAI | Multipart; requires model and file |
| POST | /v1/audio/translations | X | OpenAI | Multipart; requires model and file |
| GET | /v1/models | X | — | Model list filtered by the key's allowlist |
| GET | /v1/protocols | X | — | Registered protocols with base paths |
::: note Path aliases Protocol routes also answer on trailing-slash variants and on the alias forms used by different SDK versions — e.g. POST /chat/completions and POST /v1/v1/chat/completions reach the same handler as the canonical path. :::
Capability matrix
Provider support varies by capability — the table summarizes who can serve what.
| Capability | Providers |
|---|---|
| Chat | All types |
| Embeddings | openai, the openai-compatible family (including DeepSeek, Kimi, MiniMax, Moonshot, Qwen, xAI, vLLM, SGLang, Chutes, Mistral, NanoGPT, OpenRouter), gemini, ollama |
| Images (generation + edits) | openai, the openai-compatible family, gemini, qwen |
| Audio (speech, STT) | openai, the openai-compatible family except qwen/qwen-intl (DashScope serves speech only on its native endpoints — see below), gemini (native TTS/STT), openrouter (STT) |
| Audio (translation) | openai, the openai-compatible family except qwen/qwen-intl, gemini. openrouter and qwen/qwen-intl have no upstream endpoint and reject the request with a 400 |
| System One (evaluation) | typesafe (Jev, direct), openrouter (TypeSafe Jev resold), ollama (local models, v0.35+). Chat and embeddings against ollama keep using the native /api/* surface |
| Decisions (evaluation) | openai (native /v1/decisions), plus every System One provider above, which the proxy bridges onto a System One route. Only openai accepts inline images |
The dedicated anthropic provider type is chat-only. The typesafe provider type is System One-only — assign it to models that serve /v1/systemone, and note that chat requests against such a model are rejected with a 400.
qwen/qwen-intl serve no /audio/* route: DashScope has no OpenAI-compatible audio surface. Speech synthesis (Qwen-TTS, CosyVoice) uses the native /api/v1/services/aigc/multimodal-generation/generation endpoint, and OpenAI-compatible speech recognition (qwen3-asr-flash) is called through /chat/completions with input_audio content parts. Audio requests against a qwen model are rejected with a 400 invalid_request_error naming the limitation.
Capability flags are additive: supports_systemone marks a model as a decision model, which gates both /v1/systemone and /v1/decisions — they are two envelopes over the same evaluation primitives, and the provider translates between them (see Decisions). The flag does not restrict the model's chat service, so a model can serve both when its providers support both. A request to either evaluation endpoint naming a model without the flag is rejected with a 400 invalid_request_error before any provider is called. The flag also gates being selected as the Routing Judge.
WebSocket endpoints
| Path | Auth | Notes |
|---|---|---|
WS /v1/responses | X | Same events as the SSE stream; send {"type":"response.create", …} |
WS /v1/realtime | X | OpenAI Realtime relay; ?model= must resolve to a supports_realtime model on an openai/openai-compatible provider |
MCP
| Method | Path | Auth | Notes |
|---|---|---|---|
| POST | /servers/{server_name}/mcp | X | Streamable-HTTP MCP endpoint for one configured server (all MCP methods) |
Health
| Path | Auth | Notes |
|---|---|---|
| GET | /api/health | — |
| GET | /api/health/ready | — |
| GET | /api/health/live | — |
Admin API
All under /api, all requiring a JWT unless noted. Groups:
| Prefix | Contents |
|---|---|
/api/auth/* | setup-status, setup, login, logout (logout accepts an optional token) |
/api/api-keys* | Key CRUD, budget reset, per-key usage, spend summary |
/api/config/providers* | Provider CRUD, provider types, key reveal, upstream model list |
/api/config/models* | Model CRUD, pricing/metadata sync endpoints, model names |
/api/config/server/* | All server settings sections (logging, web search, smart routing, provider selection, request policy, resilience, security, keepalive, rate limits, CORS, MCP security) |
/api/config/circuit-breaker* | Breaker state and resets |
/api/logs* | Log query/detail/stats, usage stats, audit verification, cleanup |
/api/routing/* | Training-data export: feedback labels and judge verdicts as JSONL (/api/routing/export/dataset) |
/api/mcp/* | MCP server CRUD, status, capabilities |
/api/team/members* | Member CRUD, roles, model allowlists, account budgets, password resets |
/api/me/* | Profile, budget, password, username, tracing, feedback |
/api/catalog/models | Display catalog (any authenticated user) |
/api/system/info | Version and update check (admin) |
Static frontend
When frontend/dist exists, /assets/* serves compiled assets and any other GET path that is not /api/*, /v1/*, or /servers/* falls back to index.html (SPA routing). Without the build, those paths 404 and only the API is served.
Not available
- OpenAPI / Swagger / ReDoc at runtime — not registered (
docs_url=None,redoc_url=None,openapi_url=None), so/docs,/redoc, and/openapi.jsonare never mounted. A GET to those paths therefore follows the SPA fallback from the Static frontend section:index.html(200) whenfrontend/distexists, 404 without it. The generated/v1contract is published as OpenAPI Specification inside this documentation instead. - Log export endpoints — query
GET /api/logswith pagination instead.
Related
- Authentication — headers and credentials
- Errors & Rate Limits — failure shapes