publicdata.au republishes Australian government open data that the publishers already release under open licences. It keeps every version at a URL that never changes, serves each one in twelve formats, and answers queries over the whole table. This package reads all of it from R. Every function takes a dataset's slug, the part of its page's URL after /d/.
library(publicdataau)
pd_datasets() searches what the site serves, and filters by publisher, topic and government.
pd_datasets("road crashes")[, c("slug", "title")] #> # A tibble: 12 × 2 #> slug title #> <chr> <chr> #> 1 act-road-crashes Road crashes, ACT #> 2 qld-road-casualties Road casualties, Queensland #> 3 qld-road-crash-restraint-helmet-use Seatbelt and helmet use in road crash casualties, … #> 4 qld-road-crash-locations Road crash locations, Queensland #> 5 qld-road-crash-vehicle-types Vehicle types in road crashes, Queensland #> 6 sa-road-crash-locations Road crash locations, South Australia #> 7 tas-road-crashes Road crashes, Tasmania #> 8 qld-road-crash-factors Factors in road crashes, Queensland #> 9 nsw-road-crashes Road crashes, New South Wales #> 10 vic-road-crashes Road crashes, Victoria #> 11 qld-road-crash-driver-demographics Driver demographics in road crashes, Queensland #> 12 au-road-deaths Australian Road Deaths Database, fatalities pd_datasets(topic = "roads", jurisdiction = "Qld")$slug #> [1] "qld-road-crash-driver-demographics" "qld-road-crash-factors" #> [3] "qld-road-casualties" "qld-road-crash-locations" #> [5] "qld-road-crash-restraint-helmet-use" "qld-road-crash-vehicle-types"
pd_catalogue() searches every dataset on the government portals, including the many the site does not serve yet. Each record says whether it is served; one that is not can be voted for on its page.
pd_catalogue("water quality", jurisdiction = "Queensland", limit = 3)[, c("title", "publisher", "status")] #> # A tibble: 3 × 3 #> title publisher status #> <chr> <chr> <chr> #> 1 Pumicestone Passage Bulcock Beach - Water quality monitoring Environment, Tour… votab… #> 2 Brisbane River - Colmslie Site - Water Quality Monitoring Buoy Environment, Tour… votab… #> 3 Sentinel Water Quality City of Gold Coast votab…
pd_fields() lists each field with its type, the publisher's description, its range, and its values when it holds few. A query names fields and values exactly, so this is the first call to make.
pd_fields("act-road-crashes")[1:8, c("name", "type", "min", "max")] #> # A tibble: 8 × 4 #> name type min max #> <chr> <chr> <chr> <chr> #> 1 crash_id integer 1 354433 #> 2 crash_date date 2015-01-01 2026-09-07 #> 3 crash_time string <NA> <NA> #> 4 suburb_location string <NA> <NA> #> 5 longitude number 148.7876728 149.39631165 #> 6 latitude number -35.89116025 -35.14329768 #> 7 intersection boolean <NA> <NA> #> 8 midblock boolean <NA> <NA> pd_fields("act-road-crashes")$values[[11]] #> [1] "Fatal" "Injury" "Property damage only"
pd_rows() and pd_aggregate() ask the query API, so a filter or a total runs over the whole table without a download. Each column comes back typed as its field says and labelled with its description.
crashes <- pd_rows("act-road-crashes", crash_severity = "Fatal", crash_date = pd_gte("2025-01-01"), .select = c("crash_id", "crash_date", "crash_type", "sa2_2021_name")) crashes #> # A tibble: 14 × 4 #> crash_id crash_date crash_type sa2_2021_name #> <int> <date> <chr> <chr> #> 1 340074 2025-10-01 Struck pedestrian (Off Road) Canberra East #> 2 347129 2026-02-16 Struck object (Off Road) Hume #> 3 336058 2025-03-11 Right angle collision Nicholls #> 4 351537 2025-11-02 Collision with parked vehicle Mitchell #> 5 342444 2025-12-05 Head on collision Kaleen #> 6 343635 2026-01-09 Right angle collision Tuggeranong #> 7 330178 2025-03-11 Other - vehicle to vehicle Lyneham #> 8 340260 2025-09-27 Struck pedestrian (Off Road) Lyneham #> 9 347489 2025-03-23 Struck object (Off Road) Watson #> 10 343981 2025-12-03 Rear end collision ACT - South West #> 11 340806 2025-10-06 Struck object (Off Road) ACT - South West #> 12 345222 2026-01-24 Struck object (Off Road) O'Malley #> 13 347390 2026-04-04 Other - Single vehicle (Off Road) ACT - South West #> 14 345211 2026-02-17 Struck pedestrian (On Road) Lyneham class(crashes$crash_date) #> [1] "Date" pd_aggregate("act-road-crashes", group = "crash_severity") #> # A tibble: 3 × 2 #> crash_severity count #> <chr> <int> #> 1 Fatal 105 #> 2 Injury 6576 #> 3 Property damage only 69976
Every answer carries the attribution the publisher's licence requires.
pd_attribution(crashes) #> [1] "Roads ACT, City and Environment Directorate, ACT Government, ACT Road Crash Data, https://www.data.act.gov.au/d/6jn4-m8rx, accessed 30 September 2026, licensed under CC BY 4.0."
pd_read() downloads a version's Parquet file and reads it with 'arrow'. columns reads only the fields asked for.
rate <- pd_read("rba-cash-rate") tail(rate, 3) #> # A tibble: 3 × 7 #> date cash_rate_target_change cash_rate_target es_rate_change es_rate #> <date> <dbl> <dbl> <dbl> <dbl> #> 1 2026-03-18 0.25 4.1 0.25 4 #> 2 2026-05-06 0.25 4.35 0.25 4.25 #> 3 2026-09-30 0.25 4.6 0.25 4.5 #> # ℹ 2 more variables: overnight_repo_rate_change <dbl>, overnight_repo_rate <dbl>
A version never changes once published, so a file can be kept and reused. Nothing is kept unless you ask, with cache = TRUE on a call or options(publicdataau.cache = TRUE) for every call; pd_cache_list() shows what is kept and pd_cache_clear() deletes it.
Every version has a DuckDB file. pd_tbl() attaches it over HTTPS and returns a table for 'dplyr'; verbs become SQL that runs against the file, reading only the blocks they touch.
library(dplyr, warn.conflicts = FALSE) pd_tbl("act-road-crashes") |> filter(crash_severity == "Fatal") |> count(lighting_condition, sort = TRUE) |> collect() #> # A tibble: 5 × 2 #> lighting_condition n #> <chr> <dbl> #> 1 Daylight 63 #> 2 Dark - good street lighting 21 #> 3 Dark - no street lights 11 #> 4 Dark - poor street lighting 6 #> 5 Semi-darkness 4
G-NAF, the national address file, is a database of 37 tables served as one DuckDB file. Its licence sets a condition beyond attribution, on compiling addresses for mail, and the package states it once per session when G-NAF is first read; this vignette turns that notice off with options(publicdataau.quiet = TRUE).
pd_tables("gnaf")[1:5, c("name", "rows")] #> # A tibble: 5 × 2 #> name rows #> <chr> <dbl> #> 1 address_detail 16970406 #> 2 address_default_geocode 16970406 #> 3 address_site 16970406 #> 4 address_site_geocode 20754564 #> 5 address_alias 878895
Rows of a point dataset carry the codes of the ABS areas their point falls in. Total by one of them and pd_join_boundaries() attaches the boundaries, in GDA2020.
by_sa2 <- pd_aggregate("act-road-crashes", group = "sa2_2021_code") map <- pd_join_boundaries(by_sa2) map #> Simple feature collection with 100 features and 3 fields #> Geometry type: MULTIPOLYGON #> Dimension: XY #> Bounding box: xmin: 148.9614 ymin: -35.48032 xmax: 149.3993 ymax: -35.1244 #> Geodetic CRS: GDA2020 #> # A tibble: 100 × 4 #> sa2_2021_code count sa2_2021_name geometry #> <chr> <int> <chr> <MULTIPOLYGON [°]> #> 1 101021012 2 Queanbeyan West - Jerrabomberra (((149.1957 -35.36126, 149.1997 -3… #> 2 801011001 107 Aranda (((149.0741 -35.25529, 149.0742 -3… #> 3 801011002 2712 Belconnen (((149.057 -35.23908, 149.0574 -35… #> 4 801011003 1836 Bruce (((149.0738 -35.24299, 149.0734 -3… #> 5 801011004 301 Charnwood (((149.0285 -35.19852, 149.0284 -3… #> 6 801011005 191 Cook (((149.0572 -35.25635, 149.058 -35… #> 7 801011006 200 Dunlop (((149.0077 -35.19727, 149.0082 -3… #> 8 801011007 431 Evatt (((149.0673 -35.20722, 149.0673 -3… #> 9 801011008 671 Florey (((149.0409 -35.22017, 149.0411 -3… #> 10 801011009 338 Flynn (ACT) (((149.0495 -35.2059, 149.0492 -35… #> # ℹ 90 more rows plot(map["count"], main = "Road crashes by SA2, ACT", border = NA, logz = TRUE)

pd_boundary_layers() lists the layers, and pd_sf() reads any dataset's own map layer.
Each release is compared with the one before it on the dataset's key.
pd_changes("rba-money-market-daily")[, c("from", "to", "added", "removed", "changed")] #> # A tibble: 1 × 5 #> from to added removed changed #> <chr> <chr> <dbl> <dbl> <dbl> #> 1 2026-09-30 2026-10-01 1 0 1
pd_provenance() gives the record kept with a version: the publisher's file it was read from, its checksum and when it was fetched.
pd_provenance("act-road-crashes") #> <pd_provenance> act-road-crashes 2026-10-01 #> Source https://www.data.act.gov.au/api/views/6jn4-m8rx/rows.csv?accessType=DOWNLOAD #> File 6jn4-m8rx.csv #> Bytes 14,256,520 #> SHA-256 45dbb9445b51fdbd831d2c89efa8965f5a3071d50ccf04e0e63374a49ed39a00 #> Fetched 2026-09-30T19:25:31+00:00 #> Licence Creative Commons Attribution 4.0 International (read 2026-09-30T19:25:24+00:00) #> Rows 76,657 #> Version https://publicdata.au/d/act-road-crashes/v/2026-10-01/
An answer without a version comes from the newest one and changes when the publisher releases again. Pass a date from pd_versions() for one that never changes. pd_url() gives a fixed file address for another tool, such as a 'targets' pipeline with format = "url".
pd_url("act-road-crashes", "parquet", pd_latest("act-road-crashes")) #> [1] "https://publicdata.au/d/act-road-crashes/v/2026-10-01/data.parquet"
pd_cite() gives a version's citation, with the attribution its licence requires; utils::toBibtex() turns it into a BibTeX entry.
utils::toBibtex(pd_cite("rba-cash-rate")) #> @Misc{rba-cash-rate-2026-09-29, #> title = {Cash rate target changes, Reserve Bank of Australia}, #> author = {{Reserve Bank of Australia}}, #> year = {2026}, #> howpublished = {Version 2026-09-29, serialised and versioned by National Digital at publicdata.au}, #> url = {https://publicdata.au/d/rba-cash-rate/v/2026-09-29/}, #> note = {Source: Reserve Bank of Australia, statistical table A2 Changes in Monetary Policy and Administered Rates, sourced 30 September 2026 from https://www.rba.gov.au/statistics/tables/, republished under sections 4 and 5 of the RBA copyright notice, https://www.rba.gov.au/copyright/. The RBA does not endorse this site or any use of this data. The RBA publishes this data free of charge at rba.gov.au}, #> }
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.