Home / Blog / Tracking gender pay gap across industries with WGEA + ABS
2026-05-20 · Harry Vass
Tracking gender pay gap across industries with WGEA + ABS
A working recipe for pulling AU gender pay gap data across industries, WGEA employer-reported figures alongside ABS Average Weekly Earnings, through one API.
If you're an HR or DEI consultant doing AU benchmarking work, you've already learned the painful version of this: WGEA publishes employer-level gender pay gap data once a year (the Employer Census), ABS publishes national average weekly earnings twice a year, and the two don't talk to each other. Industry comparisons require pulling both and joining on ANZSIC division by hand.
This post walks through the recipe with one API key. ~80 lines of Python. Citation-ready output.
<!-- IMG: gender-pay-gap-by-industry-chart.png -->
What you'll get
A table by ANZSIC division like:
ANZSIC division WGEA total-remuneration gap ABS AWE gap
Mining 14.2% 19.8%
Financial and Insurance 22.5% 24.1%
Health Care and Social Assist. 11.7% 9.8%
Education and Training 8.4% 7.2%
Construction 18.6% 15.3%
Retail Trade 7.9% 8.1%
Two numbers because they measure subtly different things:
- WGEA total-remuneration gap, employers with >100 staff, includes superannuation, bonuses, and overtime. Excludes CEOs.
- ABS AWE gap, full-time adult ordinary-time earnings, national, all employers.
The WGEA figure is the one HR teams cite in employer reports. The ABS figure is the one journalists usually quote. Showing both adds context.
Step 1, get a key
curl -X POST https://api.ausdata.io/v1/register \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]"}'
Returns an ak_live_... key. Free tier is 500 calls/month, plenty for a quarterly benchmark refresh.
Step 2, pull the WGEA + ABS context
There's a single endpoint that joins them for you:
import requests
API_KEY = "ak_live_..."
r = requests.get(
"https://api.ausdata.io/v1/gender-pay-context",
headers={"X-API-Key": API_KEY}, timeout=30,
).json()
print(r["data"])
Output (abbreviated):
{
"data": {
"wgea_total_remuneration_gap_pct": 21.7,
"wgea_period": "2024-25",
"abs_awe_gap_pct": 13.0,
"abs_awe_period": "2025-11",
"real_wages_yoy_pct": 0.4,
"real_wages_period": "2025-Q4",
"context": {
"wgea_definition": "Total remuneration gender pay gap, employers >100 staff, includes super/bonuses/overtime, excludes CEOs",
"abs_definition": "Full-time adult ordinary-time earnings, all employers, national"
}
},
"meta": {
"sources": [
{"name": "WGEA",
"url": "https://www.wgea.gov.au/publications/australias-gender-pay-gap-statistics",
"attribution": "© Commonwealth of Australia (WGEA), CC-BY 3.0 AU"},
{"name": "ABS",
"url": "https://www.abs.gov.au/statistics/labour/earnings-and-working-conditions/average-weekly-earnings-australia",
"attribution": "© Commonwealth of Australia (ABS), CC-BY 4.0"}
]
}
}
For national-level reporting that's done. The next step is industry breakdown.
Step 3, industry breakdown via WGEA's industry stats
WGEA publishes the gap by ANZSIC division on its industry data page. The wgea-mcp package surfaces this as a curated dataset, and the API exposes it via /v1/data/wgea/INDUSTRY:
r = requests.get(
"https://api.ausdata.io/v1/data/wgea/INDUSTRY",
headers={"X-API-Key": API_KEY},
params={"period": "2024-25"}, timeout=30,
).json()
for row in r["data"]:
print(f"{row['anzsic_division']:<40} {row['total_remuneration_gap_pct']:>5.1f}%")
Output:
Mining 14.2%
Financial and Insurance Services 22.5%
Health Care and Social Assistance 11.7%
Education and Training 8.4%
Construction 18.6%
Retail Trade 7.9%
Professional, Scientific and Technical 23.1%
Manufacturing 14.5%
...
19 ANZSIC divisions, one row each. Each row also includes base_salary_gap_pct, bonuses_gap_pct, and superannuation_gap_pct if you want to decompose what's driving the total.
Step 4, ABS AWE breakdown (the cross-check)
ABS Average Weekly Earnings publishes by industry too, but the cut is "Full-time adult ordinary-time earnings" and the industry list is slightly different from WGEA's. Pull it from /v1/data/abs/AWE:
r = requests.get(
"https://api.ausdata.io/v1/data/abs/AWE",
headers={"X-API-Key": API_KEY},
params={"measure": "Earnings", "sex": "Persons",
"industry": "all"}, timeout=30,
).json()
# Join is on ANZSIC division name, string match with normalisation
abs_by_industry = {row["industry"]: row["value"] for row in r["data"]}
The join is the fiddly part. WGEA reports "Financial and Insurance Services"; ABS reports "Financial and insurance services" (case differs). Normalise to lowercase before joining.
Step 5, the side-by-side report
def render_report(wgea_rows, abs_male, abs_female):
"""Produce the side-by-side gap table."""
print(f"{'Industry':<42}{'WGEA':>8}{'ABS AWE':>10}")
print("-" * 60)
for row in wgea_rows:
ind = row["anzsic_division"]
ind_key = ind.lower()
abs_gap = None
if ind_key in abs_male and ind_key in abs_female:
m, f = abs_male[ind_key], abs_female[ind_key]
abs_gap = (m - f) / m * 100
abs_str = f"{abs_gap:>5.1f}%" if abs_gap is not None else " n/a"
print(f"{ind:<42}{row['total_remuneration_gap_pct']:>6.1f}% {abs_str}")
# wgea_rows + abs_male + abs_female from previous steps
render_report(wgea_rows, abs_male, abs_female)
Why two numbers per industry?
Worth explaining to the audience whoever sees your report:
- WGEA total remuneration captures everything an employer paid: base, super, bonuses, overtime. It includes part-time staff (normalised to FTE). Captured from the Employer Census, so every employer with >100 staff has reported. Excludes CEOs because the dispersion among CEOs is so extreme it would dominate the average.
- ABS AWE is a sample-based survey of payroll. It captures full-time adult ordinary-time earnings only, no part-time, no overtime, no bonuses, no super. It includes employers of any size.
Both are correct. They measure different things. In financial-services WGEA gap > ABS gap because bonuses and super skew male; in healthcare WGEA gap < ABS gap because part-time work (mostly women) is included in WGEA but excluded from ABS AWE.
What this isn't
This recipe isn't:
- A replacement for a paid Mercer / WTW / Korn Ferry benchmarking report. Those include role-level cuts, percentile bands, and proprietary employer-survey data. Public WGEA data is by industry, not by job grade.
- A way to look up gap at a specific named employer. WGEA's employer-level data is published on the WGEA site under the Employer Census, but it's not exposed via the API yet (it's PDF-only at the employer level, see WGEA's employer scorecard for the manual lookup).
- A predictive model. The numbers are descriptive, what was the gap last year. Forecasting next year's gap by industry needs your own modelling.
- A causal explanation. The gap reflects pay, composition, hours, occupation, and structural sector effects. "Why" needs analytical work beyond what either WGEA or ABS publishes.
A note on "median vs mean"
WGEA publishes both. The total_remuneration_gap_pct field above is the average. Some commentary uses the median (total_remuneration_gap_median_pct) instead because medians are less skewed by very-high-earning outliers. The API exposes both:
print(f"Mean gap: {row['total_remuneration_gap_pct']}%")
print(f"Median gap: {row['total_remuneration_gap_median_pct']}%")
Pick whichever your audience expects. Be explicit which you used.
Pricing
- Free: 500 calls/month, fine for an annual industry-benchmark refresh.
- Analyst: $29/mo, 10k calls, fine for a quarterly Notion sync across all 19 divisions plus the national-context endpoint (~30 calls/quarter).
- Pro: $99/mo, 100k calls + webhooks, for HR-SaaS products embedding the gap as a live tile.
Free key at ausdata.io.