UK Fuel Prices Scraper avatar

UK Fuel Prices Scraper

Pricing

from $1.05 / 1,000 results

Go to Apify Store
UK Fuel Prices Scraper

UK Fuel Prices Scraper

Today's petrol and diesel prices at ~3,000 UK forecourts, from the retailers' own CMA open-data feeds: station, brand, postcode, coordinates and pence per litre for E10, E5, B7 and super diesel. Stale feeds are excluded by age -- one publishes prices nineteen months old.

Pricing

from $1.05 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Today's petrol and diesel prices at ~3,000 UK forecourts, straight from the retailers' own open-data feeds published under the CMA road-fuel price scheme: station address and postcode, coordinates, brand, and pence per litre for E10, E5, B7 diesel and super diesel.

HTTP only. One request per retailer, no pagination, no key — these files are published for exactly this use.

What it is for

  • Cheapest fuel near a postcode, refreshed on a schedule.
  • Regional price monitoring — by postcode area, brand or retailer.
  • Price history — run it daily and keep the rows.

Input

fieldwhat it does
retailersAny of the ten reachable feeds. Empty = all.
maxFeedAgeDaysExclude feeds older than this. Default 7. See below.
includeStaleFeedsKeep stale feeds' stations, labelled.
fuelTypes, postcodeAreas, brandsFilters.
excludeSuspectRowsDrop placeholder ids and non-UK coordinates. Default on.

Three things about this data worth knowing before you trust a run

1. Some feeds are months old, and their prices look like prices

Each feed carries one last_updated timestamp. On the day this Actor was built:

feedlast updatedage
Esso, JET, Moto, MFG, SGNtoday / yesterdayfresh
Shell13/05/20264 months
Tesco29/04/20264.5 months
Rontec01/05/20264.5 months
Applegreen26/02/202519 months

Applegreen's E10 at 138.8p is not obviously wrong — it is a price petrol really had, in early 2025. Merged with today's ~170p it drags every average down and sends every "cheapest station" query to a forecourt whose price nobody can verify.

So feeds older than maxFeedAgeDays are excluded by default, the summary row for each names its age and says feed_stale, every kept station carries feedAgeDays, and includeStaleFeeds brings them back labelled if you want them.

2. Five of the fifteen scheme feeds are not here — and the run says so

feedwhy
Asda (790 stations)its own robots.txt disallows the feed path. The scheme's intent does not override the host's robots in this Actor.
BPHTTP 403 bot challenge
Sainsbury'shost does not resolve
Asconabroken TLS certificate
Karantimes out

Every run emits a feed_not_fetched row for each, so the coverage gap is data rather than a footnote. Asking for one of them by name is refused with the reason.

3. The feeds share a schema and disagree about everything inside it

  • last_updated is DD/MM/YYYY — 01/05/2026 is May, and a month-first parser puts Rontec eight months in the past or fails on 13/05/2026.
  • Morrisons' feed holds one station, with string coordinates, in Gibraltar. Coordinates outside the UK are flagged (coordinatesInUk) and excluded by default; MFG's feed had five such rows too.
  • Brand casing: SHELL and Shell, ESSO and Esso, TEXACO and Texaco — a group-by on the raw field splits each. brand is normalised; brandRaw is kept.
  • Placeholder site ids — 7zzzzzzzzzzz, the geohash of a missing coordinate, appears in more than one feed. Flagged and excluded.
  • JET publishes 175.89999999999998. Rounded to the scheme's one decimal.
  • Shell serves JSON as application/octet-stream at a URL ending in .html. The body decides, not the header.
  • All feeds are in pence today. The scheme has seen retailers publish pounds (1.699); a value below 10 is treated as pounds, converted, and the row says so in pricesConvertedFromPounds.

Output

  • STATION — retailer, brand + brandRaw, address, postcode, postcodeArea, latitude/longitude, e10/e5/b7/sdv (pence per litre), fuelsSold, feedLastUpdated, feedAgeDays, feedIsStale, coordinatesInUk, siteIdIsPlaceholder.
  • FEED_SUMMARY — one per retailer: stationsInFeed, stationsReturned, feedAgeDays, feedIsStale, placeholderSiteIds, stationsOutsideUk, fuelCoverage, stoppedReason.
  • ERROR — feed_not_fetched for each absent scheme feed, and anything that went wrong.

Known limits

  • last_updated is per feed, not per station. A fresh feed can still carry a station whose price has not moved in months (MFG, updated today, lists E10 at 131.9p among a field of ~170p). That is beyond what this Actor can prove either way and is not guessed at with an outlier heuristic.
  • Asda, BP, Sainsbury's, Ascona and Karan are absent — see above.
  • UK only, pence per litre.