# European Electricity Prices: Day-Ahead Rates and Power Mix (`scrapemint/european-electricity-prices`) Actor

Keyless European power market data. Day-ahead spot prices per bidding zone at quarter hour resolution, a daily summary with peak versus off peak and how long the price was negative, the generation mix by source, and physical flows between countries. Covers the zones published under an open licence.

- **URL**: https://apify.com/scrapemint/european-electricity-prices.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 power rows

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## European Electricity Prices: Day-Ahead Rates and Power Mix

Power is priced by the quarter hour, and in Europe the price regularly goes **negative** when wind and solar overshoot demand. On a recent day in Germany the market spent four and a half hours below zero, while the evening peak reached €187/MWh.

This reads the day-ahead spot price per bidding zone, what was generating behind it, and the physical flows between countries. No key, no login, no proxy.

### Four modes

**Prices** returns one row per quarter hour per zone: timestamp, price in EUR/MWh, and an `isNegative` flag. Set `onlyNegativePrices` to return just the intervals where the market was paying consumers to take power.

**Summary** returns one row per zone per day:

| Field | Meaning |
| --- | --- |
| `averagePrice`, `minPrice`, `maxPrice`, `spread` | The day, with the timestamp of the high and the low |
| `peakAverage`, `offPeakAverage`, `peakPremium` | Peak is 08:00 to 20:00 CET, the market's own definition |
| `negativeIntervals`, `negativeHours`, `lowestNegativePrice` | How long, and how far, the price went below zero |

**Generation** returns one row per production type with average, minimum and maximum output, its share of generation, and the average load for context.

**Flows** returns one row per neighbouring country: average net flow in GW, whether that is an import or an export, the extremes in each direction, and the country's overall net position.

### Example input

```json
{
  "mode": "summary",
  "zones": ["DE-LU", "FR", "NL", "AT", "BE", "PL"],
  "date": "2026-07-27"
}
```

Every quarter hour the price was negative:

```json
{
  "mode": "prices",
  "zones": ["DE-LU"],
  "onlyNegativePrices": true
}
```

### Licensing, and why some zones return no data

The upstream publisher licenses **some** bidding zones as CC BY 4.0 and marks the rest for private and internal use only, where redistribution of the raw **or derived** data is expressly prohibited.

This actor therefore returns price rows only for zones whose response declares an open licence, and every row carries the `license` and `source` attribution that licence requires. A restricted zone returns a free note explaining why instead of data you could not lawfully use.

That check runs against the live response rather than a fixed list, because the two disagree: the documentation lists IT-North as openly licensed while the live response marks it restricted. The response wins.

Zones confirmed working: `DE-LU`, `FR`, `NL`, `AT`, `BE`, `CH`, `CZ`, `DK1`, `DK2`, `HU`, `NO2`, `PL`, `SE4`, `SI`. Generation and flow data carry no such restriction and work for any covered country.

### Two things worth knowing

**The generation list mixes three different units.** Alongside the megawatt series for each fuel it carries load, cross-border trade, pumped storage consumption, and two series that are **percentages**, not megawatts. Adding the array up as if it were all generation corrupts every share computed from it. Each row here is tagged with `seriesKind` and `unit`, and shares are calculated only across real generation, so they add to 100.

**Peak hours are a CET convention.** Classifying them in UTC shifts the window two hours in summer and mislabels the midday solar trough as peak, which inverts the number people care about. The window used is on every summary row.

### Pricing

Pay per row, `$0.003`. The first 2 rows of every run are free. Licence-restricted zones, dates with nothing published, and note rows are never charged.

One zone-day is one request, and the upstream API rate limits aggressively, so requests are spaced deliberately. A two zone run takes about ten seconds.

### Related actors

- **Commodity Futures Prices: Gold, Oil, Grains and Rates** for the gas and coal that set the marginal price
- **CFTC Commitments of Traders (COT) Tracker** for positioning in energy futures
- **World Economic Indicators Scraper: GDP, Inflation & More** for the macro backdrop

# Actor input Schema

## `mode` (type: `string`):

prices = one row per quarter hour per zone. summary = one row per zone per day with peak, off peak and negative price hours. generation = the power mix by source. flows = electricity traded with each neighbour.

## `zones` (type: `array`):

For prices and summary. Openly licensed zones include DE-LU, FR, NL, AT, BE, CH, CZ, DK1, DK2, HU, NO2, PL, SE4, SI. Zones the publisher restricts return a free explanation instead of data.

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

For generation and flows. Two letter codes, e.g. de, fr, nl, at, be, pl, ch, es, it.

## `date` (type: `string`):

YYYY-MM-DD. Empty uses today, falling back to yesterday when a zone has not published yet.

## `endDate` (type: `string`):

YYYY-MM-DD. Set this with the start date to pull a range. Each day adds 96 rows per zone in prices mode.

## `onlyNegativePrices` (type: `boolean`):

Prices mode. Keep only the intervals where the price went below zero, which is when the market is paying consumers to take power.

## `maxRows` (type: `integer`):

Cap on rows returned. A single zone produces 96 price rows per day.

## Actor input object example

```json
{
  "mode": "prices",
  "zones": [
    "DE-LU",
    "FR"
  ],
  "countries": [
    "de"
  ],
  "date": "",
  "endDate": "",
  "onlyNegativePrices": false,
  "maxRows": 200
}
```

# 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 = {
    "zones": [
        "DE-LU",
        "FR"
    ],
    "countries": [
        "de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/european-electricity-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 = {
    "zones": [
        "DE-LU",
        "FR",
    ],
    "countries": ["de"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/european-electricity-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 '{
  "zones": [
    "DE-LU",
    "FR"
  ],
  "countries": [
    "de"
  ]
}' |
apify call scrapemint/european-electricity-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/european-electricity-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/lM2pzadmSkASxyW2c/builds/KjuI4FZyNB6TsWRqn/openapi.json
