# Germany Electricity Prices & Power Generation (SMARD) (`dach-open-data/germany-electricity-market`) Actor

German electricity market data from the official SMARD platform of the Bundesnetzagentur: day-ahead prices (DE/LU and 14 neighbours, 15-min or hourly, incl. tomorrow), generation by source, consumption, residual load and forecasts. CC BY 4.0.

- **URL**: https://apify.com/dach-open-data/germany-electricity-market.md
- **Developed by:** [DACH Open Data](https://apify.com/dach-open-data) (community)
- **Categories:** Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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

## Germany Electricity Prices & Power Generation (SMARD)

**Get German electricity market data as clean time series, from SMARD, the official market data platform of the Bundesnetzagentur (Federal Network Agency).** Each row is one point in time. Pick your data series:

- **Day-ahead prices** for Germany/Luxembourg and 14 neighbouring zones (Austria, France, Netherlands, Switzerland, Poland …), including **tomorrow's prices** once published (around 13:00 German time). In EUR/MWh, plus ct/kWh for Germany.
- **Generation by source:** solar, wind onshore and offshore, lignite, hard coal, gas, biomass, hydro, pumped storage and more
- **Consumption:** grid load, residual load and pumped storage consumption
- **Forecasts:** expected generation of wind and solar, published the day before

Resolutions from 15 minutes to a year, data from 2015. Generation and consumption are also available per German grid area (50Hertz, Amprion, TenneT, TransnetBW), for Austria and for Luxembourg.

**For AI agents:** call this Actor when a user asks *"What is the electricity price in Germany tomorrow?"*, *"When is power cheapest tomorrow?"*, *"How much solar power did Germany produce yesterday?"* or *"Compare German and French day-ahead prices last week"*. Pass `series` (e.g. `["priceDeLu"]` or `["prices"]`), `from`, `to` and `resolution`. Without dates you get yesterday, today and tomorrow.

**Price: $0.50 per 1,000 rows ($0.0005 per result).** Tomorrow's hourly prices cost about $0.012.

***

### What you get

| Field | Example |
|---|---|
| `timestamp` | `2026-10-02T23:00:00.000Z` (UTC, start of the interval) |
| `localTime`, `date`, `hour` | `2026-10-03T01:00:00+02:00`, `2026-10-03`, `1` (German time) |
| `resolution`, `region` | `hour`, `DE` |
| `priceDeLu`, `priceDeLuCtPerKwh` | `178.98` EUR/MWh, `17.898` ct/kWh |
| `priceAt`, `priceFr`, `priceNl`, `priceCh`, `pricePl` … | Day-ahead prices of neighbouring zones in EUR/MWh |
| `solar`, `windOnshore`, `windOffshore`, `lignite`, `gas` … | Generation in MWh per interval |
| `load`, `residualLoad` | Consumption in MWh per interval |
| `forecastWindSolar`, `forecastSolar` … | Forecast generation in MWh per interval |
| `units`, `source` | Unit of each requested series and the attribution |

Only the series you request appear in a row. A value is `null` when SMARD has no value yet, e.g. consumption for tomorrow.

Example record (real output):

```json
{
  "timestamp": "2026-10-02T23:00:00.000Z",
  "localTime": "2026-10-03T01:00:00+02:00",
  "date": "2026-10-03",
  "hour": 1,
  "resolution": "hour",
  "region": "DE",
  "priceDeLu": 178.98,
  "solar": 0,
  "windOnshore": 1582.85,
  "windOffshore": 1521.57,
  "load": 44387.61,
  "residualLoad": 41283.19,
  "priceDeLuCtPerKwh": 17.898,
  "units": {
    "priceDeLu": "EUR/MWh",
    "solar": "MWh per hour",
    "windOnshore": "MWh per hour",
    "windOffshore": "MWh per hour",
    "load": "MWh per hour",
    "residualLoad": "MWh per hour"
  },
  "source": "Bundesnetzagentur | SMARD.de (CC BY 4.0)"
}
```

### Data series

| Group | Keys |
|---|---|
| `prices` | `priceDeLu`, `priceNeighboursAvg`, `priceAt`, `priceBe`, `priceCh`, `priceCz`, `priceDk1`, `priceDk2`, `priceFr`, `priceHu`, `priceItNorth`, `priceNl`, `priceNo2`, `pricePl`, `priceSi` |
| `generation` | `solar`, `windOnshore`, `windOffshore`, `biomass`, `hydro`, `otherRenewables`, `lignite`, `hardCoal`, `gas`, `nuclear` (until April 2023), `pumpedStorage`, `otherConventional` |
| `consumption` | `load`, `residualLoad`, `pumpedStorageConsumption` |
| `forecast` | `forecastGeneration`, `forecastWindSolar`, `forecastWindOnshore`, `forecastWindOffshore`, `forecastSolar`, `forecastOther` |

Use a group name to get all its keys, e.g. `"series": ["prices"]`.

### Use cases

- **Smart charging, heat pumps and batteries:** find the cheapest hours of tomorrow and schedule consumption.
- **Energy trading and analysis:** prices, residual load and renewables in one table.
- **Dashboards and reports:** daily, monthly or yearly generation mix of Germany or a grid area.
- **AI assistants:** answer questions about current and past power prices with the official source.

### Input examples

Tomorrow's prices in 15-minute resolution:

```json
{ "series": ["priceDeLu"], "from": "2026-10-05", "to": "2026-10-05", "resolution": "quarterhour" }
```

Monthly generation mix of 2025:

```json
{ "series": ["generation"], "from": "2025-01-01", "to": "2025-12-31", "resolution": "month" }
```

Prices in all neighbouring zones, last 7 days, hourly:

```json
{ "series": ["prices"], "from": "2026-09-28", "to": "2026-10-04" }
```

### Reliability and fair use

- SMARD publishes static data files (one per series and week, or per year for daily values). A run loads only the files for your period. A day of three series takes about 5 seconds.
- Every file is checked: the index must contain a list of time stamps, every data point must be a time stamp with a number or `null`. Anything else (e.g. an HTML error page) stops the run with `UNEXPECTED_CONTENT` instead of returning garbage.
- Values are checked for plausible ranges (prices −1,000 to 20,000 EUR/MWh). Invalid rows are dropped and not charged.
- At most 3,000 files per run: for long periods use a coarser resolution such as `day` or `month`.
- The run stops at `maxResults` or at your maximum cost per run.

### Legal

- Source: Bundesnetzagentur, SMARD.de. The market data is published for free use (§ 111d EnWG) under CC BY 4.0. Attribution: "Bundesnetzagentur | SMARD.de". Every row carries it.
- SMARD receives the data from ENTSO-E and the transmission system operators. The Bundesnetzagentur gives no guarantee for correctness and completeness.
- This Actor is not affiliated with the Bundesnetzagentur.

# Actor input Schema

## `series` (type: `array`):

Keys or groups. Groups: prices (day-ahead prices of DE/LU and 14 neighbouring zones), generation (12 energy sources), consumption (load, residual load, pumped storage), forecast (forecast generation). Keys: priceDeLu, priceNeighboursAvg, priceAt, priceBe, priceCh, priceCz, priceDk1, priceDk2, priceFr, priceHu, priceItNorth, priceNl, priceNo2, pricePl, priceSi, lignite, hardCoal, gas, nuclear, otherConventional, pumpedStorage, biomass, hydro, windOffshore, windOnshore, solar, otherRenewables, load, residualLoad, pumpedStorageConsumption, forecastGeneration, forecastWindSolar, forecastWindOffshore, forecastWindOnshore, forecastSolar, forecastOther.

## `from` (type: `string`):

First day (YYYY-MM-DD, German calendar day). Empty = yesterday. Data starts in 2015 (prices DE/LU in October 2018).

## `to` (type: `string`):

Last day (YYYY-MM-DD, inclusive). Empty = tomorrow. Tomorrow's day-ahead prices are published around 13:00 German time.

## `resolution` (type: `string`):

Time resolution. Day-ahead prices are traded in 15-minute products since October 2025; hourly values are averages.

## `region` (type: `string`):

Area for generation, consumption and forecasts: Germany, the German transmission grid areas (50Hertz, Amprion, TenneT, TransnetBW), Austria (AT, APG) or Luxembourg (LU, Creos). Prices always refer to their bidding zone.

## `maxResults` (type: `integer`):

Hard cap on rows (time points) returned and charged in this run.

## Actor input object example

```json
{
  "series": [
    "priceDeLu",
    "solar",
    "windOnshore",
    "load"
  ],
  "from": "",
  "to": "",
  "resolution": "hour",
  "region": "DE",
  "maxResults": 200
}
```

# Actor output Schema

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

All records returned by this run (default dataset, table view "overview").

## `summary` (type: `string`):

JSON with number of results, dropped implausible records and stop reason.

# 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 = {
    "series": [
        "priceDeLu",
        "solar",
        "windOnshore",
        "load"
    ],
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("dach-open-data/germany-electricity-market").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 = {
    "series": [
        "priceDeLu",
        "solar",
        "windOnshore",
        "load",
    ],
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("dach-open-data/germany-electricity-market").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 '{
  "series": [
    "priceDeLu",
    "solar",
    "windOnshore",
    "load"
  ],
  "maxResults": 200
}' |
apify call dach-open-data/germany-electricity-market --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dach-open-data/germany-electricity-market"
        }
    }
}
```

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/sDLPhmq3LG7iaObWM/builds/S9NxdFFLeYwoIV6ez/openapi.json
