---
name: banque-de-france-webstat-api-ingestion
description: "How to get Banque de France Webstat API data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Load a Webstat series into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/banque-de-france-webstat-api
Provider: https://webstat.banque-france.fr/pages/guide-migration-api/?flg=en-us
Checked against the provider's documentation: 2026-11-01

## Access
- Create a free Webstat account and API key.
- Set the key in BANQUE_DE_FRANCE_API_KEY; send it as Authorization: Apikey <key>.

## Request
```bash
curl -H "Authorization: Apikey $BANQUE_DE_FRANCE_API_KEY" 'https://webstat.banque-france.fr/api/explore/v2.1/catalog/datasets/observations/exports/json?select=time_period_end,obs_value&where=series_key%3D%27MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O%27'
```

## Format
JSON array of selected observation fields; the full observations table includes dataset and series IDs, French and English titles, period start and end, value, status, update timestamp and observation attributes.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""Banque de France Webstat series -> pandas -> Parquet. Needs a free API key."""
import os
import requests
import pandas as pd

URL = "https://webstat.banque-france.fr/api/explore/v2.1/catalog/datasets/observations/exports/json"
key = os.environ["BANQUE_DE_FRANCE_API_KEY"]
params = {
    "select": "time_period_end,obs_value",
    "where": "series_key='MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O'",
}
headers = {"Authorization": f"Apikey {key}", "Accept": "application/json"}
r = requests.get(URL, params=params, headers=headers, timeout=60)
r.raise_for_status()
df = pd.DataFrame(r.json())
df["time_period_end"] = pd.to_datetime(df["time_period_end"])
df.to_parquet("banque_de_france_webstat.parquet", index=False)
print(len(df), "observations", df["time_period_end"].min().date(), "to", df["time_period_end"].max().date())
```
Not run: it needs a free API key.

## Limits
- Daily quota: 10,000 requests per user account.
- The API returns HTTP 429 after the daily quota is reached.
- Updates are published three times daily at 09:00, 13:00 and 21:00 Paris time.

## Quirks
- Use a where or refine clause on observations; the guide warns that omitting it can return all rows.
- The API does not join its four main catalog tables, so request series and codelist metadata separately.
- The provider asks clients to store downloaded data locally instead of polling repeatedly.

## Terms and attribution
- Cite the source of any reused dataset.
- Check the open or particular licence attached to each dataset before download or extraction.
- Creating multiple accounts to bypass the daily quota is prohibited.
- Terms page: https://webstat.banque-france.fr/terms/terms-and-conditions/?flg=fr-fr

## Sources
- https://webstat.banque-france.fr/pages/guide-migration-api/?flg=en-us: "Using the API requires a key that can be passed as an HTTP parameter in the URL, or, and this is the recommended way, in an HTTP header."
- https://webstat.banque-france.fr/pages/guide-migration-api/?flg=en-us: "Daily Quota: 10,000 Requests"
- https://webstat.banque-france.fr/terms/terms-and-conditions/?flg=fr-fr: "En toute hypothèse, mentionner la source des JEUX DE DONNEES en cas de réutilisation de tout ou partie de ceux-ci."

## 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.
