For developers, RegTech, and AI agents

The EU, structured.

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.

What you get

GET/api/v2/proprietary/brussels-lobbies

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

GET/api/v2/legislative/eur-lex/laws

28,500+ adopted EU laws. Filters by CELEX, doc type, policy area, publication date, full-text search.

GET/api/v2/legislative/oeil/procedures

1,200+ legislative files from proposal to adoption. Filters by OEIL reference, lead committee, rapporteur, last-update.

GET/api/v2/proprietary/catalan

8,710 binding EU laws translated into Catalan (MIT). Open data - no API key required. Filter by doc_type, category, engine; full-text search.

GET/api/v2/commission/consultations/by-initiative/{id}/feedback

Live stakeholder contributions from the EC Have Your Say portal. Paginated with country and user-type aggregates.

GET/api/v2/commission/commissioners/{name}/agenda

Live calendar items for all 27 college members. Name resolution is accent-insensitive.

GET/api/v2/predictions/{procedure_ref}/outcome

AI-predicted outcome probabilities and timeline for any ongoing EU legislative procedure (adopted, rejected, withdrawn or pending), with a confidence score and an uncertainty range.

GET/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+).

GET/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.

GET/api/v2/eeas/news

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

GET/api/v2/legislative/eur-lex/laws/{celex}/recital-article-map

TF-IDF cosine mapping of recitals to articles for any law. Top-3 recitals per article.

GET/api/v2/legislative/eur-lex/laws/{celex}/defined-terms

Article 3/4-style definitions dictionary. Hover-ready for annotating legal text.

GET/api/v2/extract

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

GET/api/v2/social/posts

Recent posts from mapped EU accounts (institutions, MEPs, Commissioners, EU-affairs journalists) across the open platforms, newest first.

Quickstart

Get your first API response in under two minutes.

1
Get a Professional subscription

Sign up at brubru.beresol.eu/subscription. Your API key will appear in your account settings within minutes.

2
Make your first request
curl -H "Authorization: Bearer brubru_live_..." \
  "https://brubru.beresol.eu/api/v2/legislative/eur-lex/laws?q=victims+rights+directive&limit=5"
3
Parse the response

Every endpoint returns the same paginated envelope. Extract the data array to iterate over results. Check has_more and next_page to paginate.

Authentication

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.

Response envelope

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"
  }
}

Code examples

Copy-paste examples for the most common integrations.

Python

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"])

JavaScript / Node.js

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));

MCP (any AI assistant)

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_..." }
    }
  }
}

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

Open source on GitHub: github.com/Beresol-BV/brubru-EU-scraper-library

pip install brubru
pip install "brubru-eurovoc[local]"   # [local] adds the classifier model

brubru On PyPI

A 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 PyPI

A 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_...")

Full documentation

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.

Rate limits and errors

CodeMeaning
200Success. See X-RateLimit-Remaining for your remaining calls in the window.
401Missing or invalid API key.
403Key valid but the owner is not on the Professional tier.
404Resource not found.
422Invalid query parameter.
429Rate limit exceeded. Respect the Retry-After header.
502Upstream 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.

Start building