GET /legal/eu-act
Returns the consolidated version of a European Union act or article in force at a given date: text, status, validity dates and coverage metadata. The lookup is served from a local store built from EUR-Lex / Cellar data, so a covered reference resolves in milliseconds without an account or API key. The corpus currently covers a selected set of EU acts and is expanding; an uncovered reference returns 404, never a paid empty answer.
Use it when an agent needs grounded EU law text it should not infer from memory:
the consolidated wording of a regulation, a directive article at a date, or the
validity window of a served consolidation. See the live
/catalog for the authoritative endpoint listing and price.
x402 golden rule: the agent pays for the answer to its question. A known
act or article with a consolidation covering the requested date is a successful
answer -> 200, even when the stored etat says the version is no longer the
current legal state. Requests the service cannot answer - missing identifiers,
invalid dates, unknown acts, unknown articles or dates outside all known
consolidations - leave the 200 range.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
celex | string | one identifier | CELEX identifier, for example 32016R0679 |
eli | string | one identifier | ELI identifier; used when celex is absent |
article | string | no | Article number within the act, for example 17; omitted for the act head |
date | string | no | UTC date to resolve, format YYYY-MM-DD; defaults to today’s date |
Provide at least one of celex or eli. If both are present, CELEX is used as
the lookup identifier and both supplied identifiers are echoed in data.
GET /legal/eu-act?celex=32016R0679&article=17&date=2026-01-01
Resolve the act head by omitting article:
GET /legal/eu-act?celex=32016R0679
Use ELI when the caller does not have a CELEX identifier:
GET /legal/eu-act?eli=eli/reg/2016/679/oj&article=17
200 response - UnifiedResponse
{
"data": { ... },
"provenance": {
"source": "eur-lex-cellar",
"fetched_at": "2026-06-20T12:00:00Z",
"freshness": { "kind": "snapshot", "as_of": "2026-06-01T00:00:00Z" }
}
}
provenance.source: source identifier from the served EUR-Lex store, commonlyeur-lex-cellar.freshness.kind:snapshot;as_ofis the store dump date that backed the answer.- EU law data is derived from EUR-Lex / Cellar data and must be reused with attribution to the European Union / Publications Office.
Fields of data
| Field | Type | Description |
|---|---|---|
celex | string | Echoed when the request supplied celex |
eli | string | Echoed when the request supplied eli |
article | string | Echoed when the request supplied an article number |
date | string | Effective resolution date in YYYY-MM-DD form |
label | string | Human label for the resolved act or article |
etat | string | Status carried as stored, never reinterpreted by the service |
text | string | Consolidated text of the selected version |
version | object | Validity period and source version identifier |
coverage | object | Completeness marker for the served consolidation |
celex, eli and article are omitted when they were not supplied. The first
public version serves English text from the local store; if a source-store
limitation or anomaly affects the served content, coverage.reason explains it
without inventing missing law.
version
| Field | Type | Description |
|---|---|---|
version_id | string | Stable identifier of the selected source version |
date_debut | string | Start date of this version, inclusive, in YYYY-MM-DD |
date_fin | string | null | End date of this version, exclusive; omitted when current |
coverage
| Field | Type | Description |
|---|---|---|
complete | bool | true when the store served an unambiguous consolidation |
reason | string | Present when complete: false, naming the source dump anomaly |
Example - article in force
{
"data": {
"celex": "32016R0679",
"article": "17",
"date": "2026-01-01",
"label": "Regulation (EU) 2016/679 (GDPR), Article 17",
"etat": "vigueur",
"text": "right to erasure",
"version": {
"version_id": "32016R0679-art-17-v1",
"date_debut": "2018-05-25"
},
"coverage": { "complete": true }
},
"provenance": {
"source": "eur-lex-cellar",
"fetched_at": "2026-06-20T12:00:00Z",
"freshness": { "kind": "snapshot", "as_of": "2026-06-01T00:00:00Z" }
}
}
Example - act head
When article is omitted, the service resolves the act-level entry served by
the store.
{
"data": {
"celex": "32016R0679",
"date": "2026-01-01",
"label": "Regulation (EU) 2016/679 (GDPR)",
"etat": "vigueur",
"text": "GDPR, consolidated act head",
"version": {
"version_id": "32016R0679-v1",
"date_debut": "2018-05-25"
},
"coverage": { "complete": true }
},
"provenance": {
"source": "eur-lex-cellar",
"fetched_at": "2026-06-20T12:00:00Z",
"freshness": { "kind": "snapshot", "as_of": "2026-06-01T00:00:00Z" }
}
}
Example - expired consolidation within its validity window
If the requested date is covered by a historical consolidation, the answer is a 200. The service exposes the stored status and validity dates; it does not convert a non-current status into an HTTP error.
{
"data": {
"celex": "31999L0093",
"article": "1",
"date": "2005-01-01",
"label": "Directive 1999/93/EC, Article 1 (repealed)",
"etat": "vigueur",
"text": "e-signatures (expired)",
"version": {
"version_id": "31999L0093-art-1-v1",
"date_debut": "2000-01-19",
"date_fin": "2016-07-01"
},
"coverage": { "complete": true }
},
"provenance": {
"source": "eur-lex-cellar",
"fetched_at": "2026-06-20T12:00:00Z",
"freshness": { "kind": "snapshot", "as_of": "2026-06-01T00:00:00Z" }
}
}
Coverage honesty
The service answers from a local snapshot of EUR-Lex / Cellar data. It does not
fetch EUR-Lex at request time, search by keyword, interpret case law, translate
missing language versions or infer absent articles. etat is carried from the
source store as legal metadata; callers should treat it as the authoritative
status for the selected consolidation.
coverage.complete: false is reserved for source-store anomalies, such as
overlapping versions where the service selected the most recent start date.
Unknown acts, unknown articles and dates not covered by any known consolidation
are not partial paid answers: they return 4xx errors.
Errors
Only requests the service cannot answer leave the 200 range.
| Status | code | Case |
|---|---|---|
| 400 | INVALID_REF | Both celex and eli are missing or empty |
| 400 | INVALID_DATE | date is present but not formatted as YYYY-MM-DD |
| 404 | UNKNOWN_ACT | The act identifier is well formed but no matching act exists |
| 404 | UNKNOWN_ARTICLE | The act exists, but the requested article is not present in the store |
| 404 | NO_VERSION_AT_DATE | The act or article exists, but no consolidation covers the date |
| 500 | INTERNAL | Internal error (detail logged, not exposed) |
{ "error": "query parameter `celex` (e.g. `32016R0679`) or `eli` is required", "code": "INVALID_REF" }
{ "error": "invalid `date` `2018`; expected ISO calendar format YYYY-MM-DD", "code": "INVALID_DATE" }
{ "error": "no act `39999R9999` found in the store", "code": "UNKNOWN_ACT" }
{ "error": "no article `999` found in act `32016R0679`", "code": "UNKNOWN_ARTICLE" }
{ "error": "Directive 1999/93/EC, Article 1 (repealed) has no consolidated version in force on 2020-01-01", "code": "NO_VERSION_AT_DATE" }
Attribution
EU law data is derived from EUR-Lex / Cellar data made available by the Publications Office of the European Union. Reuse must preserve attribution to the European Union and EUR-Lex.
See also
GET /legal/article- French law article text in force at a date from the LEGI dataset.- For agents - discovery surfaces, the live
/catalogand how settlement works.