Alternatives

How Terminal X uses OpenRouter

Most comparison pages treat the other product as a rival. OpenRouter is not our rival — it is part of our stack, and Terminal X runs a large share of its text-model traffic through it as an ordinary customer.

So the honest framing is not Terminal X versus OpenRouter. It is: do you want to build the layer above a model gateway yourself, or use one that already exists? If you are a developer with a fixed model choice and your own UI, building it is genuinely cheap. If you want the model chosen for you, several models run in parallel, and results that land in documents, images, video and your own SaaS tools, that layer is a few thousand lines of work you would otherwise write.

Below is what that layer actually contains and what it costs. Every credit figure here comes out of our own source, not a listicle.

The disclosure first: which calls go through OpenRouter

Terminal X keeps a provider registry that maps a logical model name to two things: a direct provider endpoint and an OpenRouter slug. One env flag decides which side is used. With the flag on, gpt-5 resolves to openai/gpt-5.6-terra, grok-4.5 resolves to x-ai/grok-4.5, the default DeepSeek resolves to deepseek/deepseek-v4-flash-0731, Qwen resolves to qwen/qwen3.7-flash, and Claude task models resolve to anthropic/claude-sonnet-5, anthropic/claude-opus-5 or anthropic/claude-fable-5.

The reason is boring and it is the same reason you would do it: one balance instead of six prepaid ones. Without it we would be topping up OpenAI, xAI, DeepSeek, Groq, DashScope and Mistral separately and reconciling six invoices. OpenRouter collapses that into a single auto-recharging balance, and past roughly $500/month of consistent volume they will move you to net-30 invoicing.

Some things deliberately stay on native transports. The parser stays on the Anthropic SDK because it depends on Anthropic prompt caching, which OpenRouter's OpenAI-shaped surface does not expose the way we need. The agent WebSocket loop stays native because it consumes tool_use blocks directly, and so do the internal helpers that build Word, Excel, PowerPoint and PDF files. ElevenLabs, Suno, Runway, Luma, HeyGen, Ideogram, Stability, Meshy and Firecrawl have no OpenRouter path in our code at all, so those run on their own keys regardless.

Two things people assume stay on Google's SDK do not. Gemini prefers the OpenRouter chat client when the flag is on and only falls back to Google's SDK when it is off, and Nano Banana is an OpenRouter image call against google/gemini-3.1-flash-image. The Pro and Lite variants are OpenRouter-only: google/gemini-3-pro-image and google/gemini-3.1-flash-lite-image refuse to run at all without USE_OPENROUTER=1, because Google's own image API does not serve those slugs directly.

Media is gated by a second, separate flag covering Flux, Recraft, Kling and Seedance. That separation is not tidiness. Flipping one switch must not silently move image output from BFL's flux-pro-1.1 to Flux 2 Pro, or video from Kling 2.5 Master to Kling 3.0 Std, without someone deciding that on purpose. One flag for text, one for pixels.

Net effect: on raw model access, you get roughly the same catalogue either way. The difference is everything wrapped around the call.

What the wrapper is: a router that picks the model for you

OpenRouter gives you an endpoint. It does not decide which model to send a given request to. That decision is the actual product here, and it lives in a large system prompt that reads your request and writes a brief for each model it schedules.

The rules are specific, not vibes. Write new code routes to claude-code. Read or explain existing code routes to claude-sonnet, because the expensive builder is wasted on comprehension. A quick single-fact lookup routes to perplexity rather than a frontier model that will confidently guess. A summary of many pages of input routes to gemini-pro for the context window. Strict-JSON output or a function-calling demo routes to gpt-5. Multilingual writing in a non-Latin primary script routes to qwen-next. A vector logo routes to recraft-v4.1-vector because Recraft is the only model in the set that emits true SVG, while a photoreal metallic emblem routes to nano-banana instead. A movie poster with a baked-in title and credit block routes to gpt-image-2, but the same cinematic frame with no text routes to nano-banana-pro.

Those decisions also fan out. A single request can schedule a copywriting model, an image model and a build task that depends on both, then embed the generated assets into the finished page. That dependency graph, the parallel dispatch, the placeholder substitution for image and audio bytes, and the fusion step are the parts you would be writing yourself on top of OpenRouter.

The honest cost of that routing layer

The parser is not free and we are not going to pretend it is. The system prompt is roughly 25,300 tokens. Anthropic's ephemeral prompt cache has a five-minute TTL, so at our current traffic a large share of requests arrive on a cold cache and pay the 1.25x cache-write premium instead of the cache-read discount.

Measured on 2026-08-03: a one-word prompt of hi cost $0.13 to parse and $0.003 to answer. Warm-cache parse cost is about $0.027. That ratio is the entire argument against a router when you already know what you want. If your app always calls deepseek/deepseek-v4-flash-0731, a routing layer buys you nothing and costs you a Sonnet call per request.

Two things follow. First, we added a fast path that skips the parser entirely for trivial prompts like greetings, because paying $0.13 to route the word hi is indefensible. Second, the gap shrinks as traffic rises and caches stay warm, which is why the fix is more volume rather than a thinner prompt. An adversarial pass over the prompt found only about 1,900 tokens safely removable, and rejected assembling the prompt conditionally because forking the cached prefix permanently caps the cache hit rate.

The slug tax, and a key-leak bug worth knowing about

If you wire OpenRouter yourself, budget time for model IDs. They are not guessable and they change. Real 404s from our own commit history: deepseek/deepseek-v3.1 does not exist, the working slug is deepseek/deepseek-chat-v3.1. mistralai/mistral-large-3 does not exist, Mistral Large 3 is served as mistralai/mistral-large-2512. Appending -480b-a35b to qwen/qwen3-coder 404s even though that is the model's marketing name.

Dated versus floating pins matter too. Both deepseek/deepseek-v4-flash and deepseek/deepseek-v4-flash-0731 resolve, but the undated one floats and will move under you. We pin the dated snapshot, which also means that entry has no direct-provider fallback, because DeepSeek's own API does not address an OpenRouter-side pin.

On video the naming trap is different. bytedance/seedance-2.0-i2v and kwaivgi/kling-v3.0-std-i2v do not exist — both 400 with "Model does not exist". The same base slug serves text-to-video and image-to-video, and video does not go through /chat/completions at all: you POST to https://openrouter.ai/api/v1/videos. The mode is chosen by the body shape, and the shape matters. Sending a top-level input_image field looks right and is silently dropped — Seedance ran text-to-video and returned a generic lake clip from a portrait input. The field that actually works is frame_images: [{ type: "image_url", image_url: { url }, frame_type: "first_frame" }].

The one that is worth your attention if you are building this yourself: our registry originally let an OpenRouter-only entry fall through to the direct path when the flag was off. That built an OpenAI SDK client with no baseURL, which silently defaults to api.openai.com, which means DEEPSEEK_API_KEY or DASHSCOPE_API_KEY would have gone out as a Bearer token to OpenAI. It is a third-party secret leaking cross-provider, and the auth error you get back misdiagnoses the cause completely. There is now an explicit guard that refuses the call rather than falling back. If your own wrapper has a nullable base URL anywhere, go look at it.

Billing: metered from OpenRouter's number, not from our price table

Every OpenRouter chat client we build is wrapped so that each completion request carries the usage-include extension, which makes OpenRouter return the exact amount it charged for that call. Our metering prefers that number over our own rate table.

That is deliberate. A hand-maintained token-price table drifts every time a provider changes rates, and it drifts unevenly, because OpenRouter can route the same slug to upstream providers at different prices. DeepSeek V4 Flash is the clearest case: 22 endpoints serve that slug and realized cost ranges $0.083 to $0.20 in and $0.167 to $0.50 out, so we quote at the ceiling and let the reported charge settle it. Reading the charge back is the only way credits track real spend. The conversion is fixed: 1 credit equals $0.006 of API spend, and a task bills the reported cost divided by 0.006, rounded up, with a floor of one credit.

You still get a pre-flight quote before anything runs, because a number after the fact is not a budget. The parser estimates input and output tokens per task and prices them, then a reconciliation pass after execution adjusts the deduction against that estimate. Tasks that error are excluded from the deduction entirely. The table below is the quote side: what Terminal X calls, the rate our own table quotes from, and what the pre-flight cost comes to.

When you should just use OpenRouter

You are shipping a product with your own interface. Terminal X does have an HTTP API — you can mint a Terminal X API key and call /api/parse and /api/execute, and a parse costs a flat 5 credits on a key — but it is Terminal X-shaped, not OpenAI-shaped. There is no inference endpoint you can point a baseURL at. If your integration surface is chat.completions.create, OpenRouter is the correct answer and we are not a drop-in substitute.

You need your own keys. Terminal X runs on pooled provider keys and there is no bring-your-own-key path for AI models. You can paste your own credentials for some connectors, but a connector is an integration with a SaaS tool, not a model provider. If you need per-tenant keys, your own zero-data-retention agreements, or a direct commercial relationship with a lab, go direct.

You need provider-preference control. OpenRouter lets you order upstream providers, set fallback chains and pin routing behaviour per request. Terminal X does not surface any of that. You pick a model or let the parser pick, and that is the whole control surface.

You want the cheapest possible per-token price. You will pay less calling OpenRouter yourself. Our credits sit above raw cost because they also cover the parser call, result storage, the app, and the connector runners. That is a real markup and we would rather you know it than discover it.

What you get instead, and what is still missing

Past text, one prompt can produce images, video, voice, music, 3D meshes, and real .docx, .xlsx, .pptx and .pdf files, then chain them so the build task embeds the assets the earlier tasks generated. Thirty-two connectors are marked live in the catalogue — 22 through OAuth and 10 through a pasted key — covering Slack, GitHub, GitLab, Notion, Linear, Airtable, Asana, HubSpot, Stripe, Supabase, Netlify, Railway, AWS S3, Google Workspace, Microsoft 365, Telegram, Twilio, Resend, Mailgun and Brevo, most with real CRUD rather than read-only. Eight more sit in the catalogue as "soon" and we do not pretend otherwise: Vercel, Shopify, Snowflake, Discord, Reddit, X, Bluesky and Figma. MCP is live, so you can point Terminal X at your own server, though the transport is streamable-HTTP only and local stdio servers cannot be plugged in.

The gaps, plainly. Terminal X can send mail through the Gmail connector, because the OAuth scope we hold is gmail.send — but it cannot read your inbox. Ask it to and the parser routes the request to a small model that returns a coming-soon answer. Google Drive access is scoped to files Terminal X itself created, so it cannot browse your existing Drive. There are no team seats or shared workspaces, so one login is one person; the "AI Teams" line on the plan list means a saved line-up of models, not human seats. There are no per-client brand kits, meaning style has to be restated in the prompt or stored as a memory rather than saved as a reusable profile. Kling video and Runway Aleph are Business-only, gated by model family so a version alias like kling-v3-pro cannot walk past the check; every other model is unlocked on every paid plan.

Plans start at $4.99/month for 400 credits, with 2,500 at $19.99 and 6,500 at $49.99, and unused credits roll over up to a per-plan cap of 100, 500 and 1,500 respectively. Business is contact-only — credits are sized to your volume rather than listed. There is no free tier. Using the table below, 400 credits is roughly 100 Claude Sonnet 5 tasks, or 66 Sonar Pro lookups, or 400 DeepSeek or Qwen calls.

What Terminal X actually calls on OpenRouter, the rate our own table quotes from, and the pre-flight credit cost (1 credit = $0.006)
Terminal X modelOpenRouter slug calledQuoting rate / 1M (in / out)Pre-flight quote
Claude Sonnet 5anthropic/claude-sonnet-5$2.00 / $10.004 credits (~$0.024)
Claude Opus 5anthropic/claude-opus-5$5.00 / $25.006 credits (~$0.036)
Claude Fable 5anthropic/claude-fable-5$10.00 / $50.0015 credits (~$0.090)
GPT-5.6 Terraopenai/gpt-5.6-terra$2.50 / $15.005 credits (~$0.030)
GPT-5.6 Sol Proopenai/gpt-5.6-sol-pro$5.00 / $30.0012 credits (~$0.072)
Grok 4.3x-ai/grok-4.3$1.25 / $2.501 credit (~$0.006)
DeepSeek V4 Flashdeepseek/deepseek-v4-flash-0731$0.20 / $0.501 credit (~$0.006)
Qwen3.7 Flashqwen/qwen3.7-flash$0.03 / $0.131 credit (~$0.006)
Mistral Large 3mistralai/mistral-large-2512$0.50 / $1.501 credit (~$0.006)
Sonar Properplexity/sonar-pro$3.00 / $15.006 credits (~$0.036)
GPT-OSS 120Bopenai/gpt-oss-120b$0.03 / $0.151 credit (~$0.006)

Frequently asked

Does Terminal X use OpenRouter under the hood?

Yes, for most text models, and for more of the image lane than people expect. Our provider registry maps each logical model to an OpenRouter slug, and requests go to openrouter.ai/api/v1 with our referer and title headers attached. Gemini and Nano Banana route through OpenRouter too when the flag is on, and Nano Banana Pro and Lite are OpenRouter-only. What stays on native transports: the parser (it needs Anthropic prompt caching), the agent WebSocket loop (native tool_use blocks), the internal document builders, and providers with no OpenRouter path in our code, including ElevenLabs, Suno, Runway, Luma, HeyGen, Ideogram, Stability, Meshy and Firecrawl.

Is Terminal X cheaper than calling OpenRouter directly?

No. Per token you will pay less going direct, and if you already know which model you want, you should. Terminal X credits are priced at $0.006 of API spend each and sit above raw cost because they also fund the routing parser, the parallel execution and fusion layer, result storage, and the connector runners. The routing call itself is real overhead: a warm-cache parse costs about $0.027 and a cold one measured at $0.13.

Can I point my existing code at Terminal X the way I point it at OpenRouter?

Not as a drop-in. Terminal X has an HTTP API behind its own API keys — /api/parse and /api/execute, with a parse billed at a flat 5 credits on a key — plus a CLI and a WebSocket agent loop. What it does not have is an OpenAI-compatible inference endpoint you can swap a baseURL to. If your integration surface is a chat-completions client, OpenRouter is the right tool.

Can I bring my own OpenRouter or provider API key?

Not for AI models. Model access runs on pooled keys, so there is nothing to sign up for or rotate across providers, and equally no way to attach your own account or negotiate your own rates. You can paste your own credentials for certain connectors such as Resend, Stripe, Supabase, Twilio and AWS S3, but those are SaaS integrations, not model providers, and they are billed and configured separately. Web scraping is not one of them — Firecrawl runs on our own server-side key as a platform model, not as a bring-your-own-key connector.

How do I know what a prompt will cost before I run it?

The parser produces a pre-flight quote per task by estimating input and output tokens against our rate table, and you see it before execution. After the run, metering prefers the exact charge OpenRouter reports back on each call over our own table, converts it at $0.006 per credit rounded up with a one-credit floor, and a reconciliation pass adjusts the deduction against the estimate. Tasks that error are excluded from billing.

Do images and video route through OpenRouter too?

The separate media flag covers Flux, Recraft, Kling and Seedance, so enabling text wholesaling cannot silently move those to a different model generation. The Nano Banana and GPT-image families are a different story — they run on OpenRouter under the main flag, and the Pro and Lite Nano Banana variants require it. ElevenLabs, Suno, Runway, Luma, HeyGen, Ideogram, Stability and Meshy run on their own provider keys either way. Note that Kling and Runway Aleph require the Business plan; every other model is available on every paid plan.

Or skip the comparison shopping: Terminal X routes one prompt to the right model automatically — and runs several in parallel when a job needs more than one.