Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
UK Fuel Prices Scraper icon

UK Fuel Prices Scraper

Scrape live UK petrol and diesel prices per filling station: brand, postcode, coordinates and every grade, from the retailers' own open data feeds.

44 runs on Apify $0.00092 per station ($0.92 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust retailers, maxItems, maxFeedAgeHours (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00092 per station = $0.92 per 1,000

You are charged forWhenPrice
Station scrapedOne filling station with its current pump prices. Stale or unreachable retailer feeds are never charged.$0.00092

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.

Inputs

FieldWhat it doesType
retailersWhich retailers to read. Use the single word all for every one of them. Currently publishing and up to date: asda, esso, jet, mfg, morrisons, moto, sgn. Still answering but no longer refreshed: ascona, applegreen, rontec, shell, tesco - these are skipped unless you raise the feed age limit below. Not answering at all right now: bp, karan, sainsburys. Ask for one of those and you get a free row telling you so.array
maxItemsTotal stations to return across all the retailers you chose. Retailers are read in the order you list them, so put the one you care most about first; with all, they are read biggest first. The whole set across every live retailer is roughly 2,400 stations. Keep this low while you are testing - you pay per station.integer
maxFeedAgeHoursHow old a retailer's own file is allowed to be before its stations are skipped. Several retailers still serve a file that has not been refreshed since April, and those prices are not what a driver pays today. Anything older than this is reported as a free row and never charged. The default of 48 hours keeps only genuinely current data. Raise it if you want the frozen files as well - every row tells you how old it is either way.integer
postcodePrefixesLeave empty for everything. Otherwise list the start of the postcodes you want, such as SW, M1 or EH12, and only stations whose postcode begins with one of them are returned. Stations dropped by this filter are never charged.array
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

retailerbrandsiteIdaddresspostcodelatitudelongitudepetrolE10petrolE5dieselB7dieselSDVfeedUpdatedAtfeedAgeHours

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

UK Fuel Prices Scraper: petrol and diesel pump prices for UK filling stations

Pick the fuel retailers you want and you get one row per filling station, with its brand, address, postcode, coordinates and the price in pence per litre of every grade it sells. Every row carries the time stamped on the retailer's own file, and a file older than your limit is skipped and reported for free rather than passed off as today's price. This is not every forecourt in the UK: the government's list of open price files was withdrawn on 1 May 2026, so it reads the retailers that still publish their own, which came to about 2,400 stations with current prices on 30 September 2026.

InputRetailer keys, or all, plus optional postcode areas
OutputOne row per filling station, with every grade it sells
Ceiling20,000 stations per run, far more than is published
Account neededNone
Price$0.92 per 1,000 stations, flat on every plan

🔍 What UK Fuel Prices Scraper does

It reads the price file each chosen retailer publishes, and checks it before anything is charged: that it is a station list, that the list is not empty, that it carries a date, and that the date is recent enough for your limit. A file that fails one of those checks becomes a free row saying which.

Grade codes are mapped onto one set of field names, whatever each retailer calls them. Retailers also use placeholder numbers to mean "we do not sell this grade here", so any price below 50p or above 400p a litre comes through as null instead of as a price.

A frozen file is the dangerous case. It answers like any other and holds plausible numbers in the right fields, and only its date gives it away. That is why the date is on every row.

Who publishes what, read on 30 September 2026:

RetailerKeyStations in its fileState
Motor Fuel Groupmfg1,225current
Asdaasda790current
Esso Tesco Allianceesso193current
SGNsgn112current
Motomoto47current
JET Retail UKjet11current
Morrisonsmorrisons1current, and it is one site in Gibraltar
Shellshell546frozen since 13 May 2026
Rontecrontec265frozen since 1 May 2026
Applegreenapplegreen65frozen since 26 February 2025
Ascona Groupascona60frozen since 5 May 2026
Tescotesco515 on 20 Septemberfrozen since 29 April 2026 when last read
bpbpnoneno file served
Karan Retailkarannoneserver error
Sainsbury'ssainsburysnonethe address no longer exists

Nothing is built around this table. Every retailer you choose is asked on every run, so a file that comes back to life starts returning rows by itself. Trust feedUpdatedAt on your own run over this table.

📥 What you give it

{
  "retailers": ["asda", "mfg", "moto"],
  "maxItems": 200,
  "maxFeedAgeHours": 48,
  "postcodePrefixes": ["SW", "M1", "EH12"]
}
FieldIf you leave it outWhat it is
retailersa free sample rowKeys from the table above, or the single word all. They are read in the order you list them; all reads the biggest first. A key that is not in the table is ignored.
maxItems200Stations to return across all your retailers, 1 to 20,000. Once it is reached the remaining retailers are not read at all, so list the one you care about first.
maxFeedAgeHours48How old a retailer's file may be, in hours, before its stations are skipped. Raise it to take the frozen files as well; every row still says how old it is.
postcodePrefixesevery stationOnly stations whose postcode starts with one of these, such as SW, M1 or EH12. Stations the filter drops are never charged.
proxyUrlsemptyOptional, for sending the requests through servers of your own, as http://user:pass@host:port. Leave it empty for a normal run.

📤 What you get back

A real row from a real run:

{
  "ok": true,
  "charged": true,
  "recordType": "station",
  "retailer": "Motor Fuel Group",
  "retailerKey": "mfg",
  "brand": "Jet",
  "siteId": "gcpt1f1w6e3b",
  "address": "MFG Bath Road, 230 Bath Road, Slough",
  "postcode": "SL1 4DX",
  "latitude": 51.515983,
  "longitude": -0.624051,
  "petrolE10": 174.9,
  "petrolE5": 189.9,
  "dieselB7": 201.9,
  "dieselSDV": 215.9,
  "otherPrices": null,
  "currency": "GBP",
  "priceUnit": "pence per litre",
  "feedUpdatedAt": "2026-09-30T00:00:01.000Z",
  "feedAgeHours": 2.6,
  "feedStale": false,
  "onCmaList": true,
  "scrapedAt": "2026-09-30T02:37:45.703Z"
}
FieldWhat it is
retailer, retailerKeyThe company whose file it is. Not always the brand over the door: Motor Fuel Group runs sites under BP, Esso and Jet, among others.
brandThe brand on the forecourt, spelled the way the retailer writes it, so ESSO and Esso both turn up.
siteIdThe retailer's own site code. A few sites share one, so to follow a station across runs, match retailerKey, siteId and postcode together.
petrolE10, petrolE5Standard 95-octane unleaded and super unleaded, in pence per litre.
dieselB7, dieselSDVStandard diesel and the premium diesel grade.
otherPricesAny grade code a retailer starts publishing that is not one of those four. Almost always null.
feedUpdatedAt, feedAgeHoursThe time on the retailer's own file, and how old it was when the row was written. Look here before you trust a price.
feedStaletrue when the file is more than 48 hours old, whatever limit you set, so it only shows up if you raised maxFeedAgeHours.
onCmaListWhether the retailer was on the government's final list of participating retailers. Applegreen was not.
latitude, longitudenull when the retailer published no real position. Four Motor Fuel Group sites do that; their address and postcode are right.

A grade the site does not sell is null, not zero.

🧾 Reading the output

RowHow to spot itCharged
A stationcharged: true, recordType: "station"yes
The sample row_sample: true, charged: false. Only when none of your retailer keys matchedno
A diagnostic row_diagnostic: true, charged: false, with the retailer it is about and an errorCodeno

The sample row carries recordType: "station" as well, so filter on charged rather than on recordType to keep only the stations you paid for.

errorCodeWhat happened
FEED_STALEThe file is older than your maxFeedAgeHours. The row gives its date and how many stations it holds.
FEED_HTTPThe retailer's server answered with an error, and status says which.
FEED_UNREACHABLEThe server could not be reached, or its address no longer exists.
FEED_NOT_JSON, FEED_SHAPE, FEED_EMPTYSomething answered, but it was not a usable list of stations.
FEED_NO_TIMESTAMP, FEED_BAD_TIMESTAMPThe file has no readable date, so there is no telling how old its prices are.
NO_RESULTSThe file was fine, but no station was in your postcode areas, or none had both a price and a location.
TIME_BUDGETThe run ran out of time before it reached that retailer.

▶️ How to run it

1. Open UK Fuel Prices Scraper and click Try for free. 2. In Retailers, list the keys you want, one per line, or type all. 3. Set Maximum rows. About 2,400 stations are current across every retailer, so 3,000 takes the lot. 4. To narrow it down, put postcode starts such as SW or EH12 in Postcode areas (optional). 5. Click Start, then export the dataset as CSV, JSON or Excel, filtered on charged.

💰 How much does it cost?

$0.92 per 1,000 stations, flat on every Apify plan.

Not charged: the sample row, every diagnostic row, stations from a file older than your limit, stations your postcode filter drops, stations with no price or no location, and a forecourt the same retailer lists twice. All 2,400 or so current stations come to about $2.20.

💡 What people use it for

  • Keeping a price history. Retailers overwrite their files and keep no archive, so a daily scheduled run is the only way to have last month's prices later on.
  • Costing a delivery round or a fleet's fuel: pull the postcode areas on the route and compare diesel.
  • A comparison page or an in-car app that wants one flat table instead of fifteen files in fifteen shapes.
  • Seeing what one chain charges across the country, sorted by the grade you buy.

🚧 What it does not do

  • Not every UK forecourt. Only retailers that still publish an open file are in it. Independents and several large chains are not.
  • No history. A run is a snapshot of what each retailer last published.
  • Not a live read of the pump. A forecourt that changed its price an hour ago may not have updated its file yet.
  • No stations from frozen files by default. Shell, Rontec, Applegreen, Ascona and Tesco have not refreshed since spring 2026 or earlier, so on the default limit they return a free row and nothing else.
  • Morrisons is one site in Gibraltar. That is the whole file.
  • Postcodes match on the start, with spaces ignored. M1 also catches M11 and M12, and M11 catches M1 1AA as well, so check the postcode column when that matters.
  • Times are read as UTC, because the files carry no time zone. In British Summer Time a file can look an hour older than it is.
  • A retailer that does not answer during a run gets a free row naming it, and the next run asks again.

🧭 Which UK data scraper do you need?

If you wantUse
Pump prices at UK filling stationsThis one
Classified ads on Gumtree UK, by keyword, category or townGumtree UK Scraper
Companies newly registered at Companies HouseNew UK Companies Scraper

❓ Questions people ask

How current are the prices? Every row says, in feedAgeHours. On the default limit nothing older than 48 hours is charged, and the live retailers refresh daily, so most rows are less than a day old.

What happens if a retailer's file is down? You get one free row for that retailer saying what went wrong, and the run carries on with the others.

Can I get the price at one station? Put the start of its postcode in postcodePrefixes and pick the row by postcode. Only matching stations are charged.

Can I get last month's prices? Not from this, because the retailers keep no archive. Schedule a daily run and you build the history yourself.

Why is there a null where a price should be? Either the site does not sell that grade, or the retailer put a placeholder there instead of a price. Both come through as null.

Do I need an account or an API key? No.

🆘 If something breaks

Open the Issues tab on the actor page. Include the run ID and the retailer keys you asked for.