Brubru is a vertical EU data provider. Our REST API now spans every EU institution, body and agency: 935 endpoints across 88 folders, one folder per institution. You get real-time access to 28,500+ adopted laws, 1,200+ legislative procedures, live consultation feedback, commissioner agendas, AI legislative-outcome predictions, the unified EU institutional calendar, the Transparency Register, and the legal-text intelligence layer that powers Brubru's own chatbot and Amendator. Brubru itself is the first user of its own API.
Self-serve API keys are minted from your Brubru account. Sign in or create one to get started.
/api/v2/proprietary/brussels-lobbiesEvery Brussels-based EU Transparency Register organisation, ranked, with the news and updates each one publishes on its own website. Filters by organisation type, policy interest and lobbying spend; news-availability flags per org.
/api/v2/legislative/eur-lex/laws28,500+ adopted EU laws. Filters by CELEX, doc type, policy area, publication date, full-text search.
/api/v2/legislative/oeil/procedures1,200+ legislative files from proposal to adoption. Filters by OEIL reference, lead committee, rapporteur, last-update.
/api/v2/proprietary/catalan8,710 binding EU laws translated into Catalan (MIT). Open data - no API key required. Filter by doc_type, category, engine; full-text search.
/api/v2/commission/consultations/by-initiative/{id}/feedbackLive stakeholder contributions from the EC Have Your Say portal. Paginated with country and user-type aggregates.
/api/v2/commission/commissioners/{name}/agendaLive calendar items for all 27 college members. Name resolution is accent-insensitive.
/api/v2/predictions/{procedure_ref}/outcomeAI-predicted outcome probabilities and timeline for any ongoing EU legislative procedure (adopted, rejected, withdrawn or pending), with a confidence score and an uncertainty range.
/api/v2/proprietary/tender-docs/templates/{template_id}One full EU funding-application template by id: every section, AI co-writer prompt seeds, comply targets, reference-doc bundle and Grant Agreement URLs. 19 templates across 8 programmes (EIC, Erasmus+, Digital Europe, CERV, LIFE, Creative Europe, CEF, ESF+).
/api/v2/open-data/eurostat-series/{dataset_code}One Eurostat dataset fetched live: JSON-stat 2.0 payload, parsed dimensions, sample observations and Eurostat's last-update date. 12 curated sport + fitness-relevant health series (physical activity, BMI, household sport spend, cultural employment) plus any Eurostat code on the detail endpoint.
/api/v2/eeas/newsPress material, publications, events, tenders and topic pages from the European External Action Service, the EU’s diplomatic service. The 352 officials come from who-is-who.
/api/v2/legislative/eur-lex/laws/{celex}/recital-article-mapTF-IDF cosine mapping of recitals to articles for any law. Top-3 recitals per article.
/api/v2/legislative/eur-lex/laws/{celex}/defined-termsArticle 3/4-style definitions dictionary. Hover-ready for annotating legal text.
/api/v2/extractPoint it at any EU institutional URL: it detects the platform, fetches through the right anti-bot path, and returns structured items with the 5-datapoint contract.
/api/v2/social/postsRecent posts from mapped EU accounts (institutions, MEPs, Commissioners, EU-affairs journalists) across the open platforms, newest first.
Get your first API response in under two minutes.
Sign up at brubru.beresol.eu/subscription. Your API key will appear in your account settings within minutes.
curl -H "Authorization: Bearer brubru_live_..." \
"https://brubru.beresol.eu/api/v2/legislative/eur-lex/laws?q=victims+rights+directive&limit=5"Every endpoint returns the same paginated envelope. Extract the data array to iterate over results. Check has_more and next_page to paginate.
Every /api/v1/* endpoint requires an API key. Pass it as Authorization: Bearer <key> (recommended) or X-API-Key: <key>. Keys are minted by Brubru's admin team for Professional subscribers. Rate limit is 60 requests per minute per key.
curl -H "Authorization: Bearer brubru_live_..." \
"https://brubru.beresol.eu/api/v2/legislative/eur-lex/laws?policy_area=Trade&limit=10"X-API-Key is also accepted for curl-friendly scripts. Bearer is the default for Postman, OpenAPI tooling, and SDKs.
Every paginated endpoint returns the same shape. Partners can code once against the envelope and swap datasets by changing the path.
{
"total": 139,
"returned": 20,
"pages": 7,
"page": 1,
"limit": 20,
"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": [ ... ],
"meta": {
"source": "brubru.beresol.eu",
"powered_by": "Brubru",
"fetched_at": "2026-04-15T12:34:56Z"
}
}Copy-paste examples for the most common integrations.
import requests
API_KEY = "brubru_live_..."
BASE = "https://brubru.beresol.eu/api/v2"
# Search laws by keyword
resp = requests.get(f"{BASE}/legislative/eur-lex/laws",
params={"q": "end-of-life vehicles circularity", "limit": 5},
headers={"Authorization": f"Bearer {API_KEY}"})
for law in resp.json()["data"]:
print(f'{law["celex"]} {law["title"][:80]}')
# Or browse the moat: ranked Brussels-based lobby orgs with their own news
resp = requests.get(f"{BASE}/proprietary/brussels-lobbies",
params={"has_news": "true", "order": "recent", "limit": 10},
headers={"Authorization": f"Bearer {API_KEY}"})
for org in resp.json()["data"]:
print(org["name"], "—", org["org_type"], "—", org["last_item_date"])const API_KEY = "brubru_live_...";
const BASE = "https://brubru.beresol.eu/api/v2";
const res = await fetch(`${BASE}/legislative/eur-lex/laws?q=end-of-life+vehicles+circularity&limit=5`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const { data } = await res.json();
data.forEach(law => console.log(law.celex, law.title));Brubru exposes a Model Context Protocol (MCP) server. Connect it to Claude, ChatGPT, Gemini, Mistral, or any MCP-compatible AI agent to give your assistant live EU legislative intelligence.
// MCP server configuration
{
"mcpServers": {
"brubru": {
"url": "https://brubru-production.up.railway.app/api/mcp",
"headers": { "Authorization": "Bearer brubru_live_..." }
}
}
}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).
Open source on GitHub: github.com/Beresol-BV/brubru-EU-scraper-library
pip install brubru
pip install "brubru-eurovoc[local]" # [local] adds the classifier modelbrubru On PyPIA thin Python SDK over the v2 API: typed objects over the 5-datapoint contract, automatic pagination and 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 On PyPIA standalone, open-source EuroVoc classifier that 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 run it through the hosted classifier over the API
eurovoc.classify("...", backend="brubru", api_key="brubru_live_...")The full API reference lives on its own microsite: introduction, authentication, response envelope, errors, rate limits, every endpoint documented with parameters and curl examples, a matrix of every EU institution we ingest from, a glossary for every acronym, role-specific use cases, and a dated changelog.
| Code | Meaning |
|---|---|
| 200 | Success. See X-RateLimit-Remaining for your remaining calls in the window. |
| 401 | Missing or invalid API key. |
| 403 | Key valid but the owner is not on the Professional tier. |
| 404 | Resource not found. |
| 422 | Invalid query parameter. |
| 429 | Rate limit exceeded. Respect the Retry-After header. |
| 502 | Upstream EU portal temporarily unavailable (e.g. Have Your Say, Commission calendar). |
Error responses use a canonical envelope: { error, reason_code, request_id }. Every response also carries an X-Request-Id header for support traceability.