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.

Sources

All posts · Get a free key · Docs