# German Energy Assets Scraper (MaStR) - $0.80/1K (`perceptr0n/german-energy-assets-mastr`) Actor

Export solar parks, wind farms, battery storage and CHP plants from the official German Marktstammdatenregister: operator name, capacity in kW, commissioning date, full address, district, grid operator. 9.2 million registered units, filterable by source, state, power and age.

- **URL**: https://apify.com/perceptr0n/german-energy-assets-mastr.md
- **Developed by:** [Thomas Ehrler](https://apify.com/perceptr0n) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / actor start

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

## German Energy Assets Scraper (Marktstammdatenregister) — $0.80 / 1,000

Export **every solar park, wind farm, battery storage and CHP plant in Germany**
with its **operator name, capacity, commissioning date, exact location and grid
operator** — from the Bundesnetzagentur's official register.

**9.2 million registered units.** Filter them down to exactly the segment you
sell into.

### What you can ask for

| Question | Filter | Result |
|---|---|---|
| Solar parks in Bavaria over 750 kW built before 2012 (repowering leads) | solar · BY · min 750 kW · before 2012 | named operators, 15–20 year old plants |
| Every wind turbine over 2 MW in Germany | wind · min 2,000 kW | 16,627 units |
| Commercial battery storage over 100 kW | storage · min 100 kW | 2,503 units |
| New commercial PV since January (fresh installations) | solar · min 100 kW · after 2026-01-01 | this year's market |
| Everything a specific grid operator connects | any · filter the export by `gridOperator` | portfolio view |

### What you get per unit

| Field | Example |
|---|---|
| `operatorName` | Aquila SolarINVEST II GmbH & Co. KG |
| `unitName`, `mastrNumber` | Solarpark Bergrheinfeld · SEE900... |
| `energySource`, `grossPowerKw`, `netPowerKw` | Solar · 2,239.08 kW |
| `commissionedOn`, `ageYears` | 2010-12-30 · 15.6 |
| `status`, `shutDownOn` | In operation |
| `street`, `postalCode`, `city`, `municipality`, `district`, `federalState` | full address |
| `latitude`, `longitude` | where available, for mapping |
| `gridOperator`, `gridOperatorMastrNumber` | N-ERGIE Netz GmbH |
| `registeredOn`, `lastUpdated`, `registryUrl` | provenance and a link to the official entry |

### Who buys this

- **Solar and wind service companies** — plants commissioned 15+ years ago are
  the repowering, module-replacement and O\&M market, and this is the only
  complete list of them
- **Battery storage and PPA developers** — find commercial sites with existing
  generation and grid connection
- **Grid and energy consultants** — asset inventories per district or grid operator
- **Component suppliers** — who operates what capacity, where
- **Research and journalism** — the energy transition in numbers, by municipality
- **AI agents** — clean schema, plain filters, callable via MCP

### Data protection — clean by design

The Marktstammdatenregister **anonymises private individuals at the source**:
their operator name is returned as "natürliche Person (…)", never as a real
name. This actor keeps only units with a **named operator** by default, which
means the export contains **companies only — no personal data at all**.

That is unusual for lead data and it is the reason this dataset is comfortable
to work with under GDPR. Publication itself is mandated by the German MaStR
regulation (MaStRV § 15).

### Input example

```json
{
    "energy_source": "solar",
    "federal_state": "BY",
    "min_power_kw": 750,
    "commissioned_before": "2012-01-01",
    "status": "in_operation",
    "only_named_operators": true,
    "max_items": 5000
}
```

### Output example

```json
{
    "operatorName": "Fischer Photovoltaik GbR",
    "unitName": "PV Dingolfing",
    "energySource": "Solar",
    "grossPowerKw": 3685.28,
    "commissionedOn": "2005-08-25",
    "ageYears": 20.9,
    "status": "In operation",
    "city": "Dingolfing",
    "district": "Dingolfing-Landau",
    "federalState": "Bayern",
    "gridOperator": "Bayernwerk Netz GmbH",
    "registryUrl": "https://www.marktstammdatenregister.de/MaStR/Einheit/Detail/IndexOeffentlich/…"
}
```

### What does a run cost?

| Units | Cost |
|---|---|
| 1,000 | $0.82 |
| 10,000 | $8.02 |
| 100,000 | $80.02 |

$0.02 per run start plus $0.0008 per unit.

### Why not just use the register's own website

The register's export is capped, its filter syntax is a grid dialect with
numeric German code lists (`Energieträger~eq~'2495'`), and dates come back as
`/Date(1699999999999)/`. This actor gives you plain filters, ISO dates, a
computed plant age, resolved code lists and one flat row per unit — plus
pagination past the point where the website stops.

### Limitations — stated honestly

- **Coordinates are not filled for every unit.** The register carries them for
  larger installations far more often than for small ones.
- Private operators are anonymous. That is the register's decision, not a gap in
  this actor — and `only_named_operators: false` returns those rows if you want
  them for statistics.
- Very broad queries are large: "all solar in Germany" is 6.35 million rows. Use
  `min_power_kw` and a federal state to stay in a sensible range.

### Source and licence

Data comes from the **Marktstammdatenregister** of the Bundesnetzagentur, the
German federal network agency. The register's data is published under the
**Datenlizenz Deutschland – Namensnennung – Version 2.0 (dl-de/by-2-0)**, which
permits commercial use, modification and redistribution with attribution.

Every exported record carries `dataSource` and `dataLicense` fields, so the
attribution travels with the data into your system. When you republish figures
derived from it, name the source: *Marktstammdatenregister, Bundesnetzagentur,
dl-de/by-2-0*.

Requests are paced so the register's website stays responsive for everyone else.

### Related actors

| Actor | What it does |
|---|---|
| [Website to Company Data](https://apify.com/perceptr0n/impressum-company-data-enrichment) | Turn operator names and websites into verified company records |
| [EU Public Tenders (TED)](https://apify.com/perceptr0n/eu-tenders-ted-scraper) | Public procurement — including energy infrastructure contracts |
| [EUDAMED Medical Devices](https://apify.com/perceptr0n/eudamed-medical-device-scraper) | EU medical device registry |

### Support

Need another field, filter or export shape? Open an issue in the **Issues** tab —
response within 1–2 business days.

# Actor input Schema

## `energy_source` (type: `string`):

Which kind of generating unit to export. Record counts in the register: solar 6.35M, battery storage 2.69M, wind 43k, natural gas 78k, biomass 24k, hydro 8.8k.

## `federal_state` (type: `string`):

Limit to one German state, or leave on all.

## `min_power_kw` (type: `integer`):

The most useful filter for commercial work. Above ~100 kW you are looking at businesses rather than private rooftops; above 750 kW at utility-scale parks.

## `max_power_kw` (type: `integer`):

Optional upper bound.

## `commissioned_after` (type: `string`):

Date `YYYY-MM-DD`. Use it to find new installations.

## `commissioned_before` (type: `string`):

Date `YYYY-MM-DD`. Older plants are the repowering and maintenance market — e.g. everything before 2010.

## `status` (type: `string`):

Whether the unit is currently running.

## `only_named_operators` (type: `boolean`):

ON by default. The register anonymises private individuals, so those rows carry no usable operator name. Switching this off returns them too — useful for statistics, useless for outreach.

## `max_items` (type: `integer`):

Stop after this many units.

## Actor input object example

```json
{
  "energy_source": "solar",
  "federal_state": "all",
  "min_power_kw": 100,
  "status": "in_operation",
  "only_named_operators": true,
  "max_items": 1000
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("perceptr0n/german-energy-assets-mastr").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("perceptr0n/german-energy-assets-mastr").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call perceptr0n/german-energy-assets-mastr --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=perceptr0n/german-energy-assets-mastr",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/AdG2JN0Zra73j7KY9/builds/jIB0jh71J0kgdjAr8/openapi.json
