EU Fuel Prices: Spain & France Official Data avatar

EU Fuel Prices: Spain & France Official Data

Pricing

from $1.00 / 1,000 price rows

Go to Apify Store
EU Fuel Prices: Spain & France Official Data

EU Fuel Prices: Spain & France Official Data

Live petrol station prices from the official government feeds of Spain and France: diesel, petrol 95/98, E10, LPG and more, in one clean format with GPS. Filter by city, region, radius or cheapest N, or get every price in a country for a flat $2.50.

Pricing

from $1.00 / 1,000 price rows

Rating

0.0

(0)

Developer

Hydrocore Data

Hydrocore Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Get current fuel prices for every petrol station in Spain and France, straight from each government's official open-data feed, in one clean, normalized format. Ask for the 20 cheapest diesel stations within 10 km of a point, every E10 price in a city, or every price in the country for a flat $2.50 with one click, and optionally see which prices went up or down since your last run.

  • 🇪🇸 Spain: about 11,500 stations, ~43,000 prices, refreshed by the ministry every 30 minutes
  • 🇫🇷 France: about 9,800 stations, ~30,000 prices, read straight from the ministry's instant feed, refreshed every 10 minutes
  • ⛽ Diesel, petrol 95 and 98, E10, E85, LPG, CNG/LNG, hydrogen, AdBlue, HVO and more
  • 📦 Full country snapshot: every station and every price of a country for a flat price (about $2.50 per country on the Free plan)
  • 📍 Filter by city, region/province, postcode, brand, fuel, radius around a point, or keep the cheapest N
  • 📈 Optional price-change tracking between runs (new / up / down / same)
  • 🔓 No login, no API key, no proxies: public government open data only
  • ✅ Built-in data checks: a feed that is down, changed format or went stale gives a clear error row, never silently wrong prices

What can you use it for?

  • Fleet and logistics: find the cheapest diesel along your depots every morning
  • Price comparison apps and websites: a ready-made, normalized feed for two countries
  • Market and pricing analysis: track brand and regional price differences over time
  • Alerts: schedule a run and get only the stations whose price changed
  • Journalism and research: reproducible snapshots with source and licence on every row

How it works

  1. Pick one or both countries and, if you like, fuels and a place. Or turn on Full country snapshot to get everything.
  2. The Actor downloads the official national feed for each country (for Spain, only the province or region you name, when possible).
  3. Every price is converted to one format: same field names, same fuel names, prices as numbers in euros, times in UTC.
  4. Each feed is checked (format, size, freshness, plausible prices and coordinates) before any row is used.
  5. Your filters are applied, results are sorted (cheapest first within each fuel, or nearest first) and saved to the dataset.

A run takes about 5 to 10 seconds for France or a single Spanish province, about 40 to 90 seconds when it needs the whole of Spain, and about 2 minutes for a full snapshot of both countries. It uses 512 MB of memory by default; 256 MB is enough for filtered searches.

Input example

{
"countries": ["ES"],
"fuelTypes": ["diesel", "petrol_95"],
"latitude": 40.4168,
"longitude": -3.7038,
"radiusKm": 10,
"cheapestN": 20
}

Other ideas:

  • Everything in Spain and France (bulk): {"countries": ["ES", "FR"], "fullSnapshot": true} (set Maximum cost per run to at least $5.01)
  • All diesel prices in Seville: {"countries": ["ES"], "city": "Sevilla", "fuelTypes": ["diesel"]}
  • Cheapest 10 E10 in Paris: {"countries": ["FR"], "postalCode": "75", "fuelTypes": ["petrol_95_e10"], "cheapestN": 10}
  • Daily change alert for one province: {"countries": ["ES"], "region": "Valencia", "onlyChanges": true, "stateKey": "valencia-daily", "maxResults": 0}

Output example

One row per station, fuel and service type. Every row has the same columns in the same order (real row from a test run on 2026-11-04, point search in Madrid with price tracking on):

{
"country": "ES",
"fuelType": "petrol_95",
"fuelName": "Gasolina 95 E5",
"price": 1.549,
"unit": "EUR/L",
"currency": "EUR",
"service": null,
"stationId": "12145",
"stationName": "Alcampo",
"brand": "Alcampo",
"address": "Calle Jose Paulete,",
"postalCode": "28000",
"city": "Madrid",
"province": "Madrid",
"region": "Madrid",
"latitude": 40.393806,
"longitude": -3.654528,
"distanceKm": 4.89,
"previousPrice": null,
"priceChange": null,
"changeStatus": "new",
"lastUpdated": "2026-11-05T04:04:09.000Z",
"priceAgeHours": 0,
"priceAgeDays": 0,
"isStale": false,
"source": "Ministerio para la Transición Ecológica y el Reto Demográfico (MITECO), Geoportal Gasolineras",
"sourceUrl": "https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/",
"licence": "Spanish public-sector reuse terms (Ley 37/2007): cite source and update date",
"error": null,
"errorType": null,
"scrapedAt": "2026-11-05T04:04:46.337Z"
}

Every row shows how old its price is: priceAgeHours (hours from lastUpdated to the run, one decimal), priceAgeDays (whole days) and isStale (true when the price is older than 7 days). Prices are numbers in EUR, dates are ISO 8601 in UTC, and empty values are null.

distanceKm is filled when you give a point. previousPrice, priceChange and changeStatus (new, up, down or same) are filled when price tracking is on. error and errorType are only filled on the one row added for a country whose official feed could not be used.

Views. The Output tab opens in Overview (prices). There are also Price changes, Stations & coordinates and Detailed (every field) views. A run summary (feed update time, rows per country, rows matched) is saved as OUTPUT in the key-value store.

Sorting and limits. Sort by orders results cheapest first (per fuel type), nearest first, or in feed order; Cheapest N per fuel keeps the N best per fuel type; Max results caps the total after sorting.

Changed in v1.1: every row now always has the same columns (distanceKm, the change-tracking columns and error/errorType are null when not used, instead of missing).

Fuel types

fuelTypeSpain (official name)France (official name)
dieselGasóleo AGazole
diesel_premiumGasóleo Premium–
petrol_95Gasolina 95 E5SP95
petrol_95_e10Gasolina 95 E10E10
petrol_98Gasolina 98 E5SP98
e85Gasolina 95 E85E85
lpgGases licuados del petróleoGPLc
cng / lngGas Natural Comprimido / Licuado (per kg)–
othersGasóleo B (diesel_agricultural), Diésel Renovable (hvo), Biodiésel, Bioetanol, E25, Gasolina 98 E10, Gasolina 95 E5 Premium, Gasolina Renovable, biogas, Hidrógeno, AdBlue, Metanol, Amoníaco–

The original name is always kept in fuelName. Gas and hydrogen are priced per kilogram (unit: "EUR/kg"); everything else is per litre.

Pricing

Pay per event: you only pay for what the run actually does. Platform usage is included.

EventFree planBronzeSilverGold, Platinum, Diamond
Actor start (once per run)$0.0005$0.0005$0.0005$0.0005
Country feed loaded (once per country)$0.003$0.0027$0.0024$0.002
Price row (per price row in your dataset; error rows are free)$0.0013$0.0012$0.0011$0.001
Most you pay per country (full country snapshot price)$2.50$2.25$2.00$1.75

A country never costs more than its snapshot price. In every run, only the first price rows of each country are charged (1,920 on the Free plan, 1,872 Bronze, 1,816 Silver, 1,748 Gold and above). Every row after that is still in your dataset, for free.

Want everything? Use Full country snapshot. Turn on Full country snapshot and you get every station and every price of each selected country, with no filters, for the flat price above.

Worked examples on the Free plan:

What you ask forRows you getWhat you pay
20 cheapest diesel stations near a point in Spain20$0.0005 + $0.003 + 20 × $0.0013 = $0.0295
A search that finds nothing0$0.0035
All of Spain (Full country snapshot)about 43,000$2.50 ($0.0005 start + $0.003 + 1,920 × $0.0013 = $2.4995)
All of Spain and France (Full country snapshot)about 73,000$5.00 ($0.0005 start + 2 × $2.499 = $4.9985)

A country whose feed can't be downloaded is not charged. Max results (default 1,000) limits the size and cost of a filtered search.

Maximum cost per run: Apify stops a run when it reaches the "Maximum cost per run" set in the run options. For a full snapshot set it to at least $2.51 per country ($5.01 for Spain + France). If it is too low, the Actor skips that country, says so in the log and OUTPUT, and does not charge for it.

Data quality checks

Government feeds occasionally go down or change format. Instead of passing on broken data, every run checks each feed first:

  • Format: required fields (station ID, address, coordinates, prices) must be present and numbers must be in the expected format (Spain uses comma decimals, e.g. 1,749). If the publisher changes the layout, that country is rejected with errorType: "format-changed".
  • Size: a full national feed with far fewer stations than normal is treated as a broken download (too-small).
  • Freshness: if the feed itself has not been refreshed for 24 hours (Reject feeds older than), it is rejected as stale.
  • Plausible values: prices outside 0.10–5.00 €/L (0.10–40 €/kg for gas and hydrogen) are dropped; if many are, the feed is rejected. Station coordinates with latitude and longitude swapped are corrected, and impossible ones such as 0,0 are set to null. Counts are in OUTPUT.
  • Retries: downloads are retried on network errors and server errors.
  • Price age: every row has priceAgeDays and isStale, so old prices are easy to spot (see the FAQ below).

A rejected country is not charged and adds one row like {"country": "FR", "error": "...", "errorType": "stale", "price": null}, so pipelines can spot it. Turn on Fail the run if a feed has a problem to make the run end as Failed and trigger Apify's failure alerts.

Data sources and licences

CountryPublisherFeedLicence / terms
SpainMinisterio para la Transición Ecológica y el Reto Demográfico (MITECO), Geoportal GasolinerasREST serviceReuse of Spanish public-sector information (Law 37/2007): cite the source and the update date, do not distort the data's meaning
FranceMinistère de l'Économie (DGCCRF), prix-carburants.gouv.fr open data, instant feedOfficial instant feed (fallback: data.economie.gouv.fr)Licence Ouverte v2.0 (Etalab)

Every row carries source, sourceUrl, licence and the publisher's lastUpdated time, so attribution is easy when you reuse the data. Station names and addresses are reformatted from ALL CAPS for readability and fuel names are mapped to common types; prices are never changed. This Actor is not affiliated with or endorsed by either government.

FAQ

How fresh are the prices? As fresh as the official feeds: Spain republishes its whole feed every 30 minutes; France's instant feed, which this Actor reads directly, is refreshed every 10 minutes (if it is ever unavailable, the Actor falls back to the data.economie.gouv.fr copy and says so in OUTPUT).

Are all prices current? Not always, and every row tells you. Spain gives one time for the whole feed (when it was generated), so every Spanish price has the same recent lastUpdated. In France, lastUpdated is when that station last reported the price, and some stations that rarely update have prices that are weeks or even more than a year old. Every row shows priceAgeHours, priceAgeDays and isStale (true when the price is older than 7 days). A filtered search skips prices older than Ignore prices older than (7 days by default; 0 keeps everything). A full country snapshot includes every price, old ones too, so you can filter by isStale yourself.

Why is brand empty for French stations? France's official open-data feed does not include brand or station name (the ministry's open-data page lists them as excluded). You still get the station ID, full address, postcode, town, département, region and GPS position.

Which other countries are supported? Only Spain and France for now, because their governments publish open, no-login price feeds with clear reuse terms. Italy's official MIMIT files were tested but the server does not accept connections from Apify's network without a proxy, so it is not included. Other countries were left out because their official data needs a personal API key, forbids commercial reuse or has no published licence.

How do I find the cheapest station near me? Set latitude, longitude, radiusKm and fuelTypes, and cheapestN to how many you want. Results include distanceKm. Distance is straight-line, not driving distance.

How does price-change tracking work? Turn on Track price changes and give a Tracking name. Each run saves the prices it saw in a key-value store in your Apify account and compares the next run with them. Use Only output changes to pay only for prices that moved. The first run is a baseline: every row is new.

How much does a full country cost? At most $2.50 per country on the Free plan ($2.25 Bronze, $2.00 Silver, $1.75 Gold and above), plus the $0.0005 start, for about 43,000 rows in Spain or about 30,000 in France. See Pricing above for how the cap works.

I need lots of rows. Should I filter or use the snapshot? If you want more than about 1,900 rows of a country, use Full country snapshot: you get every row for the same price a big filtered search would cost. A filtered search is cheaper for small answers, for example $0.0295 for the 20 cheapest stations near a point. Either way, a country never costs more than its snapshot price.

What does Full country snapshot ignore? Everything except Countries and the price-tracking options: fuel, place, brand, radius, cheapest N, Ignore prices older than and Max results are all skipped, and Only output changes is turned off. Because the age limit is skipped, old French prices are included; use isStale or priceAgeDays to filter them. Rows are sorted by country, then fuel, then price (cheapest first).

Why are some prices per kg? CNG, LNG, biogas and hydrogen are sold by weight at the pump. Those rows have unit: "EUR/kg".

Can I run it on a schedule or through the API? Yes. Create a schedule in Apify Console (for example every morning) or call the Actor from the Apify API, Python/JavaScript clients, Make, Zapier or n8n. Results can go to Google Sheets, webhooks or your database.

What happens if a government feed is down? The run continues with the other countries, adds an error row for the failed one, says which feed failed in the status message and the OUTPUT record, and does not charge for that country. If no feed loads, the run fails and only the start event is charged. See Data quality checks above.

Is this legal to use? The data is published by both governments as open data for reuse under the terms listed in the table above. The Actor uses only public endpoints, no logins and no proxies. When you republish the data, credit the source as shown in each row's source and licence.

Support

Found a problem or want another country? Open an issue on the Actor's Issues tab and include the run ID.