Open data
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.