Fuel Price Scraper icon

Fuel Price Scraper

Scrape current petrol and fuel prices across Australia and New Zealand. Search by address or GPS coordinates to find nearby fuel stations, compare…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Fuel Price Scraper at a glance

Fuel Price Scraper is a ready-to-run Apify actor from abotapi for collecting automation data. Its documented output includes station id, station name, brand, suburb (flat) and u91, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.40 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Automation, Travel, Real Estate
Pricing
$2.40 per 1,000 results (Free plan), from $1.80 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
22 options

Scrape current petrol and fuel prices across Australia and New Zealand. Search by address or GPS coordinates to find nearby fuel stations, compare prices and collect station locations and fuel price data.

What Fuel Price Scraper can do

  • Two ways to search. Type a suburb, city, postcode, or address into Suburb or City, or clear that field and use raw Latitude and Longitude for an exact center point instead. Suburb takes precedence when both are set.
  • Offline AU/NZ geocoding. Suburb and postcode lookups resolve against local Australian and New Zealand postcode datasets, not a third party geocoding call.
  • Price analytics built in. Every run adds a min/max/average/count price summary per fuel type, plus an optional cheapest station lookup for one fuel type.
  • Full price detail per station. Every fuel type a station reports comes with its price, who reported it, and when it last changed, not just one headline number.
  • Built for schedules. Incremental mode tracks a search over time and returns only the stations that are new or have actually changed, so a recurring monitor doesn't pay again for prices that haven't moved.
  • Clear status, no billed error rows. A network or source problem ends the run with a plain status message and zero dataset rows, never a billable placeholder record.

Choose what to collect

These inputs let you configure Fuel Price Scraper - Petrol Prices & Stations AU/NZ. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
suburbstringSuburb or city name to search (e.g., 'Sydney', 'Melbourne', 'Auckland', 'Wellington'). You can also use postcode (e.g., '2000', '3168').
latnumberLatitude coordinate (optional - use instead of suburb). Clear Suburb, or leave it at its default, to search by coordinates.
lngnumberLongitude coordinate (use with latitude)
latitudenumberAlias of Latitude, for callers that use the longer field names. Used only when Latitude is empty.
longitudenumberAlias of Longitude. Used only when Longitude is empty.
searchModestring'Location' searches by suburb or coordinates above. 'Start URLs' searches the map URLs listed below instead (map location or latlng URLs of the source site).

Choices: location, startUrls

startUrlsarrayMap URLs, either a location page (https://petrolspy.com.au/map/location/au/nsw/2000/sydney) or a coordinate page (https://petrolspy.com.au/map/latlng/-33.8688/151.2093). Only used when Search mode is Start URLs.
Show 15 more inputs
More input fields
InputWhat it controls
radiusKmnumberSearch radius in kilometers from the center point (1 to 50). A very large area is fetched in parts automatically.
fuelTypestringOptional. Does not remove any station: it picks which fuel the 'cheapest' highlight in the OUTPUT record is computed for, and which fuel 'Sort by: price' uses (default U91). Leave empty for all fuels.

Choices: , U91, E10, U95, U98, Diesel, LPG

brandsarrayOnly return stations of these brands (case-insensitive exact match on the brand, e.g. BP, Shell, Caltex). Empty returns all brands.
sortBystringOrder of the returned stations. 'price' sorts by the Fuel Type filter (U91 when empty), stations without that price go last. 'distance' is from the search centre. Empty keeps the source order.

Choices: , price, distance, name

sortOrderstringAscending or descending. Only used with Sort by.

Choices: asc, desc

maxItemsintegerMaximum number of stations returned across the whole run, applied after brands and sorting. 0 uses the largest allowed value (100000).
resumeFromRunIdstringPaste a previous run ID or dataset ID to seed Incremental mode's baseline from it, so stations already in that dataset don't look NEW again on this actor's first incremental run. This actor's search is a single request with no pagination, so there is nothing to resume mid-crawl, this field only has an effect together with Incremental mode below, and only when that state key has no saved baseline yet.
incrementalModebooleanTurn this on for daily or recurring monitoring of the same search. The first run returns all matching stations as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED stations, a station whose prices and details are unchanged since the last run is not returned (and not billed). Turn on "Emit unchanged" or "Emit expired" only when you also want those stations returned. State is kept separately per suburb/coordinates, radius, and fuel type filter; use State key to name or deliberately share a monitoring campaign. Compared fields: every output field of a station, including each fuel price and its price timestamp (prices..price, prices..updatedAt), name, brand, location, hours and flags; a field flipping to or from empty is not counted. Excluded: nothing by default; add your own with Ignore fields when detecting changes. To bootstrap the very first baseline from an existing run instead of starting fresh, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the suburb/coordinates, radius, and fuel type, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return stations that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return stations that were present in a previous run but are no longer found in the search area, marked EXPIRED. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayOptional. Field names to leave out of UPDATED change detection (they are still returned in the output). Supports nested paths such as prices.U91.reportedBy, and as a wildcard key, e.g. prices..reportedBy. By default nothing is ignored: price, price timestamp, location, name, brand, hours and every other field count as a change.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idStation ID (text)
nameStation Name (text)
brandBrand (text)
suburbSuburb (flat) (text)
u91PriceU91 (number)
dieselPriceDiesel (number)
distanceKmDistance (km) (number)
urlMap link (link)
location.suburbSuburb (text)
location.stateState (text)
location.addressAddress (text)
phonePhone (text)
Show 17 more fields
changeTypeChange type (incremental mode) (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
prices.U91.priceU91 (number)
prices.E10.priceE10 (number)
prices.U95.priceU95 (number)
prices.U98.priceU98 (number)
prices.DIESEL.priceDiesel (number)
prices.LPG.priceLPG (number)
location.latLatitude (number)
location.lngLongitude (number)
location.postcodePostcode (text)
e10PriceE10 (number)
u95PriceU95 (number)
u98PriceU98 (number)
lpgPriceLPG (number)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "stationId": "556fcfdccf79db30f9694c0b",
  "name": "Metro Fuel Example Station",
  "brand": "Metro",
  "location": {
    "lat": -33.8688,
    "lng": 151.2093,
    "address": "100 Example St",
    "suburb": "Sydney",
    "state": "NSW",
    "postcode": "2000"
  },
  "phone": "+61255550000",
  "prices": {
    "U91": {
      "price": 175.9,
      "updatedAt": 1739137133695,
      "reportedBy": "Sample User",
      "relevant": true
    },
    "E10": {
      "price": 172.9,
      "updatedAt": 1739137133694,
      "reportedBy": "Sample User",
      "relevant": true
    },
    "DIESEL": {
      "price": 189.9,
      "updatedAt": 1739137133694,
      "reportedBy": "Sample User",
      "relevant": true
    }
  },
  "tradingHours": null,
  "isAdBlueAvailable": false,
  "verified": true,
  "icon": "metro-icon",
  "brandIcon": "metro-brand-icon",
  "searchContext": {
    "searchLocation": {
      "lat": -33.8688,
      "lng": 151.2093,
      "address": "Sydney, NSW 2000, AU"
    },
    "boundingBox": {
      "neLat": -33.82,
      "neLng": 151.25,
      "swLat": -33.91,
      "swLng": 151.16
    },
    "radiusKm": 5
  }
}

Ways to use this data

  • Fuel price monitoring: track prices across a suburb or region on a schedule and see exactly what changed since last time.
  • Cost optimization: find the cheapest station and fuel type near a given address right now.
  • Fleet and logistics management: monitor refuelling costs across multiple depot suburbs at once.
  • Market and pricing research: build a historical Australia/New Zealand fuel price dataset for analysis or forecasting.
  • Price comparison apps and bots: feed live station data into your own site, app, or alert tool.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Fuel Price Scraper return?

The documented output for Fuel Price Scraper includes station id, station name, brand, suburb (flat), u91, diesel, distance (km) and map link. Availability of each field depends on the source page and the selected mode.

How much does Fuel Price Scraper cost?

It costs $2.40 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Why does my search return nothing, or the wrong area?

The most common cause is the suburb or postcode text not matching the local AU/NZ postcode dataset closely enough (for example a full street address with no recognizable suburb). Try a plain suburb name or postcode, or switch to lat/lng coordinates for an exact center point. resumeFromRunId is unrelated to this: it only seeds Incremental mode's very first baseline, and does nothing on its own without incrementalMode turned on.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Fuel Price Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.