# European Energy & Power Scraper - Generation & Prices (`ninhothedev/energy-charts-scraper`) Actor

$0.4/1K 🔥 European energy scraper! Electricity generation by source & day-ahead prices across Europe. No key. JSON, CSV, Excel or API in seconds. Power energy analytics & ESG reporting ⚡

- **URL**: https://apify.com/ninhothedev/energy-charts-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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?

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 Energy & Power Scraper - Electricity Generation, Prices & Renewables Share

Scrape **European electricity data** without an API key: generation by source (solar, wind, nuclear, coal, gas, hydro, biomass) and **day-ahead spot market prices** per bidding zone. Data comes from the public [Energy-Charts](https://energy-charts.info) API operated by **Fraunhofer ISE**, one of the most respected energy research institutes in Europe.

No login, no token, no cookies. Runs clean from datacenter IPs, so you pay nothing for proxies.

***

### What you get

The upstream API returns *columnar* data (one timestamp array plus one parallel array per production type). This actor **un-pivots it into flat rows** so you can drop the dataset straight into a spreadsheet, BI tool, or pandas DataFrame.

#### `power` mode - generation by source

One row per timestamp x production type:

```json
{
  "type": "power",
  "country": "de",
  "timestamp": "2026-07-25T22:00:00+00:00",
  "production_type": "Wind onshore",
  "power_mw": 6224.0,
  "source": "energy-charts",
  "scraped_at": "2026-07-28T12:03:30.913746+00:00"
}
```

Typical German day: **21 production types x 96-192 timestamps = ~2,000-4,000 rows**, including Solar, Wind onshore, Wind offshore, Nuclear, Fossil gas, Fossil hard coal, Fossil brown coal / lignite, Hydro Run-of-River, Hydro pumped storage, Biomass, Waste, Geothermal, Load, Residual load and Cross border electricity trading.

#### `price` mode - day-ahead spot prices

One row per timestamp:

```json
{
  "type": "price",
  "bidding_zone": "DE-LU",
  "timestamp": "2026-07-25T22:00:00+00:00",
  "price": 148.59,
  "unit": "EUR / MWh",
  "source": "energy-charts",
  "scraped_at": "2026-07-28T12:03:31.346482+00:00"
}
```

Negative prices (a real and increasingly common phenomenon in high-renewables markets) are preserved, not clipped.

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `power` | `power` = generation by source, `price` = day-ahead spot prices |
| `country` | string | `de` | Country code for `power` mode: `de`, `fr`, `at`, `ch`, `es`, `it`, `nl`, `pl`, `be`, `dk`, ... |
| `biddingZone` | string | `DE-LU` | Bidding zone for `price` mode: `DE-LU`, `FR`, `AT`, `ES`, `NL`, `BE`, `PL`, `CH`, `DK1`, `DK2`, `IT-North`, ... |
| `startDate` | string | *(empty)* | `YYYY-MM-DD`. Empty = most recent available data |
| `endDate` | string | *(empty)* | `YYYY-MM-DD`. Empty = most recent available data |
| `maxItems` | integer | `1000` | Row cap (max 10,000) to control cost on long ranges |

#### Example: German solar and wind for one week

```json
{
  "mode": "power",
  "country": "de",
  "startDate": "2026-01-01",
  "endDate": "2026-01-07",
  "maxItems": 10000
}
```

#### Example: French day-ahead prices

```json
{
  "mode": "price",
  "biddingZone": "FR",
  "startDate": "2026-01-01",
  "endDate": "2026-01-31"
}
```

***

### Pricing

Pay per usage - roughly **$0.5 per 1,000 rows**. A single day of German generation data (~4,000 rows) costs about $2; a month of hourly prices for one bidding zone is well under a dollar. No proxy costs, because the source works fine from datacenter IPs.

***

### Use cases

- **Energy analytics** - build dashboards tracking generation mix, load and residual load across European markets.
- **Renewables research** - quantify solar and wind penetration, curtailment windows, and renewables share over time.
- **Power trading** - backtest strategies against day-ahead spot prices, spot negative-price hours, correlate wind forecasts with price collapses.
- **ESG reporting** - document the grid mix behind your electricity consumption for Scope 2 market-based and location-based reporting.

Also useful for: academic energy modelling, EV charging optimisation, heat-pump and battery dispatch simulation, and journalism about the energy transition.

***

### Notes & limitations

- Data granularity depends on the country and series: typically 15-minute or hourly resolution.
- Coverage and available production types vary by country (e.g. Nuclear appears for FR but not for DE after the phase-out).
- Missing measurements (`null` in the upstream arrays) are skipped rather than pushed as empty rows.
- Prices are licensed **CC BY 4.0** by Bundesnetzagentur | SMARD.de; generation data is published by Fraunhofer ISE. Attribute the source when you republish.
- All fields are nullable - the dataset schema is deliberately permissive so upstream changes never break your runs.

***

### Related actors

- [Carbon Intensity Scraper](https://apify.com/ninhothedev/carbon-intensity-scraper) - grid carbon intensity data
- [World Bank Scraper](https://apify.com/ninhothedev/worldbank-scraper) - global development & energy indicators
- [ECB Exchange Rates Scraper](https://apify.com/ninhothedev/ecb-exchange-rates-scraper) - official euro reference rates
- [Air Quality Scraper](https://apify.com/ninhothedev/air-quality-scraper) - live pollution measurements

***

### Local development

```bash
pip install -r requirements.txt
python -m src.main
python tests/test_smoke.py   # offline smoke tests, no network needed
```

# Actor input Schema

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

What to scrape. 'power' returns electricity generation by production type over time (one row per timestamp and source). 'price' returns day-ahead spot market prices for a bidding zone (one row per timestamp).

## `country` (type: `string`):

Two-letter country code used in 'power' mode, e.g. de (Germany), fr (France), at (Austria), ch (Switzerland), es (Spain), it (Italy), nl (Netherlands), pl (Poland), be (Belgium), dk (Denmark). Ignored in 'price' mode.

## `biddingZone` (type: `string`):

Electricity market bidding zone used in 'price' mode, e.g. DE-LU (Germany/Luxembourg), FR, AT, ES, NL, BE, PL, CH, DK1, DK2, IT-North. Ignored in 'power' mode.

## `startDate` (type: `string`):

First day of the requested range in YYYY-MM-DD format, e.g. 2025-01-01. Leave empty to let the API return the most recent available data.

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

Last day of the requested range in YYYY-MM-DD format, e.g. 2025-01-07. Leave empty to let the API return the most recent available data.

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

Maximum number of dataset rows to push. Use this to cap cost on long date ranges; a single day of German generation data is roughly 2,000 rows.

## Actor input object example

```json
{
  "mode": "power",
  "country": "de",
  "biddingZone": "DE-LU",
  "maxItems": 1000
}
```

# Actor output Schema

## `records` (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 = {
    "country": "de",
    "biddingZone": "DE-LU",
    "startDate": "",
    "endDate": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/energy-charts-scraper").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 = {
    "country": "de",
    "biddingZone": "DE-LU",
    "startDate": "",
    "endDate": "",
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/energy-charts-scraper").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 '{
  "country": "de",
  "biddingZone": "DE-LU",
  "startDate": "",
  "endDate": ""
}' |
apify call ninhothedev/energy-charts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ninhothedev/energy-charts-scraper"
        }
    }
}

```

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/7ciZQ4YzhMgRNiQO7/builds/ibRtjBoLbJGDtCNUb/openapi.json
