RBA Historical Statistics
Pricing
Pay per usage
RBA Historical Statistics
Fetches historical time series from the Reserve Bank of Australia's public CSV endpoints. Input an RBA table ID (f11.1 daily FX, f1.1 cash rate, a1 balance sheet) and get back uniform JSON records — one per CSV row, with date plus a name→value series dict — pushed to the default Apify Dataset.
Fetch historical time series from the Reserve Bank of Australia's public CSV endpoints, in one Actor with two modes:
fetch— pull a single RBA table and push its rows as uniform JSON records.discover— crawl the RBA's index page and push a list of every available CSV endpoint (slug, title, category, parent, URL).
Output records always have the same shape regardless of which table you pull, so a single downstream consumer can handle every table the RBA publishes.
{"table": "f11.1-data","source_url": "https://www.rba.gov.au/statistics/tables/csv/f11.1-data.csv","fetched_at": "2026-07-09T12:35:26Z","date": "2026-07-09","series": {"A$1=USD": 0.6941,"Trade-weighted Index May 1970 = 100": 65.1,"A$1=CNY": 4.7177}}
Source: The RBA publishes ~200+ statistical tables as CSV files at predictable URLs — no auth, no rate limiting, no JS rendering. The Actor hits those URLs, parses the RBA's mixed-format CSVs (variable preamble +
01-Jan-1983/2026-07-08dates), and normalises everything to ISO-8601 strings.
Why use this Actor?
- One shape, every table. All 213 RBA CSVs emit records with the same
table / source_url / fetched_at / date / serieskeys. No per-table parsing downstream. - Discoverable. Don't know the slug? Run
mode: "discover"first and the Actor returns the full index. - No browser, no proxy, no flakiness. Pure
httpx+pandas. Runs in seconds. - Bidirectional with AI agents. The discover mode lists slugs; the fetch mode takes a slug and returns records. That's a clean tool interface for MCP / LLM use.
- No scraping glue. The RBA's HTML index has nested
<li>s up to three levels deep. The Actor handles that.
Quick start
# Run from the Apify CLI (you'll need an Apify account + token)apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f11.1-data","limit":5}'# Or invoke from Python via the Apify clientpython - <<'PY'from apify_client import ApifyClientclient = ApifyClient(token="YOUR_API_TOKEN")run = client.actor("mrjerry/rba-statistics").call(run_input={"mode": "fetch", "table": "f1.1-data", "limit": 3},)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["date"], item["series"].get("Cash Rate Target"))PY
Modes
mode: "fetch" (default)
Pull a single RBA table. Returns one record per CSV row, sorted by date.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
table | string | yes | f11.1-data | The RBA table slug — get these from mode: "discover" or the TABLES.md. Short forms like f11.1 are accepted and rewritten to f11.1-data. |
start_date | string | no | — | ISO YYYY-MM-DD; include only rows on or after this date. |
end_date | string | no | — | ISO YYYY-MM-DD; include only rows on or before this date. |
limit | integer | no | — | Cap the number of records pushed (after sorting & date filtering). |
order | string | no | desc | desc (latest first) or asc (oldest first). RBA CSVs are oldest-first by default. |
Output record: { table, source_url, fetched_at, date, series } where series is a {column_name: value} dict for that row.
Examples:
# Latest 5 daily AUD/USD + TWI observationsapify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f11.1-data","limit":5}'# All exchange rates from January 2026apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f11.1-data","start_date":"2026-01-01"}'# Last 3 cash-rate observationsapify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f1.1-data","limit":3}'# 10 most recent RBA balance-sheet rowsapify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"a1-data","limit":10}'# Oldest 5 inflation-expectation observationsapify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"g3-data","limit":5,"order":"asc"}'
mode: "discover"
Crawl the RBA's statistical-tables index and push one record per available CSV.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
category | string | no | — | Restrict results to one of the RBA's 11 H2 sections, e.g. Interest Rates, Exchange Rates, Reserve Bank of Australia, Market Economists' Forecasts. Case-insensitive. |
Output record: { slug, title, category, parent_id, url, fetched_at } where slug is what you pass back into fetch mode.
Examples:
# All 213 tablesapify call mrjerry/rba-statistics --input '{"mode":"discover"}'# Just the 18 interest-rate tablesapify call mrjerry/rba-statistics --input '{"mode":"discover","category":"Interest Rates"}'# Just the 13 Market Economists' Forecasts tablesapify call mrjerry/rba-statistics --input '{"mode":"discover","category":"Market Economists\u2019 Forecasts"}'
The full 213-entry registry is auto-regenerated into TABLES.md and registry.json on every build.
The most useful tables (curated)
The RBA publishes 213 CSVs. Here are the ones you'll reach for most often:
| Slug | What it is | Frequency | Records since |
|---|---|---|---|
f1.1-data | Cash rate target, interbank overnight, BAB/NCD, OIS | Monthly | 1969 |
f11.1-data | Exchange rates — daily (TWI + ~22 bilaterals) | Daily | 2023 |
f1-data | Money-market rates & yields | Daily | varies |
f2-data | Capital market yields — government bonds | Daily | varies |
f16-data | Indicative mid rates of Australian Government Securities | Daily | varies |
a1-data | RBA balance sheet | Weekly | 1969 |
a2-data | Changes in monetary policy & administered rates | As changes occur | varies |
a3-daily-open-market-operations | Daily open market operations | Daily (when active) | varies |
a3-omo-outright-transaction-detail | OMO outright transactions | As executed | varies |
d1-data | Credit & broad money aggregates | Monthly | varies |
g1-data | Consumer price inflation | Quarterly | 1922 |
g3-data | Inflation expectations | Quarterly | 1993 |
h1-data | GDP and gross domestic income | Quarterly | varies |
j1-gdp-growth | Market economists' GDP growth forecasts | Quarterly | 1990 |
j1-cash-rate | Market economists' cash-rate forecasts | As surveyed | 1990 |
j1-headline-inflation | Market economists' inflation forecasts | Quarterly | 1990 |
j1-unemployment-rate | Market economists' unemployment forecasts | Quarterly | 1990 |
Note on "records since": the RBA trims some history from the live index. For the full long-run series (e.g.
f11.1back to 1983, or monthly exchange rates back to 1969), use the RBA's Historical Data page or pass the slug directly — the Actor will resolve it through the URL pattern fallback.
For the full 213-table registry, see TABLES.md.
Categories
discover mode groups tables under the RBA's own 11 H2 sections:
| Category | Tables |
|---|---|
| Assets and Liabilities | 61 |
| Payments System | 33 |
| Reserve Bank of Australia | 30 |
| Household and Business Finances | 23 |
| Interest Rates | 18 |
| Money and Credit Statistics | 16 |
| Market Economists' Forecasts | 13 |
| Exchange Rates | 5 |
| Output and Labour | 5 |
| International Trade and External Finance | 5 |
| Inflation and Inflation Expectations | 4 |
How the data is parsed
RBA CSVs are not standard. They start with a small preamble (table title, units, source, publication date) before the real header row. The date column is in mixed formats: older tables use 01-Jan-1983; newer ones use 2026-07-08. The Actor:
- Fetches the CSV via
httpx(60s timeout, follow redirects). - Scans the first 20 lines for the row whose first cell is the literal token
Title— that's the header row. - Parses the rest with
pandas, normalising the date column toYYYY-MM-DDstrings. - Sorts by date (descending by default), applies date filters, then
limit. - Coerces each cell to a number when possible, otherwise keeps the string. Blank cells are dropped from the
seriesdict. - Pushes one record per row to the default Apify Dataset.
The discover mode uses httpx + BeautifulSoup to crawl the index page. It handles three different HTML shapes (leaf with title-div, leaf with bare link, container with nested <ul>s) and recurses up to three levels deep to find every CSV endpoint.
Use as an LLM tool (MCP)
This Actor is a clean fit for an LLM agent that needs to answer questions about the Australian economy. Two tool calls work together:
discover(category: "Interest Rates")→ the agent sees the 18 interest-rate tables and their slugs.fetch(table: "f1.1-data", limit: 12)→ the agent gets 12 months of cash-rate history.
You can wrap it as an MCP server with one extra Actor using the python-mcp-empty template, or expose it directly to Claude via Apify's MCP integration.
Prompt example
"What has happened to the AUD/USD exchange rate over the last month?"
The agent runs discover(category="Exchange Rates") to find the slug, then fetch(table="f11.1-data", start_date="<30 days ago>") and walks the series dict for the A$1=USD key.
Local development
# Installpip install -r requirements.txt# Run with a test inputecho '{"mode":"discover","category":"Interest Rates"}' \> storage/key_value_stores/default/INPUT.jsonapify run# Inspect the datasetls storage/datasets/default/cat storage/datasets/default/000000001.json
To regenerate the full registry after the RBA adds new tables:
python -m scripts.generate_registry# writes registry.json and TABLES.md
Limits & gotchas
- RBA CSVs are old.
f11.1-datahas ~10k rows. The Actor reads the whole CSV into memory before filtering; considerstart_date/end_dateif you only need a slice. - Free plan = zero monetization. On Apify's free tier, you pay for compute with monthly free credits. This Actor's runs are tiny (a few seconds each) but heavy users should be on a paid plan.
- No retry on transient errors. Single
httpx.getwith no backoff. The RBA is reliable; if you need retries, addtenacity. - Series breaks. Some tables publish a separate
series-breaksCSV (e.g.b11.1-series-breaks). The Actor doesn't merge these into the data — call them separately if you need them.
License
MIT.