The EU, structured.
Brubru is a vertical EU data provider. Our REST API gives developers, RegTech platforms, public-affairs teams, and AI agents programmatic access to 8,710 adopted EU laws (28,513 OJ publications), 2,080 legislative files tracked from proposal to adoption, 16,521 EU officials, every MEP, 58,399 EP amendments, the Parliament / Council / European Council / Eurogroup / Commission registers, the European Central Bank and the EU financial institutions, the decentralised EU agencies (medicines, food safety, environment, chemicals, drugs, fundamental rights and more), EU funding and tenders, open data including 12 curated Eurostat sport + fitness-relevant health datasets served live, the 19 funding-application templates behind Brubru's Tender Docs product, and Brubru's own proprietary EU intelligence. The same data we use internally is what you call. Brubru is the first customer of its own API.
One surface, one key. The API is organised the way the EU is: one folder per institution or body, 88 folders in total, 966 endpoints. Browse the folders below, or open the full, always-current API reference →: every deployed endpoint, rendered live from the OpenAPI spec.
New to APIs? An API is a way for your software to talk to Brubru's software over the internet. You send an HTTP request (like a web browser does), we send back JSON (structured data). The rest of these docs explain how.
What you get
Every folder maps to one EU institution or body. The counts are exact and update as the API grows.
Legislation (1 folder)
European Parliament (1 folder)
Council & summits (3 folders)
European Commission (1 folder)
Economic & financial (3 folders)
EU agencies (18 folders)
Funding & consultations (2 folders)
Predictions, calendar & registers (3 folders)
Open data & people (4 folders)
Proprietary intelligence (1 folder, 2 sub-routers)
Data sources & refresh cadence
The whole v2 surface is re-synced daily (a 10:00 / 15:00 / 21:00 UTC sweep). The underlying EU sources behind each folder refresh on the cadences below.
| Refresh cadence | What it covers |
|---|---|
| Every 6 hours | Adopted laws, legislative procedures, plenary texts & votes, the Commission Register, institutional press releases, the calendar |
| Every 12 hours | Committee work items, amendments, reports, EPRS research, Council documents, webstreams |
| Daily | Consultations, parliamentary questions, comitology, sanctions, trade-defence measures, TRIS notifications, tenders, infringements, funding calls; plus the ECB, EU financial institutions, ESM, the 18 decentralised agencies, open data and general publications |
| Weekly | Geographical indications, Commissioner agendas, RSB opinions, EPRS / STOA / JRC research, EU-funded projects |
| Monthly | EU officials and departments (the Who Is Who bulk re-ingest) |
| Live (real-time) | MEP profiles, DG COMP competition cases, the Combined Nomenclature, the legal-text and citation resolvers |
| On publish | The Brubru proprietary layer: knowledge guides, EU Canon deep-dives, Catalan translations, Tender Docs funding-application templates |
Authentication at a glance
Every /api/v2/* call requires an API key passed either as a Bearer token or an X-API-Key header:
curl -H "Authorization: Bearer brubru_live_..." \
"https://brubru.beresol.eu/api/v2/legislative/eur-lex/laws?q=artificial+intelligence&limit=5"
Full details on Authentication.
Response envelope at a glance
Every paginated endpoint returns the same shape. Code once against this envelope and swap datasets by changing the path:
{
"total": 139,
"returned": 20,
"pages": 7,
"page": 1,
"limit": 50,
"has_more": true,
"next_page": 2,
"remaining_pages": 6,
"coverage_complete": true,
"published_from": "2026-01-01",
"published_to": "2026-01-31",
"published_end": "2026-01-31",
"detail_level": "Full",
"data": [ ... ]
}
Provenance and rate-limit info live on response headers, not in the body:
X-Powered-By: Brubru
X-Source: brubru.beresol.eu
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Tier: free
Full details on Response envelope.
Quickstart: your first call
1. Get an API key. Email hello@beresol.eu once you're on the Professional subscription. Keys look like brubru_live_ followed by 48 hex characters.
2. Check the service is up. The health check is public: no key required:
curl "https://brubru.beresol.eu/health"
Response:
{
"status": "ok",
"service": "brubru-data-provider",
"time": "2026-04-20T15:00:00Z"
}
3. Try a real search.
curl -H "Authorization: Bearer $BRUBRU_API_KEY" \
"https://brubru.beresol.eu/api/v2/legislative/eur-lex/laws?q=artificial+intelligence&limit=3"
You get a paginated list of EU laws matching "artificial intelligence", with CELEX identifiers, titles, dates, and EUR-Lex URLs. From there every other endpoint follows the same envelope pattern: just change the path.
Limitations (what we don't cover)
- Non-EU legislation. We don't track national gazettes directly. If you need Spanish BOE + EU together, pair us with GovClipping or similar.
- Real-time push. No webhooks or SSE yet. Polling on our refresh cadence is the integration pattern. Webhooks on the September 2026 roadmap.
- Languages. API responses are English today. Some law texts are available in all 24 EU languages via the Cellar fallback but the structured responses are English-only. Multilingual endpoints in September 2026.
- Bulk exports. No nightly CSV/Parquet dumps yet. Roadmap September 2026. For now, iterate paginated lists.
- National parliaments. We don't ingest from national parliaments. EP only.
Client libraries
Two official Python libraries wrap the API and its EuroVoc classifier so you are one import away. Both are on PyPI and open source (MIT) at github.com/Beresol-BV/brubru-EU-scraper-library.
pip install brubru
pip install "brubru-eurovoc[local]" # [local] adds the classifier model
brubru: a thin Python SDK over the v2 API. Typed objects over the 5-datapoint contract, automatic pagination, honest errors. The API's own client.
import brubru
bru = brubru.Client(api_key="brubru_live_...")
# Extract structured items from any EU URL, tagged with EuroVoc
items = bru.extract("https://cinea.ec.europa.eu/news_en", classify=True)
# Recent posts from a mapped entity (MEP, Commissioner, institution, journalist)
posts = bru.social.posts(entity_type="commissioner", platform="x")
eurovoc (PyPI distribution brubru-eurovoc, import name eurovoc): a standalone, open-source EuroVoc classifier. It tags any text into the EU's official subject space (7,029 descriptors, 127 microthesauri, 21 domains), multilingual including Catalan. A modern successor to the 2021 PyEuroVoc package, and the natural home for a retrained long-context model.
import eurovoc
eurovoc.classify("Markets in crypto-assets regulation")
# -> [{"descriptor": "financial instrument", "mt": "2426", "domain": "24", "score": 0.88}, ...]
# or classify a live EU URL through the hosted engine (needs the brubru SDK)
eurovoc.classify_url("https://environment.ec.europa.eu/news_en", api_key="brubru_live_...")
PyPI is the canonical install. Direct downloads are also available for offline use:
- brubru on PyPI · wheel · source
- brubru-eurovoc on PyPI · wheel · source
- Source repository: github.com/Beresol-BV/brubru-EU-scraper-library