Skip to content

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 ​

MethodPathAuthProtocolNotes
POST/v1/chat/completionsXOpenAIChat Completions
POST/v1/responsesXResponsesJSON or SSE; background: true requires Redis
POST/v1/responses/compactXResponsesNative passthrough first, local lossless packing fallback
GET/v1/responses/{response_id}XResponsesRetrieve a stored response (24 h TTL)
DELETE/v1/responses/{response_id}XResponsesDelete a stored response
POST/v1/responses/{id}/cancelXResponsesCancel a background response (409 if not cancellable)
GET/v1/responses/{id}/input_itemsXResponseslimit 1–100 (default 20), order asc/desc, after cursor
POST/v1/messagesXAnthropicAnthropic Messages
POST/v1/messages/count_tokensXAnthropicNative upstream count when available, otherwise a local o200k_base estimate
POST/v1/embeddingsXOpenAIEmbeddings
POST/v1/systemoneXSystem OneTypeSafe 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/decisionsXDecisionsOpenAI'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/generationsXOpenAIJSON body
POST/v1/images/editsXOpenAIJSON or multipart (image, image[], mask)
POST/v1/audio/speechXOpenAIBinary audio response
POST/v1/audio/transcriptionsXOpenAIMultipart; requires model and file
POST/v1/audio/translationsXOpenAIMultipart; requires model and file
GET/v1/modelsX—Model list filtered by the key's allowlist
GET/v1/protocolsX—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.

CapabilityProviders
ChatAll types
Embeddingsopenai, 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 ​

PathAuthNotes
WS /v1/responsesXSame events as the SSE stream; send {"type":"response.create", …}
WS /v1/realtimeXOpenAI Realtime relay; ?model= must resolve to a supports_realtime model on an openai/openai-compatible provider

MCP ​

MethodPathAuthNotes
POST/servers/{server_name}/mcpXStreamable-HTTP MCP endpoint for one configured server (all MCP methods)

Health ​

PathAuthNotes
GET/api/health—
GET/api/health/ready—
GET/api/health/live—

Admin API ​

All under /api, all requiring a JWT unless noted. Groups:

PrefixContents
/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/modelsDisplay catalog (any authenticated user)
/api/system/infoVersion 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.json are never mounted. A GET to those paths therefore follows the SPA fallback from the Static frontend section: index.html (200) when frontend/dist exists, 404 without it. The generated /v1 contract is published as OpenAPI Specification inside this documentation instead.
  • Log export endpoints — query GET /api/logs with pagination instead.

MIT licensed