Which of your models should actually run the workload?

You know your token profile and you have opinions about your stack. Cost-Route measures the shortlist you are already considering against your own questions, prices every candidate across three procurement routes, and shows which price mechanics actually decide the bill. Then it names the gap between what you estimated and what the calls really cost.

Prices read from OpenRouter and the Hugging Face router at 2026-09-28T09:03:36.555Z. Page generated 2026-09-29T11:19:12.175Z.

What you get A measured quality gate per candidate against your own known answers, measured latency, cost per call and per month at your volume, and the things a price list hides: the cached-input rate, tier thresholds, provider choice, the licence, and how much lock-in each route carries.
Who it is for The engineer or procurement lead who knows their token consumption and their stack preferences. This is not a CFO's summary and it does not round the fine print off.
What it is not Not a market scan — the shortlist is yours, and the page tests the models you name rather than ranking 446 of them. Not a per-token calculator, and not an estimate generator: every measured figure came from a call that was really made and billed.

How to read this page

  1. Pick a workload. Use the tabs: Legal contract review or Image generation.
  2. Read the gap. Each tab opens with three numbers: what the buyer said the month would cost, what their own stated assumptions cost when priced out, and what the calls actually cost. The first gap is arithmetic; the second is the measurement.
  3. Move your own numbers. Volume, prompt size, answer length and your own estimate are yours to change in the panel just below. Every measured figure stays locked and timestamped.
measured produced by a real, billed call at a timestamp. It does not move. assumed the buyer's input, or yours. Move it and the answer travels. PASS FAIL whether a candidate cleared the quality bar; not measured means no usable run.

The three procurement routes. A closed API model, quoted per token · B open weights served by a third party · C open weights self-hosted, an estimate from named assumptions and never a price.

Your own numbers, on Legal contract review

Everything measured is fixed and timestamped. Everything here is a guess, by definition, so you may as well move it and see how far the answer travels. This panel follows the tab you picked above; switching tabs re-points it at the other workload's own measurements.

You change this assumed

In dollars. This is the number the rest of the page is arguing with.

Your numbers, priced at measured rates rates locked

–
per month
Your estimate, against your own assumptions
–
a calculator error if this is large
Your assumptions, against the measured cache behaviour
–
the only part measuring changes about your numbers

The estimate of $18.00/month is wrong twice over. $18.00 does not follow from the buyer's own stated assumptions, which cost $5.10 on their own model at their own volume. The measurement then says $5.11.
Two different errors. Only the second one is a measurement problem, and only the second one would have been caught by measuring anything.

Where the estimate went wrong

The buyer said $18.00/month. Here is every named reason that number is not what this workload costs, and what each one is worth.

Each row changes one thing about the buyer's own assumptions and reprices the whole bill. The dollar figure is what that mechanic was worth given everything changed above it, so the steps sum to the gap between the buyer's own assumptions and the measurement, not to the column total. Negative means the correction made the bill cheaper.

Buyer's estimate Arithmetic correction Buyer's own assumptions Prompt size Answer length Prompt caching Reasoning tokens Measured
Total (a real running figure)
Raises the bill
Lowers the bill
Measured (the answer)

The table below is the same walk, frozen at the numbers current when this page was generated.

StepTokens per callEffect on the bill
Buyer's stated estimate$18.00
does not follow from their own assumptions, before anything was measured$-12.90
Buyer's own assumptions cost$5.10
Prompt size
How much text you send with every request
1,500 → 3,000+$4.50
Answer length
How much text comes back
50 → 17−$0.39
Prompt caching
Whether the repeated part of the prompt is served from cache
0 → 2,734−$4.10
Reasoning tokens
Work the model bills for but never shows you
0 unchanged, measured 0$0.00
This model was billed for no reasoning tokens on this workload, so the mechanic did not apply. On a reasoning model it would, and it is billed without ever appearing in the answer.
Measured$5.11

Steps run from the most fundamental quantity to the most specific. Each dollar figure is what that mechanic was worth, given everything changed before it. A different order would give different per-step figures and the same total.

Mechanics this route never exercised

Absent rather than zero. A row reading $0.00 beside a mechanic that never ran looks like a saving nobody took; these are mechanics that were never available here.

  • tiered rates: this model publishes no tier thresholds, so the prompt size cannot change its rate
  • provider choice: route A does not let the buyer pick a provider, so there was no provider decision to price
  • per-call charges: this workload makes no web searches and sends no image as input, so no charge outside token arithmetic applied

Every candidate, at your volume

The shortlist is an input, not a finding. These are the models the buyer named, spanning $0.1400 to $10.0000 per 1M input tokens — about a 71x spread across both procurement routes, out of 458 text models in the catalogue. The job is to test whether the cheap one clears the bar, not to rank the market, and the reason each candidate is here is printed on its own row.

Quality and latency are locked: they were measured against a golden set at a timestamp and cannot be recomputed in a browser. Cost per call and per month respond to the panel at the top of the page.

OpenAI: GPT-4o-mini, the model this workload runs on today, fails the buyer's own quality bar.
The bar asks for 75% correct and at most 0 fabricated answers. Measured: 12 of 14 correct, 1 fabricated.
  • 1 hallucination flag; the bar allows 0
Cost is not the only thing this workload is getting wrong, and it is not the first thing. A cheaper route that also fails the bar saves money on answers nobody can use.
100% 90% 80% 70% Accuracy Monthly cost (log scale) 75% floor (and 0 fabricated answers allowed)
Clears the quality gate
Fails the quality gate
Marker size: p95 latency
CandidateQuality gateServedp50 / p95 $ per 1M inPer callMonthly
OpenAI: GPT-4o-mini current
openrouter · route A
The buyer's current default, and the incumbent the ledger has to explain: the gap between the estimate and the measurement is only interesting on the model the buyer is running today. Marked by this flag rather than by matching a name.
FAIL
12/14 correct
1 fabricated
14/14
no failures
1,294 / 2,021 ms$0.1500
effective $0.0817
––
Fails because: 1 hallucination flag; the bar allows 0
OpenAI: GPT-5.6 Sol
openrouter · route A
The frontier option, at 13x the incumbent's input price and a 1M-token context. Included to price what the extra quality actually costs. Publishes a tier override, so a long prompt can cross into a different rate than the headline one.
PASS
14/14 correct
0 fabricated
14/14
no failures
2,311 / 6,019 ms$2.0000
effective $2.0000
––
Anthropic: Claude Fable 5.1
openrouter · route A
The most expensive input rate in the shortlist, $10/M against the incumbent's $0.15/M, and 40x cheaper on cached input at $0.25/M. The clearest illustration that the list price is not the price, and that whether you get the cached rate is a prompt-structure decision rather than a purchasing one.
PASS
13/14 correct
0 fabricated
14/14
no failures
4,143 / 5,141 ms$10.0000
effective $10.0000
––
DeepSeek: DeepSeek V4 Flash 0423
openrouter · route B
The cheapest candidate in the shortlist, open weights under MIT, and about 5x cheaper again on cached input. Included specifically to test whether the cheapest option clears the buyer's bar, which is the question the page exists to answer.
PASS
11/14 correct
0 fabricated
14/14
no failures
2,094 / 4,198 ms$0.1400
effective $0.0707
––
DeepSeek: DeepSeek V4 Pro 0423
openrouter · route B
The same family one tier up, at roughly 11x Flash's input price. Included so the page shows an intra-family spread instead of treating a model family as a single option; a buyer choosing 'DeepSeek' is really choosing a tier.
PASS
14/14 correct
0 fabricated
14/14
no failures
5,635 / 12,513 ms$0.9553
effective $0.2218
––
MoonshotAI: Kimi K3
openrouter · route B
A third open-weight lab, priced between DeepSeek Pro and Claude Fable, with a 1M-token context and a bespoke licence rather than a permissive one. Included so the open-weight route is not represented by a single vendor, and so the licence column shows that 'open' is not one term.
PASS
14/14 correct
0 fabricated
14/14
no failures
1,813 / 2,654 ms$3.0000
effective $0.5190
––

"Effective" is the blended input rate after caching, computed from the measured profile. It is printed beside the list price because the two columns rank candidates differently, and the list price is the one nobody pays.

The same measurement, cut by question kind

One accuracy figure per candidate hides which questions the candidates separate on. This is the same run, re-cut: how many of each kind of question each candidate answered correctly, over the calls that were served. A question that was never answered is named under the cell rather than counted as a wrong answer.

CandidateStated in one clauseNeeds two clauses combinedNot answered by the contract
OpenAI: GPT-4o-mini current10/101/3
1 fabricated
1/1
OpenAI: GPT-5.6 Sol10/103/31/1
Anthropic: Claude Fable 5.110/102/31/1
DeepSeek: DeepSeek V4 Flash 04239/101/31/1
DeepSeek: DeepSeek V4 Pro 042310/103/31/1
MoonshotAI: Kimi K310/103/31/1

No candidate answered a Not answered by the contract question wrongly. Every difference the quality bar actually found is in “Stated in one clause”, “Needs two clauses combined”, and it is what fails GPT-4o-mini. A workload made only of the first kind has no measured reason to prefer the more expensive candidate. A low score on a kind is a failure to weigh against that candidate's price; a perfect score on a kind everyone passes is not a reason to buy it.

The same workload, bought asynchronously

The Batch API is asynchronous and text-only, one provider per batch chosen at submission with no fallback, and it returns no per-request latency. What it does return is usage.cost for the whole batch — so this route can be priced in two independent ways, and this section keeps them apart. The published columns are what the catalogue lists for the :batch card. The measured columns are what the calls were really charged: the synchronous bill from the sum of that run's per-call costs, the batch bill from the batch's own usage.cost. 1 of these candidates were bought as a batch on this workload.

CandidateStandard card, per M in – outBatch card, per M in – out Published ratioSync bill, measuredBatch bill, measured Measured ratioSubmit → done
OpenAI: GPT-4o-mini
openai/gpt-4o-mini:batch
$0.1500 – $0.6000$0.0750 – $0.3000x0.5000
published
$0.003574n/anot measured—
OpenAI: GPT-5.6 Sol
openai/gpt-5.6-sol:batch
$2.0000 – $10.0000$1.0000 – $5.0000x0.5000
published
$0.108686n/anot measured—
Anthropic: Claude Fable 5.1
anthropic/claude-fable-5.1:batch
$10.0000 – $50.0000$5.0000 – $25.0000x0.5000
published
$0.795350n/anot measured—
MoonshotAI: Kimi K3
moonshotai/kimi-k3:batch
$3.0000 – $15.0000$2.2800 – $11.4000x0.7600
published
$0.038635$0.087732
14 of 14 calls billed
x2.2708
measured
1.86 h

The two ratios answer different questions and neither substitutes for the other. The published ratio compares two rate cards and is true of every workload. The measured ratio compares two bills for these 14 questions and is true of this one — a model can publish 50% and settle somewhere else entirely, because caching, tiers and reasoning tokens are not uniformly discounted. OpenRouter's own docs say so about non-token components; this table is what it looks like when it happens.

Pricing a monthly volume off the batch bill

The batch API reports one cost for the batch and none per request, so there is no per-call price to measure. The figures below are the batch bill divided by the calls it completed — arithmetic, not observation — and they are in their own table for that reason. They are what a monthly commitment would be priced from; they are not a per-call measurement, and nothing here should be quoted as one.

CandidateBatch bill, measuredCalls billed Allocated, per callAllocated, at your volumeSource
MoonshotAI: Kimi K3$0.08773214$0.006267$125.33allocated: batch usage.cost / requests completed

Candidates the asynchronous leg could not run

CandidateWhy
openai/gpt-4o-minino batch was submitted for this candidate, and no stored batch covers it
openai/gpt-5.6-solno batch was submitted for this candidate, and no stored batch covers it
anthropic/claude-fable-5.1no batch was submitted for this candidate, and no stored batch covers it
deepseek/deepseek-v4-flashno :batch endpoint for deepseek/deepseek-v4-flash, so the submit would return 400
deepseek/deepseek-v4-prono :batch endpoint for deepseek/deepseek-v4-pro, so the submit would return 400

A model with no :batch entry in the catalogue cannot be run asynchronously at all. The leg names them rather than leaving a silent gap in the table above, because a missing row reads as an oversight and this is a fact about the catalogue.

Across the whole catalogue, the discount is a typical case

OpenRouter's announcement says batch requests "generally charge 50% (and sometimes less) of their normal per-token price", and that is accurate as a description of the usual case. It is not a rule, and a buyer pricing an async workload against it will be wrong on 7 of the 72 cards that carry a rate on both sides.

Batch card against its standard cardCardsShare
Exactly 0.5x — the announced case6590.3%
Cheaper than 0.5x34.2%
Dearer than 0.5x, still a discount22.8%
More than the standard card — going async costs more22.8%
The 7 that are not 0.5xPromptCompletionWhat it means
openai/gpt-oss-120bx0.1973x0.2267A deeper discount than the announcement describes.
z-ai/glm-5.3x0.3214x0.4545A deeper discount than the announcement describes.
z-ai/glm-5.3-flashx0.4000x0.4000A deeper discount than the announcement describes.
moonshotai/kimi-k3x0.7600x0.7600A shallower discount than the announcement describes.
x-ai/grok-4.3
tiered rates above a prompt threshold
x0.8000x0.8000A shallower discount than the announcement describes.
openai/gpt-oss-20bx1.3333x1.2444Batch costs more than the standard card on this model.
deepseek/deepseek-v4.1-flashx4.4800x0.5600Batch costs more than the standard card on this model.

Read from the catalogue at 2026-09-28T09:03:36.555Z, at no cost: every :batch entry is a full model entry with its own pricing, so the comparison needs no submission. It is a price list, not a bill — the two columns above are labelled accordingly.

The three procurement routes

Route C is an estimate built from named assumptions, not a quoted price, and it is the only row in the repository with no monthly cost field. Sorting it beside A and B as though it were one more price is the mistake this table exists to prevent.

RouteCandidateMonthlyWhat price does not say
Route A
Closed API model
quoted price
openai/gpt-4o-mini
openrouter
$5.11
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.0750/M against a list input rate of $0.1500/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $0.0817/M.
  • Vendor lock. The model can be withdrawn or repriced without notice, and the only signal is it disappearing from the catalogue. Note that expiration_date is not a usable warning: only 4 of 446 models carry it.
Route A
Closed API model
quoted price
openai/gpt-5.6-sol
openrouter
$155.27
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.2000/M against a list input rate of $2.0000/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $2.0000/M.
  • Vendor lock. The model can be withdrawn or repriced without notice, and the only signal is it disappearing from the catalogue. Note that expiration_date is not a usable warning: only 4 of 446 models carry it.
  • Tiered pricing: the rate changes once the prompt crosses a size threshold, so a longer document silently costs more per token than the headline figure.
Route A
Closed API model
quoted price
anthropic/claude-fable-5.1
openrouter
$1136.21
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.2500/M against a list input rate of $10.0000/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $10.0000/M.
  • Vendor lock. The model can be withdrawn or repriced without notice, and the only signal is it disappearing from the catalogue. Note that expiration_date is not a usable warning: only 4 of 446 models carry it.
Route B
Open weights, served by a third party
quoted price
deepseek/deepseek-v4-flash
openrouter
$3.12
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.0280/M against a list input rate of $0.1400/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $0.0707/M.
  • Licence is named and readable: "mit". With a closed model the equivalent terms are in a vendor agreement, not a file you can inspect.
  • "mit" is a permissive licence, so there is no question to ask before use.
Route B
Open weights, served by a third party
quoted price
deepseek/deepseek-v4-pro
openrouter
$21.54
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.0796/M against a list input rate of $0.9553/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $0.2218/M.
  • Licence is named and readable: "mit". With a closed model the equivalent terms are in a vendor agreement, not a file you can inspect.
  • "mit" is a permissive licence, so there is no question to ask before use.
Route B
Open weights, served by a third party
quoted price
moonshotai/kimi-k3
openrouter
$55.19
  • One endpoint and one key. No weights to run, no capacity to plan, no serving stack to maintain.
  • Publishes a cache-read rate of $0.3000/M against a list input rate of $3.0000/M. Whether you get it depends on prompt structure, not on choosing this model. Measured effective input rate on this workload: $0.5190/M.
  • Licence is named and readable: "other". With a closed model the equivalent terms are in a vendor agreement, not a file you can inspect.
  • The licence is a bespoke or restricted one ("other"), not Apache or MIT. It carries use restrictions that a permissive licence does not, and they are the buyer's to check.
Route C
Open weights, self-hosted
estimate
—$1019.10
to $2040.00 if the instance is held up all month
estimate, not a price
  • No per-token meter and no vendor between the buyer and the model. Inference stays inside the buyer's own infrastructure.
  • Everything except hardware cost. Throughput engineering, capacity planning, failover, and an on-call rota are now the buyer's.
  • No price exists, so this row cannot be compared numerically with A and B.

The monthly figures for routes A and B price each candidate's own measured token profile at this workload's stated volume, and they are fixed. They are not the candidates table above, which moves with your inputs; where the two differ, they are pricing different configurations and both are right.

Assumptions this page rests on

  • Synthetic documents. The contract and every question are invented for this benchmark, with known correct answers. No client documents, no scraped contracts, no real counterparty names.
  • A 14-question golden set. Chosen to include deliberate hard cases rather than sampled at random. The quality bar is 75% correct and at most 0 fabricated answers.
  • A 15,000 ms latency ceiling, the buyer's own number. Latency is reported against that ceiling, not against a generic target.
  • The buyer's estimate is an input, not a finding. 20,000 requests a month, 1,500 prompt tokens and 50 answer tokens per request, $18.00/month were stated by the buyer, not measured. The page's argument is the distance between those inputs and the measurement.
  • Prices were read at a timestamp. Catalogue rates were read 2026-09-28T09:03:36.555Z, and the calls behind this tab were made 2026-09-21T10:24:35.356Z. Re-running the pipeline reproduces the method, not these figures.
  • Route C is an estimate. Self-hosting has no published price, so its row is built from named assumptions and is never compared numerically with the two quoted routes.

What this tab cannot tell you

  • One workload. These numbers describe answering one question from one contract. A different task has different token counts, a different cache hit rate, and probably a different winner.
  • A cache hit rate that was measured once. Moving the prompt size scales the cached and uncached halves together, holding the measured hit rate fixed. A prompt with a different shape caches differently.
  • Quality that does not travel. The gate result is for this model on these 14 questions. It is evidence, not a guarantee about your questions.
  • No latency on the asynchronous route. The Batch API returns no per-request timing, so the 15000ms ceiling was not applied to any batch here — not passed, not failed, not run. The only timing fact a batch carries is submit-to-terminal, which is a property of the queue.
  • Prices that drift. Every rate here was read at 2026-09-28T09:03:36.555Z. Re-run the pipeline for today's.

Run this on your shortlist

Take the document or prompt, ten to fifteen questions you already know the answers to, and the models you are considering. You get this page back with your numbers in it. Three ways in, in increasing order of control:

  • Form — fill in the workload and submit it; the run hands back the summary. Best for a one-off question.
  • API — POST /webhook/cost-route with the workload as JSON, for anything you want to run repeatedly or wire into a pipeline.
  • Locally — clone the repository, add one workload file, and run the pipeline. Full control, and the whole interactive page is yours.

A text run of five or six models on fourteen questions costs roughly $0.01–1.00 depending on the shortlist — the frontier model dominates the bill, which is the finding, not a caveat. Nothing runs on a visitor's behalf, and no key is needed to read this page.

This page is the artifact. The pipeline that produces it — the benchmark runner, the estimate-versus-measured ledger, the renderer, the saved run files and the test suite — is in the repository, together with the n8n workflow that orchestrates the calls. Point it at your own contract or prompt and your own shortlist by adding one workload file, and the same report comes back with your numbers in it.

The Cost-Route n8n workflow canvas: a manual trigger, two catalogue HTTP Request nodes, and Code nodes that plan the calls, time them, apply the quality gate, price the survivors, compare the three procurement routes and render the decision summary.

Written by Madeline Li · LinkedIn