Overview — v3.0 (effective April 2026)
The AHI public API provides programmatic access to the Australian Household Index composite score under the v3.0 three-tier model. The composite applies primary weight to structural cost pressures (Tier 1), moderate weight to cyclical stress outcomes (Tier 2), and a smaller weight to behavioural leading indicators (Tier 3), with a continuous amplifier component calibrated to empirical stress regimes. Scores are reported to one decimal place. Data is computed server-side from live upstream sources including the RBA, ABS, AER, APRA, and AFSA, with hardcoded fallbacks ensuring the endpoint always returns valid data.
The API is designed for media organisations, financial services platforms, government dashboards, and developers who want to embed authoritative cost-of-living data into their own products. There is no authentication required and no rate limits for reasonable use. We ask only for attribution.
- No API key required
- CORS enabled — call directly from browser or server
- Response cached for up to 1 hour at the CDN layer
- Always returns valid JSON — fallback values used if live fetch fails
- Licence: CC BY 4.0 — free to use with attribution
Endpoint
GET https://australianhouseholdindex.com.au/.netlify/functions/ahi-score
# Returns: application/json, HTTP 200
# Cache-Control: public, max-age=3600
# CORS: Access-Control-Allow-Origin: *
No parameters, headers or authentication required. The endpoint always returns HTTP 200 — check the data_status field on each category to distinguish live from fallback data.
Response schema
The API returns AHI Score v3.0 — a three-tier weighted composite. The root response object:
| Field | Type | Description |
|---|---|---|
| model_version | string | Model version, currently "3.0". Increment indicates a methodology change. |
| version | string | API schema version, e.g. "3.0" |
| generated | string | ISO 8601 timestamp of calculation |
| score | number | Composite index of three tiers (structural cost pressure, cyclical stress outcomes, behavioural leading indicators) with a regime-aware amplifier. To one decimal place (e.g. 48.8). |
| label | string | One of: Low, Moderate, Elevated, High, Severe |
| description | string | Plain-English interpretation of the current score |
| tier1_score | integer | Tier 1 cost pressure score 0–100. Weighted sum of 8 cost categories. Carries primary weight in composite. |
| tier2_score | number | Tier 2 stress outcomes composite 0–100. Empirically weighted composite of formal stress outcomes and vulnerability indicators. Carries moderate weight in composite. |
| tier3_score | number | Tier 3 leading indicators composite 0–100. Weighted composite of forward-looking signals. Carries the smallest tier weight in the composite. |
| composite_raw | number | Raw composite value before amplifier application. Amplifier is then applied to produce the final score. Canonical field name — use this. Same value as base_composite and the deprecated geometric_raw. |
| geometric_raw | number | Deprecated — scheduled for removal 2026-10-21. Use composite_raw instead. Identical value. The name is a legacy artefact from the prior geometric model; the underlying formula has always been an arithmetic weighted sum since v3.0. Retained for backward compatibility. |
| tier1_detail | object | Full Tier 1 breakdown — keyed by category ID. See Categories section. Same as categories field. |
| tier2_detail | object | Tier 2 stress outcome signals. Combines formal stress measurements (arrears, insolvency, credit stress) with vulnerability indicators (savings behaviour, debt servicing capacity, credit growth, consumption patterns). Empirical weighting applied by classified macroeconomic regime. Contains sub-composite scores and per-signal score, source, and fallback fields. |
| tier3_detail | object | Tier 3 leading indicator signals. Combines indicators across real wages dynamics, consumer expectations, credit utilisation, and new financial commitments. Signals standardised as z-scores against historical parameters. Contains tier3_composite, per-signal detail, and weights_applied. |
| band_thresholds | object | v3.0 band definitions. Each band has range (string) and description. Bands: Low 0–24.9, Moderate 25–39.9, Elevated 40–54.9, High 55–71.9, Severe 72–100. |
| score_scale | object | Score band ranges as strings |
| ceilings | object | Effective ceiling values used for each Tier 1 category, with source notes |
| methodology | object | URL, summary, tier weights, and ceilings source |
| attribution | string | Required attribution text |
| licence | string | CC BY 4.0 |
Each Tier 1 category object (within tier1_detail):
| Field | Type | Description |
|---|---|---|
| label | string | Human-readable category name |
| score | number | Category score 0–100 (1 decimal) |
| weight | number | Decimal weight within Tier 1 |
| weight_pct | integer | Weight as percentage (e.g. 30) |
| value | number | Current raw value in native units |
| unit | string | Unit descriptor, e.g. "% cumulative above 2019" |
| source | string | Upstream data source name |
| data_status | string | "live", "static", or "fallback:<reason>" |
| baseline | number | 2019 baseline value for this category (0 for CPI cumulative series) |
| ceiling | number | Income-adjusted stress ceiling (= category score of 100) |
Score labels — v3.0
Scores 72+ indicate severe household stress. The composite reflects weighted aggregation across structural, cyclical, and behavioural tiers with a continuous amplifier component calibrated to empirical stress regimes. Scores are reported to one decimal place.
| 0.0–24.9 | Low | Negligible stress across all three tiers. Cost levels near 2019 baseline. |
| 25.0–39.9 | Moderate | Cost pressure beginning to emerge. Stress outcomes and leading indicators benign. |
| 40.0–54.9 | Elevated | Cost pressure visible across Tier 1. Formal stress outcomes (arrears, insolvencies) beginning to appear but still contained. |
| 55.0–71.9 | High | Cost pressure genuinely elevated and leading indicators deteriorating. Formal stress outcomes remain contained — households absorbing pressure but not defaulting at scale. |
| 72.0–100 | Severe | Cost pressure extreme and stress outcomes manifesting at scale in administrative data. Households unable to meet all financial obligations. |
Tier 1 categories
The eight Tier 1 cost pressure categories, their weights within Tier 1, and their data sources. Tier 1 carries the primary weight in the composite.
| Key | Label | Tier 1 weight | Unit | Source |
|---|---|---|---|---|
| housing | Housing | 30% | Tenure-weighted composite score (mortgage, rent, owner, social) | RBA cash rate; ABS CPI Rents series 115522; ABS CPI Other housing series 131187; ABS Census 2021 tenure weights |
| food | Groceries | 22% | % cumulative above 2019-Q2 | ABS CPI Food series 20001 |
| transport | Transport | 14% | % cumulative above 2019-Q2 | ABS CPI Transport series 20005 |
| insurance | Insurance | 10% | % cumulative above 2019-Q2 | ABS CPI Insurance & financial services series 126670 |
| health | Health | 8% | % cumulative above 2019-Q2 | ABS CPI Health series 115486 |
| fuel | Fuel | 8% | c/L population-weighted national retail average | State government fuel price APIs (NSW FuelCheck, VIC Service Victoria, QLD, WA, SA, TAS, ACT, NT); population weights ABS 2023 |
| energy | Energy | 5% | % cumulative above 2019-Q2 | AER Default Market Offer (annual determination) |
| telco | Telecommunications | 3% | % year-on-year change | ABS CPI Communications series 30022 |
Category weights are derived from the ABS Household Expenditure Survey 2022–23 and ABS CPI basket weights (January 2025 update). The per-category scoring formula is clamp(value / ceiling × 100, 0, 100) with baseline = 0 (2019-Q2 conditions). The eight category scores are combined as a weighted sum to produce tier1_score.
Housing stress calibrated across three tenure contexts — mortgage holders (rate-sensitive), renters (exposed to cumulative rent inflation), outright owners (exposed to cumulative non-mortgage housing costs). Tenure-specific stress ceilings calibrated against historical crisis episodes.
Tier 2 — Stress outcome signals
Tier 2 combines formal household stress measurements with forward-looking vulnerability indicators. Weighted composition shifts based on classified macroeconomic regime. Available in tier2_detail.
| Signal key | Description | Source | Baseline → Ceiling |
|---|---|---|---|
| energy_stress | Composite energy stress signal drawing on AER administrative data across payment difficulties, disconnections, and hardship enrolment | AER Retail Energy Market Performance and Annual Retail Markets Report | Calibrated empirically against historical stress levels |
| mortgage_arrears | Composite of early-stage and non-performing mortgage arrears indicators with weighted aggregation | APRA quarterly ADI statistics | Ceilings calibrated empirically against historical crisis episodes |
| personal_insolvency | Personal insolvency trend measured as year-over-year change rather than absolute rate, reflecting post-2020 structural changes in insolvency rates. Contributes to formal stress outcomes component. | AFSA annual statistics | Rate of change from post-COVID trough; ceilings calibrated empirically |
| consumer_credit_arrears | Consumer credit arrears composite. Primary source is Pillar 3 non-mortgage NPE rate, triangulated against two corroborating sources (AFCA complaints trend and RBA accruing interest ratio). | NAB APS330 Pillar 3 (primary) + AFCA Datacube + RBA C1 CCCCSBAISA/CCCCSBTSA — hardcoded quarterly | Ceilings calibrated empirically |
| saving_ratio | Inverted household saving ratio — low saving = high stress | ABS National Accounts (quarterly) | Baseline 7.0%; inverted scale |
| retail_compression | Real household spending YoY% (ABS MHSI deflated by CPI), inverted — falling real spending = higher stress. Reclassified to Tier 2 based on empirical correlation with established stress outcomes. | ABS Monthly Household Spending Indicator (HSI_M), fallback ABS Retail Trade; deflated by ABS CPI All Groups | Baseline real growth → stress compression threshold |
Tier 3 — Leading indicator signals
Four empirically weighted signals, each z-scored from its historical distribution and combined to produce tier3_score (0–100). All four signals are live. Available in tier3_detail.
| Signal key | Description | Source | Role |
|---|---|---|---|
| real_wages_z | Real wage growth: WPI YoY% minus CPI YoY%, inverted — falling real wages = higher stress. Z-scored from full historical series. | RBA H4 GWPIYP (WPI YoY%) / RBA G1 GCPIAGYP (CPI YoY%) | Primary contributor |
| expectations_z | NAB business survey 1-year inflation expectations (RBA G3 GBUSEXP). Higher business expectations of future inflation → greater cost-of-living pressure ahead. | RBA G3 statistical table (quarterly) | Primary contributor |
| cc_utilisation_z | Credit card balances accruing interest YoY% (RBA C1 CCCCSBAISA). Rising accruing balances indicate households financing consumption from revolving debt. | RBA C1 statistical table (monthly → quarterly YoY%) | Secondary contributor |
| commitments_z | New owner-occupier mortgage commitment volumes YoY%, inverted — falling commitments = tighter credit conditions / weaker demand. Live. | ABS Lending Indicators (LEND_HOUSING quarterly, ABS API) | Secondary contributor |
Each signal is z-scored using its full historical distribution and combined into a weighted composite, scaled to 0–100. Active weights reported in tier3_detail.weights_applied. Weights validated against historical household stress episodes.
Signals removed 2026-04-07: consumer_confidence (ANZ-Roy Morgan — contemporaneous sentiment, not leading); labour_market (structurally misaligned — inflationary stress at record-low unemployment); retail_compression reclassified to Tier 2 based on empirical correlation with established stress outcomes.
Live demo
Code examples
const AHI_URL = 'https://australianhouseholdindex.com.au/.netlify/functions/ahi-score'; fetch(AHI_URL) .then(r => r.json()) .then(data => { // Composite score console.log(`AHI Score: ${data.score}/100 (${data.label})`); // Housing category const h = data.categories.housing; console.log(`RBA rate: ${h.value}% — category score: ${h.score.toFixed(1)}/100`); // Check if live data const isLive = Object.values(data.categories) .every(c => c.data_status === 'live'); console.log(`Data is ${isLive ? 'live' : 'partly static'}`); });
import requests AHI_URL = "https://australianhouseholdindex.com.au/.netlify/functions/ahi-score" response = requests.get(AHI_URL, timeout=10) data = response.json() print(f"AHI Score: {data['score']}/100 ({data['label']})") print(f"Generated: {data['generated']}") for cat_id, cat in data['categories'].items(): print(f" {cat['label']:20s} score={cat['score']:5.1f} weight={cat['weight_pct']}%") print(f" {cat['value']} {cat['unit']} — {cat['data_status']}") # Attribution required by CC BY 4.0 print(f"\nSource: {data['attribution']}")
curl -s https://australianhouseholdindex.com.au/.netlify/functions/ahi-score \
| python3 -m json.tool
# Or just the score:
curl -s https://australianhouseholdindex.com.au/.netlify/functions/ahi-score \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(f'{d[\"score\"]}/100 ({d[\"label\"]})')"
<!-- AHI Score Widget — embed anywhere -->
<div id="ahi-widget" style="font-family:system-ui;padding:16px;background:#0D1B2A;color:#F5F0E8;border-radius:8px;display:inline-block">
<div style="font-size:11px;opacity:.6;margin-bottom:4px">AHI Cost-of-Living Score</div>
<div id="ahi-widget-score" style="font-size:36px;font-weight:700">—</div>
<div id="ahi-widget-label" style="font-size:12px;margin-top:4px;opacity:.7">Loading…</div>
<div style="font-size:10px;margin-top:8px;opacity:.4">Source: australianhouseholdindex.com.au</div>
</div>
<script>
fetch('https://australianhouseholdindex.com.au/.netlify/functions/ahi-score')
.then(r=>r.json())
.then(d=>{
document.getElementById('ahi-widget-score').textContent = parseFloat(d.score).toFixed(1)+'/100';
document.getElementById('ahi-widget-label').textContent = d.label+' — '+d.generated.slice(0,10);
});
</script>
Behaviour Index API
A second endpoint returns ABS Retail Trade data showing what households are actually spending — the behavioural complement to the price-based AHI score.
GET /.netlify/functions/behaviour-index
# Returns monthly retail turnover by category (ABS 8501.0)
# with YoY change and a derived stress signal (compressing / cautious / resilient / neutral)
# Cache-Control: public, max-age=14400 (4 hours)
Key fields in the response:
- categories — each retail category with
value($M turnover),yoy_pct,mom_pct, andtype(essential / discretionary / mixed) - summary.stress_signal —
compressing/cautious/resilient/neutral - summary.essential_yoy_avg — average YoY growth of essential spending
- summary.discretionary_yoy_avg — average YoY growth of discretionary spending
When essential spending grows materially faster than discretionary, households are compressing — the most reliable leading indicator of financial stress in the retail data.
Attribution & usage
The AHI API is published under CC BY 4.0. You are free to use the data in any product, commercial or otherwise, with the following attribution text:
Source: Australian Household Index (australianhouseholdindex.com.au)
For commercial use — financial services platforms, media white-label, government dashboards — we offer a commercial data agreement that includes SLA guarantees, a dedicated data feed, and co-branding rights. Contact data@australianhouseholdindex.com.au.
The API does not require registration for reasonable use. If you are making high-volume requests (more than 1,000 per day) or embedding the data in a commercial product, please reach out so we can ensure service quality for all users.