Campsite API
Free, read-only JSON and GeoJSON for 9,276 Australian camping areas, caravan parks and Scout & Guide venues. No sign-up and no key. Show the attribution and link back to the listing.
- Quick start
- Endpoints
- Search parameters
- The record
- Licences and attribution
- Fair use and keys
- Widget
- Try it
- Terms
Quick start
Base URL: https://outdoors.keptsimple.com.au/api/v1. Every response is JSON with meta and data, or GeoJSON when you add format=geojson. CORS is open, so you can call it from a browser.
Campsites with toilets within 30 km of Katoomba
curl "https://outdoors.keptsimple.com.au/api/v1/campsites?near=-33.71,150.31&radius=30&facilities=toilets&limit=5" One campsite
curl "https://outdoors.keptsimple.com.au/api/v1/campsites/nsw-acacia-flat-campground"JavaScript
const url = new URL('https://outdoors.keptsimple.com.au/api/v1/campsites');
url.search = new URLSearchParams({ near: '-36.41,148.61', radius: 40, limit: 10 });
const { meta, data } = await fetch(url).then(r => r.json());
for (const site of data) {
console.log(site.name, site.distanceKm + ' km', site.url);
// Show site.licence.attribution wherever you show the record.
}GeoJSON for a map
curl "https://outdoors.keptsimple.com.au/api/v1/campsites?state=QLD&type=national-park&format=geojson&limit=200"// Drop the GeoJSON straight into Mapbox GL / MapLibre
map.addSource('campsites', {
type: 'geojson',
data: 'https://outdoors.keptsimple.com.au/api/v1/campsites?bbox=150.0,-34.0,150.7,-33.4&limit=200&format=geojson'
});
map.addLayer({ id: 'campsites', type: 'circle', source: 'campsites',
paint: { 'circle-color': '#a8492a', 'circle-radius': 6 } });Bulk download
curl -O "https://outdoors.keptsimple.com.au/api/v1/exports/vic.geojson"Exports are static files that update when the data does. If you need everything, or want to work offline, use these. They don't count towards the fair-use limit.
Endpoints
| Method | Path | What it returns | Kind |
|---|---|---|---|
| GET | /api/v1/campsites | Search and list. Filters: q, state, type, facilities, bbox, near + radius, sort, limit, offset/page, format=geojson. | Live |
| GET | /api/v1/campsites/{id} | One campsite. The id is the state code plus the listing slug, e.g. nsw-acacia-flat-campground. | Live |
| GET | /api/v1/campsites/{id}/nearby | The closest campsites to a campsite, with distanceKm. | Live |
| GET | /api/v1/meta.json | States, types, regions, amenities, sources and licences, with counts. | Static |
| GET | /api/v1/states.json · types.json · regions.json · amenities.json · sources.json | Lookup lists for building filters. | Static |
| GET | /api/v1/exports/{state}.json · .geojson | Full dataset per state, or all. Best for syncing or offline maps. | Static |
| GET | /api/v1/openapi.json | OpenAPI 3 spec. Generate a client or import it into Postman. | Static |
Live endpoints run on the edge. Static files are served from the CDN and cached for an hour. Responses carry ETag and Cache-Control, so cache them on your side as well.
Search parameters
| Parameter | Example | Notes |
|---|---|---|
q | murramarang | Matches words in the name, park, locality, LGA, postcode and operator. Each word matches by prefix. |
state | NSW,ACT | NSW, VIC, QLD, WA, SA, TAS, NT, ACT |
type | national-park | national-park, state-forest, park-reserve, other-campground, caravan-park, scout-guide |
facilities | toilets,drinking_water | The site must have all of them. Keys: toilets, shower, drinking_water, power_supply, sanitary_dump_station, tents, caravans, cabins, fee, charge, reservation, dog, openfire, bbq, picnic_table, kitchen, laundry, wheelchair, internet_access, backcountry, access, maxstay, capacity, opening_hours, surface. An unknown value counts as not having it. |
bbox | 150.2,-34.0,150.6,-33.5 | minLng,minLat,maxLng,maxLat. Useful for the current map view. |
near + radius | -33.71,150.31 + 30 | lat,lng and km (default 50, max 1000). Results come nearest first, each with distanceKm. |
sort | distance | name or distance. |
limit, offset / page | 50, 100 | Up to 200 per page. meta.next and the Link header give the next page. meta.total is the full count. |
format | geojson | Returns a FeatureCollection with Point geometry, ready for Mapbox, MapLibre, Leaflet or QGIS. |
List response
{
"meta": {
"apiVersion": "1.0.0",
"dataVersion": "2026-10-31",
"total": 23,
"count": 5,
"offset": 0,
"limit": 5,
"next": "https://outdoors.keptsimple.com.au/api/v1/campsites?near=-33.71%2C150.31&radius=30&facilities=toilets&limit=5&offset=5",
"attribution": "Data compiled by Outdoors Kept Simple from … Each record carries its own licence.attribution, which you must display with the data.",
"licence": {
"summary": "…",
"licences": [
"…"
]
},
"terms": "https://outdoors.keptsimple.com.au/developers/terms/",
"docs": "https://outdoors.keptsimple.com.au/developers/"
},
"data": [
"{ …campsite… }"
]
} The record
IDs are stable. Each one is the lower-case state code plus the slug in the listing URL. If we merge duplicates, the old listing URL redirects. amenities lists only what the source data records, usually yes or no. A missing key means unknown, not no. Before you go, check access, fees and fire bans with the land manager.
{
"id": "nsw-acacia-flat-campground",
"slug": "acacia-flat-campground",
"name": "Acacia Flat Campground",
"state": "NSW",
"type": "national-park",
"typeLabel": "National park",
"subtype": "Camping area",
"lat": -33.61529,
"lng": 150.35334,
"locality": "Blue Mountains National Park",
"lga": "Blue Mountains",
"postcode": "2787",
"region": {
"id": "sydney-blue-mountains-hunter",
"name": "Sydney, Blue Mountains & Hunter"
},
"park": null,
"operator": "National Parks and Wildlife Service",
"description": "Fuel stoves only.",
"amenities": {
"fee": "yes",
"charge": "$6 Au",
"toilets": "yes",
"shower": "no",
"tents": "yes",
"caravans": "no",
"backcountry": "yes",
"access": "yes"
},
"contact": {
"website": "https://www.nationalparks.nsw.gov.au/camping-and-accommodation/campgrounds/acacia-flat-campground"
},
"closed": false,
"url": "https://outdoors.keptsimple.com.au/nsw-campsites/acacia-flat-campground/",
"source": {
"key": "npws",
"name": "NSW National Parks and Wildlife Service – Asset Infrastructure: Visitor Area",
"recordId": "N0004C-V0063-CGACF",
"url": "https://mapprod2.environment.nsw.gov.au/arcgis/rest/services/Assets/AMS_Assets/FeatureServer/24"
},
"licence": {
"licences": [
"CC-BY-4.0",
"ODbL-1.0"
],
"shareAlike": true,
"attribution": "© State of New South Wales (NSW National Parks and Wildlife Service, DCCEEW), CC BY 4.0; © OpenStreetMap contributors, ODbL; Australian Bureau of Statistics, ASGS Edition 3 (2021), CC BY 4.0. Compiled by Outdoors Kept Simple (outdoors.keptsimple.com.au).",
"sources": [
"npws",
"osm",
"abs"
]
},
"distanceKm": 12.4
} Licences and attribution
licence.attribution next to the data, link each record to its url, and if licence.shareAlike is true, any database you publish that is built from those records has to be shared under the ODbL.- OpenStreetMap-derived content (most records, and facility tags on many government records): © OpenStreetMap contributors, ODbL 1.0. You can use it commercially. Credit OpenStreetMap. If you publicly use a database adapted from it, you must offer that database under the ODbL. Maps or lists you produce from it ("Produced Works") need only the attribution.
- Government data: NSW NPWS (CC BY 4.0), NSW Spatial Services POI (CC BY 3.0 AU), Parks Victoria via DataVic (CC BY 4.0), ABS ASGS 2021 (CC BY 4.0) and Forestry Corporation of NSW (CC BY). Use it freely, with attribution.
- Scout & Guide venues: factual details and links from each branch's official page. Link to the listing or the branch page.
Each record has licence.licences, licence.shareAlike, licence.attribution and licence.sources. meta.attribution and meta.licence cover the whole response. sources.json lists every dataset and its licence. The full conditions are in the API terms.
Fair use and keys
Anonymous use is free and needs no key. The live endpoints allow about 120 requests a minute per IP. Above that you get 429 with Retry-After. Every response includes X-RateLimit-Limit and X-RateLimit-Remaining. To stay well clear of the limit, cache responses, use bbox for map views rather than one request per pin, and sync with the static exports.
Partners who need more can ask for a key and send it as an X-API-Key header. Keys raise the allowance. Later they may unlock extras such as featured listings or fresher data. Requests without a key will keep working.
Embeddable widget
This adds a "campsites near X" map and list to any page with two lines. Each listing links back here.
Script embed
<div data-oks-campsites data-place="Katoomba" data-state="NSW" data-limit="8"></div>
<script src="https://outdoors.keptsimple.com.au/widget/v1/embed.js" async></script> Options: data-near="lat,lng", or data-place with data-state (any Australian locality). Also data-q, data-radius, data-type, data-facilities, data-limit (max 50), data-map="0" for a list only, data-title and data-height.
Plain iframe
<iframe src="https://outdoors.keptsimple.com.au/widget/v1/frame?near=-36.41,148.61&radius=40&limit=6"
width="100%" height="460" style="border:0" loading="lazy" title="Campsites nearby"></iframe>Try it
Press Send. Versioning and changes
The version is in the path (/api/v1). Within v1 we only add fields; we never rename or remove one. Anything that would break v1 goes into /api/v2, and v1 stays up alongside it for at least six months. meta.dataVersion is the date the data was last refreshed.