Australian health funds raise premiums on 1 April and the Minister announces one industry average. In 2026 that figure was 4.41%. Across the 29,702 hospital products priced in both the March and April files the middle one moved 4.15%; across the 14,574 of those open to the general public, 3.54%. The spread by tier ran from Basic at 2.37% to Gold at 5.67%. 596 products rose more than 20%, 526 of them at one insurer, and 2,392 did not move at all.
The announced average is not the same measure. It is weighted by how many people each product covers, spans hospital and extras together, and includes rate protection and age-based discounts that this file does not carry. No individual product is expected to match it.
The percentage your own policy rose is not published anywhere — not by your fund, not by privatehealth.gov.au, not by any comparison site. It is a join of two files the government already publishes. This does the join.
The Private Health Insurance Ombudsman publishes a monthly snapshot of every open health insurance product to data.gov.au under CC BY 3.0 AU. Take the March snapshot and the April snapshot, match products, and the difference is the rise.
Matching is on (ProductCode, State, whoIsCoveredSignature, ExcessPerPerson, ExcessPerAdmission). ProductCode is stable across this window; the ProductID GUID
rotates whenever a fund edits a product, so anything keyed on it gets no history at all
— only 259 of April's 30,563 products keep March's ProductID.
That key is verified against the publisher's own record rather than assumed. Each ZIP
ships a Product Changes CSV carrying ProductID and OLD_ProductID, which chains
each product to its previous version, and every row also carries a ProductItemID
that stays fixed across versions (29,702 matched hospital rows share it between March
and April, against 259 sharing a ProductID). Following that chain (src/idjoin.mjs) reproduces the same 29,702 matches
and the same 4.1534% median, and selects the same March row as the key above for every
single product.
The who-is-covered signature is derived from the adult count, the OnlyOnePerson flag
and the sorted list of dependant types marked covered — a fund can publish the same
product code as single, couple and family rows with different premiums.
Premiums do not move between April rate rises. Comparing August 2026 against April
2026 gives 29,268 common products and exactly zero price changes. So the history line
uses April snapshots only, five of them, back to 2022 — the first April rate rise for
which every product uses the WhoIsCovered element, per the dataset's ReadMe. 49.0% of
currently open hospital products have all five points; 87.6% have at least 2025 and
2026 (combined: 31.2% and 70.3%). Where a point is missing the
chart says so per product rather than drawing a shorter line.
It never shows what anyone pays. Every figure is the listed premium before rebate, straight out of the file. That excludes the Australian Government Rebate tier, payment frequency, direct-debit discounts, age-based discounts and Lifetime Health Cover loading. None of those adjustments are applied — the file records only whether an age-based discount is available on a product, never the amount, and carries no rebate, frequency or loading figures at all. The rebate percentage also fell on 1 April 2026, from 24.288% to 24.118% at the base tier under 65, so a premium net of rebate rose by slightly more than the figure shown.
It never says one product is better than another. The same-cover panel lists products whose medical-services vector, state, scale and excess match yours exactly, and puts the six fields where they still differ in the same table — excess waivers, co-payments, known-gap cover, accommodation, ambulance and waiting periods. Identical clinical cover is not an identical policy: agreement hospital networks differ between funds and are not in the product file at all.
It excludes products you cannot buy. 11,629 of 30,563 open hospital products carry
Corporate IsCorporate="true" and a further 2,380 carry a non-NotApplicable
OnlyAvailableWith. Separately, nine insurers are restricted — you must be eligible to
join them. The product file does not record that, but the Funds file in the same ZIP
does (<FundType>Restricted</FundType>, the same nine codes), and the build carries
them as a hardcoded set of nine fund codes matching
privatehealth.gov.au.
All three are filtered out of every alternatives list. Leaving them in puts an
employer-only or members-only product at the top of a list sorted by price.
It excludes policies closed to new members. 18,406 closed hospital and 28,444 closed combined products sit in the same ZIP and are never parsed. A reader who cannot find their policy is most likely on one of them, and nothing on the page tells them that beyond a line in the footer.
It says nothing about tax. No Medicare Levy Surcharge page, no Lifetime Health
Cover calculator. Those exist on government sites that keep them current. The file
carries a MedicareLevySurchargeExempt flag per product and it is deliberately not
surfaced — do not add it. Telling a reader whether a specific product discharges a
taxation obligation is the one thing on this page that walks toward the Tax Agent
Services Act; nothing else here goes near it.
npm run fetch # ~350 MB, six snapshots, extracts three XML members from each
npm run check # the join test: 29,702 common, median 4.15%, bands 524/17538/9515/1352/177/596
npm run build # emits site/index.json, ~1.2 MB gzipped
npm run test # verifies the index against what app.js assumes
node src/smoke.mjs # runs render() over every branch without a browser
npm run serve
npm run check is the one that matters. Those six numbers were measured from the raw
ZIPs. If they ever stop reproducing, the scale signature or the excess extraction has
silently drifted and every percentage on the page is wrong.
Refresh twice a year: early March for the pre-rise baseline, early April when the new file lands (the 2026 one was extracted on 5 April).
Resources are matched on resource.name, never the URL. Eight of the 73 filenames
break any date pattern you would write — privatehealth-05-apr-2026.zip,
privatehealth.gov.au-april-2022.zip. The CKAN created timestamps are junk too; the
October 2021 resource claims 2019.
One HTML file, two JS files, one JSON file. No framework, no build step for the site, no network requests after the page loads, no cookies, no analytics, no accounts. Selection lives in the URL hash as a product index so a result is linkable in any language. Deploys to any static host.
Seven languages: English, 한국어, 中文, 日本語, Tiếng Việt, Español, Français. Picked from
?lang=xx, then the saved choice, then the browser language. The UI is translated;
product names, fund names and the eligibility wording a fund files stay in English as
filed, and the footer says so. site/strings.js holds English by hand and the other
six generated from site/strings.<lang>.json by node src/i18n.mjs. Every translation
was reviewed for meaning drift against the English — the hedges are load-bearing under
ACL s 18 and a translator's instinct to make a sentence firmer is exactly the failure
mode. src/smoke.mjs renders every branch in every language and checks key sets,
placeholders and HTML tags match the English.
Light and dark follow the OS unless the reader picks one; the choice is saved in
localStorage and applied before first paint.
In the March 2026 file, some funds listed the same premium whether or not a policy covered a non-student adult dependant. In the April file they do not. 499 hospital products and 1,932 combined ones have a sibling row — same policy, same state, same excess, same covered services — that was priced identically in March and is priced lower in April. Where that happens the page shows the other row's price and says both are in the file. It draws no conclusion about why.
No revenue, no affiliate links, no sponsorship, no lead capture, no analytics. Not a style preference. A free non-commercial page has an argument that it is not conduct in trade or commerce under the Australian Consumer Law; any of those flips that for everything the page has ever published.
Data: PrivateHealth.gov.au, Private Health Insurance Ombudsman, CC BY 3.0 AU.
Not affiliated with or endorsed by the Ombudsman, the Commonwealth, or any health fund.
Code: MIT.