Linked Marktstammdatenregister

Welcome to the experimental Linked Data wrapper for the Marktstammdatenregister (MaStR). MaStR is the Bundesnetzagentur's register of electricity and gas generation units in Germany — photovoltaic, wind, hydro, biomass, geothermal, storage and more. The data is open (dl-de/by-2.0).

This is a very large dataset: roughly 9.7 million generation units; the full official export (Gesamtdatenexport) is on the order of ~3 GB compressed. There is therefore no “download everything” endpoint: you reach the data by unit, by district, by spatial bounding box, or by name, or page through a collection — each scoped so you only retrieve what you ask for.

This public instance serves the whole register: every unit, Anlage, Lokation, operator and grid in the Gesamtdatenexport (about 41 million records), rebuilt from each new export. The examples below are all Bavarian (in and around Nürnberg).

Nearby: code on GitHub.

Browse

Collections and services: every collection (units, operators, locations, codelists, …) page by page, and a form for each search, filter and lookup. The same page as RDF, with the forms as Hydra templates, is what machine clients start from.

Examples — follow the links

Each MaStR unit carries its coordinates, technology, commissioning date and capacity, and links out to the registrations that hold what the unit itself does not: its operator (Anlagenbetreiber), Lokation, EEG / KWK registration, permit and grid connection. Two worked examples, each held together by its operator — follow your nose from one record to the next.

1. An operator's PV plant and battery (Robert Bosch GmbH)

Robert Bosch GmbH operates, in and around Nürnberg, both a photovoltaic plant and a battery storage system. From each unit, mastr:AnlagenbetreiberMastrNummer leads back to the same operator; and each unit links out to the Anlage that carries its headline figure — the EEG-Anlage for the PV, the storage Anlage (usable kWh) for the battery.

./abr/926842967274#it
The operator (Anlagenbetreiber) — a vocab:Operator with foaf:name “Robert Bosch GmbH” and a vcard:hasAddress block. Both units below link here via mastr:AnlagenbetreiberMastrNummer; the operator links back the other way — vocab:operatesUnit to each unit and vocab:hasSite to their shared Lokation ↓ — so you can follow your nose in either direction.
./sel/956197343287#it
The Lokation (site) — a vocab:Location that groups both units below (sharing one grid-connection setup). The operator reaches it via vocab:hasSite; each unit via mastr:LokationMaStRNummer; and the Lokation links back the other way — vocab:hasUnit to each unit and vocab:hasOperator to the operator — so the operator ↔ site ↔ unit graph is navigable in every direction.
./see/975852529842#it
The PV unit (upstream); operated by Bosch, links to its EEG-Anlage ↓.
./eeg/973290077826#it
The PV unit's EEG-Anlage (the subsidy registration).
./see/965276283956#it
The battery storage unit (upstream); operated by Bosch, links to its storage Anlage ↓.
./sse/964037356847#it
The storage Anlage — mastr:NutzbareSpeicherkapazitaet, the usable kWh (which lives on the Anlage, not the unit).

2. A cogeneration plant (KFZ-Innung Mittelfranken)

KFZ-Innung Mittelfranken operates a combustion cogeneration unit (BHKW) that produces both electricity and heat. The unit's KWK registration carries the cogeneration output.

./abr/943466687630#it
The operator — foaf:name “KFZ-Innung Mittelfranken KdöR”. It links forward to the unit below via vocab:operatesUnit and to its Lokation ↓ via vocab:hasSite.
./sel/918138846097#it
The Lokation (site) the cogeneration unit sits at — a vocab:Location; reached from the operator via vocab:hasSite and from the unit via mastr:LokationMaStRNummer, and linking back via vocab:hasUnit / vocab:hasOperator.
./see/942775431309#it
The cogeneration unit (BHKW) (upstream); links to its KWK Anlage ↓.
./kwk/953238616133#it
The KWK (cogeneration) Anlage — mastr:ThermischeNutzleistung (thermal) + mastr:ElektrischeKwkLeistung (electrical).

A record's IRI is its MaStR-Nr split in two: the 3-letter prefix, lowercased, names the collection (see for Stromerzeugungseinheiten, abr for operators, sel for Lokationen, …) and the 12 characters after it name the record. The fragment distinguishes the thing (#it) from the document describing it (httpRange-14). Every collection, its URI templates and its formats are listed under Collections and services.

Example municipalities (AGS)

./ags/09362000#it
Stadt Regensburg (AGS 09362000); the thing carries the AGS as skos:notation, the key to join on with other sources, and the document lists the MaStR units in the municipality via rdfs:member.
./ags/09564000?bbox=10.9,49.4,11.1,49.6
Stadt Nürnberg, narrowed to a map bounding box (minLon,minLat,maxLon,maxLat).

Spatial range query

./within?bbox=10.9,49.4,11.1,49.6
Units within a map bounding box (minLon,minLat,maxLon,maxLat), answered from a pre-built in-memory spatial index — fast and paginated; returns 503 when no index is loaded.
./within.jsonld?sw=49.4,10.9&ne=49.6,11.1
The same window as JSON-LD, given as south-west / north-east corners (lat,lon) instead of a bbox string.
./within.geojson?bbox=10.9,49.4,11.1,49.6
The same hits as a GeoJSON FeatureCollection of Points at [lon, lat] (one feature per hit with coordinates), for direct consumption by web maps. A non-RDF view, also served via Accept: application/geo+json; the same .geojson view is available on ./filter.

By-attribute filter

./filter?ags=09564
Every generation unit whose municipality key (AGS) starts with 09564 (here the Kreis of Nürnberg). ags is an AGS prefix, so one parameter selects at any grain — 09 (Land), 09564 (Kreis), 09564000 (Gemeinde) — matching the SKOS/LAU code hierarchy. Exact municipal containment, no bounding-box slop.
./filter?ags=09564&carrier=2495
The same, narrowed to a MaStR Energieträger code (carrier is repeatable / comma-separated). ags is required.

The two query endpoints ./within and ./filter are modelled as Linked Data Services (LIDS): each RDF response names the call itself as an entity under a #id fragment and links it to the matched records. A ./within call is a mastr:BoundingBox (its four mastr:minLon/minLat/maxLon/maxLat bounds) related to each hit via mastr:contains; a ./filter call is a mastr:Query (its active facets — mastr:ags, mastr:carrier) related to each hit via mastr:result. In Turtle the call entity relativizes host-free as <?…#id>. The .geojson view is a non-RDF representation and carries no call entity.

Spatial browser

The spatial browser is a Leaflet map widget over the German basemap.de tiles. Pan / zoom to a German city (zoom ≥ 11), and units within the visible window are loaded from the JSON-LD within endpoint and rendered as markers colour-coded by energy source. Clicking a marker fetches its full record (./{prefix}/{tail}.jsonld) and shows the properties in the right-hand panel.

Documentation

For project updates and changes, see the CHANGELOG.


Source: Marktstammdatenregister, Bundesnetzagentur. Licence: dl-de/by-2.0.