Data exports
The published price set and its whole history, as CSV and JSON, with the provenance on every row. Static files: they are up whenever the site is.
These are the same numbers the pages show, read through the same query layer, so a file and a page cannot disagree. 734 published prices and 1,676 distinct historical values across every priced key. The vendor’s own page is authoritative: if it and these files disagree, the vendor is right and we are wrong. These exports are the sanctioned way to take the whole set, so you do not have to scrape the pages for it.
The files
Four files, at URLs that will not move.
- prices-current.csv — every published price of the latest run, one row per model and tier key. JSON
- price-history.csv — every distinct value each of those keys has taken, oldest first. Consecutive identical readings are collapsed: this is what the price did, not how often we looked. JSON
An empty cell is never a zero
Some published rates really are 0.00. A rate we do not have is an
EMPTY cell, and the companion *_absent_reason column says which kind of absence
it is.
not_applicable— This tier does not bill this side. A cache-read or cache-write rate is charged on input tokens only, so there is no output price to be missing.not_published— The tier bills this side and we have no publishable value for it. The other side of this row is priced. Treat the rate as unknown, not as zero.none_publishable— Neither side of this key could be read. The row exists because the key exists; it carries no price at all.not_yet_in_force— Every quote for this key is dated into the future, so no rate is in force today. The scheduled_* columns carry the announced rate and the date it takes effect. This is not a gap in our reading.
Flagged rows are in the file
Nothing is filtered out. 104 of
734 rows carry needs_review, and
53 of those are source_handover.
- Read
primary_causebefore you cost anything. Asource_handoverrow is a price a primary source stopped serving and an aggregator’s resale rate backfilled. The number is real and still published — it is no longer the vendor’s, and it runs several times the withdrawn rate. A cost model built on it is wrong by that multiple. - A flag is not always a fault.
scheduled_changeandno_rate_in_forceare the engine reporting a date the vendor announced, which is the one thing an aggregator mirror cannot carry. The rule that decides which of the two a rate is under is METHODOLOGY §6. unclassifiedmeans we did not look. The row is flagged and no rule we can name explains it. It is never reached by elimination.
Columns — prices-current
Keyed on provider, api_id,
tier_key. Rows sort on identity, so two days’ files diff row for row.
provider— Vendor, as we name them. Stable; used as a join key.api_id— The model id the vendor's API takes. Unique within a provider.display_name— Human label. Cosmetic — never join on it.tier— What is being billed: flat, batch, cache_hit, cache_write, peak, offpeak.variant— The qualifier within the tier (long_context, 1h, audio, priority), or empty for the unqualified tier.tier_key— tier and variant joined with a colon. The key the archive uses, and with provider and api_id the primary key of this file.input_price_usd_per_1m_tokens— Price per 1,000,000 input tokens, in USD. Empty means absent — see input_price_absent_reason. 0.0 means free, and is not the same thing.output_price_usd_per_1m_tokens— Price per 1,000,000 output tokens, in USD. Same rules as the input side.currency— Always USD today. A column and not an assumption, so that the first non-USD rate is visible rather than silently wrong.unit— Always usd_per_1m_tokens. Check it before multiplying: the 1,000× error between per-1M and per-1K pricing is the one this column exists to stop.input_price_absent_reason— Empty when the input price is present; otherwise one of not_applicable, not_published, none_publishable, not_yet_in_force.output_price_absent_reason— The same vocabulary, for the output side.context_window— Maximum context in tokens, or empty if we do not publish one.max_output— Maximum output tokens, or empty.needs_review— true if the reconciler flagged this row. A flagged row is still published; see primary_cause for what is wrong with it.primary_cause— The single most defect-like review cause, or empty when the row is not flagged. source_handover is the one to filter on before costing anything: the vendor withdrew the tier and an aggregator's resale price backfilled it, which on the current archive runs 4-7x the withdrawn rate.review_causes— Every cause that holds, pipe-separated, most defect-like first. Empty when the row is not flagged.scheduled_effective_date— The date an announced rate takes effect, or empty. Present only where the vendor has dated a change; it is news, not a restatement.scheduled_input_price_usd_per_1m_tokens— The announced input rate. NOT in force today and not what you would be billed now.scheduled_output_price_usd_per_1m_tokens— The announced output rate.confirmed— true if a second independent source agreed with this value.verified_at— When we last read this value off a source, ISO 8601 UTC. This moves on every run for every row, by design.source— The source we published the value from.source_url— The exact page the number was read from. The vendor's page is authoritative: if it and this file disagree, it is right.extractor— Which reader produced the value. 'unknown' is a withdrawn claim about the reader, never an unread price.run_id— The collection run this price set is from. Constant within the file.
Columns — price-history
One row per span a value held. needs_review here is
three-valued: empty means no row in the span could carry the flag, which is not the same as
false.
provider— Vendor, as in the current-price file.api_id— The model id.tier— What is being billed.variant— The qualifier within the tier, or empty.tier_key— tier and variant joined with a colon.input_price_usd_per_1m_tokens— The input rate over this span, in USD per 1,000,000 tokens. Empty is absent; 0.0 is free.output_price_usd_per_1m_tokens— The output rate over this span.currency— Always USD today.unit— Always usd_per_1m_tokens.input_price_absent_reason— Why the input price is empty, if it is.output_price_absent_reason— Why the output price is empty, if it is.first_observed_at— When we first saw this value. ISO 8601 UTC.last_observed_at— When we last saw it. Equal to first_observed_at for a value seen once.observations— How many times we saw it across the span. Consecutive identical values are collapsed into one row: this file is what the price DID, not how often we looked.origin— reconciled if this span came from a published run; backfill if it came from a third-party git history that we never verified.verified_by_us— true if we read this value off a source ourselves at least once during the span.last_verified_by_us— When we last did so, or empty if we never did.confirmed— true if a second independent source agreed during the span.needs_review— true, false, or EMPTY. Empty means no row in this span could carry the flag — every row in it is a backfill, and the flag is a reconciliation-layer one. Empty is not false.effective_date— The date the source stated the value took effect, where it stated one.source— The source the span is attributed to.source_url— The page it was read from.extractor— The reader. litellm_git_backfill is never ours.