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

ParameterTypeRequiredDescription
celexstringone identifierCELEX identifier, for example 32016R0679
elistringone identifierELI identifier; used when celex is absent
articlestringnoArticle number within the act, for example 17; omitted for the act head
datestringnoUTC 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, commonly eur-lex-cellar.
  • freshness.kind: snapshot; as_of is 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

FieldTypeDescription
celexstringEchoed when the request supplied celex
elistringEchoed when the request supplied eli
articlestringEchoed when the request supplied an article number
datestringEffective resolution date in YYYY-MM-DD form
labelstringHuman label for the resolved act or article
etatstringStatus carried as stored, never reinterpreted by the service
textstringConsolidated text of the selected version
versionobjectValidity period and source version identifier
coverageobjectCompleteness 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

FieldTypeDescription
version_idstringStable identifier of the selected source version
date_debutstringStart date of this version, inclusive, in YYYY-MM-DD
date_finstring | nullEnd date of this version, exclusive; omitted when current

coverage

FieldTypeDescription
completebooltrue when the store served an unambiguous consolidation
reasonstringPresent 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.

StatuscodeCase
400INVALID_REFBoth celex and eli are missing or empty
400INVALID_DATEdate is present but not formatted as YYYY-MM-DD
404UNKNOWN_ACTThe act identifier is well formed but no matching act exists
404UNKNOWN_ARTICLEThe act exists, but the requested article is not present in the store
404NO_VERSION_AT_DATEThe act or article exists, but no consolidation covers the date
500INTERNALInternal 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 /catalog and how settlement works.