# Germany Electricity Prices & Generation — SMARD Power Data (`nexgensignal/germany-power-market-records`) Actor

German electricity market data from the Bundesnetzagentur's SMARD platform: day-ahead prices for Germany and 15 neighbouring zones, generation by source, grid load and forecasts, hourly or 15-minute. Part of NexGen Signal — official-source data products

- **URL**: https://apify.com/nexgensignal/germany-power-market-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** News, Automation, 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 power market values

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

## Germany Electricity Prices & Generation — SMARD Power Data

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

This actor gives you German electricity market data from **SMARD**, the market-data platform of the Bundesnetzagentur (the German Federal Network Agency), as clean time-series records. It covers 36 series in four groups:

| Group | Series |
|---|---|
| `prices` | Day-ahead prices for Germany/Luxembourg, the average of its neighbours, and 14 neighbouring zones (Austria, Belgium, Switzerland, Czech Republic, Denmark 1 and 2, France, Hungary, Northern Italy, Netherlands, Norway 2, Poland, Sweden 4, Slovenia) in €/MWh |
| `generation` | Actual generation by source in MWh: biomass, hydropower, wind offshore, wind onshore, photovoltaics, other renewable, lignite, hard coal, fossil gas, pumped storage, other conventional |
| `consumption` | Grid load, residual load and pumped-storage consumption in MWh |
| `forecast` | Day-ahead generation forecasts: total, wind and solar combined, wind offshore, wind onshore, photovoltaics, other |

Values come hourly, quarter-hourly or daily. Day-ahead prices start in October 2018, when the Germany/Luxembourg price zone began; they run up to the next day as soon as the auction result is published. Each record is one value for one series and one time interval.

Every series id and label in this actor was checked on 27 September 2026 against SMARD's own download service. Each series was matched value for value with the column SMARD labels for it — for example Germany/Luxembourg at 150.71 €/MWh for the first hour of 28 September 2026 in both.

### Who buys this and for what job

- **Energy traders, utilities and suppliers** tracking German and neighbouring day-ahead prices next to wind, solar and load.
- **Industrial energy buyers and procurement teams** timing consumption and checking price exposure.
- **Battery, flexibility and renewable-project developers** modelling spreads, solar and wind output and residual load.
- **Analysts, researchers and journalists** covering the German energy transition with official figures.
- **Data teams** feeding dashboards and models without handling SMARD's weekly file layout.

### Sample output

![Sample output — Germany Electricity Prices & Generation](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/germany-power-market-records.png)

```json
{
  "record_id": "SMARD:4169:DE:hour:1790629200000",
  "series": "price_de_lu",
  "category": "Day-ahead prices",
  "label": "Germany/Luxembourg",
  "unit": "€/MWh",
  "area": "Germany/Luxembourg",
  "resolution": "hour",
  "timestamp_utc": "2026-09-28T21:00:00Z",
  "timestamp_ms": 1790629200000,
  "value": 181.29,
  "chart_url": "https://www.smard.de/app/chart_data/4169/DE/4169_DE_hour_1790546400000.json",
  "source": "Bundesnetzagentur | SMARD.de — electricity market data (https://www.smard.de)",
  "licence": "Creative Commons Attribution 4.0 (CC BY 4.0) — SMARD states that its market data 'is licensed under a Creative Commons Attribution 4.0 International Licence' and should be attributed to 'Bundesnetzagentur | SMARD.de'.",
  "attribution": "Source: Bundesnetzagentur | SMARD.de (CC BY 4.0); reformatted by NexGen Signal.",
  "observed_at": "2026-09-28T03:48:01Z"
}
```

### 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 — one record per value. `maxRecords` caps what a run can cost: 500 records cost $25 on the Free plan. Empty intervals (for example load that is not yet published) are skipped and never charged.

### Input

| Field | What it does | Default |
|---|---|---|
| `series` | Groups (`prices`, `generation`, `consumption`, `forecast`) and/or single series such as `price_de_lu`, `price_fr`, `gen_wind_onshore`, `gen_photovoltaics`, `load_grid`, `load_residual`, `fc_wind_and_pv` | `price_de_lu`, `load_grid`, `gen_wind_onshore`, `gen_photovoltaics` |
| `resolution` | `hour`, `quarterhour` or `day` | hour |
| `lastDays` | Only the last N days | last 7 days if no dates are given |
| `fromDate`, `toDate` | First and last day, UTC (YYYY-MM-DD) | 7 days ago → tomorrow |
| `maxRecords` | Maximum records delivered and billed | 500 |

Newest values come first; at each time step the series follow the order you listed them.

Example — every series, daily, for January 2025:

```json
{"series": ["prices", "generation", "consumption", "forecast"], "resolution": "day", "fromDate": "2025-01-01", "toDate": "2025-01-31", "maxRecords": 5000}
```

(That returned 1,116 values: 36 series × 31 days.)

Example — tomorrow's quarter-hourly German price curve plus the last two days:

```json
{"series": ["price_de_lu"], "resolution": "quarterhour", "lastDays": 2, "maxRecords": 1000}
```

### Output

| Field | Meaning |
|---|---|
| `record_id` | `SMARD:<series id>:DE:<resolution>:<timestamp>` — unique per value |
| `series`, `category`, `label`, `unit` | The series key, SMARD's category and English label, and the unit |
| `area` | For prices, SMARD's zone label (a bidding zone, or "∅ DE/LU neighbours" for the neighbours' average); Germany for generation, load and forecasts |
| `resolution` | hour, quarterhour or day |
| `timestamp_utc`, `timestamp_ms` | Start of the interval, in UTC and in SMARD's Unix milliseconds |
| `value` | The value as SMARD publishes it |
| `chart_url`, `source`, `licence`, `attribution`, `observed_at` | Provenance on every record |

Values are SMARD's, unchanged. Hourly and daily values are the ones SMARD itself shows (its download files call them "calculated resolutions").

### Cost guidance

A week of one hourly series is 168 records ($5.63 on Gold). A day of every series hourly is about 860 records ($29). A year of the German hourly price is 8,760 records ($293); the same year at daily resolution is 365 ($12). Quarter-hourly data is four times the hourly count. Start with the series you need and daily or hourly resolution; switch to quarter-hourly only where you need it.

### Tips

- **Daily price feed:** schedule a run each afternoon with `series: ["prices"]` and `lastDays: 1`; it picks up the next day's auction results as soon as SMARD publishes them.
- **Spreads:** request `price_de_lu` together with a neighbour such as `price_fr` or `price_at` and subtract by `timestamp_utc`.
- **Renewable share:** divide `gen_wind_onshore` + `gen_wind_offshore` + `gen_photovoltaics` by `load_grid` for the same interval.
- **Forecast error:** compare `fc_wind_onshore` with `gen_wind_onshore` for the same hours.

### Series keys at a glance

Prices: `price_de_lu`, `price_de_lu_neighbours_avg`, `price_at`, `price_be`, `price_ch`, `price_cz`, `price_dk1`, `price_dk2`, `price_fr`, `price_hu`, `price_it_north`, `price_nl`, `price_no2`, `price_pl`, `price_se4`, `price_si`. Generation: `gen_biomass`, `gen_hydropower`, `gen_wind_offshore`, `gen_wind_onshore`, `gen_photovoltaics`, `gen_other_renewable`, `gen_lignite`, `gen_hard_coal`, `gen_fossil_gas`, `gen_pumped_storage`, `gen_other_conventional`. Consumption: `load_grid`, `load_residual`, `load_pumped_storage`. Forecasts: `fc_total`, `fc_wind_and_pv`, `fc_wind_offshore`, `fc_wind_onshore`, `fc_photovoltaics`, `fc_other`.

### How a run works

The actor checks robots.txt (smard.de serves none — HTTP 404 — which is recorded in the run receipt as "no policy", not as permission), reads SMARD's index for each series to find the weekly (or, for daily data, yearly) files that cover your dates, and reads those files newest first. 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 4–30 seconds. Every run saves a receipt (`RUN_RECEIPT`) with the robots decision, files read and empty intervals skipped. If SMARD cannot be reached after several retries, the run ends with a clear message and nothing is charged.

### Honest limitations

- **Times are UTC.** SMARD's website shows German local time; `timestamp_utc` 2026-09-27T22:00:00Z is midnight on 28 September in Berlin.
- **Prices from October 2018.** The Germany/Luxembourg price zone began then; earlier dates return no price values.
- **Quarter-hour versus hour.** In SMARD's quarter-hourly price files, the four quarters of an hour carry the same price up to September 2025 and different prices from October 2025, when the day-ahead auction moved to 15-minute products. `quarterhour` gives those values; `hour` gives SMARD's hourly values.
- **Latest values fill in over time.** Load and generation for the most recent hours are not published yet when prices for the next day already are; those empty intervals are skipped (161 in one 7-day test run). Re-read recent days later if you need them complete.
- **Germany-wide only.** Generation, load and forecasts are for the whole of Germany; the four transmission-system-operator areas are not included.
- **No nuclear series.** German nuclear generation ended in April 2023, and SMARD serves no current chart file for it, so it is not offered.

### Licence and attribution

SMARD states that its market data "is licensed under a Creative Commons Attribution 4.0 International Licence" and should be attributed to "Bundesnetzagentur | SMARD.de". Every record carries the credit *Source: Bundesnetzagentur | SMARD.de (CC BY 4.0); reformatted by NexGen Signal.* This actor is not affiliated with or endorsed by the Bundesnetzagentur.

### Differentiation

Power-market actors on the Store — such as scrapemint/european-electricity-prices, jungle_synthesizer/entsoe-european-power-market-scraper and ninhothedev/energy-charts-scraper — draw on ENTSO-E or third-party portals. This actor reads the German regulator's own platform, with prices, generation by source, load and forecasts in one input, every series id verified against SMARD's own labels, and an open licence you can pass on with attribution.

### The NexGen Signal family

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

- [UK Renewable Project Pipeline Records — DESNZ REPD](https://apify.com/nexgensignal/uk-renewable-project-pipeline-records)
- [EU GHG Inventory Records — EEA](https://apify.com/nexgensignal/eu-ghg-inventory-records)
- [EU Industrial Emissions Records — EEA IED Facilities](https://apify.com/nexgensignal/eu-industrial-emissions-records)
- [ECB Bank Lending & Deposit Rate Records — Euro Area MIR](https://apify.com/nexgensignal/ecb-bank-interest-rate-records)
- [National Macro Indicator Records — World Bank](https://apify.com/nexgensignal/national-macro-indicator-records)

# Actor input Schema

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

Which SMARD series to read. Pick whole groups or single series.

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

Time resolution as SMARD publishes it.

## `lastDays` (type: `integer`):

Only values from the last N days. If no dates are given at all, the last 7 days are read.

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

Optional. First day (UTC, YYYY-MM-DD). Prices start October 2018; load and generation earlier.

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

Optional. Last day (UTC). Default tomorrow, which includes published day-ahead prices and forecasts.

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

Maximum records delivered and billed in this run. One record = one value for one series at one time. Newest first.

## Actor input object example

```json
{
  "series": [
    "price_de_lu",
    "load_grid",
    "gen_wind_onshore",
    "gen_photovoltaics"
  ],
  "resolution": "hour",
  "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 = {
    "series": [
        "price_de_lu",
        "load_grid",
        "gen_wind_onshore",
        "gen_photovoltaics"
    ],
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/germany-power-market-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 = {
    "series": [
        "price_de_lu",
        "load_grid",
        "gen_wind_onshore",
        "gen_photovoltaics",
    ],
    "maxRecords": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/germany-power-market-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 '{
  "series": [
    "price_de_lu",
    "load_grid",
    "gen_wind_onshore",
    "gen_photovoltaics"
  ],
  "maxRecords": 10
}' |
apify call nexgensignal/germany-power-market-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/germany-power-market-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/uBEKHFphoL4FKlqMd/builds/aaua6JDrgdNBw6kIa/openapi.json
