Home / Blog / AU government data release calendars in one place
2026-05-20 · Harry Vass
AU government data release calendars in one place
Stop scraping nine separate agency release calendars. How ABS, RBA, APRA, AIHW, ASIC, ATO, AEMO, WGEA, and BOM publish schedules, and how to poll real ausdata.io datasets after a release lands.
If you've ever tried to automate a "fire a Slack alert the minute CPI drops" workflow, you've discovered something painful: every Australian government agency publishes its release calendar in a different place, in a different format, with different fields, and with different lead times.
The ABS uses a Future Releases page rendered server-side. The RBA publishes a statements of monetary policy schedule. APRA buries quarterly publication dates in PDFs. AIHW announces report drops on an RSS feed. AEMO has a dispatch-schedule API that mixes operational and statistical artifacts in the same stream.
Nine sources, nine conventions, zero standardisation.
That's what the release calendar feed fixes.
<!-- IMG: hero diagram, nine agency calendar logos collapsing into a single JSON envelope -->
One endpoint, every upcoming release
curl -H "x-api-key: $AUSDATA_API_KEY" \
"https://api.ausdata.iothe release calendar feed?days_ahead=14"
Response (abbreviated):
{
"data": {
"window": {"start": "2026-05-20", "end": "2026-06-03"},
"releases": [
{
"source": "abs",
"dataset_id": "CPI",
"dataset_name": "Consumer Price Index, Australia",
"release_at": "2026-05-28T11:30:00+10:00",
"period_covered": "2026-Q1",
"confidence": "scheduled",
"source_url": "https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/consumer-price-index-australia"
},
{
"source": "rba",
"dataset_id": "CASH_RATE_DECISION",
"dataset_name": "Monetary Policy Decision",
"release_at": "2026-06-03T14:30:00+10:00",
"period_covered": "2026-06",
"confidence": "scheduled",
"source_url": "https://www.rba.gov.au/monetary-policy/"
},
{
"source": "apra",
"dataset_id": "MADIS",
"dataset_name": "Monthly ADI Statistics",
"release_at": "2026-05-30T11:00:00+10:00",
"period_covered": "2026-04",
"confidence": "indicative",
"source_url": "https://www.apra.gov.au/monthly-authorised-deposit-taking-institution-statistics"
}
]
},
"meta": {
"endpoint": "the release calendar feed",
"sources_covered": 9,
"retrieved_at": "<iso-timestamp>"
}
}
Every release carries:
release_at, RFC 3339 timestamp in Australian Eastern Time (the publishing timezone for all nine sources)period_covered, what period the data describes (monthlyYYYY-MM, quarterlyYYYY-Qn, etc.)confidence,scheduled(date confirmed by source) vsindicative(modelled from historical cadence)source_url, the canonical agency page to scrape on release-day if you want raw artifacts
<!-- IMG: timeline chart, next 14 days of AU releases coloured by agency -->
Why a release calendar belongs in your stack
The classic release-day automation pattern is:
- Poll the agency at the published time
- Diff the new value against the previous
- Pipe the delta into Slack / a newsletter draft / a model rerun
The "poll the agency at the published time" step is exactly where most teams trip up. ABS publishes CPI at 11:30 Canberra time. The RBA announces cash-rate decisions at 14:30 Sydney time. APRA's MADIS is "11am AEST/AEDT depending on the season". If you hardcode UTC offsets, you'll miss the daylight-savings switch and quietly poll an hour late twice a year.
the release calendar feed normalises all of that. The release_at field is the actual local time the source agency has committed to, rendered in IANA-correct AET.
Recipe: release-day Slack notifier
import os, asyncio, httpx, datetime as dt
API_KEY = os.environ["AUSDATA_API_KEY"]
SLACK = os.environ["SLACK_WEBHOOK"]
async def releases_today():
async with httpx.AsyncClient() as c:
r = await c.get(
"https://api.ausdata.iothe release calendar feed",
params={"days_ahead": 1},
headers={"x-api-key": API_KEY},
timeout=10.0,
)
return r.json()["data"]["releases"]
async def main():
today = dt.date.today().isoformat()
for rel in await releases_today():
if rel["release_at"].startswith(today):
msg = f":bell: *{rel['dataset_name']}* drops at {rel['release_at'][11:16]} AET, {rel['source_url']}"
async with httpx.AsyncClient() as c:
await c.post(SLACK, json={"text": msg})
asyncio.run(main())
Schedule this with cron, GitHub Actions, or a Fly machine, and your team sees an alert at 08:05 every morning for any AU data that lands that day.
Recipe: subscribe to a specific source
import httpx
releases = httpx.get(
"https://api.ausdata.iothe release calendar feed",
params={"sources": "abs,rba", "days_ahead": 30},
headers={"x-api-key": "ak_..."},
).json()["data"]["releases"]
cpi_drops = [r for r in releases if r["dataset_id"] == "CPI"]
print(f"Next CPI: {cpi_drops[0]['release_at']}")
The sources filter accepts any subset of the nine LIVE sister MCPs: abs, rba, apra, aihw, asic, ato, aemo, wgea, au-weather.
<!-- IMG: code snippet diff, 70 lines of per-agency scrapers collapsing to 6 lines using release-pulse -->
How it's built (engineering)
the release calendar feed doesn't scrape on every request. Each sister MCP carries a thin release_calendar() tool that pulls its source's schedule once per six hours into the per-sister SQLite cache. The signal endpoint reads those nine caches, merges them, normalises timezones, and returns. The 6-hour TTL means worst-case staleness is half a working day, fine for a tool whose purpose is next 14 days, not next 14 minutes.
When a source page is down, the signal serves the stale cache with stale=true and stale_reason="ABS calendar 503 at 07:55 AET". No hard fail.
What this isn't
release-pulse is a calendar, not a content feed:
- It tells you that CPI drops Wednesday at 11:30. It does not tell you the CPI number, call
/v1/data/abs/CPIafter the release lands. - It tells you a release is
scheduled(agency-confirmed) vsindicative(modelled). For decision-grade compliance use cases, only treatscheduledreleases as commitments. - It covers the nine sources currently in the bundle. ATO has no fixed release calendar (datasets refresh annually with announcements). The "AU government data calendar" is not a single thing,
release-pulseis the best-effort union of what each agency does publish.
Pricing
- Free: 500 calls/month, fine for one cron job hitting the release calendar feed daily (≈30 calls/month)
- Analyst: $29/mo, 10k calls, fine for a team-wide release-day automation
- Pro: $99/mo, 100k calls, fine for embedding in a customer-facing product
Every tier gets every endpoint. Webhooks land in Q3 2026 (see post #24).
Grab a key at ausdata.io.