One OpenAI-compatible endpoint over 17 providers, plus verbatim native passthrough. This page is generated from the gateway's live provider registry, so every value below reflects current behavior.
Base URL: https://llmproxy.api.sparkbright.me. Every request (except GET /health and the docs pages)
authenticates with a SparkBright app key:
Authorization: Bearer <your-app-key>
The app key controls rate limits and which providers the app may call. Provider API keys are held by the
gateway and injected server-side — clients never send upstream provider keys. An app restricted by
allowedProviders gets 403 for any other provider.
endpoints
POST /v1/chat/completions ·
GET /v1/models[?provider=] ·
GET /v1/models/pricing[?provider=] ·
GET /v1/providers ·
ANY /native/{provider}/{path...} ·
GET /health ·
GET / · GET /docs
POST /v1/chat/completionsAn OpenAI-shaped chat endpoint that works identically across providers. Pick the provider and model per request; the gateway renames the token param, clamps temperature, and drops unsupported params for you (see the parameter matrix).
{
"provider": "openai", // required — a provider id (see table below)
"model": "gpt-5.5", // required — a model id for that provider
"messages": [ // required — OpenAI chat messages
{ "role": "system", "content": "You are concise." },
{ "role": "user", "content": "Hello" }
],
"temperature": 0.7, // standard params, top-level (OpenAI style)
"max_tokens": 1024,
"stream": false,
"conversationId": "optional-id",// server-side 90-min history merge (non-stream)
"standardFormat": true // default true; false returns provider-raw body
}
Params may be sent top-level (OpenAI style) or inside a legacy options{} object,
in camelCase or snake_case; top-level wins. Recognized standard params:
max_tokens, temperature, top_p, top_k, stop,
seed, presence_penalty, frequency_penalty, response_format,
tools, tool_choice, parallel_tool_calls, reasoning_effort,
n, user.
{
"success": true,
"provider": "openai",
"model": "gpt-5.5",
"response": { /* OpenAI chat.completion shape (normalized) */
"choices": [{ "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }]
},
"usage": { "prompt_tokens": 12, "completion_tokens": 34, "total_tokens": 46 },
"conversationId": "conv-...",
"metadata": {
"requestId": "req-...",
"timestamp": "2026-07-12T00:00:00.000Z",
"rateLimitRemaining": 58,
"dropped_params": ["top_k"] // params silently dropped for this provider
}
}
response is always normalized to the OpenAI chat.completion shape when
standardFormat is true (the default). Set standardFormat: false to receive the
provider's raw body instead. Inspect metadata.dropped_params to see exactly what the gateway removed.
curl -sS https://llmproxy.api.sparkbright.me/v1/chat/completions \
-H "Authorization: Bearer $SB_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "openai",
"model": "gpt-5.5",
"messages": [{ "role": "user", "content": "Hello" }],
"max_tokens": 256
}'
const res = await fetch("https://llmproxy.api.sparkbright.me/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SB_APP_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
provider: "anthropic",
model: "claude-sonnet-5",
messages: [{ role: "user", content: "Hello" }],
max_tokens: 256,
}),
});
const data = await res.json();
console.log(data.response.choices[0].message.content);
Set "stream": true to receive Server-Sent Events. The gateway pipes the upstream SSE straight through in
OpenAI delta shape (Anthropic's typed stream is translated to the same shape). Streamed responses have
no JSON wrapper and skip the conversation cache.
curl -N https://llmproxy.api.sparkbright.me/v1/chat/completions \
-H "Authorization: Bearer $SB_APP_KEY" \
-H "Content-Type: application/json" \
-d '{ "provider": "groq", "model": "openai/gpt-oss-120b",
"messages": [{ "role": "user", "content": "Count to 3" }], "stream": true }'
# data: {"choices":[{"delta":{"content":"1"}}]}
# data: {"choices":[{"delta":{"content":"2"}}]}
# ...
# data: [DONE]
Supply a conversationId on a non-stream request and the gateway merges prior turns from a 90-minute
server-side cache, appends the new turn, and stores the assistant reply. To keep multi-turn history you must supply
the same id from the first request onward. Omitted on streams.
The request shape is identical across providers — change provider and model and nothing else.
Because token-param renaming, temperature clamping, and unsupported-param dropping are handled per provider, the same
body is portable. Use GET /v1/models?provider=<id> to discover live model ids, and each provider's
default/cheap ids (below) as safe starting points.
GET /v1/models/pricingSame auth, query, and envelope as /v1/models, with a per-model pricing object
(USD per 1,000,000 tokens) and a provider-level cost summary attached. Alias:
/v1/models/cost. Each provider carries a cost_source:
api (pricing read live from the provider — OpenRouter, Together, SambaNova),
static (published rates the gateway maintains), or
none (no per-token cost — Ollama is local/self-hosted, Featherless
is a flat subscription). Models with no known price (e.g. openrouter/auto) return
pricing:null with a cost_reason.
curl -sS https://llmproxy.api.sparkbright.me/v1/models/pricing?provider=anthropic -H "Authorization: Bearer <app-key>"
{ "provider": "anthropic", "cost_source": "static", "cost_available": true,
"unit": "usd_per_1m_tokens", "currency": "USD",
"models": [ { "id": "claude-sonnet-5",
"pricing": { "input": 3, "output": 15, "source": "static", "unit": "usd_per_1m_tokens" } } ] }
ANY /native/{provider}/{path...}Forward a request verbatim to a provider's own API. The gateway does no body parsing, no param
validation, and no transformation — it injects provider auth (and required headers such as
anthropic-version), forwards method, query, and body, and streams the response back with the provider's
own status and content type. Use this to reach provider-specific features the standard route doesn't model.
The path after /native/{provider} is appended to that provider's native root:
| Provider | Forwards to (native root) | Native chat surface | Example call |
|---|---|---|---|
openai |
https://api.openai.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/openai/chat/completions |
anthropic |
https://api.anthropic.com |
POST /v1/messages |
POST https://llmproxy.api.sparkbright.me/native/anthropic/v1/messages |
google |
https://generativelanguage.googleapis.com |
POST /v1beta/models/{model}:generateContent |
POST https://llmproxy.api.sparkbright.me/native/google/v1beta/models/gemini-3.5-flash:generateContent |
groq |
https://api.groq.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/groq/chat/completions |
sambanova |
https://api.sambanova.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/sambanova/chat/completions |
moonshot |
https://api.moonshot.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/moonshot/chat/completions |
deepseek |
https://api.deepseek.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/deepseek/chat/completions |
alibaba |
https://dashscope-intl.aliyuncs.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/alibaba/chat/completions |
cohere |
https://api.cohere.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/cohere/chat/completions |
mistral |
https://api.mistral.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/mistral/chat/completions |
xai |
https://api.x.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/xai/chat/completions |
cerebras |
https://api.cerebras.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/cerebras/chat/completions |
perplexity |
https://api.perplexity.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/perplexity/chat/completions |
openrouter |
https://openrouter.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/openrouter/chat/completions |
together |
https://api.together.xyz |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/together/chat/completions |
featherless |
https://api.featherless.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/featherless/chat/completions |
ollama |
http://localhost:11434 |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/ollama/chat/completions |
Example: POST /native/anthropic/v1/messages reaches
https://api.anthropic.com/v1/messages with
x-api-key + anthropic-version injected.
Each cell shows two things: the native param name / range (top, grey) to use for a native passthrough call, and how the standard route maps that param for the provider (bottom; red = dropped). Table scrolls horizontally; the param column is pinned.
| param | openai | anthropic | google | groq | sambanova | moonshot | deepseek | alibaba | cohere | mistral | xai | cerebras | perplexity | openrouter | together | featherless | ollama |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
max_tokens |
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens (required)
passed as max_tokens; required, defaults 4096
|
generationConfig.maxOutputTokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens; defaults 4096 if unset
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
temperature |
temperature 0–2
clamped to 0–2; dropped on reasoning models unless reasoning_effort none
|
temperature 0–1
clamped to 0–1
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–1
clamped to 0–1
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.999
clamped to 0–1.999
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.5
clamped to 0–1.5
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.5
clamped to 0–1.5
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
top_p |
top_p
passed; dropped on reasoning models
|
top_p
passed
|
topP
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_k |
top_k (may 400)
dropped
|
top_k
passed
|
topK
passed
|
top_k (may 400)
dropped
|
top_k
passed
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
stop |
stop
passed
|
stop_sequences[]
passed
|
stopSequences[]
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
seed |
seed
passed
|
—
dropped
|
seed
passed
|
seed
passed
|
seed (may 400)
dropped
|
seed (may 400)
dropped
|
seed (may 400)
dropped
|
seed
passed
|
seed
passed
|
random_seed
renamed → random_seed
|
seed
passed
|
seed
passed
|
seed (may 400)
dropped
|
seed
passed
|
seed
passed
|
seed
passed
|
seed
passed
|
presence_penalty |
presence_penalty
passed
|
—
dropped
|
presencePenalty
passed
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
frequency_penalty |
frequency_penalty
passed
|
—
dropped
|
frequencyPenalty
passed
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
response_format |
response_format
passed
|
— (use tools / JSON prompt)
dropped
|
responseMimeType / responseSchema
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format (may 400)
dropped
|
response_format
passed
|
response_format
passed
|
response_format (may 400)
dropped
|
response_format
passed
|
tools |
tools
passed
|
tools[]
passed
|
tools[].functionDeclarations
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools (may 400)
dropped
|
tools
passed
|
tools
passed
|
tools (may 400)
dropped
|
tools
passed
|
tool_choice |
tool_choice
passed
|
tool_choice {auto|any|tool|none}
passed
|
toolConfig.functionCallingConfig
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed; "required" → "auto"
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice (may 400)
dropped
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice (may 400)
dropped
|
tool_choice
passed
|
parallel_tool_calls |
parallel_tool_calls
passed
|
—
passed
|
—
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls (may 400)
dropped
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls (may 400)
dropped
|
parallel_tool_calls
passed
|
stream |
stream
passed w/ stream_options
|
typed SSE
passed w/ stream_options
|
:streamGenerateContent?alt=sse
passed (no stream_options)
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed (no stream_options)
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
reasoning_effort |
reasoning_effort
passed
|
— (thinking{budget_tokens})
dropped
|
— (thinkingConfig)
dropped
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
"passed w/ stream_options" means the gateway adds stream_options:{include_usage:true} on
streams. "may 400" on a native cell means passthrough forwards the param but the provider itself may reject it.
| ID | Provider | Protocol | Token param | Temp | Default | Cheap | Models list | Extra standard params |
|---|---|---|---|---|---|---|---|---|
openai |
OpenAI | openai | max_completion_tokens |
0–2 | gpt-5.5 |
gpt-5.4-nano |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
anthropic |
Anthropic | anthropic | max_tokens |
0–1 | claude-sonnet-5 |
claude-haiku-4-5 |
live | temperature, top_k, tools, tool_choice, parallel_tool_calls |
google |
Google Gemini | openai | max_tokens |
0–2 | gemini-3.5-flash |
gemini-3.1-flash-lite |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
groq |
Groq | openai | max_completion_tokens |
0–2 | openai/gpt-oss-120b |
openai/gpt-oss-20b |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
sambanova |
SambaNova | openai | max_tokens |
0–2 | Meta-Llama-3.3-70B-Instruct |
gemma-4-31B-it |
live | temperature, top_k, response_format, tools, tool_choice, parallel_tool_calls |
moonshot |
Moonshot (Kimi) | openai | max_completion_tokens |
0–1 | kimi-k2.6 |
kimi-k2.5 |
live | temperature, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
deepseek |
DeepSeek | openai | max_tokens |
0–2 | deepseek-v4-flash |
deepseek-v4-flash |
live | temperature, response_format, tools, tool_choice, parallel_tool_calls |
alibaba |
Alibaba Qwen (DashScope) | openai | max_tokens |
0–1.999 | qwen-plus |
qwen-flash |
live | temperature, seed, response_format, tools, tool_choice, parallel_tool_calls |
cohere |
Cohere | openai | max_tokens |
0–2 | command-a-03-2025 |
command-r7b-12-2024 |
fallback only | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
mistral |
Mistral | openai | max_tokens |
0–1.5 | mistral-large-latest |
mistral-small-latest |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
xai |
xAI (Grok) | openai | max_completion_tokens |
0–2 | grok-4.5 |
grok-4.3 |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
cerebras |
Cerebras | openai | max_completion_tokens |
0–1.5 | gpt-oss-120b |
gemma-4-31b |
live | temperature, seed, response_format, tools, tool_choice, parallel_tool_calls |
perplexity |
Perplexity (Sonar) | openai | max_tokens |
0–2 | sonar-pro |
sonar |
fallback only | temperature, top_k, presence_penalty, frequency_penalty |
openrouter |
OpenRouter | openai | max_tokens |
0–2 | openrouter/auto |
meta-llama/llama-3.3-70b-instruct:free |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
together |
Together AI | openai | max_tokens |
0–2 | meta-llama/Llama-3.3-70B-Instruct-Turbo |
meta-llama/Llama-3.1-8B-Instruct-Turbo |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
featherless |
Featherless AI | openai | max_tokens |
0–2 | meta-llama/Meta-Llama-3.1-8B-Instruct |
meta-llama/Meta-Llama-3.1-8B-Instruct |
live | temperature, top_k, seed, presence_penalty, frequency_penalty |
ollama |
Ollama | openai | max_tokens |
0–2 | llama3.3 |
llama3.2 |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
| Standard base | https://api.openai.com/v1 |
|---|---|
| Native root | https://api.openai.com |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | gpt-5.5 |
| Cheap model | gpt-5.4-nano |
| Fallback list | gpt-5.6-sol, gpt-5.5-pro, gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-4.1, gpt-4.1-mini, gpt-4o, gpt-4o-mini |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Reasoning models (gpt-5*/o-series) drop temperature & top_p unless reasoning_effort is none. |
| Docs | https://platform.openai.com/docs/api-reference |
| Standard base | https://api.anthropic.com |
|---|---|
| Native root | https://api.anthropic.com |
| Auth (standard) | x-api-key + anthropic-version: 2023-06-01 |
| Token param | max_tokens |
| Temperature | 0 – 1 (clamped) |
| Default model | claude-sonnet-5 |
| Cheap model | claude-haiku-4-5 |
| Fallback list | claude-fable-5, claude-opus-4-8, claude-sonnet-5, claude-haiku-4-5-20251001 |
| /v1/models | live via /v1/models |
| Always dropped | none |
| Quirks | max_tokens is required; the gateway defaults it to 4096. |
| Docs | https://docs.anthropic.com/en/api |
| Standard base | https://generativelanguage.googleapis.com/v1beta/openai |
|---|---|
| Native root | https://generativelanguage.googleapis.com |
| Auth (standard) | bearer / native x-goog-api-key |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | gemini-3.5-flash |
| Cheap model | gemini-3.1-flash-lite |
| Fallback list | gemini-3.1-pro, gemini-3.5-flash, gemini-3.1-flash-lite, gemini-2.5-pro, gemini-2.5-flash |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | No stream_options; usage arrives in the final stream chunk automatically. |
| Docs | https://ai.google.dev/gemini-api/docs |
| Standard base | https://api.groq.com/openai/v1 |
|---|---|
| Native root | https://api.groq.com |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | openai/gpt-oss-120b |
| Cheap model | openai/gpt-oss-20b |
| Fallback list | openai/gpt-oss-120b, openai/gpt-oss-20b, llama-3.1-8b-instant, moonshotai/kimi-k2-instruct, qwen/qwen3-32b |
| /v1/models | live via /models |
| Always dropped | logprobs, top_logprobs, logit_bias, n |
| Docs | https://console.groq.com/docs |
| Standard base | https://api.sambanova.ai/v1 |
|---|---|
| Native root | https://api.sambanova.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | Meta-Llama-3.3-70B-Instruct |
| Cheap model | gemma-4-31B-it |
| Fallback list | DeepSeek-V3.1, DeepSeek-V3.2, Meta-Llama-3.3-70B-Instruct, MiniMax-M2.7, gemma-4-31B-it, gpt-oss-120b |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, logprobs, top_logprobs, logit_bias |
| Docs | https://docs.sambanova.ai |
| Standard base | https://api.moonshot.ai/v1 |
|---|---|
| Native root | https://api.moonshot.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 1 (clamped) |
| Default model | kimi-k2.6 |
| Cheap model | kimi-k2.5 |
| Fallback list | kimi-k2.7-code, kimi-k2.7-code-highspeed, kimi-k2.6, kimi-k2.5 |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Bad low default for max tokens — the gateway sets 4096 when you omit it. tool_choice:"required" is unsupported and is coerced to "auto". |
| Docs | https://platform.moonshot.ai/docs |
| Standard base | https://api.deepseek.com |
|---|---|
| Native root | https://api.deepseek.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | deepseek-v4-flash |
| Cheap model | deepseek-v4-flash |
| Fallback list | deepseek-v4-flash, deepseek-v4-pro |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, seed, top_k |
| Docs | https://api-docs.deepseek.com |
| Standard base | https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
|---|---|
| Native root | https://dashscope-intl.aliyuncs.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 1.999 (clamped) |
| Default model | qwen-plus |
| Cheap model | qwen-flash |
| Fallback list | qwen3-max, qwen-max, qwen-plus, qwen-flash, qwen-turbo, qwq-plus |
| /v1/models | live via /models |
| Always dropped | frequency_penalty, top_k |
| Docs | https://www.alibabacloud.com/help/en/model-studio |
| Standard base | https://api.cohere.com/compatibility/v1 |
|---|---|
| Native root | https://api.cohere.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | command-a-03-2025 |
| Cheap model | command-r7b-12-2024 |
| Fallback list | command-a-plus-05-2026, command-a-03-2025, command-a-reasoning-08-2025, command-a-vision-07-2025, command-r7b-12-2024 |
| /v1/models | no live list — fallback ids only |
| Always dropped | none |
| Docs | https://docs.cohere.com |
| Standard base | https://api.mistral.ai/v1 |
|---|---|
| Native root | https://api.mistral.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 1.5 (clamped) |
| Default model | mistral-large-latest |
| Cheap model | mistral-small-latest |
| Fallback list | mistral-large-latest, mistral-medium-latest, mistral-small-latest, ministral-3-8b, codestral-latest |
| /v1/models | live via /models |
| Always dropped | logit_bias, logprobs, top_logprobs, top_k |
| Quirks | seed is renamed to random_seed. No stream_options; usage arrives in the final stream chunk automatically. |
| Docs | https://docs.mistral.ai |
| Standard base | https://api.x.ai/v1 |
|---|---|
| Native root | https://api.x.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | grok-4.5 |
| Cheap model | grok-4.3 |
| Fallback list | grok-4.5, grok-4.3, grok-4.20, grok-build-0.1 |
| /v1/models | live via /models |
| Always dropped | logit_bias |
| Docs | https://docs.x.ai |
| Standard base | https://api.cerebras.ai/v1 |
|---|---|
| Native root | https://api.cerebras.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 1.5 (clamped) |
| Default model | gpt-oss-120b |
| Cheap model | gemma-4-31b |
| Fallback list | zai-glm-4.7, gemma-4-31b, gpt-oss-120b |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, logit_bias |
| Docs | https://inference-docs.cerebras.ai |
| Standard base | https://api.perplexity.ai |
|---|---|
| Native root | https://api.perplexity.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | sonar-pro |
| Cheap model | sonar |
| Fallback list | sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro, sonar-deep-research |
| /v1/models | no live list — fallback ids only |
| Always dropped | logit_bias |
| Docs | https://docs.perplexity.ai |
| Standard base | https://openrouter.ai/api/v1 |
|---|---|
| Native root | https://openrouter.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | openrouter/auto |
| Cheap model | meta-llama/llama-3.3-70b-instruct:free |
| Fallback list | openrouter/auto, meta-llama/llama-3.3-70b-instruct:free, deepseek/deepseek-chat:free |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Unknown/extra params are forwarded (e.g. models[], provider, route, transforms). |
| Docs | https://openrouter.ai/docs |
| Standard base | https://api.together.xyz/v1 |
|---|---|
| Native root | https://api.together.xyz |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | meta-llama/Llama-3.3-70B-Instruct-Turbo |
| Cheap model | meta-llama/Llama-3.1-8B-Instruct-Turbo |
| Fallback list | meta-llama/Llama-3.3-70B-Instruct-Turbo, deepseek-ai/DeepSeek-V3, Qwen/Qwen2.5-72B-Instruct-Turbo, meta-llama/Llama-3.1-8B-Instruct-Turbo, moonshotai/Kimi-K2-Instruct |
| /v1/models | live via /models |
| Always dropped | none |
| Docs | https://docs.together.ai |
| Standard base | https://api.featherless.ai/v1 |
|---|---|
| Native root | https://api.featherless.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | meta-llama/Meta-Llama-3.1-8B-Instruct |
| Cheap model | meta-llama/Meta-Llama-3.1-8B-Instruct |
| Fallback list | meta-llama/Meta-Llama-3.1-8B-Instruct, meta-llama/Meta-Llama-3.1-70B-Instruct, Qwen/Qwen2.5-72B-Instruct |
| /v1/models | live via /models |
| Always dropped | none |
| Docs | https://featherless.ai/docs |
| Standard base | http://localhost:11434/v1 |
|---|---|
| Native root | http://localhost:11434 |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | llama3.3 |
| Cheap model | llama3.2 |
| Fallback list | llama3.3, qwen2.5, gpt-oss:20b, deepseek-r1 |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Base URL overridable via env OLLAMA_BASE_URL (local/self-hosted). |
| Docs | https://github.com/ollama/ollama/blob/main/docs/openai.md |
OpenRouter (provider: "openrouter") fronts hundreds of upstreams and exposes a pool of
free models. Params unsupported by the chosen upstream are silently dropped, not errored.
GET https://llmproxy.api.sparkbright.me/v1/models?provider=openrouter (or OpenRouter's own
GET /models), then keep entries whose pricing.prompt == "0" and
pricing.completion == "0" (they are strings). Free ids carry a :free suffix."model": "meta-llama/llama-3.3-70b-instruct:free". The suffix is mandatory to force the free tier.models array of ids tried in order —
{ "model": "a:free", "models": ["a:free", "b:free"] } (forwarded because OpenRouter allows extra params)."model": "openrouter/auto" lets OpenRouter pick a model for the prompt.429.When a provider returns a non-2xx response, the gateway returns the same HTTP status and preserves the provider's own error body verbatim:
{
"success": false,
"error": {
"type": "provider_error",
"provider": "openai",
"status": 400,
"message": "<best short message>",
"provider_error": { /* the provider's raw JSON body, verbatim (or raw text) */ },
"request_id": "req-..."
}
}
On the native route the provider's response is passed through untouched (status, content-type, body).
Mid-stream provider errors are piped through unchanged. Gateway-side problems use standard 4xx types
— invalid_request_error, authentication_error, rate_limit_error.
GET /v1/providers returns the full registry as JSON (secrets excluded): for every provider its
protocol, baseUrl, nativeBaseUrl, authStyle, tokenParam,
temperature range, supports flags, dropParams, quirks,
models (default/cheap/fallback/list), and docs.
This is the same data that generates this page.
Recommended agent flow for choosing a model dynamically:
GET /v1/providers once to learn which providers exist, their capabilities, and their default/cheap ids.supports.tools for function calling,
supports.response_format for JSON mode, supports.reasoning_effort for reasoning control.GET /v1/models?provider=<id> for the chosen provider to get live model ids
(falls back to the registry's fallback list if the provider has no live list or is unreachable);
each response also carries default and cheap for that provider.POST /v1/chat/completions with the selected provider + model. Read
metadata.dropped_params to confirm which of your params the provider actually honored.error.provider_error (verbatim) and either retry with a
fallback model or switch providers.Prefer each provider's default for quality and cheap for cost/latency. Do not
hardcode model ids long-term — resolve them from /v1/models so you follow provider deprecations automatically.
SparkBright LLM Gateway · 17 providers · generated from src/registry.js at request time.