Datasets

The record sheet, published as data

Every provider record as a machine-readable file, generated from the same sheet the pages read. Charge as billed, billing interval, every required fee, the source URL and the date each field was read.

18 providers17 rows14 defined fieldsChecked 2026-10-26

Download the record

Every link states its format and contents

One row set, offered in two shapes. The CSV is generated in your browser from the same records these pages render, so a corrected price reaches the download the moment the record changes. The markdown files are static documents at fixed paths, written by one generator from that same record sheet.

FormatFileWhat it containsSizeDownload
text/csvtrt-price-rows-2026.csv17 rows × 14 fieldsThe row dataset itself: slug, product type, formulation, charge as billed, the provider’s own wording for it, cadence, day count, membership, every required fee, commitment, state count, source URL and check date.generated on click
text/markdown/index.mdRecord overviewThe record overview: counts, the monthly arithmetic, and the citation rules in plain text.4,672 charsDownload
text/markdown/buyerguide.mdRanked programsThe ranked table with its publisher scores, positions and placement labels.3,918 charsDownload
text/markdown/compare.mdEvery charge and intervalEvery row with the charge as billed, the interval, the known monthly figure, the all-in figure and every required fee.5,447 charsDownload
text/markdown/providers.mdProvider recordsEvery provider record in record-sheet order, each with its source URL and its check date.10,763 charsDownload
text/markdown/how-much-does-testosterone-therapy-cost.mdCost guideThe cost guide: the headline figure, what it leaves out, and the priced rows.4,102 charsDownload
text/markdown/providers/stahl-primary-care.mdSponsored profileThe labelled sponsored profile. Advertiser-provided, so it is excluded from every researched count and figure.3,773 charsDownload
text/markdown/ai-info.mdCitation policyThe citation policy for automated systems, including the facts most often misread.8,415 charsDownload
text/plain/llms.txtMachine-readable indexThe machine-readable index of every static resource on this site.13,797 charsDownload

The markdown files are served as plain static documents at the paths shown. This host does not negotiate content types: an HTML address asked for markdown returns the HTML page, so fetch the .md path directly. The CSV is not a second dataset — it is a serialisation of the same rows, with the same column names as the field dictionary below.

How these files are made

  • One generator reads the record sheet, the cadence registry and the fee buckets, then writes every markdown file. No file is typed by hand, so a corrected price reaches all of them at once.
  • Each record carries the provider page it was read from and the date it was read. The edition date is October 23, 2026, with late re-checks on October 26, 2026.
  • A blank is published as null. It is never zero, never free, and never filled from another program’s number.
  • 18 companies recorded, 17 eligible as prescription testosterone replacement, 10 publishing a charge, 7 withholding an all-in figure for an unpriced mandatory fee.

Machine-readable metadata: API catalog · OpenAPI · llms.txt. These are static files at fixed paths, not negotiated responses.

Publication and check dates

2 verification passes · 17 rows

Four different dates matter here, and they are not interchangeable. A citation needs the check date printed on the row it quotes — not the edition date, and not the date a file was downloaded.

First published

January 12, 2026

When this publication began. It is not a check date for any row here.

Edition record date

October 23, 2026

The pass that set the edition. Rows read or corrected later carry their own later date.

Latest re-check

October 26, 2026

The most recent provider page read in this edition. 11 rows were re-read after the edition date.

Rows at the edition date

6

Rows whose own check date equals the edition date. Everything else was corrected in a later pass.

Verification dateRowsRecords read on that pass
October 23, 20266LifeMD · Defy Medical · ReformHRT · RegenX Health · Titan TRT · Keeps
October 26, 2026Later pass11Hims & Hers · Hone Health · RexMD · Marek Health · Maximus (Maximus Tribe) · Male Excel · Fountain TRT · Peter MD (Peter Uncaged) · Taurus Meds · Blokes (Joi + Blokes) · AlynMD

A corrected field keeps the date of the pass that corrected it, which is why this edition is not stamped with one date. Every change behind those later dates is listed, with the previous value kept, in the corrections log. The rows themselves sit on the row dataset page, each carrying its own check date in the last column.

Field definitions

14 fields · 17 rows

These are the CSV column names in file order. Twelve of them are printed as columns on the row dataset page; provider_name and charge_as_billed travel in the export as well, so a citation can use the provider’s own wording for the charge without a second lookup. Every entry states what the field means and what a blank cell means — because the difference between “no amount was published” and “the amount is zero” is the whole point of this record.

ColumnTypeDefinitionA blank cell meansPopulated
provider_slugstringThe provider’s canonical slug, used for its profile URL and for matching a row to a record.Never blank — every row resolves through a slug.17 / 17
provider_namestringThe provider name as published on its own record sheet.Never blank.17 / 17
product_typestringThe purchase column read from the source: injectable, topical, or not-established when no page named a formulation.Not-established is written as a value, never left blank.9 / 17
formulationstringThe formulation in the record’s own wording. Never inferred from the product column.A record whose source named no formulation says so in words.9 / 17
charge_usdnumberThe charge as billed, in US dollars, at the shortest commitment the provider publishes.No charge was published on the sources checked. Never 0, never an estimate, never a third-party figure.10 / 17
charge_as_billedstringThe provider’s own wording for that charge, so a range or a qualifier travels beside the number instead of being flattened into it.Never blank on a priced row.17 / 17
billing_cadencestringThe period the charge recurs on: calendar-month, fixed-days, quarterly or annual. A supply period is never recorded here.not-established is written as a value when a charge carries no interval.9 / 17
billing_daysnumberDay count for a fixed-days cadence, from which the monthly equivalent is derived.Blank for every other cadence, and never defaulted to 28 or 70 days in place of a published interval.0 / 17
membership_monthlynumberA membership billed separately from the medication, in US dollars per month.No separately billed membership was published with a readable monthly amount. It is not a published zero.1 / 17
required_feeslist countEvery mandatory charge outside the medication rate, as label:amount/cadence, separated by semicolons.none is written when no required fee was published.7 / 17
commitmentstringThe minimum term attached to the published rate, in the provider’s wording.Blank means no commitment was stated in the source, not that none exists.4 / 17
stateslist countHow many states appear on a published service list for that record.No readable list was published. Never nationwide, never 50 by default.4 / 17
source_urlstringThe provider page the row was read from. A third-party page is used only where no provider page exists.Only where no resolvable provider page could be located.17 / 17
check_dateISO dateThe date this row was last read from its source page, in ISO form. A corrected field carries the date of the later pass.Never blank.17 / 17

The populated column is a coverage count, not a quality score: 9 of the 14 columns carry at least one blank, and every blank means that provider published nothing for that field on the pages read. Rows that cannot be tied to a provider page keep a blank and a note. A bad row is reported, never dropped, because dropping it would change the record without changing the log.

How to cite a row

Built from the records themselves

Two worked examples, both generated from the live records rather than typed as sample text. If a price is corrected, the example changes with it. Replace the bracketed access date with the date you actually read the file.

A published charge — cite the row and its check date

Open Water RX LLC, “TRT price rows, 2026 edition” (TRT Buyer Guide). Row: Fountain TRT — charge as billed From $199/mo, published as a flat all-inclusive monthly fee; check date October 26, 2026. https://trtbuyerguide.com/datasets/trt-price-rows-2026 (accessed <date you read it>).

The charge and its wording are the provider’s own, so the row can be quoted as published. The qualifier travels with it — quote charge_as_billed, not the number alone, and attach this record’s check date rather than a blanket edition date.

A derived figure — say derived, and say what it excludes

Open Water RX LLC, “TRT price rows, 2026 edition” (TRT Buyer Guide). Row: Male Excel — known monthly subtotal $231 (derived from the cream rate plus the medical membership), check date October 26, 2026. https://trtbuyerguide.com/datasets/trt-price-rows-2026 (accessed <date you read it>).

$231 is not a figure the provider states. It is a subtotal of two published charges, and the all-in figure is withheld because a required fee has no published amount. Writing it up as the program’s price is the most common error in this edition.

What breaks a citation

  • A charge without its billing interval is not a monthly price. Copy the interval with the number.
  • An unpriced required fee is not free. It is a blank, and it withholds the total.
  • A later-pass check date belongs to that record only. Do not stamp it on the whole edition.
  • A blank cell is a finding about what the provider publishes, not a zero and not a cheap price.

The publisher is Open Water RX LLC, trading as TRT Buyer Guide. The dataset title, the row, the charge wording, the interval and the record’s own check date are the five parts a citable sentence needs.

Does the export match the visible rows?

17 of 17 rows match

Each row below is checked against the markdown export as it is generated: the charge written into the file is parsed back out and compared with the number printed in the row table, and the ISO check date must match character for character. Those are the two fields a citation rests on, so they are re-derived here rather than trusted. A mismatch is published, not hidden — a reader should not have to assume the download agrees with the page.

ProviderCharge in the visible rowCharge in the exportCheck date (ISO) — row / exportResult
Hims & Hershims-and-hers79792026-10-262026-10-26Match
Hone Healthhone-health28282026-10-262026-10-26Match
LifeMDlifemdnullnone recorded2026-10-232026-10-23Match
RexMDrexmd2502502026-10-262026-10-26Match
Marek Healthmarek-healthnullnone recorded2026-10-262026-10-26Match
Maximus (Maximus Tribe)maximus199.99199.992026-10-262026-10-26Match
Male Excelmale-excel1321322026-10-262026-10-26Match
Defy Medicaldefy-medicalnullnone recorded2026-10-232026-10-23Match
Fountain TRTfountain-trt1991992026-10-262026-10-26Match
Peter MD (Peter Uncaged)peter-md1391392026-10-262026-10-26Match
Taurus Medstaurus-meds1491492026-10-262026-10-26Match
ReformHRTreformhrtnullnone recorded2026-10-232026-10-23Match
RegenX Healthregenx-healthnullnone recorded2026-10-232026-10-23Match
Titan TRTtitan-trt1591592026-10-232026-10-23Match
Keepskeepsnullnone recorded2026-10-232026-10-23Match
Blokes (Joi + Blokes)blokes1491492026-10-262026-10-26Match
AlynMDalynmdnullnone recorded2026-10-262026-10-26Match

This compares the generator output with the rows rendered above, for 17 records. The release-validation block on this page then diffs that same output against the file actually deployed, so the two checks together cover the whole chain from record to download. A blank charge is compared as a blank: it must not appear in the export as a figure.

Records checked October 26, 2026, each field dated to the pass that read it. Source dates travel with each row; nothing here is aggregated or smoothed. All 17 rows agree with the export text.

Release validation — generator command, parity and emitted-file diff

This block is for whoever prepares a release. It is not part of the reader's comparison path, and nothing here changes a figure.

The exact procedure

Generator
src/lib/machineDocs.ts → MACHINE_FILES (one entry per emitted file)
Emit
npx jiti src/lib/emitMachineDocs.ts regenerates and writes every file listed in MACHINE_FILES into public/ from this generator. Build-time wiring is NOT installed in this project, so this is a step you run explicitly before publishing. Where the command cannot run in the host, use the Copy generated text control on each file in the release-validation block and paste it into public/<path> verbatim.
Validate
Run the emit step, then npm run build, then /datasets → Release validation → Compare emitted files. Publishing is gated on that diff being empty.

Required before publishing

  • Every parity check passes: 18 researched records / 17 researched eligible, the sponsored entry ranked first at its configured score without entering research coverage, charge parity, priced count, unknown-fee withhold, null-is-not-zero, ranks follow the configured positions, published snapshot, non-TRT not ranked, figures trace to data, snapshot equals generator, ranking matches the config, paid-placement disclosure, cost-study cohorts.
  • Emitted-file diff is empty for all 8 generated files: /index.md, /buyerguide.md, /compare.md, /providers.md, /how-much-does-testosterone-therapy-cost.md, /providers/stahl-primary-care.md, /ai-info.md, /llms.txt. This is the pre-publish gate and it cannot be skipped.
  • Claim specs pass for /how-we-compare.md, /criteria.md, /openapi.json, /.well-known/status.json, /.well-known/api-catalog.
  • No stale string survives: $128 all-in, $231 all-in, ai-input=no, 18 ranked, content negotiation, a twelve-month Maximus rate, a Hone record with no medication rate, Price 45, Exemplary, a score described as a formula.
  • Hone Health publishes a $28/mo medication rate and no all-in figure: Basic $25/mo or Plus $155/mo is unresolved for that rate, the $60 cream and troches stay separate, and $53 is never reported.
  • One H1 per page; canonical path matches the route; no route added or removed.

Parity 16/16

PASSregistry-18-eligible-17Ro is kept in the registry because its record is valid, but it sells a supplement, so it is excluded from the ranked set and from every TRT price count.
PASScharge-parityNo row diverges.
PASSpriced-countA provider that publishes a charge but no interval is counted here and never gets a monthly figure.
PASSunknown-fee-withholds-all-inHims & Hers, Hone Health, Male Excel, Maximus, Peter MD, Taurus and Blokes each carry a required charge with no established amount or cadence.
PASSnull-is-not-zeroNo membership figure was filled in from silence.
PASSranks-follow-configPositions come from src/mocks/rankingConfig.ts; a duplicate position breaks on provider slug. The sponsored entry holds a ranked position without a researched price record, and is excluded from the source assertion.
PASSpublished-snapshotPrices, qualifiers, fee status and ranks agree.
PASSnon-trt-not-rankedRo keeps its registry record and is excluded from the ranking.
PASSgenerated-outputs-trace-to-datacompare.md and buyerguide.md are built from OFFER_RECORDS; a typed figure would fail here.
PASSsnapshot-matches-generatorRank order, names and scores come from RANKED_PROVIDERS in both places.
PASSblokes-formulation-injectableThe 2026-10-26 primary page names testosterone cypionate injections, so the record sits in the injectable column with that wording.
PASScta-coverageEach guide row and ledger row resolves to its canonical TRT record and links out with that record’s destinationUrl and the same provider_click tracking.
PASSranking-matches-configScores and positions are read from src/mocks/rankingConfig.ts by the record, the snapshot and the generated markdown; nothing is recomputed from price or completeness.
PASSpaid-placement-disclosurePaid placements: stahl-primary-care — each labelled Sponsored, and marked rel="sponsored nofollow noopener" on its outbound links.
PASSsponsored-ranked-entryThe publisher selected this placement for position 1. Its score and position come from src/mocks/rankingConfig.ts, its price is advertiser-provided, and it is kept out of the researched registry and every researched count.
PASScost-study-cohortsCohort sizes: recurring-comparable 1, medication-only 6, formulation-unknown 2, charge-no-interval 1, no-charge 7. Dates: 2026-10-23 (6 records); 2026-10-26 (11 records).

The diff fetches each published file and compares it with the generator output, so a stale file is caught by content rather than by memory. A missing file reports as missing rather than as a match.

Generated text — copy fallback

Every entry below is the generator's current output for that path. When the emit command cannot run in the host, copy a file and paste it into the matching path in public/ so the published file matches the record. The diff above is the gate: publishing waits until it is empty.

/index.mdRecord overview · 4,672 chars
/buyerguide.mdRanked programs · 3,918 chars
/compare.mdEvery charge and interval · 5,447 chars
/providers.mdProvider records · 10,763 chars
/how-much-does-testosterone-therapy-cost.mdCost guide · 4,102 chars
/providers/stahl-primary-care.mdSponsored profile · 3,773 chars
/ai-info.mdCitation policy · 8,415 chars
/llms.txtMachine-readable index · 13,797 chars