The dataset behind the site

Everything the True-Cost Index shows, as data: channel × drug × dose tier, required fees, verification status per row. Licensed CC BY 4.0 — use it, including commercially, with attribution.

Endpoints#

/api/v0/prices.json The full index: channels, medications, dose tiers, required fees, verification tiers and dates, sources per row. Versioned (v0); breaking changes get a new version path.
/data/prices.csv Flattened: one row per channel × drug × dose tier, with med price, required membership, and computed true monthly cost. Sort by true_monthly_usd and read commitment alongside it — an annual row is only that cheap on a year's prepay, and ranking those against month-to-month prices puts whoever demands the longest contract on top. The last two lines are a blank and an attribution comment, so parse with comment='#' or drop them.
/api/v0/verticals.json The non-GLP-1 markets: ED, hair, skin and longevity. 71 rows with channel, product, the price exactly as published, the billing fine print, listed-vs-reported status, and a source URL per row.
/data/verticals.csv The same 71 rows as CSV. Built from the same function as the JSON, so the two cannot drift.
/api/v0/pharmacies.json The compounding-pharmacy index: all 97 FDA-registered 503B outsourcing facilities with inspection and enforcement status, the 503A pharmacies named in connection with tracked channels and what kind of evidence names each one, and the provider-disclosure audit. FDA publishes the 503B register as a web page with no download, and publishes no 503A register at all, so this is the machine-readable form that did not previously exist — the index itself.
/data/pharmacies.csv The same two registers as one CSV, distinguished by a list column. They are in one file on purpose: split across two, they invite being concatenated, which loses the fact that 503B facilities are federally inspected and 503A pharmacies are not.
/embed/price-table.js The dataset as a drop-in table for your own site — one div and one script tag, no key, no rate limit. Ranked cheapest-first on month-to-month prices, and it re-renders itself when our figures change. Setup and options.
/rss.xml The price changelog as RSS — one item per verified change.
/llms.txt The answer-engine summary: key facts, core pages, attribution rules.
Why the vertical dataset has no numeric price column. GLP-1 pricing resolves to a clean monthly figure, so prices.json carries parsed numbers. ED, hair, skin and longevity do not: a real row is "$0.22/tab · $11.94/30 delivered (100 mg)" or "$100/mo monthly · $66.67/mo quarterly". Collapsing that to one number would mean choosing an interpretation and presenting it as fact, so price_label ships as published and is documented as a string, not an amount.

Reading the data honestly#

  • true_monthly_usd = medication + required membership fees — the number that leaves an account.
  • Verification states: a checkout date means we walked the purchase flow; listed means the provider's own published price on that date; reported means concordant secondary sources. Fields: verification.last_verified, listed_verified, unverified_placeholder.
  • Annual-commitment pricing lives in tier labels, never in the monthly sort — read billing.
  • Prices change; the dataset carries its dates for a reason. The provider's checkout is always the final word.

Attribution#

License: CC BY 4.0. Credit "eDietAdvice" with a link to the page you drew from. If you publish something built on this data, we'd genuinely like to see it — and if you find an error, tell us: corrections land in the changelog.

CORS is open on the JSON and CSV endpoints. No key, no rate limit at current scale — don't make us regret that.

Prices here change constantly. Every verified change is published as it lands. The changelog feed →