# EU Fuel Prices — Weekly Oil Bulletin by Country Since 2005 (`nexgensignal/eu-weekly-oil-bulletin-records`) Actor

European Commission Weekly Oil Bulletin: consumer prices of petrol, diesel, heating oil, fuel oil and LPG in every EU country, with and without taxes, weekly since 2005. Part of NexGen Signal — official-source data products

- **URL**: https://apify.com/nexgensignal/eu-weekly-oil-bulletin-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Travel, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 weekly fuel price records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## EU Fuel Prices — Weekly Oil Bulletin by Country Since 2005

**Official source. No API key. Pay per record.**

This actor gives you the European Commission's **Weekly Oil Bulletin** as clean, long-format records: the consumer price of petrol (Euro-super 95), diesel, heating oil, heavy fuel oil and LPG in every EU country, with and without taxes, every week since January 2005. It reads the Commission's own "Price developments 2005 onwards" workbook from the Weekly Oil Bulletin page, so you get the official figures that governments, analysts and journalists quote.

On 27 September 2026 the workbook held **1,085 weekly bulletins** (3 January 2005 to 21 September 2026) and **143,399 price records** across the 27 member states, the EU and euro-area weighted averages, and the United Kingdom up to December 2020. The latest bulletin, for prices of 21 September 2026, had 119 records: petrol and diesel for all 29 areas, heating oil for 25, LPG for 21 and heavy fuel oil for fewer.

Each record is one area, one product, one week — with the price including taxes, the price net of taxes, the unit, and (for non-euro countries) the exchange rate the Commission used.

### Who buys this and for what job

- **Fleet, logistics and transport companies** tracking diesel costs by country and building fuel surcharges.
- **Energy, commodity and retail-fuel analysts** comparing pump prices and tax wedges across the EU.
- **Economists and inflation watchers** who need weekly fuel prices ahead of monthly CPI.
- **Price-comparison, travel and mobility apps** showing what fuel costs in each country.
- **Journalists and policy teams** reporting on fuel taxes and price moves, with the Commission as the source.

### Sample output

![Sample output — EU Fuel Prices](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/eu-weekly-oil-bulletin-records.png)

```json
{
  "record_id": "WOB:2026-09-21:PL:diesel",
  "price_date": "2026-09-21",
  "area_code": "PL",
  "area_name": "Poland",
  "product_code": "diesel",
  "product_name": "Automotive gas oil (diesel)",
  "product_label_in_file": "Gas oil automobile Automotive gas oil Dieselkraftstoff (I)",
  "price_with_taxes": 2039.1223028329377,
  "price_without_taxes": 1268.7763759283437,
  "currency": "EUR",
  "per_unit": "1000 l",
  "exchange_rate_in_file": 0.22972662531587412,
  "file_url": "https://energy.ec.europa.eu/document/download/906e60ca-8b6a-44e7-8589-652854d2fd3f_en?filename=Weekly_Oil_Bulletin_Prices_History_maticni_4web.xlsx",
  "source": "European Commission, DG Energy — Weekly Oil Bulletin, 'Price developments 2005 onwards' workbook (linked from https://energy.ec.europa.eu/data-and-analysis/weekly-oil-bulletin_en)",
  "licence": "The workbook states: 'Reproduction is authorised provided the source is acknowledged. © European Communities'. The Commission's legal notice (linked from the page footer) licenses its content under Creative Commons Attribution 4.0 (CC BY 4.0).",
  "attribution": "Source: European Commission, Weekly Oil Bulletin (CC BY 4.0); reformatted by NexGen Signal.",
  "observed_at": "2026-09-27T16:50:07Z"
}
```

Prices are in **euro per 1,000 litres** (or per tonne for heavy fuel oil), as the Commission publishes them: 2,039.12 means €2.04 a litre.

### Pricing

| Apify plan | Price per record |
|---|---|
| Free | $0.05 |
| Bronze | $0.045 |
| Silver | $0.04 |
| Gold and above | $0.0335 |

You pay only for records delivered to your dataset. `maxRecords` caps what a run can cost: 500 records cost $25 on the Free plan. Filtering is free — the whole workbook is read on every run and you pay only for what matches.

### Input

| Field | What it does | Default |
|---|---|---|
| `areas` | Area codes: `EU`, `EUR` (euro area), `AT` … `SK`, `UK` (to 2020) | all |
| `products` | `euro95`, `diesel`, `heating_oil`, `fuel_oil_1` (sulphur up to 1%), `fuel_oil_2` (above 1%), `LPG` | all |
| `latestOnly` | Only the most recent bulletin | off |
| `lastWeeks` | Only bulletins dated in the last N weeks | not set |
| `fromDate`, `toDate` | Only price dates between two days (YYYY-MM-DD) | not set |
| `sortBy` | `newest` or `oldest` bulletin first | newest |
| `maxRecords` | Maximum records delivered and billed | 10 |

**Default changed on 30 Sep 2026:** if you leave `maxRecords` out, a run now returns up to **10** records (it was 500). Set `maxRecords` yourself to get more — the maximum is unchanged.

Example — this week's petrol and diesel prices everywhere:

```json
{"latestOnly": true, "products": ["euro95", "diesel"], "maxRecords": 100}
```

Example — diesel and petrol in Germany, France and Poland for 2026 so far:

```json
{"areas": ["DE", "FR", "PL"], "products": ["diesel", "euro95"], "fromDate": "2026-01-01", "maxRecords": 1000}
```

(On 27 September 2026 that returned 228 records.)

### Output

| Field | Meaning |
|---|---|
| `record_id` | `WOB:<price date>:<area>:<product>` — unique per record |
| `price_date` | The date the prices refer to (the bulletin's Monday) |
| `area_code`, `area_name` | Area code as the file uses it, and its name |
| `product_code`, `product_name` | Product code as the file uses it, and an English name |
| `product_label_in_file` | The product label exactly as the workbook prints it (it is multilingual) |
| `price_with_taxes` | Consumer price including duties and taxes, EUR per unit |
| `price_without_taxes` | Consumer price net of duties and taxes, EUR per unit |
| `currency`, `per_unit` | `EUR`, and `1000 l` or `t` |
| `exchange_rate_in_file` | For non-euro countries, the rate the Commission used, as it appears in the file |
| `file_url`, `source`, `licence`, `attribution`, `observed_at` | Provenance on every record |

Numbers are the Commission's, unrounded. Nothing is converted, rescaled or estimated; the actor does not turn prices into euro per litre for you.

### Cost guidance

One full weekly bulletin is about 120 records — about $4 on Gold ($6 on Free). Petrol and diesel only for all areas is 58 records a week. A single country and product is 52 records a year. The whole history (about 143,000 records) is about $4,800 on Gold, so most buyers take the countries and products they need; a weekly `latestOnly` run then keeps them current.

### Tips

- **Weekly monitoring:** schedule the actor every Tuesday or Wednesday with `latestOnly: true` and only the areas and products you track; each run then costs a few dollars at most and never repeats old weeks.
- **Back-fill once:** take the history you need in one run with `fromDate`, then switch to the weekly schedule.
- **Tax wedge:** `price_with_taxes` minus `price_without_taxes` is the duties and taxes per unit, as the Commission reports them.
- **Per litre:** divide road-fuel prices by 1,000 to get euro per litre.

### How a run works

The actor checks the site's robots.txt, reads the Weekly Oil Bulletin page, finds the link to the "Price developments 2005 onwards" workbook (about 4.5 MB), checks that path against robots.txt as well, downloads it, and reads the "Prices with taxes" and "Prices wo taxes" sheets. It pairs the two sheets by week, area and product. Matching records are pushed to your dataset first and charged only after they are delivered; if you set a maximum charge, the run stops cleanly when it is reached. Test runs took 8–11 seconds. Every run saves a receipt (`RUN_RECEIPT`) with the robots decision, the workbook URL and size, the number of weeks in the file and its first and last dates. If the site cannot be reached after several retries, the run ends with a clear message and nothing is charged.

### Honest limitations

- **National averages, not station prices.** The bulletin reports one weighted average consumer price per country and product each week, supplied by member states. For individual stations, see the station-level actors below.
- **Not every country reports every product.** Heavy fuel oil and LPG are missing for many countries; those combinations simply have no record.
- **Weekly, published after the price date.** Prices refer to the Monday of each week and appear on the page some days later: on 27 September 2026 the latest bulletin was for prices of Monday 21 September 2026, in both the history workbook and the weekly file.
- **Units differ by product.** Road fuels, heating oil and LPG are per 1,000 litres; heavy fuel oil is per tonne.
- **Country methods differ.** Member states report on their own methodologies, which the Commission documents in country notes on the bulletin page; a country's series can break when its method changes.
- **The workbook's layout could change.** The actor recognises the price columns by their names; if the Commission changes them, the run says so instead of guessing.

### Licence and attribution

The workbook itself states: "Reproduction is authorised provided the source is acknowledged. © European Communities". The European Commission's legal notice, linked from the bulletin page's footer, licenses Commission content under **Creative Commons Attribution 4.0 (CC BY 4.0)**. Every record carries the credit *Source: European Commission, Weekly Oil Bulletin (CC BY 4.0); reformatted by NexGen Signal.* This actor is not affiliated with or endorsed by the European Commission.

### Differentiation

Fuel-price actors on the Store — such as eu\_open\_data/eu-fuel-station-prices and kondasviktor/cee-dach-fuel-intelligence — collect station-level prices from national feeds in a few countries. This actor covers all 27 EU countries on one official, comparable basis, splits out the tax wedge (prices with and without taxes), and goes back weekly to 2005 — the series the Commission itself uses to monitor fuel prices.

### The NexGen Signal family

Part of NexGen Signal — official-source data products, no API keys, pay per record. Related actors:

- [Spain Fuel Station Prices - MINCOTUR](https://apify.com/nexgensignal/es-fuel-station-price-records)
- [France Fuel Station Prices - roulez-eco](https://apify.com/nexgensignal/fr-fuel-station-price-records)
- [Italy Fuel Price Observations - MIMIT](https://apify.com/nexgensignal/it-fuel-price-observation-records)
- [EU Vehicle CO2 Records — EEA New-Car Monitoring](https://apify.com/nexgensignal/eu-vehicle-co2-records)
- [National Macro Indicator Records — World Bank](https://apify.com/nexgensignal/national-macro-indicator-records)

# Actor input Schema

## `areas` (type: `array`):

Only these areas. EU and EUR are the Commission's weighted averages for the EU and the euro area. Leave empty for all.

## `products` (type: `array`):

Only these products. Leave empty for all six.

## `latestOnly` (type: `boolean`):

Only the most recent weekly bulletin in the file.

## `lastWeeks` (type: `integer`):

Only bulletins dated in the last N weeks.

## `fromDate` (type: `string`):

Optional. Only price dates on or after this day (YYYY-MM-DD). The file starts on 3 January 2005.

## `toDate` (type: `string`):

Optional. Only price dates on or before this day (YYYY-MM-DD).

## `sortBy` (type: `string`):

Which weeks come first when more match than your maximum.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed in this run. One record = one area, one product, one week. A full week is about 120 records; the whole file is about 143,000.

## Actor input object example

```json
{
  "areas": [],
  "products": [],
  "latestOnly": false,
  "sortBy": "newest",
  "maxRecords": 10
}
```

# Actor output Schema

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

The delivered records.

# 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 = {
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/eu-weekly-oil-bulletin-records").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 = { "maxRecords": 10 }

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/eu-weekly-oil-bulletin-records").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 '{
  "maxRecords": 10
}' |
apify call nexgensignal/eu-weekly-oil-bulletin-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/eu-weekly-oil-bulletin-records"
        }
    }
}
```

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/hwAJI0DDJHh5qHitX/builds/eKANusCLE6Fxkei7Y/openapi.json
