Back

API documentation

One bearer token over 9 Australian government data sources. JSON in, JSON out. Every response is CC-BY attributed via meta.sources.

Base URLhttps://api.ausdata.io

Quickstart

Three commands. Sixty seconds. No credit card.

terminal
# 1. Register
curl -X POST https://api.ausdata.io/v1/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com"}'

# 2. Call any composed endpoint. One call, one answer
curl https://api.ausdata.io/v1/economic-dashboard \
  -H "Authorization: Bearer YOUR_KEY"

Install

Pick your interface. All three talk to the same API.

Python SDK
pip install ausdata-sdk

from ausdata import Client

Node CLI
npm i -g ausdata-cli

ausdata economic-dashboard

MCP server
npx ausdata-mcp

Claude / Cursor / Windsurf

python
from ausdata import Client
c = Client(api_key="ak_...")

dash = c.economic_dashboard()
print(f"Cash rate: {dash.data.cash_rate_pct}%")
print(f"CPI: {dash.data.cpi_annual_pct}%")
print(f"Real cash rate: {dash.data.cash_rate_pct - dash.data.cpi_annual_pct:.2f}pp")

Authentication

Every data endpoint takes a Bearer token. Free keys give you 500 calls/month and every feature.

header
Authorization: Bearer YOUR_API_KEY

Composed analytics

One call, one answer. Each endpoint stitches multiple sources behind a single URL.

GET/v1/economic-dashboard

Economic dashboard

Snapshot of the Australian economy right now. RBA cash rate, ABS CPI, unemployment, wage growth, household spending. One call, five sources.

request
curl https://api.ausdata.io/v1/economic-dashboard \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "as_of": "2026-Q1",
    "cash_rate_pct": 4.35,
    "cpi_annual_pct": 3.50,
    "unemployment_rate_pct": 4.26,
    "wage_growth_annual_pct": 3.20,
    "consumer_spending_yoy_pct": 6.10
  }
}
GET/v1/real-cash-rate

Real cash rate

Is the inflation-adjusted cash rate positive? Cash rate minus annual CPI, with direction.

request
curl https://api.ausdata.io/v1/real-cash-rate \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "as_of": "2026-05-15",
    "cash_rate_pct": 4.35,
    "cpi_annual_pct": 3.50,
    "real_cash_rate_pct": 0.85,
    "direction": "positive"
  }
}
GET/v1/real-wages

Real wages

Quarterly WPI vs CPI annual change with computed real-wages gap and direction.

Parameters

start / endstring
YYYY or YYYY-Q[1-4].
seasonal_adjustmentstring
original | trend | seasonally_adjusted. Default trend.
request
curl "https://api.ausdata.io/v1/real-wages?start=2024-Q1" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [{
    "period": "2026-Q1",
    "wpi_annual_change_pct": 3.30,
    "cpi_annual_change_pct": 4.00,
    "real_wages_gap_pct": -0.70,
    "real_wages_direction": "shrinking"
  }]
}
GET/v1/cost-of-living

Cost of living

Annual CPI change by expenditure group (food, housing, transport, health, recreation, etc.). Answers which category is driving inflation.

request
curl https://api.ausdata.io/v1/cost-of-living \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [
    { "group": "housing",   "annual_change_pct": 5.60, "period": "2025-09" },
    { "group": "food",      "annual_change_pct": 3.10, "period": "2025-09" },
    { "group": "transport", "annual_change_pct": 2.30, "period": "2025-09" }
    // 12 expenditure groups total
  ]
}
GET/v1/youth-unemployment

Youth unemployment

15-24 unemployment vs all-ages, with the youth premium in percentage points.

request
curl https://api.ausdata.io/v1/youth-unemployment \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "youth_unemployment_pct": 10.15,
    "all_ages_unemployment_pct": 4.26,
    "youth_premium_pp": 5.89,
    "period": "2026-03"
  }
}
GET/v1/trade-balance

Trade balance

Australia's monthly trade balance plus top goods export and import categories.

request
curl https://api.ausdata.io/v1/trade-balance \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [
    { "data_item": "balance_on_goods",     "value_aud_million": -1841, "period": "2026-03" },
    { "data_item": "total_goods_exports",  "value_aud_million": 43929, "period": "2026-03" }
  ]
}
GET/v1/housing-affordability

Housing affordability

Years of median income required to buy a typical dwelling.

request
curl https://api.ausdata.io/v1/housing-affordability \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "mean_price_to_median_income_ratio": 20.24,
    "median_price_to_median_income_ratio": null,
    "mean_dwelling_value_aud": 1074700,
    "median_income_aud": 53091,
    "dwelling_period": "2025-Q4",
    "income_period": "2022-23"
  }
}
GET/v1/gender-pay-context

Gender pay context

WGEA gender pay gap for an industry, compared against the national baseline.

Parameters

industryrequiredstring
e.g. Mining, Finance, Education.
request
curl "https://api.ausdata.io/v1/gender-pay-context?industry=Mining" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "industry": "Mining",
    "period": "2024-25",
    "headline_gap_pct": 11.42,
    "all_employers_baseline_pct": 21.66,
    "relative_to_baseline": "narrower than national"
  }
}
GET/v1/energy-snapshot

Energy snapshot

Live NEM spot prices by region (NSW1, VIC1, QLD1, SA1, TAS1).

Parameters

regionrequiredstring
NEM region code.
request
curl "https://api.ausdata.io/v1/energy-snapshot?region=VIC1" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [{
    "region": "VIC1",
    "latest_price_aud_mwh": 111.98,
    "latest_period": "2026-05-18T19:50:00+10:00"
  }]
}

Discovery

Find datasets and schedule jobs around upcoming releases.

GET/v1/search-datasets

Search datasets

Plain-English search across all 9 sources. Returns dataset IDs you can pass to /v1/data.

Parameters

qrequiredstring
e.g. "unemployment rate NSW".
sourcestring
Filter to one of: abs, rba, ato, apra, aihw, asic, aemo, au_weather, wgea.
limitinteger
Default 10, max 50.
request
curl "https://api.ausdata.io/v1/search-datasets?q=gender+pay+gap&limit=5" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [{
    "dataset_id": "wgea.WORKFORCE_COMPOSITION",
    "source": "WGEA",
    "name": "WGEA Workforce Composition",
    "is_curated": true
  }],
  "meta": { "row_count": 5 }
}
GET/v1/datasets/{source}

List datasets

Every curated dataset for one source.

request
curl https://api.ausdata.io/v1/datasets/rba \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [
    { "dataset_id": "F1.1", "name": "Cash rate target" },
    { "dataset_id": "F11",  "name": "Exchange rates" }
  ]
}
GET/v1/describe/{source}/{dataset_id}

Describe dataset

Schema and valid filter values for a dataset. Use this before calling /v1/data. Required for the location-based au_weather source.

request
curl https://api.ausdata.io/v1/describe/abs/CPI \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": {
    "dataset_id": "CPI",
    "dimensions": ["measure", "region", "adjustment"],
    "valid_values": { "region": ["australia", "sydney", "melbourne", "..."] }
  }
}
GET/v1/releases

Upcoming releases

Scheduled ABS and RBA publications. Use it to wake your dashboard the moment CPI drops.

Parameters

days_aheadinteger
Default 14.
dataset_idstring
Filter, e.g. CPI.
request
curl "https://api.ausdata.io/v1/releases?days_ahead=30&dataset_id=CPI" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [{
    "release_at": "2026-05-27T11:30:00+10:00",
    "title": "Consumer Price Index, Australia",
    "event_type": "data_release"
  }]
}

Raw data

Fetch rows from any curated dataset.

GET/v1/data/{source}/{dataset_id}

Raw data passthrough

Fetch rows from any dataset. Filter by dimension (e.g. region=NSW) via query params. Reserved params: start, end, limit, format. Works for abs, rba, ato, apra, aihw, asic, aemo, wgea. For au_weather, use /v1/describe/au_weather/{location}. That source is location-based, not dataset-based.

Parameters

sourcerequiredstring
Source code.
dataset_idrequiredstring
From /v1/search-datasets or /v1/datasets/{source}.
start / endstring
YYYY-Q1, YYYY-MM, or YYYY.
limitinteger
Default 100, max 1000.
formatstring
json or csv.
…otherstring
Forwarded as dimension filters.
request
curl "https://api.ausdata.io/v1/data/abs/LF?region=australia&measure=unemployment_rate&start=2024-01&limit=12" \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{
  "data": [{
    "period": "2026-03",
    "value": 3.93,
    "dimensions": { "measure": "Unemployment rate", "region": "Australia" },
    "unit": "Percent"
  }],
  "meta": { "row_count": 12, "tier": "free", "truncated_at": null }
}

Webhooks

Subscribe to dataset releases. The server POSTs your URL when a new value publishes. Signed with HMAC-SHA256 so you can verify it really came from us. Available on every tier, no extra cost.

Subscribe

POST /v1/webhooks
curl -X POST https://api.ausdata.io/v1/webhooks \
  -H "Authorization: Bearer ak_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://your.app/cpi-alert","datasets":["CPI"]}'
# → { "id": "sub_...", "secret": "whsec_...", "url": "...", "datasets": ["CPI"] }

Verify the signature (Node)

webhook-verify.ts
import crypto from "node:crypto";

// Headers you'll receive:
//   X-Ausdata-Signature: sha256=<hex>
//   X-Ausdata-Event:     release.published

export function verify(rawBody: string, signatureHeader: string, secret: string) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader),
    Buffer.from(expected),
  );
}

Manage subscriptions

terminal
# List your subscriptions
curl https://api.ausdata.io/v1/webhooks \
  -H "Authorization: Bearer ak_YOUR_KEY"

# Remove one
curl -X DELETE https://api.ausdata.io/v1/webhooks/sub_... \
  -H "Authorization: Bearer ak_YOUR_KEY"
Store the secret returned from POST /v1/webhooks. It's shown once and used to verify every event for this subscription.

Meta

Auth, identity, and service health.

POST/v1/registerno auth

Register

Get a free API key. No auth required. 500 calls/month, no credit card.

request
curl -X POST https://api.ausdata.io/v1/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com"}'
response
{
  "api_key": "ak_...",
  "key": "ak_...",
  "tier": "free",
  "monthly_limit": 500,
  "usage_example": "curl -H 'Authorization: Bearer ak_...' https://api.ausdata.io/v1/whoami"
}
GET/v1/whoami

Who am I

Your tier, monthly limit, and usage so far.

request
curl https://api.ausdata.io/v1/whoami \
  -H "Authorization: Bearer ak_YOUR_KEY"
response
{ "tier": "free", "monthly_limit": 500, "usage_this_month": 42 }
GET/v1/statusno auth

Status

Per-source health and 30-day uptime. No auth required.

request
curl https://api.ausdata.io/v1/status
response
{
  "uptime_30d": 0.999,
  "sources": [{ "id": "abs", "status": "ok" }],
  "server_version": "0.6.x"
}

Errors

All errors return JSON with error, message, and hint.

CodeErrorWhen / how to fix
400bad_requestUnknown or malformed parameter. Check spelling and allowed values.
401unauthorizedMissing or invalid API key. Use Authorization: Bearer ak_…
402quota_exceededMonthly tier limit reached. Upgrade or wait until reset.
422validation_errorValue out of range or wrong format. Check the message field.
429rate_limitedToo many requests. Back off and retry after Retry-After seconds.
503upstream_unavailableAn upstream source is temporarily down. Retry with backoff.
example
{
  "error": "validation_error",
  "message": "Parameter 'start' must be YYYY, YYYY-MM, or YYYY-Q[1-4].",
  "hint": "Try start=2024-Q1."
}

Known limitations

  • Cold-call latency. First query of the day on an uncommon dataset can take 5-20s while we warm the cache. Subsequent calls are sub-second.
  • One dataset temporarily blocked. ato.ACNC_AIS_FINANCIALS (the 853k-row charity register). Cold-parse exceeds our 8s upstream timeout, so it returns a clean 503 directing you to alternative ATO datasets.
  • au_weather is location-based. Use /v1/describe/au_weather/{location} rather than /v1/data/au_weather/*.
  • Quarterly CPI is SA only. The quarterly series exposes Seasonally Adjusted. For Original (NSA) values use the Monthly CPI Indicator (abs/CPI_MONTHLY), which carries Original, SA, and Trend.

Reference

Tier limits

Every tier gets every endpoint, webhooks, and full historical data. Tiers differ only in call volume and rate limits.

TierPriceCalls / monthRate
Free$050010/min
Analyst$29 AUD/mo10,00060/min
Embed$99 AUD/mo100,000300/min
EnterpriseContact usUnlimitedCustom

Response headers

headers
X-Quota-Limit: 500
X-Quota-Used: 21
X-Quota-Remaining: 479
X-Response-Time-ms: 172

Attribution

Every response carries a meta.sources array with CC-BY attribution per source.

Versioning

All endpoints are v1 and stable. Breaking changes ship as v2 with ≥6 months of parallel support.

OpenAPI

https://api.ausdata.io/openapi.json

Ready to start?

Free key, 500 calls/month, every feature, no credit card.