RBA Historical Statistics avatar

RBA Historical Statistics

Pricing

Pay per usage

Go to Apify Store
RBA Historical Statistics

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.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Huxley

Huxley

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Apify Store Python 3.11+ LICENSE

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-08 dates), 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 / series keys. 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 client
python - <<'PY'
from apify_client import ApifyClient
client = 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.

FieldTypeRequiredDefaultDescription
tablestringyesf11.1-dataThe 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_datestringnoISO YYYY-MM-DD; include only rows on or after this date.
end_datestringnoISO YYYY-MM-DD; include only rows on or before this date.
limitintegernoCap the number of records pushed (after sorting & date filtering).
orderstringnodescdesc (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 observations
apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f11.1-data","limit":5}'
# All exchange rates from January 2026
apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f11.1-data","start_date":"2026-01-01"}'
# Last 3 cash-rate observations
apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"f1.1-data","limit":3}'
# 10 most recent RBA balance-sheet rows
apify call mrjerry/rba-statistics --input '{"mode":"fetch","table":"a1-data","limit":10}'
# Oldest 5 inflation-expectation observations
apify 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.

FieldTypeRequiredDefaultDescription
categorystringnoRestrict 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 tables
apify call mrjerry/rba-statistics --input '{"mode":"discover"}'
# Just the 18 interest-rate tables
apify call mrjerry/rba-statistics --input '{"mode":"discover","category":"Interest Rates"}'
# Just the 13 Market Economists' Forecasts tables
apify 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:

SlugWhat it isFrequencyRecords since
f1.1-dataCash rate target, interbank overnight, BAB/NCD, OISMonthly1969
f11.1-dataExchange rates — daily (TWI + ~22 bilaterals)Daily2023
f1-dataMoney-market rates & yieldsDailyvaries
f2-dataCapital market yields — government bondsDailyvaries
f16-dataIndicative mid rates of Australian Government SecuritiesDailyvaries
a1-dataRBA balance sheetWeekly1969
a2-dataChanges in monetary policy & administered ratesAs changes occurvaries
a3-daily-open-market-operationsDaily open market operationsDaily (when active)varies
a3-omo-outright-transaction-detailOMO outright transactionsAs executedvaries
d1-dataCredit & broad money aggregatesMonthlyvaries
g1-dataConsumer price inflationQuarterly1922
g3-dataInflation expectationsQuarterly1993
h1-dataGDP and gross domestic incomeQuarterlyvaries
j1-gdp-growthMarket economists' GDP growth forecastsQuarterly1990
j1-cash-rateMarket economists' cash-rate forecastsAs surveyed1990
j1-headline-inflationMarket economists' inflation forecastsQuarterly1990
j1-unemployment-rateMarket economists' unemployment forecastsQuarterly1990

Note on "records since": the RBA trims some history from the live index. For the full long-run series (e.g. f11.1 back 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:

CategoryTables
Assets and Liabilities61
Payments System33
Reserve Bank of Australia30
Household and Business Finances23
Interest Rates18
Money and Credit Statistics16
Market Economists' Forecasts13
Exchange Rates5
Output and Labour5
International Trade and External Finance5
Inflation and Inflation Expectations4

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:

  1. Fetches the CSV via httpx (60s timeout, follow redirects).
  2. Scans the first 20 lines for the row whose first cell is the literal token Title — that's the header row.
  3. Parses the rest with pandas, normalising the date column to YYYY-MM-DD strings.
  4. Sorts by date (descending by default), applies date filters, then limit.
  5. Coerces each cell to a number when possible, otherwise keeps the string. Blank cells are dropped from the series dict.
  6. 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:

  1. discover(category: "Interest Rates") → the agent sees the 18 interest-rate tables and their slugs.
  2. 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

# Install
pip install -r requirements.txt
# Run with a test input
echo '{"mode":"discover","category":"Interest Rates"}' \
> storage/key_value_stores/default/INPUT.json
apify run
# Inspect the dataset
ls 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-data has ~10k rows. The Actor reads the whole CSV into memory before filtering; consider start_date / end_date if 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.get with no backoff. The RBA is reliable; if you need retries, add tenacity.
  • Series breaks. Some tables publish a separate series-breaks CSV (e.g. b11.1-series-breaks). The Actor doesn't merge these into the data — call them separately if you need them.

License

MIT.