A model catalog row looks like a fact: a slug, a context window, a price per million tokens, a listed date. Treat it as one and it can quietly mis-state all four. The price may be a time-boxed promotion. The rate may belong to one buying surface and not another. The date may record when a marketplace updated its database, not when the vendor shipped anything. And the vendor may have already told you, in writing, that the number is provisional.
This matters because catalog rows are where cost models start. Teams screenshot an aggregator page, drop the numbers into a spreadsheet, and project a quarter of spend from figures that were never load-bearing to begin with. In a single August 2026 window, we verified four separate cases — one per failure mode — where the row and the reality had already diverged.
This guide works through each case with the primary sources attached: a promotional rate being served as if it were list, a vendor family split across two pricing bases on one catalog page, listing dates that ran from ahead of the vendor’s own blog to roughly six months behind it, and a pricing page that warns its own numbers are expected to rise — with no date, no percentage, and no scheme.
- 01A live price is not a list price.Solar Pro 4’s $0.03 / $0.12 per million tokens is a 90%-off launch promotion — off a $0.30 input / $1.20 output list — that expires September 10, 2026 at 23:59 UTC. The reversion is 10× on both sides, and the promotional figure is what OpenRouter serves.
- 02Surface divergence is asymmetric per model.OpenRouter matches the vendor’s standard list for Grok 4.6, Claude Opus 5, Claude Fable 5 and GPT-5.6 Sol — and lists GPT-5.6 Terra and Luna at exactly half of OpenAI’s standard rates. One spot-check cannot be generalised to a family.
- 03A catalog slug is not proof of a product.OpenRouter carries gpt-5.6-*-pro rows with their own prices, but following one of them back to OpenAI’s developer docs returns a 404 — at the vendor, Pro is a request-time reasoning mode, not a model. One model can also carry two provider rates on the same catalog.
- 04Listed is not launched — in either direction.Catalog listing dates this window trailed vendor launches by 7 days, 8 days, roughly seven weeks and roughly six months — and one listing predates the date on the vendor’s own launch blog. One model’s created field even moved by two days between two pulls hours apart.
- 05Some prices are provisional by the vendor’s own admission.DeepSeek’s pricing page carries an undated footnote warning of a significant increase, with no figure and no timeframe, while the table above it holds steady. A 12-month cost model built on that table has vendor-documented, unboundable risk.
01 — FramingThe row is a contract term, not a fact.
A catalog row — on OpenRouter, on a vendor console, on any third-party price aggregator — is a snapshot of one surface at one moment, rendered without its qualifiers. The qualifiers are the price: whether the number is promotional or standing, which surface it bills on, when the record was written, and whether the vendor has flagged it as temporary. Strip those away and two teams reading the same row can build cost models that differ by an order of magnitude, both citing the same screenshot.
To be precise about what this piece is: it is a planning-risk guide, not a price tracker. For the running ledger of this month’s cuts and promotions, see our August 2026 pricing tracker; for what the newly cheap tier unlocks economically, the sub-$0.30 tier repricing analysis; for reference rates across the major vendors, the LLM API pricing index; and for what actually shipped versus what was merely announced this month, the August 2026 model releases tracker. Those pieces carry the numbers. This one carries the reading skill that stops the numbers from misleading you.
Promo vs list
The row shows what the surface bills right now — not what it reverts to. Solar Pro 4’s promotional rate is real and live, and it expires on a written date, after which the standing list is 10× higher.
Surface vs surface
An aggregator row can match the vendor’s standard list for one model and sit on a different pricing basis for its sibling — on the same page, with nothing flagging which is which.
Listed vs launched
A catalog’s listed date answers “when did this record change,” not “when did the vendor ship.” Verified gaps this window ran from ahead of the vendor’s own blog to roughly six months behind it.
Provisional pricing
A pricing page can carry a standing notice that the numbers are expected to rise — with no date, no percentage, and no scheme — while the table above it stays still. The footnote is part of the price.
02 — Promo vs ListA live price is not a list price.
Upstage launched Solar Pro 4 on or around August 10–11, 2026, with a 512K context window and a launch discount the vendor states plainly: 90% off — off the Upstage Console standard list of $0.30 per million input tokens, $0.06 per million cached input, and $1.20 per million output. The promotional rate is $0.03 input / $0.12 output, it applies on Upstage Console and OpenRouter, and it runs through September 10, 2026 at 23:59 UTC. That expiry is a hard cliff, not a taper: the day after, the same workload bills at 10× the rate on both input and output.
off the Console list
The promotional $0.03 input / $0.12 output per million tokens is 90% off Upstage’s standing list of $0.30 input / $1.20 output. The vendor names both the discount and the date it ends.
on both input and output
$0.03 reverts to $0.30 and $0.12 reverts to $1.20 — a uniform 10× step on each side. A cost model built on the promotional rate is off by an order of magnitude from mid-September.
only — no open weights
Solar Pro 4 is a proprietary, API-served model. Upstage’s open-weights products live in a separate line, Solar Open 2 — searching “Upstage open weights” and landing on Solar Pro 4 pricing is looking at the wrong product.
Here is the part that makes this a catalog-literacy problem rather than a footnote-reading problem. We pulled OpenRouter’s raw model JSON directly and confirmed that upstage/solar-pro4 is listed at $0.03 / $0.12 per million — the promotional rate, served as the row’s price with no promo qualifier attached. And per our earlier verification pass, several third-party price aggregators were already carrying that promotional figure as Upstage’s standing price. The number is not wrong. It is real, live, and it is what the surface bills at the time of writing. It is simply a snapshot of a time-boxed promotion, presented with the same typography as a list price.
Play that forward. A team at example.com scopes a document-heavy workload against the catalog row in late August, budgets the quarter, and ships in October. Every unit economic in the plan is 10× optimistic by the time traffic arrives — not because anyone lied, but because a promotional rate crossed into a spreadsheet without its expiry date. The discount is only half the fact; the denominator and the cliff are the other half. Never carry a discounted figure into a plan without the list price it discounts and the date it reverts.
“90% off on Upstage Console and OpenRouter through September 10”— Upstage, Solar Pro 4 launch announcement — the discount, its surfaces, and its expiry in a single line
03 — Surface vs SurfaceThe same model, two prices — on the same page.
The comfortable assumption is that an aggregator like OpenRouter simply mirrors vendor pricing. Sometimes it does. We cross-checked OpenAI’s pricing documentation and other vendors’ published lists against OpenRouter’s raw model JSON, parsed directly rather than read off a rendered page. For Grok 4.6, Claude Opus 5, Claude Fable 5 and GPT-5.6 Sol, the OpenRouter row matches the vendor’s standard list exactly. For GPT-5.6 Terra and GPT-5.6 Luna — two siblings from the same vendor family, on the same catalog page — it does not.
| Model | Vendor standard list (in / out per 1M) | OpenRouter listing | Relationship |
|---|---|---|---|
| Where the catalog matches the vendor standard list | |||
| Grok 4.6 | $2.00 / $6.00 — standard rate, prompts under 200K tokens | $2.00 / $6.00 | Matches the standard sub-200K rate; longer prompts bill on a separate vendor tier the row does not show. |
| Claude Opus 5 | $5.00 / $25.00 | $5.00 / $25.00 | Matches the vendor list. |
| Claude Fable 5 | $10.00 / $50.00 | $10.00 / $50.00 | Matches the vendor list. |
| GPT-5.6 Sol | $5.00 / $30.00 standard | $5.00 / $30.00 | Matches OpenAI’s standard tier, not its discounted batch tier. |
| Where it diverges — same vendor family, same catalog page | |||
| GPT-5.6 Terra | $2.00 / $12.00 standard | $1.00 / $6.00 | Exactly half of the vendor’s standard list on both sides — numerically coinciding with OpenAI’s documented batch tier at 50% off standard. |
| GPT-5.6 Luna | $0.20 / $1.20 standard | $0.10 / $0.60 | Exactly half of the vendor’s standard list on both sides — the same batch-tier coincidence as Terra. |
OpenRouter listing as a share of the vendor’s standard list rate
Sources: OpenAI developer pricing docs and the other vendors’ published lists; OpenRouter models API, raw JSON — percentage is the OpenRouter rate as a share of the same model’s vendor standard list rateWe can state the observation with confidence; the mechanism is the aggregator’s to explain. Terra and Luna’s OpenRouter rates land exactly on the figures OpenAI documents for its batch tier — which OpenAI prices at 50% off the standard list for all three siblings — while Sol’s OpenRouter rate matches the standard tier. Nothing on the catalog page flags that two rows sit on one pricing basis and the third on another. The lesson is not “OpenRouter is wrong” — every one of those numbers is what the surface actually bills. The lesson is that divergence is asymmetric per model: checking Sol tells you nothing about Terra, and checking Terra tells you nothing about Luna. A spot-check does not generalise, even inside one vendor family.
The vendor’s own surface can hide structure too, in the opposite direction. ByteDance prices doubao-seed-2.0-code on Volcano Engine in CNY, tiered by input length — longer prompts bill at progressively higher per-token rates. OpenRouter lists the same model (bytedance-seed/seed-2.0-code) at a single flat $0.50 / $3.00 per million. The flat row and the tiered schedule cannot be declared cheaper or pricier than each other in general: which surface wins depends on how long your prompts run, and the single-number row gives you no way to tell which regime your workload is in. A catalog row flattens pricing structure by design; the structure is where the money is.
04 — Phantom RowsRows that are not products.
A subtler trap: a slug existing in a catalog — with a price attached — is not proof the vendor recognises it as a product. OpenRouter’s raw model list carries three gpt-5.6-*-pro rows — one apiece for the Sol, Terra and Luna tiers — each with a :batch sibling and each with its own listed price. Follow one back to the source and it dissolves: the corresponding model page on OpenAI’s developer docs returns an HTTP 404. OpenAI’s pricing documentation describes Pro as a reasoning.mode request parameter on an existing model — a setting, not a model. The catalog has minted a distinct product row, with distinct pricing, for something the vendor ships as a request-time flag.
The same catalog can also carry two prices for one genuine model. NVIDIA’s Nemotron 3.5 Lightning — covered in our launch analysis of the efficiency tier — lists on OpenRouter at $0.10 / $0.25 per million via the CoreWeave route and $0.05 / $0.20 via DeepInfra. Neither is “the OpenRouter price.” A quote that says “Nemotron costs $0.10 on OpenRouter” and one that says “$0.05” are both right and both incomplete — the price belongs to the provider route, and any citation that drops the route is under-specified by exactly 2× on input.
05 — DatesListed is not launched.
Every OpenRouter row carries a created timestamp, and it is routinely read as a launch date. It is not one. It answers “when did this catalog’s record change,” and the gap between that and the vendor’s actual ship date is neither small, nor constant, nor even reliably in one direction. We converted the raw timestamps ourselves and checked them against the vendor’s primary announcements where we could locate one — for ByteDance, against the Seed team’s own blog. Five listings from the same catalog, all live in the same August window:
| Model ID | Vendor-launched | OpenRouter-listed | Gap |
|---|---|---|---|
| Catalog lagged the vendor | |||
bytedance-seed/seed-2.0-code | A February 2026 release | August 12, 2026 | Roughly six months — an old model, newly routed, reading as a fresh arrival. |
bytedance-seed/seed-2-1-turbo | June 23, 2026 — the vendor’s own blog dates the Seed 2.1 release | Unstable — the field moved between pulls; see below | Roughly seven weeks. |
sakana/sakana-namazu | August 3, 2026 — vendor API launch | August 11, 2026 | 8 days, per our earlier verification pass. |
liquid/lfm-2.5-2.6b:free | August 4, 2026 | August 11, 2026 | 7 days. |
| Catalog led the vendor | |||
meta/muse-glimmer-30b | August 10, 2026 — the date on Meta’s own launch blog | August 9, 2026 | The listing predates the vendor blog’s stated date — the catalog led. |
Two rows deserve a closer look. Meta’s Muse Glimmer 30B — the open-weights local-agent model we covered in our Muse Glimmer analysis — appears on OpenRouter dated before the date on Meta’s own announcement blog. So the catalog does not merely lag; it can lead, which breaks the one heuristic (“the vendor announced it first”) that a careful reader might have relied on.
The strongest evidence, though, is what happened with seed-2-1-turbo. Between two pulls of the same OpenRouter endpoint, hours apart, that model’s created field moved — from August 10 to August 12, 2026. Same catalog, same model ID, same field, two different answers in one day. Whatever internal re-indexing explains it, the practical conclusion is stark: the catalog’s own date field is not a stable historical record. It cannot be cited as one, archived as one, or used to settle a “when did this ship” dispute. For ship dates, only the vendor’s dated primary counts.
06 — Provisional PricingProvisional by the vendor’s own admission.
The fourth thing a catalog row cannot show you is a footnote on the vendor’s pricing page. DeepSeek’s API pricing page currently lists deepseek-v4-pro at $0.435 per million input tokens on a cache miss and $0.87 per million output — vendor list rates that, per our own earlier snapshot checks, have not moved in weeks. Beneath that table sits this notice, quoted verbatim:
Read it as a contract term and notice what is missing: no effective date, no percentage, no named scheme, no affected model list. “Significant” is the only sizing word the vendor offers, and we will not speculate past it — DeepSeek gave no number, so no forecast belongs in a plan. This is not an announced price change; it is a standing disclaimer that the entire table above it is provisional. A team building a 12-month cost model on those rates has no primary-source way to bound the risk: the vendor has explicitly said the number will move, and explicitly declined to say when or by how much.
The surrounding signals make the picture stranger, not clearer. DeepSeek’s own homepage banner says the V4-Pro version “remains unchanged for now.” The pricing page’s model-version field reads DeepSeek-V4-Pro-0813 — a dated version string — while the vendor’s own Hugging Face card still describes the whole V4 series as “a preview version.” Two vendor surfaces, two maturity signals, one model family — and a price-increase warning underneath both. Our companion piece, published alongside this one, unpacks the 0813 version-string sighting in full. The footnote also predates the version-string edit — it is a separate, earlier change, which is exactly why footnotes deserve their own diff-watch: they move independently of the table.
07 — The ProtocolRead every row like a contract.
The four cases reduce to four questions. Ask them of every catalog row before it enters a budget, and record the answers with the same discipline you would apply to an FX rate: sourced, dated, and labelled by surface.
Is this price promotional?
Find the vendor’s standing list price and the promo’s expiry date before the number moves anywhere. If a discount is quoted, record the rate it discounts from and the date it reverts. Solar Pro 4’s row is exact on two surfaces and still 10× wrong for October planning.
Which surface is this rate from?
Vendor standard, vendor batch, a provider route on an aggregator — same model, different bases. Label every number with its surface, and never generalise a spot-check across a model family: OpenRouter matches Sol at standard and lists Terra and Luna at half of it.
Is the listed date a launch date?
No. It is a database write that lagged vendors by up to roughly six months this window, led one vendor’s own blog date, and in one case changed between two same-day pulls. Take ship dates from the vendor’s dated primary only.
Has the vendor flagged the price as provisional?
Read the footnotes under the pricing table, not just the table. An undated increase notice is a material contract term: it converts every figure above it into a floating rate. Treat flagged prices as provisional in the model and keep a priced fallback route warm.
Step back and the pattern has a structural cause worth naming: a catalog is a routing layer, not a procurement document. Its job is to make a model callable through one API — which it does well — and every field beyond the endpoint is metadata maintained on a best-effort basis. Promotions get cached because rows show what the route bills now; pricing bases mix because the row records whatever rate the listing was configured with; dates wobble because they are database fields, not archival records. None of this is deception. It is what happens when an operational surface gets read as a reference surface.
Looking forward, expect the divergence to widen rather than close. More launches now debut with time-boxed promotional rates, more vendors run multi-tier pricing that flattens badly into one-number rows, and aggregators keep adding provider routes — each a new surface with its own rate for the same slug. Teams that treat catalog figures the way finance treats exchange rates — a quoted number, from a named source, on a stated date, with a known revert — will keep their models honest. The same skill applies one shelf over: our companion piece on reading vendor benchmark tables is this argument applied to capability claims, and our AI procurement checklist covers the signing-stage version. If you want this discipline built into your stack’s cost governance — surface-labelled rate cards, promo-cliff calendars, fallback routing — that is exactly the kind of system our AI transformation engagements put in place.
08 — ConclusionThe literacy, not the ledger.
A catalog row is a snapshot of one surface at one moment — price it like a contract term.
None of the four cases in this piece involves a false number. Solar Pro 4’s $0.03 / $0.12 is genuinely what two surfaces bill during the promotion — the row just omits that it is 90% off a $0.30 / $1.20 list until September 10. Terra and Luna’s OpenRouter rates are genuinely billable — they just sit at half the vendor’s standard list while Sol’s row sits at full. The listing dates are genuine database records — of the catalog’s edits, not the vendors’ ships. And DeepSeek’s table is genuinely current — with a vendor-written warning underneath that it will not stay that way.
That is why the fix is literacy rather than a better data source. We know of no feed you can subscribe to that resolves promo from list, surface from surface, listed from launched, and standing from provisional — because those distinctions live in footnotes, expiry clauses and vendor primaries, not in fields. The reading protocol is four questions long and takes minutes per model. The failure it prevents is an order-of-magnitude budget miss that surfaces months after the plan shipped.
Treat every catalog number as quoted, sourced, dated and reverting until the vendor’s own page proves otherwise — and re-verify on the vendor’s surface, not the aggregator’s, every time a number is about to become a commitment.