Outdoors Kept SimpleCamping areas · Australia
Developers

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 startOpenAPI specEmbed widget

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

MethodPathWhat it returnsKind
GET/api/v1/campsitesSearch 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}/nearbyThe closest campsites to a campsite, with distanceKm.Live
GET/api/v1/meta.jsonStates, types, regions, amenities, sources and licences, with counts.Static
GET/api/v1/states.json · types.json · regions.json · amenities.json · sources.jsonLookup lists for building filters.Static
GET/api/v1/exports/{state}.json · .geojsonFull dataset per state, or all. Best for syncing or offline maps.Static
GET/api/v1/openapi.jsonOpenAPI 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.

ParameterExampleNotes
qmurramarangMatches words in the name, park, locality, LGA, postcode and operator. Each word matches by prefix.
stateNSW,ACTNSW, VIC, QLD, WA, SA, TAS, NT, ACT
typenational-parknational-park, state-forest, park-reserve, other-campground, caravan-park, scout-guide
facilitiestoilets,drinking_waterThe 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.
bbox150.2,-34.0,150.6,-33.5minLng,minLat,maxLng,maxLat. Useful for the current map view.
near + radius-33.71,150.31 + 30lat,lng and km (default 50, max 1000). Results come nearest first, each with distanceKm.
sortdistancename or distance.
limit, offset / page50, 100Up to 200 per page. meta.next and the Link header give the next page. meta.total is the full count.
formatgeojsonReturns 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

The short version: show 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.