---
name: bundesbank-sdmx-api-ingestion
description: "How to get Deutsche Bundesbank SDMX API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load Bundesbank USD/EUR rates into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/bundesbank-sdmx-api
Provider: https://statistiken.bundesbank.de/statistiken-en/help-991452?article=bundesbank-sdmx-web-service-api-991448
Checked against the provider's documentation: 2026-11-01

## Access
- No account or key was required for the checked SDMX CSV query.
- Public ESCB statistics require source attribution; third-party data can carry separate permissions.

## Request
```bash
curl 'https://api.statistiken.bundesbank.de/rest/data/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx_csv&startPeriod=2026-10-01&endPeriod=2026-11-01'
```

## Format
Semicolon-delimited SDMX CSV with a BOM, series dimensions, TIME_PERIOD, OBS_VALUE, status, unit, title, source and commentary attributes.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Bundesbank daily USD per EUR reference rate -> pandas -> Parquet. No key."""
import io
import requests
import pandas as pd

URL = "https://api.statistiken.bundesbank.de/rest/data/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx_csv&startPeriod=2026-10-01&endPeriod=2026-11-01"
r = requests.get(URL, timeout=60)
r.raise_for_status()
df = pd.read_csv(io.StringIO(r.text), sep=";", na_values=["."])
df["TIME_PERIOD"] = pd.to_datetime(df["TIME_PERIOD"])
df.to_parquet("bundesbank_usd_eur.parquet", index=False)
valid = df.dropna(subset=["OBS_VALUE"])
print(len(df), "daily rows", valid["TIME_PERIOD"].min().date().isoformat(), "to",
      valid["TIME_PERIOD"].max().date().isoformat(), "latest", valid.iloc[-1]["OBS_VALUE"])
```
Run by us on 2026-11-01 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 30 daily rows 2026-10-01 to 2026-10-30 latest 1.1172

## Limits
- Rate limit: Not stated.
- Plain SDMX CSV is limited to 200 time series; larger or mixed-frequency requests can return ZIP.
- HTTP 413 indicates too much data and background generation rather than an immediately complete response.

## Quirks
- SDMX CSV is semicolon-delimited and begins with a UTF-8 BOM.
- The provider uses a dot for missing observations; pass it as an NA value before numeric analysis.
- Daily series can include weekend rows with missing values, so count valid observations separately from returned periods.

## Terms and attribution
- Quote the source and do not modify public ESCB statistics or metadata when relying on the free-reuse condition.
- Third-party data are excluded from free reuse unless the originator permits it.
- Published series may change through revisions or other updates.
- Terms page: https://www.bundesbank.de/en/homepage/user-information/terms-of-use-642972?index=6

## Sources
- https://statistiken.bundesbank.de/content/991448.md: "With the Bundesbank SDMX Web Service, the Bundesbank offers a technical REST-API interface that can be used to automatically download statistical data by calling a URL."
- https://statistiken.bundesbank.de/content/991448.md: "If more than 200 time series or different periodicities are in CSV format, a ZIP file is returned."
- https://www.bundesbank.de/en/homepage/user-information/terms-of-use-642972?index=6: "All publicly available ESCB statistics may be reused free of charge on the condition that the source is quoted"
- https://www.bundesbank.de/en/homepage/user-information/terms-of-use-642972?index=6: "The right of free reuse does not apply to third-party data without a prior permission from the originator."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
