Skip to content

API and Routing

All errors follow this shape:

{ "error": "..." }

Admin and user routes typically use:

  • x-api-key

Provider routes also support:

  • x-api-key
  • x-goog-api-key
  • Authorization: Bearer ...
  • Gemini query ?key=... (normalized to x-api-key)
MethodPathDescription
GET/Admin console homepage
GET/assets/{*path}Admin static assets
GET/favicon.icoReturns 204 No Content
MethodPathFunction
POST/v1/messagesClaude-style message generation (unified entrance)
POST/v1/messages/count_tokensClaude-style token count
POST/v1/chat/completionsOpenAI Chat Completions entrance
POST/v1/responsesOpenAI Responses entrance
GET/v1/responsesResponse upgrade-check entrance (use POST in practice)
POST/v1/responses/input_tokensOpenAI input token counting
POST/v1/embeddingsEmbedding entrance
POST/v1/responses/compactOpenAI Compact entrance
GET/v1/modelsModel list
GET/v1/models/{*model_id}Model details
GET/v1beta/modelsGemini-style model list entrance
GET/v1beta/{*target}Gemini-style GET target (models.get, etc.)
POST/v1beta/{*target}Gemini-style POST target (generateContent, countTokens, embedContent, etc.)
POST/v1/{*target}Provider custom v1 passthrough target

Rules:

  • For unscoped routes, model must include provider prefix (for example openai/gpt-4.1).
  • Gemini path targets must also be provider-resolvable (for example models/aistudio/gemini-2.5-flash:generateContent).
  • GET /v1/responses is upgrade-check logic (upstream WebSocket not implemented yet; use POST /v1/responses).
MethodPathFunction
GET/{provider}/v1/oauthStart OAuth authorization flow
GET/{provider}/v1/oauth/callbackOAuth callback handling
GET/{provider}/v1/usageQuery upstream usage (supported channels)
GET/{provider}/v1/realtimeRealtime upgrade entrance
GET/{provider}/v1/realtime/{*tail}Realtime upgrade entrance with tail
POST/{provider}/v1/messagesClaude-style generation
POST/{provider}/v1/messages/count_tokensClaude-style token count
POST/{provider}/v1/chat/completionsOpenAI Chat Completions
POST/{provider}/v1/responsesOpenAI Responses
GET/{provider}/v1/responsesResponses upgrade-check entrance
POST/{provider}/v1/responses/input_tokensOpenAI input token count
POST/{provider}/v1/embeddingsEmbedding
POST/{provider}/v1/responses/compactCompact response entrance
GET/{provider}/v1/modelsModel list
GET/{provider}/v1/models/{*model_id}Model details
GET/{provider}/v1beta/modelsGemini-style model list
GET/{provider}/v1beta/{*target}Gemini-style GET target
POST/{provider}/v1beta/{*target}Gemini-style POST target
POST/{provider}/v1/{*target}Provider v1 passthrough target

Built-in channels currently supporting OAuth:

  • codex
  • claudecode
  • geminicli
  • antigravity
MethodExample pathFunction
GET/v1beta/models or /{provider}/v1beta/modelsmodels.list, list available Gemini models
GET/v1beta/models/{model} (via /{*target})models.get, query single model details
POST/v1beta/models/{model}:countTokenscountTokens, count input tokens
POST/v1beta/models/{model}:generateContentgenerateContent, non-stream generation
POST/v1beta/models/{model}:streamGenerateContentstreamGenerateContent, stream generation (SSE/NDJSON)
POST/v1beta/models/{model}:embedContentembedContent, vector embedding
MethodPathFunction
GET/admin/global-settingsRead global settings
POST/admin/global-settings/upsertUpdate global settings
POST/admin/system/self_updateTrigger system self-update
GET/admin/config/export-tomlExport TOML config
POST/admin/config/import-tomlImport TOML config
POST/admin/providers/queryQuery providers
POST/admin/providers/upsertCreate/update provider
POST/admin/providers/deleteDelete provider
POST/admin/credentials/queryQuery credentials
POST/admin/credentials/upsertCreate/update credential
POST/admin/credentials/deleteDelete credential
POST/admin/credential-statuses/queryQuery credential health status
POST/admin/credential-statuses/upsertCreate/update credential health status
POST/admin/credential-statuses/deleteDelete credential health status
POST/admin/users/queryQuery users
POST/admin/users/upsertCreate/update user
POST/admin/users/deleteDelete user
POST/admin/user-keys/queryQuery user keys
POST/admin/user-keys/upsertCreate/update user keys
POST/admin/user-keys/deleteDelete user keys
POST/admin/requests/upstream/queryQuery upstream request audit
POST/admin/requests/downstream/queryQuery downstream request audit
POST/admin/usages/queryQuery usage details
POST/admin/usages/summaryQuery usage summary
MethodPathFunction
POST/user/keys/queryQuery current user’s keys
POST/user/keys/upsertCreate/update current user’s keys
POST/user/keys/deleteDelete current user’s keys
POST/user/usages/queryQuery current user’s usage details
POST/user/usages/summaryQuery current user’s usage summary

User key normalization:

  • Stored as u{user_id}_<raw_key>
  • If input already has this prefix, it stays unchanged
Terminal window
curl -sS http://127.0.0.1:8787/openai/v1/chat/completions \
-H "x-api-key: <key>" \
-H "content-type: application/json" \
-d '{
"model": "gpt-4.1",
"messages": [{"role":"user","content":"hello"}],
"stream": false
}'