# Is this EU act in force? Look it up in EUR-Lex by CELEX or ELI > EU law addressed by its stable identifier — CELEX or ELI — instead of a title an agent may have hallucinated. One call returns the act or article text at a date, its status and its validity window. Published 2026-06-28 · Updated 2026-08-16 · HTML version: https://invoket.com/blog/is-this-eu-act-in-force-by-celex-or-eli --- An agent that reasons about EU law should not pull the text of a regulation from its own weights. EU acts are consolidated and amended over time, and a model's recollection is a paraphrase with no version, no date, and no way to tell whether it is still the law. The reliable move is to **address the act by its stable identifier — CELEX or ELI — and resolve the consolidated text in force on a date**. One paid call — [`GET /legal/eu-act`](/docs/api/legal-eu-act) — returns the text, its status, and the validity window it applies to. ## The problem: EU law is identifier-addressed and time-scoped European law has two properties that defeat recall and reward lookup. First, each act has a **stable identifier**: a CELEX number (`32016R0679` for the GDPR) or an ELI (`eli/reg/2016/679/oj`). That identifier — not a title an agent half-remembers — is the correct key. Second, an act is **consolidated over time**: the wording of an article on one date is not the wording on another. "Is this in force?" is only meaningful relative to a date. The consolidated EUR-Lex / Cellar corpus that holds this is bulky, versioned reference data. It is exactly what should be looked up against a known snapshot rather than stored in a model. ## The call: text, status and validity for an identifier and date `GET /legal/eu-act` takes a `celex` **or** an `eli`, an optional `article`, and an optional `date` (defaults to today). Omit `article` to resolve the act head: ```http GET /legal/eu-act?celex=32016R0679&article=17&date=2026-01-01 GET /legal/eu-act?eli=eli/reg/2016/679/oj&article=17 ``` It returns the consolidation in force on that date: | Field | What the agent learns | |------------|----------------------------------------------------------------| | `text` | Consolidated text of the version in force on the date | | `etat` | Status, carried as stored — never reinterpreted | | `date` | The effective resolution date | | `version` | The selected consolidation's id and validity window | | `coverage` | Whether the store served an unambiguous consolidation | Provide at least one identifier; if both `celex` and `eli` are supplied, CELEX is used as the lookup key and both are echoed back. The `version` block — `date_debut` (inclusive) and `date_fin` (exclusive, omitted when current) — bounds exactly the window the returned text governs, which is what makes the citation auditable. ## A covered date is a 200, even for an expired consolidation The honesty point for legal grounding: if the requested date falls inside a historical consolidation's validity window, the answer is a **200** — the service returns the text that was in force *then*, with the stored `etat` and the `date_fin` that closed it. It does not convert a non-current status into an HTTP error. Per the x402 golden rule, the agent pays for the *answer to its question*. "Here is the text that applied on 2005-01-01, and its window ended 2016-07-01" is a successful answer. The `4xx` range is reserved for questions the service cannot answer: - `INVALID_REF` — neither `celex` nor `eli` was supplied. - `INVALID_DATE` — `date` is not `YYYY-MM-DD`. - `UNKNOWN_ACT` / `UNKNOWN_ARTICLE` — the identifier or article does not exist. - `NO_VERSION_AT_DATE` — the act exists, but no consolidation covers that date. So an agent must read `version.date_fin` and `etat`, not just the `200`: a historical version is a valid answer to "what applied then," not a statement that it is current law. ## Coverage honesty: what it will not do The endpoint answers from a **local snapshot** of EUR-Lex / Cellar (`freshness.kind: "snapshot"`, `as_of` the dump date). It does **not** fetch EUR-Lex at request time, search by keyword, interpret case law, translate missing language versions, or infer absent articles. The first public version serves English text. `etat` is carried verbatim as legal metadata, and `coverage.complete: false` is reserved for genuine source anomalies (e.g. overlapping versions) — never a guess. Unknown acts and uncovered dates are `4xx`, not partial paid answers. ## Where it sits in the x402 loop Grounding is the lookup before the agent commits to a statement about EU law. The loop: 1. **Discover** the endpoint and call it; receive the `402`. 2. **Pay** — sign the chosen rail and replay the request. 3. **Resolve** — read `text`, `etat`, and the `version` window. 4. **Branch** — cite the text only when it is in force for the date; flag an expired or future consolidation; on `NO_VERSION_AT_DATE`, report that no version applied rather than inventing one. Each paid call follows the same x402 pattern as every Invoket endpoint. The [Quickstart](/docs/quickstart) walks the whole discover → `402` → pay → replay cycle with runnable snippets. Price and accepted rails are not pinned in this article — they are served live by the [catalog](https://api.invoket.com/catalog); see the [endpoint reference](/docs/api/legal-eu-act) for the current figure. ## Related legal lookups `GET /legal/eu-act` is the EU counterpart to the French-law endpoint, and sits alongside the time-travel lookups: - [`GET /legal/article`](/docs/api/legal-article) — the same grounding for French law from the LEGI dataset (see [Is this French law still in force? Légifrance article text, dated](/blog/is-this-french-law-still-in-force)). - [`GET /legal/history`](/docs/api/legal-history) — when did a provision last change? - [`GET /legal/diff`](/docs/api/legal-diff) — what changed between two dates? Used for what it is — a grounded, identifier-addressed, date-scoped lookup of EU law — `GET /legal/eu-act` lets an agent quote a regulation it can stand behind, with the validity window attached. For the full field reference and error codes, see the [`GET /legal/eu-act` documentation](/docs/api/legal-eu-act); for how agents discover and call Invoket endpoints, see [For agents](/docs/for-agents). EU law data is derived from EUR-Lex / Cellar made available by the Publications Office of the European Union; reuse must preserve attribution to the European Union and EUR-Lex.