NSW government schools, locations and enrolments
liveThe NSW public schools master dataset from the NSW Department of Education, one row per government school. It holds the school code and name, street address, phone, email and website, the level of schooling, selective, opportunity class, speciality and distance education flags, the latest FTE enrolment, the per cent of Aboriginal and Torres Strait Islander students and of students with a language background other than English, the family occupation and education index, the date the school opened, and the council area, state and federal electorates, departmental regions, health district, remoteness and latitude and longitude.
Also called: NSW public schools master dataset, NSW government school locations, NSW public school enrolment numbers, Find a NSW public school by suburb.
- What is in each row?
- One NSW government school, with its code, name, address and contacts, the level of schooling and the kinds of classes it offers, its latest full-time equivalent enrolment, the share of Aboriginal and Torres Strait Islander students and of students from a language background other than English, the areas it falls in and its latitude and longitude.
- What does a null percentage mean?
- The Department writes np where five or fewer students are counted, so the percentage is not published. Those cells are null here with a suppressed flag.
- Are the fields all current?
- The file carries the date it was extracted, but the fields come from different collections. Enrolments are as at August of the latest year, language background as at March, and the index of disadvantage as at May, each updated once a year.
- Why is the ICSEA value not here?
- The Department's file carries each school's ICSEA value, which it sources from ACARA. ACARA's terms for My School allow its content to be reproduced for non-commercial educational use only, so the column is left out until the Department confirms that its CC BY 4.0 licence covers it. Every other column is published.

Made for agents
Connect your AI agent
Any agent that connects to publicdata.au/mcp can find this dataset, read its 45 fields, count and filter across all 2,210 rows and diff its versions. Every answer names the version and carries Department of Education's attribution. No key.
Then ask it: What does NSW government schools, locations and enrolments hold, and what changed in the newest version?
claude mcp add --transport http publicdata https://publicdata.au/mcp One command. No key, no account, no sign-up.
Settings, then Connectors, then Add custom connector, and paste https://publicdata.au/mcp.
On the web and in the desktop app.
https://publicdata.au/mcp Streamable HTTP. Cursor, VS Code or any client that connects to a remote MCP server.
Using https://publicdata.au/llms.txt, how many people died on Queensland roads in 2025, by month? For an assistant that reads the web and has no connector.
The dashboard above, live. Click to filter, add panels, share a link or embed a frame.
Query APIFilter and count from a URLaggregate?group=lga&metric=sum.latest_year_enrolment_fte
Students (FTE) by council area: 48,392 Blacktown, 34,663 Central Coast (NSW), 31,645 Canterbury-Bankstown, 26,835 Parramatta.
Download it as Excel, CSV, JSON and 9 more formats
Pick a format and a version. Excel is picked first because it opens in the tools most offices have. The URL is yours to keep. A dated version never changes.
In your own tools
Use it in Excel, R, Python and more
Excel and Power BI read the CSV from its address and refresh from it. The R and Python packages take any dataset on this site by its slug, so a new dataset needs no new release. The DuckDB file attaches read-only over HTTPS, and a query reads only the blocks it touches.
The dated URL in the code never changes. https://publicdata.au/d/nsw-public-schools/latest/ redirects to the newest version.
https://publicdata.au/d/nsw-public-schools/latest/data.csv In Excel choose Data, then From Web, and paste this address. Excel keeps it, so Refresh All reads the newest version. A sheet holds about a million rows; past that, load the query to the Data Model.
https://publicdata.au/d/nsw-public-schools/latest/data.csv In Power BI Desktop choose Get data, then Web, paste this address and choose Anonymous when asked how to sign in. A scheduled refresh reads the same address, so the report follows each new version.
library(publicdataau)
df <- pd_read("nsw-public-schools")
pd_attribution(df) install.packages("publicdataau"). pd_read() fetches the version's Parquet file; pd_rows() and pd_aggregate() ask the query API instead, and pd_connect() attaches the DuckDB file.
import publicdata_au as pd_au
df = pd_au.read("nsw-public-schools")
df.attrs["publicdata"]["attribution"] pip install "publicdata-au[pandas]". read() fetches the version's Parquet file; rows() and aggregate() ask the query API, and connect() attaches the DuckDB file.
INSTALL httpfs; LOAD httpfs;
ATTACH 'https://publicdata.au/d/nsw-public-schools/v/2026-10-02/data.duckdb' AS nsw_public_schools (READ_ONLY);
SELECT school_code, count(*) FROM nsw_public_schools.records GROUP BY 1 ORDER BY 2 DESC; The DuckDB file attaches read-only over HTTPS and only the blocks a query touches are read. Parquet works the same way: FROM read_parquet(url).
const res = await fetch("https://publicdata.au/api/v1/datasets/nsw-public-schools/aggregate?group=lga&metric=sum.latest_year_enrolment_fte");
const { rows, publicdata } = await res.json();
console.log(rows, publicdata.attribution); The query API answers a page on any site as well as Node, with no key. It returns the rows and the attribution the licence asks for.
What is in it
Column names are made snake_case and the publisher's original header is kept beside each one. Blank cells are null. Nothing is added, removed, ranked or summarised.
| Field | Type | Publisher's header | Note |
|---|---|---|---|
| school_code | integer | School_code | |
| ageid | integer | AgeID | |
| school_name | string | School_name | |
| street | string | Street | |
| town_suburb | string | Town_suburb | |
| postcode | string | Postcode | |
| phone | string | Phone | |
| school_email | string | School_Email | |
| website | string | Website | |
| fax | string | Fax | |
| latest_year_enrolment_fte | number | latest_year_enrolment_FTE | Full-time equivalent enrolments as reported to the ABS National Schools Statistics Collection, as at August. |
| indigenous_pct | integer | Indigenous_pct | Per cent of FTE students who identify as Aboriginal or Torres Strait Islander. The Department writes np where the student number is five or fewer; it is null here with a suppressed flag. |
| lbote_pct | integer | LBOTE_pct | Per cent of students, by headcount, from a language background other than English, as at March. np where the student number is five or fewer. |
| level_of_schooling | string | Level_of_schooling | |
| selective_school | string | Selective_school | |
| opportunity_class | boolean | Opportunity_class | |
| school_specialty_type | string | School_specialty_type | |
| school_subtype | string | School_subtype | |
| preschool_ind | boolean | Preschool_ind | |
| distance_education | string | Distance_education | |
| intensive_english_centre | boolean | Intensive_english_centre | |
| school_gender | string | School_gender | |
| late_opening_school | boolean | Late_opening_school | |
| date_1st_teacher | date | Date_1st_teacher | The date the first teacher was on duty, which the Department treats as the date the school opened. |
| lga | string | LGA | |
| electorate_from_2023 | string | electorate_from_2023 | |
| electorate_2015_2022 | string | electorate_2015_2022 | |
| fed_electorate_from_2025 | string | fed_electorate_from_2025 | |
| fed_electorate_2016_2024 | string | fed_electorate_2016_2024 | |
| operational_directorate | string | Operational_directorate | |
| principal_network | string | Principal_network | |
| operational_directorate_office | string | Operational_directorate_office | |
| operational_directorate_office_phone | string | Operational_directorate_office_phone | |
| operational_directorate_office_address | string | Operational_directorate_office_address | |
| facs_district | string | FACS_district | |
| local_health_district | string | Local_health_district | |
| aecg_region | string | AECG_region | |
| asgs_remoteness | string | ASGS_remoteness | |
| latitude | number | Latitude | As published. The Department's data dictionary does not state the datum. |
| longitude | number | Longitude | As published. The Department's data dictionary does not state the datum. |
| assets_unit | string | Assets unit | |
| sa4 | string | SA4 | |
| foei_value | number | FOEI_Value | Family Occupation and Education Index, the Department's school-level index of educational disadvantage. A higher value means more disadvantage. |
| date_extracted | date | Date_extracted | The night the file was extracted. Fields come from different update cycles, so not every field was refreshed on this date. |
| support_classes | string | Support_classes | |
| suppressed | array | Names of the fields the publisher suppressed in this row. The cells are null. |
Download this table as a data dictionary (Excel), or read it as a Frictionless Table Schema at schema.json. The key is school_code.
A sample of 10 rows
From the latest version, newest first by date first teacher on duty, then in the publisher's order, with every field. A blank cell is shown as null.
| school_code | ageid | school_name | street | town_suburb | postcode | phone | school_email | website | fax | latest_year_enrolment_fte | indigenous_pct | lbote_pct | level_of_schooling | selective_school | opportunity_class | school_specialty_type | school_subtype | preschool_ind | distance_education | intensive_english_centre | school_gender | late_opening_school | date_1st_teacher | lga | electorate_from_2023 | electorate_2015_2022 | fed_electorate_from_2025 | fed_electorate_2016_2024 | operational_directorate | principal_network | operational_directorate_office | operational_directorate_office_phone | operational_directorate_office_address | facs_district | local_health_district | aecg_region | asgs_remoteness | latitude | longitude | assets_unit | sa4 | foei_value | date_extracted | support_classes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8933 | 89905 | Bayside High School | Princes Highway | Kogarah | 2217 | 02 8566 2200 | bayside-h.school@det.nsw.edu.au | https://bayside-h.schools.nsw.gov.au/ | null | null | null | null | Secondary School | Not Selective | false | Comprehensive | Year 7 to Year 12 | false | N | false | Coed | false | 2026-01-27 | Bayside (NSW) | Rockdale | Rockdale | Barton | Cook | Metropolitan South | Kogarah | Arncliffe | 131 536 | Arncliffe Education Office, Corner Segenhoe and Avenal Streets | null | null | null | Major Cities of Australia | -33.9673955 | 151.1374145 | null | Sydney - Inner South West | 82 | 2026-10-02 | null |
| 8935 | 89907 | Box Hill High School | George Street | Box Hill | 2765 | 02 9421 1200 | BoxHill-h.school@det.nsw.edu.au | https://boxhill-h.schools.nsw.gov.au/ | null | null | null | null | Secondary School | Not Selective | false | Comprehensive | Year 7 to Year 9 | false | N | false | Coed | false | 2026-01-27 | The Hills | Hawkesbury | null | Greenway | null | Metropolitan North | South Creek | Quakers Hill | 131 536 | Building T3C, Nirimba Education Precinct, Eastern Road | null | null | null | Major Cities of Australia | -33.6457 | 150.898968 | null | Sydney - Baulkham Hills and Hawkesbury | 33 | 2026-10-02 | null |
| 4681 | 89440 | Green Square Public School | Joynton Avenue | Zetlands | 2017 | 8344 7100 | greensquare-p.school@det.nsw.edu.au | https://greensquare-p.schools.nsw.gov.au | null | 107 | null | 75 | Primary School | Not Selective | false | Comprehensive | Kindergarten to Year 6 | false | N | false | Coed | false | 2025-01-31 | Sydney | Heffron | Heffron | Sydney | Sydney | Metropolitan South | Kamay | St Peters | 131 536 | St Peters Education Office, 93 Church Street | null | null | Metropolitan East | Major Cities of Australia | -33.908383 | 151.20668 | null | Sydney - City and Inner South | 0 | 2026-10-02 | null |
| 4689 | 89442 | Melonba Public School | 10 SWALLOWTAIL ST | MELONBA | 2765 | 02 8808 4800 | melonba-p.school@det.nsw.edu.au | https://melonba-p.schools.nsw.gov.au/ | null | 776 | null | 92 | Primary School | Not Selective | false | Comprehensive | Kindergarten to Year 6 | false | N | false | Coed | false | 2025-01-31 | Blacktown | Londonderry | Londonderry | Chifley | Chifley | Metropolitan North | South Creek | Quakers Hill | 131 536 | Building T3C, Nirimba Education Precinct, Eastern Road | null | null | Metropolitan West | Major Cities of Australia | -33.699759 | 150.803617 | null | Sydney - Blacktown | 18 | 2026-10-02 | null |
| 4694 | 89444 | Box Hill Public School | George St | Box Hill | 2765 | 02 9852 6900 | boxhill-p.school@det.nsw.edu.au | https://boxhill-p.schools.nsw.gov.au | null | 271 | null | 91 | Primary School | Not Selective | false | Comprehensive | Kindergarten to Year 6 | false | N | false | Coed | false | 2025-01-31 | The Hills | Hawkesbury | Castle Hill | Greenway | Mitchell | Metropolitan North | South Creek | Quakers Hill | 131 536 | Building T3C, Nirimba Education Precinct, Eastern Road | null | null | Metropolitan West | Major Cities of Australia | -33.64227 | 150.892123 | null | Sydney - Baulkham Hills and Hawkesbury | 2 | 2026-10-02 | null |
| 8918 | 89446 | Wentworth Point High School | 7 Burroway Rd | WENTWORTH POINT | 2127 | 8737 7000 | WentworthPoint-h.school@det.nsw.edu.au | https://wentworthpoint-h.schools.nsw.gov.au/ | null | 188 | null | 88 | Secondary School | Not Selective | false | Comprehensive | Year 7 to Year 12 | false | N | false | Coed | false | 2025-01-31 | Parramatta | Parramatta | Auburn | Reid | Reid | Metropolitan South | Auburn | St Peters | 131 536 | St Peters Education Office, 93 Church Street | null | null | Metropolitan South West | Major Cities of Australia | -33.82399 | 151.08074 | null | Sydney - Parramatta | 49 | 2026-10-02 | null |
| 8926 | 46463 | Randwick High School | Avoca Street | Randwick | 2031 | 02 9314 9800 | randwick-h.school@det.nsw.edu.au | https://randwick-h.schools.nsw.gov.au/ | null | 1460 | 2 | 54 | Secondary School | Not Selective | false | Comprehensive | Year 7 to Year 12 | false | N | false | Coed | false | 2025-01-31 | Randwick | Coogee | Coogee | Kingsford Smith | Kingsford Smith | Metropolitan South | Bondi | St Peters | 131 536 | St Peters Education Office, 93 Church Street | null | null | Metropolitan East | Major Cities of Australia | -33.921832 | 151.23944 | null | Sydney - Eastern Suburbs | 50 | 2026-10-02 | null |
| 8927 | 89458 | Gledswood Hills High School | 9 GREGORY HILLS DR | GLEDSWOOD HILLS | 2557 | 02 4645 2800 | gledswoodhill-h.school@det.nsw.edu.au | https://gledswoodhills-h.schools.nsw.gov.au/ | null | 87 | null | 60 | Secondary School | Not Selective | false | Comprehensive | Year 7 to Year 9 | false | N | false | Coed | false | 2025-01-31 | Camden | Camden | Camden | Macarthur | Macarthur | Regional South and Connected Communities | Macarthur | Campbelltown | 131 536 | Corner Lindesay and Lithgow Streets | null | null | Metropolitan South West | Major Cities of Australia | -34.022494 | 150.769597 | null | Sydney - South West | 84 | 2026-10-02 | null |
| 4687 | 88922 | Gulyangarri Public School | 18 Forbes Street | Liverpool | 2170 | 02 8777 6500 | gulyan-p.school@det.nsw.edu.au | https://gulyangarri-p.schools.nsw.gov.au/ | null | 267 | null | 86 | Primary School | Not Selective | false | Comprehensive | Preschool to Year 6 | true | N | false | Coed | false | 2024-01-31 | Liverpool | Liverpool | Liverpool | Fowler | Fowler | Metropolitan South and West | Liverpool | Glenfield | 131 536 | Glenfield Education Office, Roy Watts Road | null | null | Metropolitan South West | Major Cities of Australia | -33.917848 | 150.932241 | null | Sydney - South West | 118 | 2026-10-02 | null |
| 4686 | 88920 | Tallawong Public School | 24 Macquarie Road | Rouse Hill | 2155 | 02 9627 0900 | tallawong-p.school@det.nsw.edu.au | https://tallawong-p.schools.nsw.gov.au | null | 121 | null | 76 | Primary School | Not Selective | false | Comprehensive | Kindergarten to Year 6 | false | N | false | Coed | false | 2024-01-30 | Blacktown | Riverstone | Riverstone | Greenway | Greenway | Metropolitan North | South Creek | Quakers Hill | 131 536 | Building T3C, Nirimba Education Precinct, Eastern Road | null | null | Metropolitan West | Major Cities of Australia | -33.6868 | 150.8991 | null | Sydney - Blacktown | 35 | 2026-10-02 | null |
The first row as JSON
As it appears in data.json.
GET https://publicdata.au/d/nsw-public-schools/latest/data.json
{
"school_code": 1001,
"ageid": 44402,
"school_name": "Abbotsford Public School",
"street": "350 Great North Rd",
"town_suburb": "Abbotsford",
"postcode": "2046",
"phone": "9713 6220",
"school_email": "abbotsford-p.school@det.nsw.edu.au",
"website": "https://abbotsford-p.schools.nsw.gov.au",
"fax": "9712 1825",
"latest_year_enrolment_fte": 368.0,
"indigenous_pct": 2,
"lbote_pct": 37,
"level_of_schooling": "Primary School",
"selective_school": "Not Selective",
"opportunity_class": false,
"school_specialty_type": "Comprehensive",
"school_subtype": "Kindergarten to Year 6",
"preschool_ind": false,
"distance_education": "N",
"intensive_english_centre": false,
"school_gender": "Coed",
"late_opening_school": false,
"date_1st_teacher": "1925-04-01",
"lga": "Canada Bay",
"electorate_from_2023": "Drummoyne",
"electorate_2015_2022": "Drummoyne",
"fed_electorate_from_2025": "Reid",
"fed_electorate_2016_2024": "Reid",
"operational_directorate": "Metropolitan South",
"principal_network": "Iron Cove",
"operational_directorate_office": "St Peters",
"operational_directorate_office_phone": "131 536",
"operational_directorate_office_address": "St Peters Education Office, 93 Church Street",
"facs_district": "South Eastern Sydney, Northern Sydney & Sydney",
"local_health_district": "Sydney",
"aecg_region": "Metropolitan East",
"asgs_remoteness": "Major Cities of Australia",
"latitude": -33.852728,
"longitude": 151.131206,
"assets_unit": "Sydney",
"sa4": "Sydney - Inner West",
"foei_value": 27.0,
"date_extracted": "2026-10-02",
"support_classes": null,
"suppressed": []
}
Query it without downloading
The query API returns only the rows you ask for, as JSON, NDJSON or CSV, from the same typed rows as the files. It needs no key. Build a query here and run it, then copy the URL or the code into your own work.
How filters work
Each filter is field=operator.value in the query string, and every filter must match. A number or date field compares as a number or date, and a text field compares as text. Values are case-sensitive except with ilike. Prefix not. to negate a filter, as not.eq.value.
| Operator | What it matches |
|---|---|
| eq.value | Equal to the value. |
| neq.value | Not equal to the value. A blank cell does not match. |
| gt.value | Greater than the value. |
| gte.value | Greater than or equal to the value. |
| lt.value | Less than the value. |
| lte.value | Less than or equal to the value. |
| like.*text* | Matches a pattern where * stands for any run of characters. Case-sensitive. |
| ilike.*text* | The same as like, ignoring case. |
| in.(a,b,c) | Equal to any value in the list. A value cannot contain a comma. |
| is.null | Blank in the source, or suppressed by the publisher. |
| Parameter | What it does |
|---|---|
| select | Fields to return, comma-separated. Every field when absent. |
| order | field.asc or field.desc, comma-separated. The publisher's row order when absent. |
| limit | Rows per page, 1 to 10,000. 100 when absent. |
| offset | Rows to skip. The next URL in each answer sets it for you. |
| group | On aggregate, fields to group by, comma-separated. |
| metric | On aggregate, count, sum.field, avg.field, min.field or max.field, comma-separated. count when absent. |
| format | json, ndjson or csv. JSON carries the provenance header, and the others carry it in response headers. |
Without a version the API answers from the newest loaded version, and that answer changes when the publisher releases again. Put versions/<date>/ before rows or aggregate for an answer that never changes. /api/v1/datasets/<slug>/versions lists the loaded versions. The 1 newest version is loaded; versions lists them.
The API allows 60 requests in 10 seconds from one address. Above that it answers 429 for 10 seconds with a Retry-After header, a RateLimit-Policy header and a JSON body that gives the limit. Every API answer carries the same RateLimit-Policy. A client should wait the Retry-After seconds, or read the files, which have no limit. openapi.json describes this dataset's query paths for client generators and agents.
https://publicdata.au/mcp is a remote MCP server over Streamable HTTP with the same tools, defined in the same place, so a tool added to the pages is added here too. It needs no key and no account. The row tools are held to the query API's limit of 60 queries in 10 seconds from one address, and each call is two queries because it also counts the matching rows. Add it to Claude Code with claude mcp add --transport http publicdata https://publicdata.au/mcp, add the URL in Claude as a custom connector, or give it to any client that connects to remote MCP servers. Each queryable dataset is also a resource at https://publicdata.au/d/<slug>/fields.json, which lists its fields with their types, the publisher's descriptions, their ranges and the values they hold, so an agent can read a dataset's shape before it writes a query.
What changed
One version for every release the publisher has made since this site started following the dataset. The date is the day the file changed on the portal.
- 2026-10-02 2,210 rows45 fieldsutf-8-sig2bc63daaf71d
versions.json · changes.json · history.tar.zst (214 KB, every version's Parquet and manifest)
Questions
How do I download NSW government schools as a CSV file?
Open https://publicdata.au/d/nsw-public-schools/latest/data.csv. It redirects to the newest dated version, which is https://publicdata.au/d/nsw-public-schools/v/2026-10-02/data.csv today. The same path serves Excel, JSON, GeoJSON, Parquet, SQLite, DuckDB, GeoPackage, GeoParquet, NDJSON, Arrow. A dated URL never changes, so use it when the file must stay the same.
Can I open NSW government schools in Excel?
Yes. https://publicdata.au/d/nsw-public-schools/v/2026-10-02/data.xlsx is a workbook with the 2,210 rows on a records sheet, the field list on a second sheet and the provenance on a third. The CSV also opens in Excel. https://publicdata.au/d/nsw-public-schools/v/2026-10-02/data.csv.gz is the CSV at about a tenth of the size.
What years does NSW government schools cover?
The current version covers 1849 to 2025. Each release from Department of Education becomes a new dated version here, and earlier versions stay online.
How often is NSW government schools updated?
Department of Education releases it monthly. This site checks the portal every week and adds a dated version when the file changes.
Can I use NSW government schools commercially?
Yes. CC BY 4.0 allows commercial use, redistribution and derived works as long as the attribution is kept. The attribution string is in this page's side column and inside every file.
Is this the official source for NSW government schools?
No. The publisher is NSW Department of Education, and its page is https://data.nsw.gov.au/data/dataset/nsw-education-nsw-public-schools-master-dataset. This site republishes the publisher's file with one change. The ICSEA value column is left out because ACARA licenses ICSEA for non-commercial educational use only, and the Department has been asked whether its CC BY 4.0 licence covers it. The publisher's own file includes that column, so it is not kept beside each version.
What coordinate system does NSW government schools use?
Latitude and longitude in decimal degrees as published. The Department's data dictionary does not state the datum; GDA94 is the NSW Government's standard and differs from GDA2020 and WGS84 by under 2 metres. The GeoJSON file uses the same coordinates, which is what GeoJSON expects.
What this site did to the data. Cells were typed, headers were renamed and the encoding was made UTF-8. Rows were left alone. The ICSEA value column is left out because ACARA licenses ICSEA for non-commercial educational use only, and the Department has been asked whether its CC BY 4.0 licence covers it. The publisher's own file includes that column, so it is not kept beside each version.