From the bund.dev idea to real API constraints and a three-layer R architecture.
R
OpenData
APIs
DataScience
Author
Michael Bücker
Published
February 15, 2026
bund.dev is a central infrastructure layer for discovering and documenting APIs from German federal institutions.1bunddev translates that principle into an R-oriented analysis model: from API discovery to standardized requests and direct downstream use in reproducible data-science workflows.2
A Brief History of bund.dev
Publicly available sources show a clear trajectory:
In July 2021, the bundesAPI/sofortmassnahmen repository was created as a civil-society participation process around Germany’s “Second Open Data Act”.3
The documented 5-point plan defined a target state in which federal datasets and administrative procedures should be accessible via APIs by 2024.4
bund.dev positions itself as a development and documentation portal: discoverability, documentation, and reuse of APIs.5
The Python package bundesAPI/deutschland (since 2021) illustrates that the ecosystem moved early from documentation toward practical implementation.6
Crucially, this foundation was built by volunteers, although API documentation at this scale would normally require institutional support. The resulting professional quality even led to occasional perception as an official government service.78
This also exposed a structural weakness: civil society effectively compensated for a gap in public digital infrastructure.
In parallel, public backlash emerged. It was reported that some agencies started hardening interfaces that had become more visible through documentation, which is still visible today, including in parts of the Federal Employment Agency context.9
The core point remains: open data only becomes meaningful when it is actually usable under real technical conditions, for civil society, research, and product development.
Why an R Package?
In R-based data-science projects, value is created when public data can move into a consistent pipeline without friction:
retrieve
clean
join
visualize
model
That was the gap: APIs on bund.dev are highly valuable, but heterogeneous in structure, authentication, and response design. R workflows lacked a unified access layer.
zoll: endpoints removed (redesign) plus Radware bot protection.
berufssprachkurssuche: public OAuth2 credentials revoked by BA.
coachingangebote: public OAuth2 credentials revoked by BA.
entgeltatlas: no official public API according to BA; credentials revoked.
weiterbildungssuche: undocumented internal BA endpoint; credentials revoked.
There are also known constraints in active adapters. For example, hochwasserzentralen can return empty lagepegel responses intermittently. diga requires a valid bearer token, which limits immediate public reproducibility.
Practical Usage
The following examples explicitly mirror the bunddev architecture: Registry → OpenAPI Core → Adapters.
1) Registry Layer: Discover and Classify APIs
The first step is intentionally methodological: do not call endpoints blindly. Instead, identify relevant APIs and inspect metadata first. bunddev_list(tag = "energy") provides a compact overview. bunddev_info("smard") then adds key API metadata such as base URL, tags, and documentation link.
library(bunddev)# Which APIs are tagged as energy-related?bunddev_list(tag ="energy")
# A tibble: 3 × 8
id title provider spec_url docs_url auth rate_limit tags
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <lis>
1 ladestationen Ladesaeulen… Bundesn… https:/… https:/… none <NA> <chr>
2 marktstammdaten Marktdatens… Bundesn… https:/… https:/… none <NA> <chr>
3 smard SMARD API Bundesn… https:/… https:/… none Mehr als … <chr>
# Metadata for a specific APIbunddev_info("smard")
# A tibble: 1 × 8
id title provider spec_url docs_url auth rate_limit tags
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <lis>
1 smard SMARD API Bundesnetzagentur https://raw… https:/… none Mehr als … <chr>
2) OpenAPI Core Layer: Turn Specs into Robust Calls
The second step targets robustness: many failures come from wrong assumptions about IDs, parameter domains, or path variables. bunddev_parameters("smard") exposes spec-defined parameters. bunddev_parameter_values(smard_timeseries, "filter") then provides valid filter values for the exact function used later.
# Spec-defined parameters for SMARDbunddev_parameters("smard")
# A tibble: 14 × 8
method path name location required description schema_type enum
<chr> <chr> <chr> <chr> <lgl> <chr> <chr> <lis>
1 get /chart_data/{fi… filt… path TRUE "Mögliche … integer <int>
2 get /chart_data/{fi… regi… path TRUE "Land / Re… string <chr>
3 get /chart_data/{fi… reso… path TRUE "Auflösung… string <chr>
4 get /chart_data/{fi… filt… path TRUE "Mögliche … integer <int>
5 get /chart_data/{fi… filt… path TRUE "Muss dem … integer <int>
6 get /chart_data/{fi… regi… path TRUE "Land / Re… string <chr>
7 get /chart_data/{fi… regi… path TRUE "Muss dem … string <chr>
8 get /chart_data/{fi… reso… path TRUE "Auflösung… string <chr>
9 get /chart_data/{fi… time… path TRUE <NA> integer <chr>
10 get /table_data/{fi… filt… path TRUE "Mögliche … integer <int>
11 get /table_data/{fi… filt… path TRUE "Muss dem … integer <int>
12 get /table_data/{fi… regi… path TRUE "Land / Re… string <chr>
13 get /table_data/{fi… regi… path TRUE "Muss dem … string <chr>
14 get /table_data/{fi… time… path TRUE <NA> integer <chr>
# Valid values for a specific parameterbunddev_parameter_values(smard_timeseries, "filter")
bunddev primarily serves as a productivity layer for open-data analytics in R: lower API friction, stronger focus on the analytical question itself. The combination of registry, generic OpenAPI core, and tidy adapters makes federal data sources not only reachable, but quickly analyzable in practice.
If an adapter is missing or an endpoint breaks, issues and PRs are always welcome.