From OpenRouter
Same OpenAI-shaped API, a fraction of the bill — what to change and what to expect.
Both are OpenAI-shaped, so the move is the base URL, the key, and the model ids.
- baseURL: 'https://openrouter.ai/api/v1'
+ baseURL: 'https://chat.eterial.ai/v1'Model ids are short
OpenRouter namespaces a model by its publisher. Eterial's ids are the model, not the route to it — the same id resolves to whichever backend serves it.
| OpenRouter | Eterial |
|---|---|
moonshotai/kimi-k2.6 | kimi-k2.6 |
minimax/minimax-m2.7 | minimax-m2.7 |
deepseek/deepseek-v4-flash | deepseek-v4-flash |
OpenRouter-only fields
The request body is forwarded to the backend untouched, so these are neither stripped nor rejected — but they are not part of Eterial's contract, and on a request the GPU network serves they mean nothing at all:
provider— routing preferences. Eterial decides the order itself; see Routing.models— OpenRouter's fallback array. Eterial's fallback is automatic and needs no declaring.transforms,route— no equivalent.- The
HTTP-RefererandX-Titleheaders — attribution for OpenRouter's leaderboards. Harmless, and pointless here.
One field does carry over exactly: plugins: [{ "id": "web" }] is recognised as
a request for web search and routes accordingly, alongside web_search_options
and a web-search entry in tools.
The bill
This is the reason to move: the same models, served by the GPU network, cost a small fraction of what an aggregator charges for them. See Pricing for the rates.
Requests that fall back
OpenRouter is also Eterial's fallback provider. A request the network cannot serve is retried there and priced accordingly, so the saving applies to the requests the network served — see Failover & retries.
Other differences
- The catalogue is much smaller. Eterial serves a curated set rather than
every model on the market.
GET /v1/modelsis the live list. - Capabilities narrow the routing, and a combination no single backend
supports is a
400even when/v1/modelsadvertises both. Idempotency-Keyis supported.