Bosco Labs

Tools › Compliance & law

EU Law Lookup API (EUR-Lex): article text, in force, amendments

Coming soon to the Store

One call answers "what does Article 50 of the AI Act say today, is it in force, and what amended it?": the article as plain text from the current consolidated version (or the one in force on any date), the act's in-force status and dates, and the acts that amend, correct or repeal it. A second mode lists new acts in the Official Journal L series. Built for AI agents doing legal and compliance work, and for people who want a sourced answer without SPARQL.

Price$0.01 per act or article returned
DomainCompliance & law
Call itApify API, MCP or HTTP API

Pricing (pay per event): $0.01 per act or article returned (act-lookup). A citation that can't be read, or an article that doesn't exist, fails in seconds and costs nothing.

Coming soon to the Apify StoreAsk for early access

Questions agents ask

  • “What does Article 50 of the AI Act require today, and has it been amended? Quote the text and link the source.”

Example

Input

{ "query": "AI Act", "article": "50", "language": "EN", "asOf": "2026-11-05" }

Output

{
  "schema_version": "1",
  "query": "AI Act",
  "celex": "32024R1689",
  "eli": "http://data.europa.eu/eli/reg/2024/1689/oj",
  "title": "Regulation (EU) 2024/1689 of the European Parliament and of the Council of 13 June 2024 laying down harmonised rules on artificial intelligence and amending Regulations (EC) No 300/2008, ... (Artificial Intelligence Act) (Text with EEA relevance)",
  "act_type": "Regulation",
  "act_type_code": "REG",
  "date_document": "2024-06-13",
  "date_publication": "2024-07-12",
  "oj_reference": "OJ L, 2024/1689",
  "date_entry_into_force": "2024-08-01",
  "entry_into_force_dates": ["2024-08-01", "2025-02-02", "2025-08-02", "2026-08-02", "2027-08-02"],
  "date_end_of_validity": null,
  "in_force": true,
  "eur_lex_url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689",
  "summary_url": "https://eur-lex.europa.eu/legal-content/EN/LSU/?uri=CELEX:32024R1689",
  "language": "EN",
  "as_of": null,
  "latest_consolidated_version_date": "2026-07-27",
  "text_version": "consolidated",
  "text_celex": "02024R1689-20260727",
  "consolidated_version_date": "2026-07-27",
  "text_notice": "This text is meant purely as a documentation tool and has no legal effect. The Union's institutions do not assume any liability for its contents. The authentic versions of the relevant acts, including their preambles, are those published in the Official Journal of the European Union and available in EUR-Lex. ...",
  "source_url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02024R1689-20260727",
  "cellar_url": "http://publications.europa.eu/resource/cellar/b1730fb2-8f1c-11f1-9262-01aa75ed71a1.0001.03/DOC_1",
  "amended_by": [
    {
      "celex": "32026R1744",
      "title": "Regulation (EU) 2026/1744 of the European Parliament and of the Council of 8 July 2026 amending Regulations (EU) 2024/1689, (EU) 2018/1139 and (EU) 2023/1230 as regards the simplification of the implementation of harmonised rules on artificial intelligence (Digital Omnibus on AI) (Text with EEA relevance)",
      "date": "2026-07-08",
      "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026R1744"
    }
  ],
  "corrected_by": [
    { "celex": "32024R1689R(04)", "title": null, "date": "2026-05-04", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689R(04)" }
  ],
  "repealed_by": [],
  "implicitly_repealed_by": [],
  "amends": [
    { "celex": "32020L1828", "title": "Directive (EU) 2020/1828 of the European Parliament and of the Council of 25 November 2020 on representative actions ...", "date": "2020-11-25", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32020L1828" }
  ],
  "repeals": [],
  "implicitly_repeals": [],
  "article": "50",
  "paragraph": null,
  "article_title": "Transparency obligations for providers and deployers of certain AI systems",
  "article_text": "1. Providers shall ensure that AI systems intended to interact directly with natural persons are designed and developed in such a way that the natural persons concerned are informed that they are interacting with an AI system, ...\n2. Providers of AI systems, including general-purpose AI systems, generating synthetic audio, image, video or text content, shall ensure that the outputs of the AI system are marked in a machine-readable format ...\n...\n7. The Commission shall encourage and facilitate the drawing up of codes of practice at Union level ...",
  "article_text_truncated": false,
  "article_amended_by": [{ "celex": "32026R1744", "change": "replaced" }],
  "warnings": [],
  "retrieved_at": "2026-11-05T21:50:10+00:00",
  "duration_seconds": 0.7
}

What you get

FieldTypeMeaning
schema_versionstringOutput schema version.
querystring | nullThe query as given (null in OJ mode).
celexstringCELEX number of the act, e.g. 32016R0679.
elistring | nullEuropean Legislation Identifier URI of the act, e.g. http://data.europa.eu/eli/reg/2016/679/oj.
titlestring | nullOfficial title in the chosen language (null if Cellar has none in that language).
act_typestring | nullType of act, e.g. Regulation, Directive, Implementing regulation, Corrigendum.
act_type_codestring | nullPublications Office resource-type code, e.g. REG, DIR, DEC_IMPL, CORRIGENDUM.
date_documentstring | nullDate of the document (signature/adoption), YYYY-MM-DD.
date_publicationstring | nullDate of publication in the Official Journal, YYYY-MM-DD.
oj_referencestring | nullOfficial Journal reference for acts published act by act (since Oct 2023), e.g. "OJ L, 2024/1689".
date_entry_into_forcestring | nullEarliest date of entry into force, YYYY-MM-DD.
entry_into_force_datesarrayAll entry-into-force / effect dates EUR-Lex records (staged application), sorted.
date_end_of_validitystring | nullEnd of validity, YYYY-MM-DD; null when open-ended.
in_forceboolean | nullWhether EUR-Lex marks the act as in force today.
eur_lex_urlstringEUR-Lex page of the original act.
summary_urlstring | nullEUR-Lex plain-language summary of the act, when one exists.
languagestringLanguage of the text and titles returned (EN when the requested one was unavailable).
as_ofstring | nullThe asOf date used (null = today).
latest_consolidated_version_datestring | nullDate of the newest consolidated version EUR-Lex holds (may be later than asOf).
text_versionstring | null"consolidated" (EUR-Lex consolidated version, documentation only) or "original" (OJ text); null if no text.
text_celexstring | nullCELEX of the text the article was read from, e.g. 02024R1689-20260727 for a consolidated version.
consolidated_version_datestring | nullDate of the consolidated version used, YYYY-MM-DD.
text_noticestring | nullFor consolidated texts: EUR-Lex's own disclaimer (no legal effect; the OJ text is authentic).
source_urlstringEUR-Lex page of the exact text version used (consolidated version or OJ act).
cellar_urlstring | nullThe Cellar document the text was read from.
amended_byarrayActs that amend this act: {celex, title, date, url}, newest first (include amendments).
corrected_byarrayCorrigenda to this act: {celex, title, date, url}.
repealed_byarrayActs that repeal this act: {celex, title, date, url}.
implicitly_repealed_byarrayActs that implicitly repeal this act.
amendsarrayActs this act amends: {celex, title, date, url}.
repealsarrayActs this act repeals.
implicitly_repealsarrayActs this act implicitly repeals.
citing_actsarray | nullLegislation and case-law citing this act, newest first, up to maxCiting: {celex, title, date, url} (include citing).
citing_acts_totalinteger | nullHow many legislative acts and judgments cite this act.
articlestring | nullThe article returned, e.g. "50"; null for an act-level row.
paragraphstring | nullThe paragraph returned, e.g. "1"; null = whole article.
article_titlestring | nullHeading of the article, e.g. "Principles relating to processing of personal data".
article_textstring | nullPlain text of the article (or paragraph), one line per paragraph or point, numbering kept ("1.", "(a)").
article_text_truncatedboolean | nullTrue when article_text was cut at maxTextChars.
article_amended_byarrayIn a consolidated text: acts that changed this article (from EUR-Lex's change markers), {celex, change}.
recitals_countinteger | nullAct-level row: number of recitals in the OJ text.
articles_countinteger | nullAct-level row: number of articles in the text used.
table_of_contentsarrayAct-level row: [{article, title}] for every article, to pick one for a follow-up call.
textstring | nullWhole act as plain text, cut at maxTextChars (include text only).
text_truncatedboolean | nullTrue when text was cut at maxTextChars.
warningsarrayCaveats in plain words: fallbacks, not in force on asOf, truncation, partial data.
retrieved_atstringWhen the row was made (ISO 8601, UTC).
duration_secondsnumberHow long the lookup took.

Use with AI agents (MCP)

Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.

https://mcp.apify.com?tools=bosco_labs/eu-law-lookup

For “What does Article 50 of the AI Act require today, and has it been amended? Quote the text and link the source.” the agent passes:

{ "query": "AI Act", "article": "50" }

small JSON rows (typically 5-20 KB), stable snake_case fields, ISO dates, null for unknown, a EUR-Lex link for the act, the text version and every related act. warnings says in plain words when a fallback was used (another language, the OJ text instead of a consolidated version) or the act was not in force on asOf. A lookup takes about 1 second after start-up (measured 0.6-0.7 s for GDPR Art. 5 and AI Act Art. 50).

Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~eu-law-lookup/run-sync-get-dataset-items with the input as JSON body. Cost: $0.01 per act or article returned.

HTTP API

Also on the Bosco Labs HTTP API (beta, test mode): same input and same rows as the Actor, $0.005 per act or article returned from prepaid credits (max 50 results (maxResults) per call). Get a key with a $0.50 free trial; see prices and limits.

curl https://api.boscolabs.dev/v1/eu-law-lookup \
  -H "Authorization: Bearer $BOSCO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "AI Act", "article": "50"}'

Consolidated texts from EUR-Lex (© European Union) are a documentation tool with no legal effect; only the acts published in the Official Journal of the European Union are authentic.

Input fields

FieldTypeMeaning
querystringThe EU act to look up: a short name ("GDPR", "AI Act", "DSA", "NIS2", "DORA", "MiCA", "CSRD"...), a citation ("Regulation (EU) 2024/1689", "Directive 95/46/EC", "Regulation (EC) No 1907/2006"), a bare number ("2016/679"), a CELEX number ("32016R0679") or an ELI URI ("http://data.europa.eu/eli/reg/2016/679/oj"). "AI Act Article 50" also works. Leave empty only when using ojSince (new Official Journal acts). An unreadable citation fails in seconds, with examples, at no charge.
articlestringArticle number, optionally with a paragraph: "5", "6(1)", "4a"; several separated by commas ("5, 6(1)", up to 10). One row per article. Empty = one row for the whole act with its table of contents and recital count (no full text unless include has "text").
languagestringEU language code of the text and titles: BG, CS, DA, DE, EL, EN, ES, ET, FI, FR, GA, HR, HU, IT, LT, LV, MT, NL, PL, PT, RO, SK, SL, SV. Default EN. If the text is missing in that language, English is returned with a warning.
asOfstringYYYY-MM-DD, e.g. "2025-01-01": return the consolidated version that applied on that date. Empty = today (the newest consolidated version in force now). Acts without consolidated versions return the Official Journal text.
includearrayAny of "metadata" (always on), "amendments" (amended_by, corrected_by, repealed_by, amends, repeals), "citing" (acts and judgments that cite this act, newest first) and "text" (the whole act as plain text, cut at maxTextChars). Default ["metadata", "amendments"]. The price is the same.
maxTextCharsintegerCap on article_text and text, in characters, e.g. 30000 (default). Longer text is cut and flagged (article_text_truncated / text_truncated) with a warning.
maxCitingintegerWith include "citing": how many citing acts to list, newest first, e.g. 20 (default). citing_acts_total always gives the full count.
ojSincestringSwitches to Official Journal mode: list acts published in the OJ L series from this date (YYYY-MM-DD, e.g. "2026-11-03") until today, newest first, at most 31 days back. Leave query empty when you use this. Empty = normal lookup.
keywordsstringOJ mode only: comma-separated words or phrases; an act is kept when its title (in the chosen language) contains any of them, case-insensitive, e.g. "artificial intelligence, data". Empty = all acts.
maxResultsintegerOJ mode only: the most acts to return, newest first, e.g. 50 (default). One charge per act returned.

Sources, licence and limits

Where does the data come from? Only from the Publications Office of the EU, the publisher of EUR-Lex: its Cellar repository (SPARQL endpoint for metadata and relations, REST content negotiation for texts). Nothing else is added, and the text is not rewritten or summarised.

Is the consolidated text the law? No. Consolidated versions are, in EUR-Lex's own words, "a documentation tool" with no legal effect; only the texts published in the Official Journal are authentic. Every row with a consolidated text carries EUR-Lex's disclaimer in text_notice and links the authentic act in eur_lex_url. Ask with an asOf before the first consolidated version to get the OJ text itself.

Is this legal advice? No. It returns official texts and metadata as published; it does not interpret them. EUR-Lex itself states its information is not professional or legal advice.

Which acts work? Any act with a CELEX number in EUR-Lex: regulations, directives and decisions, corrigenda and consolidated versions. Article extraction works on all current texts; for some old acts (before about 2000) only an HTML text without article markup exists, and the last article may then include trailing headings. Annexes are not split out (use include: ["text"]).

How current is it? Live: every call reads Cellar directly. New OJ acts appear the day they are published; consolidated versions follow when the Publications Office produces them (days to weeks), so latest_consolidated_version_date can lag behind amended_by. in_force can be null for acts published in the last few days, before EUR-Lex has set it.

Why is a title null? Some corrigenda have no title in Cellar, and very new acts may not yet have one in every language.

Points like 6(1)(a)? The paragraph is returned whole; points are lines inside it.

Personal data? None is requested or returned beyond what the published legal acts contain. Signatory names in the metadata are not output.

Content: © European Union, https://eur-lex.europa.eu (reuse under Commission Decision 2011/833/EU; consolidated texts and editorial content under CC BY 4.0; metadata CC0). Text is converted from XHTML to plain text and long texts are cut where maxTextChars says; nothing else is changed.

Coming soon to the Apify StoreAsk for early access