Europa APIeur-lex.europa.eu ↗
Access EU regulations, directives, decisions, full text, metadata, procedure history, and Official Journal publications via the EUR-Lex API.
What is the Europa API?
This API exposes 7 endpoints covering the full EUR-Lex corpus of EU legal documents, from metadata retrieval to full HTML text and national transposition measures. Use search_documents to filter regulations, directives, and decisions by keyword, year, CELEX number, or document type, and use get_document_metadata to pull structured fields including ELI URI, in-force status, authors, and all literal properties stored in the Cellar linked-data repository.
curl -X GET 'https://api.parse.bot/scraper/fba146da-e9c1-44ce-a43f-e7ecc1dceebe/search_documents?page=1&sort=celex&year=2024&order=desc&query=data+protection&doc_type=REG' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace eur-lex-europa-eu-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: EUR-Lex EU Law API — search, inspect, and navigate EU legislation."""
from parse_apis.eur_lex_eu_law_api import EurLex, DocType, SortField, Sort, DocumentNotFound
client = EurLex()
# Search for EU regulations from 2024 sorted by date descending
for doc in client.documents.search(year="2024", doc_type=DocType.REG, sort=SortField.DATE, order=Sort.DESC, limit=3):
print(doc.celex, doc.title[:80], doc.date)
# Drill into a specific document by CELEX number
gdpr = client.documents.get(celex="32016R0679")
print(gdpr.title, gdpr.type, gdpr.authors)
# Access the document's sub-resources: summary, procedure, transposition
summary = gdpr.summary.get()
print(summary.summary_text[:200] if summary.summary_text else "No summary")
proc = gdpr.procedure.get()
for event in proc.procedure_timeline:
print(event.date, event.event)
# Typed error handling for a non-existent document
try:
client.documents.get(celex="39999X0000")
except DocumentNotFound as exc:
print(f"Not found: {exc.celex}")
# Get Official Journal acts for a specific date
oj_day = client.officialjournaldays.get(date="2024-01-15")
for act in oj_day.acts:
print(act.celex, act.type)
print("exercised: documents.search / documents.get / summary.get / procedure.get / officialjournaldays.get")
Search for EU legal documents using keywords, year, document number, or type. Queries the Cellar SPARQL endpoint. Text search (query parameter) performs a case-insensitive title match and works best combined with year or doc_type filters; broad text-only queries may time out upstream. Returns paginated results of 20 per page.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (20 results per page) |
| sort | string | Sort field |
| year | string | Filter by document year (e.g. 2024) |
| order | string | Sort order |
| query | string | Search keywords to match in document titles (case-insensitive substring match). Works best combined with year or doc_type filters. |
| number | string | Filter by document number |
| doc_type | string | Filter by document type code |
{
"type": "object",
"fields": {
"page": "integer current page number",
"results": "array of document objects with celex, title, date, type, status, author, link",
"page_size": "integer results per page (20)"
},
"sample": {
"data": {
"page": 1,
"results": [
{
"date": "2025-12-05",
"link": "https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX:32024R1679R(01)",
"type": "REG",
"celex": "32024R1679R(01)",
"title": "Corrigendum to Regulation (EU) 2024/1679...",
"author": "CONSIL",
"status": ""
}
],
"page_size": 20
},
"status": "success"
}
}About the Europa API
Document Search and Metadata
The search_documents endpoint accepts keyword queries, a year filter, a number filter, and a doc_type parameter (REG, DIR, or DEC). Results are paginated at 20 items per page and can be sorted by date or celex in ascending or descending order. Each result object carries the document's celex identifier, title, date, type, status, author, and a direct link. For a specific document, get_document_metadata returns the full property set: eli (European Legislation Identifier URI), in_force flag, date_document, date_entry_into_force, authors array, and an all_properties object with every literal property available for that work.
Full Text, Summaries, and Official Journal
get_document_text_html returns the complete HTML body of a document in full_text_html alongside an articles array where each entry has id, title, and content. Article extraction works best for OJ-published legislative acts; non-legislative documents may return full text without structured article segmentation. get_document_summary delivers the official plain-language summary in both summary_html and summary_text fields — both return null when no summary exists. get_official_journal_daily accepts a date in DDMMYYYY or YYYY-MM-DD format (defaults to today) and returns the full list of acts published that day, each with celex, title, type, and link.
Procedure History and National Transposition
get_document_procedure reconstructs the legislative lifecycle for a document: the procedure_timeline array lists dated events (signature, entry into force, etc.) while related_documents captures legal basis, amending acts, and repeals with their relationship type. For directives specifically, get_national_transposition returns an array of country objects, each with a measures array listing the national implementing measures with title and link to the source text.
The Europa API is a managed, monitored endpoint for eur-lex.europa.eu — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when eur-lex.europa.eu changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official eur-lex.europa.eu API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor newly published EU regulations and directives by querying
get_official_journal_dailyfor each trading day. - Build a compliance tracker that flags documents where
in_forceis 1 anddate_entry_into_forcefalls within a target window. - Extract structured article text from GDPR or other regulations using
get_document_text_htmlto power legal search tools. - Map directive transposition status across EU member states using
get_national_transpositionfor a given directive CELEX number. - Construct a legislative history graph by walking
related_documentsreturned byget_document_procedureacross amending and repealing acts. - Generate plain-language policy briefings using
summary_textfromget_document_summaryfor a curated set of CELEX identifiers. - Filter all decisions from a specific year by combining
doc_type=DECand ayearparameter insearch_documents.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does EUR-Lex have an official developer API?+
What does `get_document_metadata` return beyond the document title?+
eli URI, the type code, the in_force flag (1 or 0), date_document, date_entry_into_force (which may be a single date or an array), an authors array of corporate body codes, and an all_properties object containing every literal property recorded for that work in the Cellar repository.Does article extraction work for all document types?+
get_document_text_html works best for OJ-published legislative documents such as regulations and directives. Non-legislative documents return content in full_text_html but the articles array may be empty. If article-level parsing for non-legislative document types is important, you can fork the API on Parse and revise the extraction logic for those cases.Can I search documents in languages other than English?+
language parameter targeting other language versions.Is there a way to retrieve the consolidated (amended) version of a regulation rather than the original?+
get_document_procedure, but consolidated text retrieval is not a dedicated endpoint. EUR-Lex does publish consolidated versions under separate CELEX identifiers. You can fork the API on Parse and add an endpoint that targets consolidated CELEX numbers directly.