AU Road Trip Planner: Rest Areas, Toilets, Fuel & EV by Route avatar

AU Road Trip Planner: Rest Areas, Toilets, Fuel & EV by Route

Pricing

from $0.50 / 1,000 rest area or toilets

Go to Apify Store
AU Road Trip Planner: Rest Areas, Toilets, Fuel & EV by Route

AU Road Trip Planner: Rest Areas, Toilets, Fuel & EV by Route

Road trip planner for Australia: rest areas and toilets, fuel stops and gaps, EV charging, food, attractions and Big Things, camping, dump points, water, shops, hospitals and vets on any route, plus low bridges, level crossings, speed cameras, floodways and crash hotspots. By route km, all states.

Pricing

from $0.50 / 1,000 rest area or toilets

Rating

0.0

(0)

Developer

David Roberts

David Roberts

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

AU Route Corridor — road trip planner: rest stops, toilets, fuel, EV charging and low bridges along any Australian route

Plan the stops on an Australian road trip, or check a caravan or truck route before you drive it: toilets and rest stops for driver fatigue breaks, fuel stops and fuel gaps, EV charging for an EV road trip, caravan and camping stops, dump points and drinking water, lunch stops (cafes, fast food, bakeries), attractions and Big Things worth a detour, supermarkets, pharmacies, hospitals and vets on the way, plus the road itself — height and weight limits (low bridges, overbridge clearances), level crossings, speed cameras, floodways and fords, and crash hotspots (Queensland). Australia-wide, every state.

Give it a route across Australia and a list of layers, and get back every matching feature within reach of the road, in order along the route, with the distance along the route, which side of the road it sits on, and the attributes its source publishes:

LayerWhatSources
rest_areasRest areas, service centres, truck bays, parks, public toilets — toilet type, water, shelter, tables, lighting, heavy-vehicle bays, Driver ReviverQLD TMR, Transport for NSW, Vicmap (locations), Main Roads WA, TAS State Growth, ACT toilets, OpenStreetMap
fuelService stations: brand, fuels sold, 24 h, heavy-vehicle accessOpenStreetMap
ev_chargingEV chargers: network, sockets, capacity, feeOpenStreetMap
campingCampsites and caravan parks: toilets, showers, water, power, dogs, feeOpenStreetMap
water, dump_pointsDrinking-water taps and water points; caravan dump pointsOpenStreetMap, agency rest-area layers
supermarkets, pharmaciesShops you will actually needOpenStreetMap
hospitals, vetsWith emergency department / after-hours where taggedOpenStreetMap
foodRestaurants, cafes, fast food, food courts, bakeries: brand, cuisine, opening hours, takeaway, drive-through, dietsOpenStreetMap
attractionsNamed attractions, museums, lookouts, galleries, zoos, monuments, telescopes, Big Things; notable ones up to 10 km off the roadOpenStreetMap
rail_crossingsLevel crossings: barriers, lights, bellsMain Roads WA, OpenStreetMap
speed_cameras, traffic_camerasFixed speed cameras; road-authority live traffic camerasOpenStreetMap; QLD TMR
clearancesStructure height limits and weight limits — for caravans and trucksQLD TMR structure clearance, Main Roads WA structures, OpenStreetMap maxheight/maxweight
floodwaysFloodways, fords and flood-prone sectionsMain Roads WA, OpenStreetMap
crashesCrash density: counts by severity per 10 km binQLD TMR crash layers

Plus, for the layers where it matters, the gaps: every stretch of the route with no toilet, no fuel or no charger for gapKm (default 100 km). It started as a toilet-stop planner for a Brisbane → Melbourne move with dogs and a caravan, whose hand-made version found a 128 km run on Goldfields Way with no toilet at all. Now the same corridor matching serves every layer above.

What you get

One dataset row per feature (not per kilometre), ordered by layer then routeKm:

{
"layer": "rest_areas",
"kind": "rest_area",
"routeKm": 532.117,
"side": "left",
"distanceFromRouteM": 38,
"name": "Tookey Creek Rest Area",
"named": true,
"state": "NSW",
"lat": -29.9,
"lng": 149.75,
"attributes": {
"toilet": { "present": true, "type": null, "accessible": false },
"shelter": true,
"table": true,
"lighting": true,
"water": null,
"bbq": false,
"bins": true,
"dumpPoint": null,
"driverReviver": false,
"fuel": false,
"food": false,
"spaces": { "light": 6, "heavy": 5 },
"heavyVehicles": true,
"access": "Both",
"where": "Newell Highway — 48.2km South of Moree"
},
"source": "nsw_tfnsw_rest_areas",
"alsoIn": [{ "sourceId": "osm", "ref": "node/1234567", "name": "Tookey Creek Rest Area" }]
}

source is the source's id; its name, URL, licence, attribution and vintage are in OUTPUT.bySource[<id>].source, once per run rather than on every row. alsoIn (other sources that reported the same place) is present only when there are any.

attributes is a typed block per layer (the full list is in the dataset schema's field description and in src/types.ts): fuel has brand, fuels, open24h, heavyVehicles; ev_charging has network, sockets, capacity, maxKw, fee; camping has toilets, showers, drinkingWater, power, dogs, fee; clearances has maxHeightM, maxWeightT, clearanceClass, structure, road; crashes rows are segments with fromKm, toKm and counts by severity (fatal, hospitalisation, medicalTreatment, minorInjury, propertyDamage), years and perKmPerYear.

Tri-state attributes. true and false are what the source says; null means the source does not say. Never read null as "no": OpenStreetMap rarely tags toilets=no, and Vicmap's layer has no amenity fields at all. With the default requireToilet: true, only rest-area sites whose source says there is a toilet are emitted (service centres are assumed to have one, flagged extra.toiletAssumed).

The OUTPUT record holds the summary — counts by layer, state and source, per-source status (ok / unknown / skipped) with each source's licence and attribution, gaps per layer, droppedByLimit (rows left out by the row limits), retrievedAt, the computed route when you gave place names, and warnings. The GEOJSON record is a FeatureCollection (the route line, a Point per feature, a LineString per crash bin and per gap) for drawing your own map.

Use cases

  • Road trip stops. Rest stops, toilets, fuel and food in route order with the km, so you can plan a break every two hours instead of guessing where the next one is.
  • Driver fatigue breaks. gaps lists every stretch with no toilet stop longer than gapKm — set it to the distance you want between rest stops and read off the stretches that break the rule.
  • Fuel stops and fuel gaps. Service stations, roadhouses and truck stops, and every stretch longer than gapKm with none — the runs where you fill up before you leave town.
  • EV road trip. EV charging along the route, with network, sockets and kW where tagged, and the charger gaps.
  • Caravan and camping stops. Campsites and caravan parks, free camps (fee: false where tagged), dump points and drinking water.
  • Truck route and caravan height check. Height and weight limits on the road driven — low bridges, overbridge clearances, tunnels — with the maximum height in metres to compare against your own. Route with profile: "truck".
  • Level crossings, speed cameras, floodways and fords on the road itself, not the streets beside it.
  • Road safety. Crash data binned per 10 km with counts by severity, to find crash hotspots (Queensland only).
  • Lunch stops. food lists cafes, fast food, restaurants and bakeries in route order with brand, cuisine and opening hours where tagged — pick lunch in a town at the right time of day instead of at a toilet-only rest area. Service centres also say whether they sell food (see Reading the output). OUTPUT.gaps.food shows the long stretches with nothing.
  • Sightseeing on the way. attractions lists museums, lookouts, galleries, monuments, telescopes and Australia's Big Things along the route. Notable ones (the Parkes Dish, the Big Merino, a museum with a Wikipedia article) count up to 10 km off the road; the rest within bufferKm.
  • Errands on the way. Supermarkets, pharmacies, hospitals (emergency department where tagged), and vets for a trip with pets.
  • Maps and agents. A GeoJSON record of the route, every stop and every gap for your own map, and a flat dataset an AI agent can read.

Input

FieldTypeNotes
originstringStart of a route to be computed for you: a place name or address ("Goondiwindi QLD") or "lat,lng". Needs destination.
destinationstringEnd of that route, same forms.
waypointsarrayOptional stops in between, in order: place names or "lat,lng" strings. Up to 18. See Why waypoints.
profilestringTravel mode for origin/destination: car (default), bike, foot, truck, motorcycle, scooter, bus, taxi.
polylinestringEncoded polyline of a route — Google Directions, OSRM, Mapbox, Valhalla, or davidar/openstreetmap-directions-api's polyline6. Wins over the rest.
polylinePrecision5 | 65 for Google and OSRM's default, 6 for Mapbox / Valhalla / OSRM polyline6 / openstreetmap-directions-api. Default 5.
coordinatesarrayAlternative to polyline: [lat, lng] pairs, latitude first like everywhere else. Wins over origin.
layersarrayWhich layers to report (table above). Default ["rest_areas"].
bufferKmnumberCorridor half-width for site layers. Default 1.5 (highway rest areas and town services just off the road). Max 10. Road-feature layers are capped regardless: clearances and rail crossings 40 m, floodways and speed cameras 60 m, crashes 100 m, traffic cameras 300 m. Attractions with a Wikidata/Wikipedia entry reach 10 km regardless.
requireToiletbooleanRest areas only. Default true: emit only sites whose source says there is a toilet. false = every rest area and truck bay.
gapKmnumberFlag stretches of at least this many route-km with no toilet stop / fuel / charger. Default 100.
binKmnumberCrash density only: bin length in route-km. Default 10.
maxRowsPer10KmintegerThins towns: each place layer keeps its best rows (named, notable, nearest) up to this many per 10 km of route. Road features are never thinned; gaps use every row found; rows left out are not charged. Default 5; 0 = every row.
notableOnlybooleanAttractions only: keep just the notable ones (a Wikipedia article, a Big Thing…). Default false.
maxRowsPerLayerintegerOptional cap: at most this many rows per layer, spread along the route (each equal stretch keeps its best row: named, then notable, then nearest). Gaps still come from every row found. Rows left out are not charged; OUTPUT.droppedByLimit counts them.
statesarrayKeep only features in these states (QLD, NSW, VIC, SA, WA, TAS, NT, ACT). Default: every state the route crosses.
sourcesarrayagency (state road authorities), osm (bundled OpenStreetMap). Default both; matches are merged, agency first.
concurrencyintegerAgency sources queried in parallel (1–8). Per-host request caps apply regardless (2 per agency server).

Route by name

{
"origin": "Goondiwindi QLD",
"destination": "Dubbo NSW",
"waypoints": ["Gilgandra NSW"],
"layers": ["rest_areas", "fuel", "clearances"]
}

With origin and destination (and optional waypoints and profile), the Actor asks the Routing & Directions API actor (davidar/openstreetmap-directions-api) for the route, run under your account, then matches features to that line. Place names are geocoded within Australia; a town name resolves to the town centre. Use "lat,lng" when the exact start matters.

Why waypoints. The router takes the shortest road, not the one you will drive. Goondiwindi → Dubbo unrouted leaves the Newell Highway at Coonabarabran for the Mendooran back road; if you are driving the Newell via Gilgandra, say so with "waypoints": ["Gilgandra NSW"] and the stops are the ones you will actually pass.

What routing costs. The routing actor's charges appear on that actor in your Apify billing, not on this one: one route_computed ($0.003), one geocoded_location ($0.001) per place name (coordinates are free) and Apify's standard actor-start event for a 512 MB run. Free Apify plans get its community-router tier: coordinates only, car only — pass "lat,lng" origins and destinations, or a polyline. If the route can't be found, this run stops before querying any source, charges nothing here, and the status message says why; OUTPUT.route holds the routing run id.

Bring your own route

{
"polyline": "<Google Directions overview_polyline.points>",
"polylinePrecision": 5,
"bufferKm": 2,
"layers": ["camping", "water"]
}

Pass the directions polyline, not your own coarse samples: features are matched to the line, so a straight segment between two towns misses everything the road bends past. A coarse line needs a bigger bufferKm.

Sources and coverage

Only the states a route actually crosses are queried (the line is checked against ABS state boundaries).

StateAgency layers (attributes are authoritative)LicenceOpenStreetMap
QLDTMR "Roadside amenities" (toilet type, water, shelter, table, lighting, dump point, HV bays, Driver Reviver); TMR structure clearance, traffic cameras, crash layersCC BY 3.0fills gaps
NSWTransport for NSW "Rest Areas" (869 sites: toilets, accessible toilet, shelter, tables, lighting, spaces, Driver Reviver, food/fuel)CC BY 4.0fills gaps
VICVicmap Features of Interest "rest area" (location only — no amenity fields; the state publishes no amenity layer)CC BY 4.0primary for amenities
WAMain Roads WA "Road Stopping Places" (1,672 state-road sites: toilet count, accessible toilet, shelter, shade, lighting, tables, bins, dump point); floodways; rail crossings; structuresCC BY 4.0fills gaps
TASDepartment of State Growth "Roadside Stops" (81 state-owned sites, 2018 survey: toilet, shelter, BBQ, bins, tables)CC BY 3.0 AUfills gaps; carries most TAS toilets
ACTACT Government "Public Toilet Assets" (urban toilet blocks, active and public only)CC BY 4.0fills gaps
SA— (the Department for Infrastructure and Transport publishes only a 2018 download of 391 polygons, 7 with toilets)only source
NT— (nothing published as data)only source

OpenStreetMap covers every state and every layer from a bundled extract (the Geofabrik Australia file filtered at build time; the source's vintage is the extract date, and the Actor makes no OSM requests at run time — the public Overpass servers were too unreliable to build on). Agency and OSM features of the same layer within 150 m are merged: the agency row is primary, OSM fills what it leaves null, and alsoIn keeps the OSM id. OSM is community-reported: toilets is usually untagged (→ null), and a mapped rest area may be a truck parking bay. Rows say so through source and kind.

Attribution: rows from Queensland TMR (CC BY 3.0), Transport for NSW and Vicmap (CC BY 4.0), Main Roads WA (CC BY 4.0), the Tasmanian Department of State Growth (CC BY 3.0 AU) and the ACT Government (CC BY 4.0) carry each agency's credit in OUTPUT.bySource[<row source>].source.attribution; OpenStreetMap data is © OpenStreetMap contributors, ODbL 1.0 — reproduce these when you publish derived work.

Pricing

Pay per row, three tiers, plus Apify's standard actor-start event:

EventRowsPrice
corridor_rest_arearest_areas — rest areas, service centres, parks, public toilets (agency layers merged with OSM)$0.0005
corridor_siteevery other place: fuel, EV charging, camping, water, dump points, supermarkets, pharmacies, hospitals, vets, food, attractions$0.0002
corridor_featurerail crossings, cameras, height/weight limits, floodways, one crash-density bin$0.0002

Brisbane → Melbourne (1,700 km) with the default rest-areas layer is about 250 rows ≈ $0.12; with all 18 layers on, about 1,500 rows ≈ $0.37 (measured 29 Sep 2026 with the default maxRowsPer10Km: 5; every row, maxRowsPer10Km: 0, is about 5,800 — mostly Brisbane's and Melbourne's cafes and park toilets). Rest areas dropped by requireToilet, rows left out by the row limits and rows outside states are not emitted and not charged; a source that is unavailable charges nothing and the run still succeeds on the others (

OUTPUT.bySource[id].status = "unknown"
, named in the status message). Routing by name adds the routing actor's own charges under its line (above).

Reading the output

  • routeKm is where the feature projects onto the route, so a park 800 m down a side street still has a km. distanceFromRouteM is how far off the line it is; side (left/right in the direction of travel, on within 25 m) tells you whether you cross the road.
  • kind is per layer: rest areas are rest_area (signed stopping place), service_centre (fuel/food), truck_bay (heavy-vehicle only, incl. Queensland's "HV" sites which have facilities), park, toilets (a public toilet block on its own), unknown; clearances are bridge, tunnel, sign, structure; floodways are floodway, ford, flood_prone.
  • attributes.toilet.type: flush (TMR "Water"), composting (TMR "Enviro", OSM pit/composting), unknown when a toilet is present but its type is not published, null when the source doesn't say.
  • named: false rows are synthesised labels like "unnamed rest area (Goondiwindi Regional)" — TMR leaves many sites unnamed. near names the nearest named row of any layer within 150 m, so an unnamed tap reads as "in Cameron Park" and a strip can fold water and toilet rows into their host site.
  • Road features that cross the route are dropped: a side street's height sign or a side-track ford 30 m from the highway is not on the road driven. OpenStreetMap ways carry a bearing; where it differs from the route's by more than 30° the feature is left out. Agency clearance points have no bearing and are kept as published.
  • requireToilet and camping. A rest area without a toilet is dropped from rest_areas under the default, but OpenStreetMap often maps the same spot as a campsite, so it reappears in camping with kind: rest_area — a leg-stretch stop, not a caravan park. Set requireToilet: false to keep them in rest_areas instead.
  • Sparse OSM attributes. camping.dogs is almost never tagged (null on most rows); fuel open24h/openingHours are tagged on roughly one station in ten. Null means untagged, not no.
  • gaps include the run from the start to the first stop and from the last stop to the end. Rest-area gaps count only rows with a toilet.
  • OpenStreetMap toilet folding. OSM often maps a rest area's toilet block as its own node or way. A standalone amenity=toilets within 150 m of an OSM rest area or service centre is folded into it (toilet.present: true, extra.toiletsFrom names the element) rather than emitted as a nameless toilets row beside it. A rest area tagged toilets=no never absorbs one; the disagreement stays visible as two rows.
  • Service centres' food and fuel. OpenStreetMap maps a highway service centre as one area and its McDonald's and bowsers as separate points, and only Transport for NSW publishes food/fuel flags, so most service centres would say food: null. Where the source leaves food or fuel null and an OpenStreetMap food outlet or fuel station lies within 200 m, the row says true and names them in extra.foodNearby / extra.fuelNearby (e.g. Euroa Service Centre: "McDonald's; Oliver's; Evoke Coffee; Mustafa's Kebabs; KFC"). This works whether or not you asked for the food and fuel layers, and never overrides a source's own answer.
  • Attractions are curated from OpenStreetMap so a town doesn't drown in plaques: every named tourist attraction, museum, lookout, gallery, zoo, aquarium, theme park and telescope; monuments, forts, castles, ruins and battlefields; other artworks, memorials and heritage items only when notable. attributes.notable = a Wikipedia article, a Wikidata entry on a museum / attraction / zoo / lookout or telescope, or a Big Thing's name (a bare Wikidata entry on a memorial is not enough — a town's war-memorial garden would otherwise be ten notable rows). Notable ones are listed up to 10 km off the road where they stand out (not in a city), so expect a few more rows than bufferKm suggests. The enclosures and rides inside a zoo or theme park are not listed; the park is one row. category carries the source's own value (big_toy, monument, sculpture…). A town's cluster of small sights (Glenrowan's Ned Kelly sites) is not notable unless one of them is — look for several rows at the same routeKm.
  • Food opening hours are tagged on about one outlet in four and brands on about one in six (chains are well tagged, small-town cafes not). Null means untagged, not closed. OUTPUT.openingHoursKnown counts, per layer, the rows that have hours (e.g. food: 85 of 478 on the Hume), so a planner knows how far "open at lunch" can be trusted. An outlet with no name says its cuisine where tagged (unnamed fast food (fish and chips)).
  • Dataset itemCount in a run summary can lag by a second after the run finishes; read totalItemCount from the dataset endpoint. Fetch full items rather than projected fields= if you need attributes, alsoIn or osm.tags.

Limits and honesty

  • Corridor matching is geometric: a site 1.4 km away across a river with no bridge is still "within 1.5 km".
  • Road features are matched to the road itself (40–100 m), so a bridge over a street the route doesn't use, or a crash on a side street, is not listed. A clearance on the route's own road is; whether you pass under or over it the data doesn't say.
  • Agency layers are edited on their own schedules (each source's vintage in OUTPUT.bySource where published); the OSM bundle is a snapshot and the run warns when it is older than 90 days.
  • Nothing here is inspected: a toilet that is present may be locked, a fuel station may have closed. Driver Reviver sites operate on holiday weekends only.
  • Crash density is only as good as the state's published crash layer (QLD today) and says nothing about cause.
  • The crash layer is the slow one: Queensland publishes every crash as a point (about 19,000 within 1.5 km of the 360 km Queensland leg of Brisbane → Melbourne), fetched in ~100 paged requests over ~40 s before binning. The other layers answer in seconds; a 1,700 km run with six layers takes about two minutes.
  • Height and weight limits list every structure with a published clearance, not only low ones — filter on attributes.maxHeightM against your own height. clearanceClass carries Queensland's own banding. What the layer is for: on the Newell through Dubbo the route runs along Bligh Street under the 4.9 m rail overbridge — two clearances rows, on the road driven, 4.9 m. A caravan over that height needs to know.
  • Height and weight limits come from the structure layers where they exist; an unposted low bridge is not in any dataset. Check signs.

FAQ

Where are the toilets and rest stops along my route? Run the default rest_areas layer. Each row is a rest area, service centre or public toilet with a toilet, in route order with its km and side of the road.

How far is it between fuel stops? Add fuel to layers. OUTPUT.gaps.fuel lists every stretch of at least gapKm with no service station.

Where can we stop for lunch? Add food. Rows carry brand, cuisine and opening hours where tagged; service centres in rest_areas also say food: true with the outlets in extra.foodNearby.

What's worth seeing on the way? Add attractions. attributes.notable rows (a Wikipedia article, a Big Thing…) are the well-known ones and are listed up to 10 km off the road.

Are there low bridges on my caravan or truck route? Add clearances. Filter attributes.maxHeightM against your height, and read the limits in the section above.

How do I use it from an AI agent (MCP), n8n, Make or my own code? Through the Apify MCP server (mcp.apify.com) an agent can find this Actor with search-actors, read this README and call it with the fields in the Input section. n8n, Make and your own code call it through the Apify API or its integrations. Join rows to your trip on layer and routeKm; read counts from the dataset (or OUTPUT), not the run summary.

The results are too long for my agent to read. Towns are already thinned by default (maxRowsPer10Km: 5 — each place layer keeps its best five rows per 10 km of route; the country and road features are untouched). For fewer: layers only what the trip needs, notableOnly: true for sights, maxRowsPerLayer (e.g. 20) for a spread-out shortlist — the gaps in OUTPUT are still computed from everything found. When reading the dataset, omit=osm drops the raw OpenStreetMap tags (the Apify MCP get-dataset-items takes it too); OUTPUT alone (counts, gaps, openingHoursKnown) answers "is there anywhere to stop" without any rows. Set maxRowsPer10Km: 0 for every row.

Can I use my own route from Google Maps? Yes — the Directions API overview_polyline.points with polylinePrecision: 5. The consumer Google Maps share link does not contain the geometry.

Why does a site appear twice? Two different sources more than 150 m apart (a large service centre mapped at the fuel pumps by one and the toilet block by another), or two layers (a roadhouse is both a rest_areas service centre and a fuel station; layers never merge with each other). Use alsoIn, layer and distanceFromRouteM to decide.

Why is toilet.present null for a Victorian rest area? Vicmap's layer records the location only. If OSM has tagged the same site the merge fills it; otherwise the row is dropped under requireToilet: true and counted in OUTPUT.droppedNoToilet. Set requireToilet: false to see them.

Why no crash rows outside Queensland? Other states publish crash data as bulk downloads or dashboards, not as a queryable layer. They will be added as they become queryable.