# Fuel Prices France, Spain & Portugal: Gas Stations (`maliksaid/europe-fuel-prices`) Actor

Live fuel prices at every petrol station in France, Spain and Portugal from official government feeds. Diesel, petrol 95, E10, 98, LPG and more in EUR per litre, one schema. Search by radius, get the cheapest stations, or run a change-only price feed for fleets.

- **URL**: https://apify.com/maliksaid/europe-fuel-prices.md
- **Developed by:** [Malik Said](https://apify.com/maliksaid) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 stations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fuel Prices France, Spain & Portugal: Gas Stations

This Actor returns live fuel prices for every petrol station in France, Spain and Portugal. It reads the official government open data feeds. All three countries come out in one schema, with prices in EUR per litre. Fleet managers, travel apps, price analysts and logistics teams use it.

### What it covers

| Country | Official source | Stations with prices (21 Oct 2026) | Price update time |
|---|---|---|---|
| France | Prix des carburants, Ministère de l'Économie | 9,304 | Per station and fuel |
| Spain | Geoportal Gasolineras, Ministerio para la Transición Ecológica | 11,328 public stations | One time for the national file, refreshed about every 30 minutes |
| Portugal | Direção-Geral de Energia e Geologia (DGEG) | 3,209 | Per station and fuel |

A full snapshot of the three countries is about 23,800 stations. It runs in under one minute.

### Fuel types

Each country names its fuels differently. The Actor maps them to one standard name.

| Standard name | France | Spain | Portugal |
|---|---|---|---|
| `diesel` | Gazole | Gasóleo A | Gasóleo simples |
| `diesel_premium` | | Gasóleo Premium | Gasóleo especial |
| `petrol_95` | SP95 | Gasolina 95 E5 | Gasolina simples 95 |
| `petrol_95_e10` | E10 | Gasolina 95 E10 | |
| `petrol_95_premium` | | Gasolina 95 E5 Premium | Gasolina especial 95 |
| `petrol_98` | SP98 | Gasolina 98 E5 | Gasolina 98 |
| `petrol_98_e10` | | Gasolina 98 E10 | |
| `petrol_98_premium` | | | Gasolina especial 98 |
| `e85` | E85 | Gasolina 95 E85 | |
| `lpg` | GPLc | Gases licuados del petróleo | GPL Auto |
| `cng` (per kg) | | Gas Natural Comprimido | GNC €/kg |
| `lng` (per kg) | | Gas Natural Licuado | GNL €/kg |
| `biodiesel` | | Biodiesel | Biodiesel B15 |
| `renewable_diesel` | | Diésel Renovable | |
| `agricultural_diesel` | | Gasóleo B | Gasóleo colorido |
| `adblue` | | AdBlue | |
| `hydrogen` (per kg) | | Hidrógeno | |

Each price also keeps the fuel name the source uses, in `priceDetails.sourceFuelName`.

### What you get

One record per station.

| Field | Meaning |
|---|---|
| `id` | Country code and station ID, for example `ES-15437` |
| `country` | `FR`, `ES` or `PT` |
| `name` | Station name. Portugal only |
| `brand` | Brand or sign. Spain and Portugal |
| `address`, `postalCode`, `city`, `region` | Location. `region` is the province (Spain) or district (Portugal) |
| `latitude`, `longitude` | WGS84 coordinates |
| `stationType` | `road` or `motorway` (France). `motorway`, `hypermarket` or `other` (Portugal) |
| `open24h`, `openingHours` | 24/7 flag (France and Spain) and opening hours (Spain) |
| `prices` | Price in EUR per standard fuel type |
| `priceDetails` | Per fuel: price, unit, source fuel name and update time |
| `lastPriceUpdate` | Latest price update at the station |
| `distanceKm` | Distance from your search point |
| `change`, `previousPrices` | Change-only feed: `new` or `changed`, and the earlier prices |
| `source`, `sourceUrl` | Official source, for attribution |

Sample record from a test run on 21 October 2026:

```json
{
  "id": "ES-15437",
  "country": "ES",
  "stationId": "15437",
  "name": null,
  "brand": "MOEVE",
  "address": "CARRETERA DEL AEREOPUERTO, CAMINO DE LAS GALESAS KM. 1,4",
  "postalCode": "18320",
  "city": "SANTA FE",
  "region": "GRANADA",
  "latitude": 37.183417,
  "longitude": -3.763167,
  "stationType": null,
  "open24h": false,
  "openingHours": "L-D: 07:00-23:00",
  "publicAccess": true,
  "priceDetails": [
    { "fuelType": "diesel", "priceEur": 1.909, "unit": "litre", "sourceFuelName": "Gasoleo A", "updatedAt": "2026-10-21T13:25:57+02:00" },
    { "fuelType": "petrol_95", "priceEur": 1.799, "unit": "litre", "sourceFuelName": "Gasolina 95 E5", "updatedAt": "2026-10-21T13:25:57+02:00" },
    { "fuelType": "lpg", "priceEur": 1.089, "unit": "litre", "sourceFuelName": "Gases licuados del petróleo", "updatedAt": "2026-10-21T13:25:57+02:00" },
    { "fuelType": "adblue", "priceEur": 0.978, "unit": "litre", "sourceFuelName": "Adblue", "updatedAt": "2026-10-21T13:25:57+02:00" }
  ],
  "prices": { "diesel": 1.909, "petrol_95": 1.799, "lpg": 1.089, "adblue": 0.978 },
  "lastPriceUpdate": "2026-10-21T13:25:57+02:00",
  "distanceKm": null,
  "change": null,
  "previousPrices": null,
  "currency": "EUR",
  "source": "Geoportal Gasolineras, Ministerio para la Transición Ecológica (Spain)",
  "sourceUrl": "https://geoportalgasolineras.es/",
  "scrapedAt": "2026-10-21T11:25:54.436Z"
}
```

Some fields are empty on purpose:

- The French feed has no station name and no brand.
- The Spanish feed has no station name.
- `region` is empty for France. `stationType` is empty for Spain.
- A fuel the station does not sell is left out of `prices`.

### How to use it

1. **Full snapshot.** Set Maximum stations to 0. Leave the other options empty.
2. **Stations near a place.** Set latitude, longitude and a radius in km. Results come nearest first.
3. **Cheapest stations.** Pick a fuel type and set Cheapest stations, for example 20. Add a point and radius to search one area.
4. **Price feed for fleets.** Turn on Change-only price feed and schedule the Actor, for example every hour. Each run returns only stations that are new or whose price changed. Use a different state key for each watch list.

Example input for the 20 cheapest diesel stations within 10 km of central Madrid:

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

### Input

| Option | Default | Meaning |
|---|---|---|
| Countries | France, Spain, Portugal | Countries to collect |
| Fuel types | All | Keep only these fuels. The first one is used by Cheapest stations |
| Latitude, Longitude | Empty | Optional search point |
| Radius (km) | 10 | Distance from the search point |
| Cheapest stations | 0 (off) | Return only the N cheapest stations |
| Maximum price age (days) | 0 (off) | Drop prices older than this |
| Include restricted stations (Spain) | Off | Add Spanish stations that sell only to members or fleets |
| Change-only price feed | Off | Return only new stations and price changes |
| Change feed state key | `default` | Name of the price memory |
| Maximum stations | 100 | Stop after this many stations. Set 0 for no limit |

With Cheapest stations and the change-only feed both on, the Actor first picks the N cheapest stations. It then returns the ones whose price changed.

### Pricing

You pay a small fee per run and a fee for each station saved to your dataset. Stations skipped by your filters cost nothing. See the price on the Pricing tab.

### Data sources and use

- All data comes from official open data feeds that need no login.
- France: Licence Ouverte 2.0. Spain: open data of the Spanish Ministry for the Ecological Transition. Portugal: DGEG allows free reuse when DGEG is named as the source and the price update time is shown. Each record carries `source` and `updatedAt` for this.
- The Actor downloads each national file once per run.
- Station records describe business premises. The Actor collects no personal contact details.
- Prices are reported by the stations. They can lag behind the price at the pump.

### Support

Report a problem in the Issues tab. Include the run link.

# Actor input Schema

## `countries` (type: `array`):

Countries to collect. Leave empty to collect France, Spain and Portugal.

## `fuelTypes` (type: `array`):

Keep only these fuel types, mapped to one standard name across the three countries. Stations that sell none of them are skipped. Leave empty to keep every fuel. The first fuel type is also the one Cheapest stations sorts by.

## `latitude` (type: `string`):

Optional search point, in decimal degrees. Example: 40.4168 for Madrid. Set it together with longitude.

## `longitude` (type: `string`):

Optional search point, in decimal degrees. Example: -3.7038 for Madrid. West of Greenwich is negative.

## `radiusKm` (type: `integer`):

Keep stations within this distance of the search point. Used only when latitude and longitude are set. Results are sorted nearest first.

## `cheapestN` (type: `integer`):

Return only the N cheapest stations for the first selected fuel type (diesel when no fuel type is selected). 0 turns this off.

## `maxPriceAgeDays` (type: `integer`):

Drop prices that the station has not updated for more than this many days. Some stations keep old prices for months. 0 keeps every price.

## `includeRestricted` (type: `boolean`):

Spain also lists stations that sell only to members or fleets. Turn this on to include them.

## `changesOnly` (type: `boolean`):

Return only stations that are new or whose price changed since the last change-only run with the same state key. Schedule the Actor with this on to receive a price feed. The first run returns every matching station.

## `stateKey` (type: `string`):

Name of the price memory that the change-only feed uses. Use a different key for each separate watch list.

## `maxItems` (type: `integer`):

Stop after saving this many stations. The default keeps test runs short and cheap. Set 0 for no limit. A full France, Spain and Portugal snapshot is about 24,000 stations.

## Actor input object example

```json
{
  "countries": [
    "FR",
    "ES",
    "PT"
  ],
  "fuelTypes": [],
  "radiusKm": 10,
  "cheapestN": 0,
  "maxPriceAgeDays": 0,
  "includeRestricted": false,
  "changesOnly": false,
  "stateKey": "default",
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/europe-fuel-prices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "maxItems": 100 }

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/europe-fuel-prices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 100
}' |
apify call maliksaid/europe-fuel-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maliksaid/europe-fuel-prices"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PXZTDB7zSOagNHWOv/builds/Ygw7ke0gXShq5Z7wN/openapi.json
