Developers
The Lex API, for programs and AI agents
The answers this site's pages show come from one API, and the same answers are open to any program, over REST and over MCP, at this site's own address. It is free and anonymous: there is no key, no account and no paid plan. This page is generated from the operation registry and the schemas this release checks every request and answer against, so it lists what the server does.
Two ways in, one answer
REST: POST /api/v3/{operation}, with a JSON body that names the operation and its parameters, {"operation_id": "…", "parameters": {…}}. The path takes no query, and any other method gets only a failure below the envelope.
MCP: JSON-RPC messages sent by POST to https://law.soufien.lu/mcp, over the Streamable HTTP transport, protocol version 2025-06-18. The server answers initialize, ping, tools/list, tools/call; every registered operation is a tool of the same name, whose input schema is the parameters member of the operation's request schema.
Both give the same envelope for the same request: a tool call is turned into the REST request document and answered by the same code, and its result carries the envelope as its structured content. A refusal is an answer, not an error: REST sends it as a successful HTTP answer, and MCP as a tool result with isError: false; only the refusal of a request past its client's limit has another status over REST, given below.
Its answer to initialize carries instructions, which a client may hand its model, and ping is answered with an empty result. The instructions, as the server sends them:
Lex answers from the Luxembourg and EU legal texts this server holds, and every tool returns one Lex V3 envelope (lex-v3-envelope/1) as structuredContent, the same envelope the REST route POST /api/v3/{operation} returns. A refusal is an answer, not an error: its verdict is refuse, isError stays false, and its refusal names one code of the registry's closed twenty with the payload the registry fixes for that code; read the payload rather than retrying another way. A failure is never an envelope: a JSON-RPC message the server cannot carry out answers a JSON-RPC error (-32602 for invalid arguments, -32603 for a failure of the server's own), and an HTTP request the endpoint refuses or cannot answer answers an HTTP status with a problem document (application/problem+json). A Luxembourg state's date is the publisher's applicability date, or, where its date_role is entry_into_force, the act's entry into force, which is never an applicability date; an EU wording date is never an applicability date; the kinds are never merged. An absence in this server is not evidence that a law does not exist. Every envelope names the registry digest it is bound to (registry_sha256) and its context says how current the data is. Lex shows the published text of the law; it does not say whether or how it applies to anyone's situation and is not legal advice.
For example, the coverage report, asked with curl:
curl -X POST https://law.soufien.lu/api/v3/coverage \
-H 'content-type: application/json' \
-d '{"operation_id":"coverage","parameters":{}}'The same over MCP, as a tools/call message:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "coverage",
"arguments": {}
}
}A client that speaks Streamable HTTP is given the address https://law.soufien.lu/mcp; one that reads its servers from a JSON file, for example:
{
"mcpServers": {
"lex": {
"type": "http",
"url": "https://law.soufien.lu/mcp"
}
}
}Asked of this server now
As it served this page, this server answered this request from the law it holds:
curl -X POST https://law.soufien.lu/api/v3/browse \
-H 'content-type: application/json' \
-d '{"operation_id":"browse","parameters":{"limit":1}}'Its answer, whole:
{
"context": {
"commits": {
"index_builder_source_commit": "98eef6c624df3779748a983cd56a5f664cd91b2b",
"serving_runtime_source_commit": "7583e4d0032dd13dd980a05a0ebb0ec5dc1a2d87"
},
"freshness": {
"channels": [
{
"age_days": 18,
"lag_days": null,
"lag_observations": 0,
"newest_completed_observation": "2026-10-12T18:17:04Z",
"publisher": "lu-legilux",
"stale": false
},
{
"age_days": 25,
"lag_days": null,
"lag_observations": 0,
"newest_completed_observation": "2026-10-05T03:50:08Z",
"publisher": "eu-eurlex",
"stale": false
}
],
"index_built_at": "2026-10-12T18:17:05Z",
"last_checked_against_publisher": null,
"maximum_data_age_days": 30,
"observed_at": "2026-10-31T02:32:44.8105491Z",
"stale": false,
"upstream_health": "stale"
},
"jurisdiction": "lu",
"provisional": false,
"publisher": "lu-legilux",
"snapshot": {
"snapshot_id": "corpus-a88d6f2c175b060c",
"snapshot_sha256": "a88d6f2c175b060ce8b0b7898d41bd261956685e51c83655ee49a4daa1e391cf"
},
"status": "success",
"timeline_semantics": "publisher_applicability"
},
"object_type": "envelope",
"operation_id": "browse",
"refusal": null,
"registry_schema": "lex-v3-operation-registry/2",
"registry_sha256": "627879b6718d746b944758378b9ea476919311a72857bcba0cb72e202fb70059",
"request_ref": "http_8a8df60f3fe8e6f6e6f5555fd9dbb0914923e0363319025ee9b6b10fc8d7800f",
"result": {
"object_type": "work_record",
"schema": "lex-v3-browse-result/1",
"value": {
"languages_held": [
"eng",
"fra"
],
"limit": 1,
"next_after": "code-civil",
"not_held": [
{
"item": "publisher_universe",
"reason": "how many works the publisher holds, or which of them this index lacks: the rows are what was admitted"
},
{
"item": "titles",
"reason": "titles are served by dossier and resolve; a row here names the work by its identifiers"
},
{
"item": "legal_status",
"reason": "no in-force fact is read here; status_on serves the publisher's force assertions per work"
}
],
"publisher": "lu-legilux",
"requested_after": null,
"requested_language": null,
"requested_type": null,
"scope": "the works this index holds, one row per work key in ordinal order, with the publisher identifiers and languages their states carry, the first and latest state dates, the state count and the publisher's document and resource types read verbatim from the index's fact table; a type filters to works whose typeDocument is exactly that IRI or ends exactly in /{type} (case-sensitive, no pattern); a language filters to works with a state in it; paged by work key",
"verified_by": {
"corpus_sha256": "a88d6f2c175b060ce8b0b7898d41bd261956685e51c83655ee49a4daa1e391cf",
"index_sha256": "cb0cbe5991f8bd883bfd06c807f408727ab394c0bc261e9464727a729f2006db",
"registry_sha256": "627879b6718d746b944758378b9ea476919311a72857bcba0cb72e202fb70059"
},
"works": [
{
"document_types": [
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/authority/resource-type/CODE"
}
],
"history_begins": "2016-09-01",
"identifier": "/lu-legilux/code-civil",
"languages": [
"fra"
],
"latest_applicability_date": "2025-12-26",
"publisher_legal_resource_iris": [
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226"
],
"publisher_work_iris": [
"http://data.legilux.public.lu/eli/etat/leg/code/civil"
],
"resource_types": [
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#ComplexWork"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20160901",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20170401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180401",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180709",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20180916",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20200101",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20211226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20220701",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230201",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230822",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20230923",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20240801",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20241224",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20250420",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Code"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Consolidation"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#LegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#NationalLegalResource"
},
{
"datatype_iri": null,
"evidence_sha256": "b86525e5dc4a237ca540299fd1f122edc9d36abd74daae80f089bad03984cfed",
"language_tag": null,
"object_kind": "iri",
"subject_iri": "http://data.legilux.public.lu/eli/etat/leg/code/civil/20251226",
"value": "http://data.legilux.public.lu/resource/ontology/jolux#Work"
}
],
"state_count": 16,
"work_key": "code-civil"
}
]
}
},
"schema": "lex-v3-envelope/1",
"verdict": "answer",
"version": "v3"
}/lu-legilux/code-civil, the first act it holds, asked for its dossier over REST, then over MCP for its text on 2025-12-26, its latest version's date:
curl -X POST https://law.soufien.lu/api/v3/dossier \
-H 'content-type: application/json' \
-d '{"operation_id":"dossier","parameters":{"identifier":"/lu-legilux/code-civil"}}'{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "as_of",
"arguments": {
"identifier": "/lu-legilux/code-civil",
"date": "2025-12-26",
"language": "fra"
}
}
}The operations
The registry lists 27 operations; this server serves 24 of them. Each gives its REST path, its MCP tool, its parameters as its request schema states them, the objects its answer carries, and its two schemas.
For an EU identifier, some served operations refuse with retrieval_mode_unavailable, naming the modes available; when an EU index is mounted, the coverage answer's operations.refused_for_eu lists them.
answer_drift
The past dated answers that a later publisher revision invalidated, found from the event log.
- REST
POST /api/v3/answer_drift- MCP tool
answer_drift- Parameters
identifier(optional){"type":"string","minLength":1,"pattern":"\\S"}after(optional){"type":"string","pattern":"^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$"}limit(optional){"type":"integer","minimum":1,"maximum":200}
- Answer carries
answer_drift
article_history
One article of a Luxembourg act through the versions held: whether its wording changed from one to the next, and which versions do not carry it.
- REST
POST /api/v3/article_history- MCP tool
article_history- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}anchor(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
provision_history
as_observed
The version of a Luxembourg act applicable on a date as one build of the event log held it, with that build's time as an upper bound on when it was observed.
- REST
POST /api/v3/as_observed- MCP tool
as_observed- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}snapshot(optional){"type":"string","pattern":"^[0-9a-f]{64}$"}at(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
quote,version_state
as_of
The version of a Luxembourg act applicable on a date, with its articles; for an EU act, the wording that answers the date.
- REST
POST /api/v3/as_of- MCP tool
as_of- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
quote,version_state
ask
The assistant, which is off: every question receives the presentation result that says so, naming the operations that answer from the law Lex holds. No model writes an answer.
- REST
POST /api/v3/ask- MCP tool
ask- Parameters
question(required){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
answer_dossier,handoff_card
browse
The Luxembourg acts held, as one ordered and paged list, with their identifiers, languages, version dates and the publisher's document types.
- REST
POST /api/v3/browse- MCP tool
browse- Parameters
type(optional){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
classification,work_record
changes_in_period
The Luxembourg versions whose applicability begins in a period, for one act or across the index.
- REST
POST /api/v3/changes_in_period- MCP tool
changes_in_period- Parameters
date_from(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}date_to(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(optional){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}
- Answer carries
change_list
citation
The references the publisher wrote in the text of a Luxembourg version's articles.
- REST
POST /api/v3/citation- MCP tool
citation- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}anchor(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
relation_edge
cited_by
The references, in any Luxembourg version held, whose target is a given act.
- REST
POST /api/v3/cited_by- MCP tool
cited_by- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
relation_edge
classification
The publisher's typed facts about a Luxembourg act, as the publisher states them: document type, legal value, responsible body, historical identifiers, publication and document dates.
- REST
POST /api/v3/classification- MCP tool
classification- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
classification
concepts
The concepts the Publications Office attaches to EU acts: EuroVoc descriptors, directory codes and subject matters.
Not served from data: a request to it is answered inside the envelope with the refusal retrieval_mode_unavailable, naming the mode asked, r5_concepts, and the modes this server serves; the data that would serve it: the concept data attached to EU works: EuroVoc descriptors, EU directory codes and subject matters as the Publications Office records them; the EU index holds none of them.
- REST
POST /api/v3/concepts- MCP tool
concepts- Parameters
- none
- Answer carries
classification
coverage
What this server holds and serves, counted from its index, and what it does not hold.
- REST
POST /api/v3/coverage- MCP tool
coverage- Parameters
language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
coverage_report
diff
The article-by-article difference between the versions of a Luxembourg act applicable on two dates.
- REST
POST /api/v3/diff- MCP tool
diff- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date_from(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}date_to(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}page(optional){"type":"integer","minimum":1,"maximum":100000}
- Answer carries
diff
dossier
An act's record as the index holds it: a Luxembourg act's titles and versions, or an EU act's expressions.
- REST
POST /api/v3/dossier- MCP tool
dossier- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
work_record
events
The event log of what each build of the index found, polled by cursor and delivered at least once.
- REST
POST /api/v3/events- MCP tool
events- Parameters
after(optional){"type":"string","pattern":"^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$"}limit(optional){"type":"integer","minimum":1,"maximum":200}event(optional){"type":"string","enum":["first_sighting","resighted","metadata_revised","validity_revised","interval_closed","withdrawn_from_source","expression_added","file_replaced","relation_asserted","relation_retracted","future_state_scheduled","future_state_activated"]}
- Answer carries
event
evidence_bundle
What quoting a version needs, a page at a time: each article's text with its digests, the version's permalink, sources and official identities, under the rights rule; for an EU act, the same for the wording that answers the date.
- REST
POST /api/v3/evidence_bundle- MCP tool
evidence_bundle- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}article(optional){"type":"string","minLength":1,"pattern":"\\S"}page(optional){"type":"integer","minimum":1,"maximum":100000}contents(optional){"type":"boolean"}
- Answer carries
evidence_bundle
in_force_on
The Luxembourg acts with a version applicable on a date.
- REST
POST /api/v3/in_force_on- MCP tool
in_force_on- Parameters
date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(optional){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after_work_key(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
version_state
knowable_on
What a reader could have known on a date: each version's publication beside the time Lex observed it.
Not served from data: a request to it is answered inside the envelope with the refusal retrieval_mode_unavailable, naming the mode asked, r6_knowable_on, and the modes this server serves; the data that would serve it: each held state's publication date beside its observation time (observed_from), so a date is answered with what a reader could have known on it, never with the publisher's valid-from date; the observation times need each Luxembourg body's capture time in the corpus, which no build records yet: a build's time bounds observation only from above.
- REST
POST /api/v3/knowable_on- MCP tool
knowable_on- Parameters
- none
- Answer carries
quote,version_state
manifestation
The publisher's manifestations of a Luxembourg act's expressions, with their formats and files, the one Lex retained marked with its digest.
- REST
POST /api/v3/manifestation- MCP tool
manifestation- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}format(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
manifestation
provenance
The sources, rule profiles and digests behind a Luxembourg version.
- REST
POST /api/v3/provenance- MCP tool
provenance- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
provenance_chain
relations
The references of a Luxembourg act in both directions, as one ordered and paged list.
- REST
POST /api/v3/relations- MCP tool
relations- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(optional){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}direction(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
relation_edge
resolve
The act and the expression that a Luxembourg identifier or a pinned permalink names.
- REST
POST /api/v3/resolve- MCP tool
resolve- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
work_resolution
search
An exact reference opens its act; any other phrase is searched, with capitals and accents ignored, in the Luxembourg article text whose rights allow it, or in the wordings of one EU act named by its identifier.
- REST
POST /api/v3/search- MCP tool
search- Parameters
query(required){"type":"string","minLength":1,"maxLength":512,"pattern":"\\S"}language(required){"type":"string","minLength":1,"pattern":"\\S"}date(optional){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(optional){"type":"string","minLength":1,"pattern":"\\S"}mode(optional){"type":"string","minLength":1,"pattern":"\\S"}limit(optional){"type":"integer","minimum":1,"maximum":200}after(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
quote,work_record
status_on
The publisher's own statements on a Luxembourg act's entry into force and its end, word for word, beside the version applicable on a date.
- REST
POST /api/v3/status_on- MCP tool
status_on- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}date(required){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
version_state
timeline
Every version of a Luxembourg act held, in the publisher's order of applicability; for an EU act, every wording discovered, in order of date.
- REST
POST /api/v3/timeline- MCP tool
timeline- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
timeline
transposition
The links between EU directives and the Luxembourg acts that transpose them, as each publisher asserts them.
Not served from data: a request to it is answered inside the envelope with the refusal retrieval_mode_unavailable, naming the mode asked, r4_transposition, and the modes this server serves; the data that would serve it: the transposition links: Legilux's transposes and draftTransposes assertions and the Publications Office's national implementing measures for Luxembourg, each kept as its publisher asserts it and never merged; neither is acquired.
- REST
POST /api/v3/transposition- MCP tool
transposition- Parameters
- none
- Answer carries
relation_edge
verify
Checks a pinned permalink against the digest the index holds, or gives the current digests to pin.
- REST
POST /api/v3/verify- MCP tool
verify- Parameters
identifier(required){"type":"string","minLength":1,"pattern":"\\S"}language(optional){"type":"string","minLength":1,"pattern":"\\S"}
- Answer carries
verification
The envelope
Every answer, over REST and over MCP, is one envelope, lex-v3-envelope/1 (digest d135633d801092e5b1d46c0a5c168f1354b1c0e5595d07372c23744dd0e7c255), with these members:
schema- The envelope's schema identity.
version- The platform's version.
object_type- The object's type: an envelope.
request_ref- An opaque reference to this one request, for the client's own use.
operation_id- The operation that answered.
registry_schema- The operation registry's schema identity.
registry_sha256- The digest of the operation registry this server runs.
context- What the answer was given from, below.
verdict- What kind of answer this is, below.
result- The answer's object, with its own schema and type, or null when the operation refuses.
refusal- The refusal, with its code and payload, or null when the operation answers.
Its context says what the answer was given from:
commits- The revisions of Lex's code that built the index,
index_builder_source_commit(“Index built from”), and that serve the answer,serving_runtime_source_commit(“Service running”). freshness- How current the data is: when the index was built, each publisher's newest complete collection with its age and lag, the maximum age allowed, and whether the data is older than that.
jurisdiction- The jurisdiction of the law answered: Luxembourg or the EU.
provisional- Whether the answer is provisional; this server always sends
false. publisher- The publisher whose law is answered.
snapshot- The corpus snapshot the index was derived from, by its identity and digest.
status- Whether the operation answered or refused.
timeline_semantics- How the answer's dates are to be read:
publisher_applicabilityfor Luxembourg, the dates from which the publisher states its versions are applicable;official_consolidation_statefor the EU, the dates of the publisher's wordings.
Its verdict is one of the registry's closed set:
answer- The operation answered.
answer_with_enrichment- Reserved for the assistant, which is off; this server sends it for no answer.
point- The answer points elsewhere: what
askgives, since the assistant is off. clarify- Reserved for the assistant, which is off; this server sends it for no answer.
refuse- The operation refused, with a typed refusal.
split- Reserved for the assistant, which is off; this server sends it for no answer.
registry_sha256 is 627879b6718d746b944758378b9ea476919311a72857bcba0cb72e202fb70059 for this release: the digest of the registry, which covers every operation, every schema's digest and every refusal code with the fields its payload must carry, so it changes whenever any of them changes. Each schema's identity ends in its version.
Refusals
When an operation cannot answer, it refuses with one of 20 codes, never with an empty answer: the envelope's verdict is refuse, its result is null, and its refusal, lex-v3-refusal/1 (digest 2705723884d22104188d9e9fe6673efc5a2563e4549af6f774dbadf974dc5c98), carries the code and a payload. The registry fixes the fields each code's payload must carry; a payload may carry more.
On this site's pages, a refusal's plain sentence comes first, and its code and payload follow it.
advice_boundary- The question asks for advice: Lex shows the text, and does not apply it to anyone's situation. Its payload carries
descriptive_maximum,handoff, and is held to lex-v3-advice_boundary-payload/1 (digest76fe0961f4734b99f12bdc81e623faa3648952e66b3bbe5e9fb82365a7f98d64). ambiguous_identifier- The identifier names more than one act; the candidates are listed, and none is chosen. Its payload carries
requested_identifier,candidates, and is held to lex-v3-ambiguous_identifier-payload/1 (digestf2ccba8567ad4c69b1a7247b0f05ab8e45dc1c164aac325d07d6307a532dff13). ambiguous_version- More than one version covers the date and the publisher does not say which applies; each candidate is listed, and none is chosen. Its payload carries
requested_date,candidates, and is held to lex-v3-ambiguous_version-payload/1 (digest283beeada41bb31c342eb21262622add6a53b4dbc461ffaa7663254771a3f27e). anchor_not_in_version- The index holds no article with that identifier in the version; the nearest article identifiers are given, and no text search is run in its place. Its payload carries
requested_anchor,nearest_anchors,do_not_fall_back_to_full_text_search, and is held to lex-v3-anchor_not_in_version-payload/1 (digestc869995a2de63355e7bb745ee886dd986a613c7ef4643618fd7b9fe23c8edd19). derivation_refused- Lex will not derive what was asked from the text it holds; the payload says what and why. Its payload carries
derivation,reason, and is held to lex-v3-derivation_refused-payload/1 (digest02c709e03d9ebb98fd3ed2d59d348c9556fc1130bff6cb2436877f1e93f7f1f3). format_not_available- The format asked for is not offered for this answer; the formats offered are listed. Its payload carries
requested_format,available_formats, and is held to lex-v3-format_not_available-payload/1 (digest6212f923de42878063c1f5f19bd60db37dd324fd5f0b1d265e731c9e5effaf45). identifier_unknown- No act the index holds has that identifier; the payload gives the official search and what would answer. Its payload carries
requested_identifier,official_search_actions,what_would_answer, and is held to lex-v3-identifier_unknown-payload/1 (digestb44b428735377e8a80b87c3d2a36d5a7bf088963dad2e9ea09eb20bc02589363). language_not_available- The text is not held in that language; the languages held are listed. Its payload carries
requested_language,available_languages, and is held to lex-v3-language_not_available-payload/1 (digest16cc301311ff4b00eb411787c41f6a350bff402312ae1b945be5ce9cbb59c193). no_corpus_mounted- This server holds no law at the moment. Its payload carries
required_corpus, and is held to lex-v3-no_corpus_mounted-payload/1 (digestf630698422967772f3856d9ba9316b3dbbc3dca0db0fa32982a1f3958637f24d). no_version_for_date- No version the index holds covers the date; the payload gives the date its history begins and the nearest dates held before and after it. Its payload carries
requested_date,history_begins,nearest_earlier,nearest_later, and is held to lex-v3-no_version_for_date-payload/1 (digest96f500518a36236a9657373ddfbb30327dbcf48aff54019d832c4710878e370d). not_transposable- Only a directive is transposed, and this instrument is not one; the payload says why. Its payload carries
instrument_type,explanation, and is held to lex-v3-not_transposable-payload/1 (digest889145a4c9e933214affde1a5a4241954d96ee51a7da7d68fd06e8664c1fb813). out_of_corpus_scope- Lex does not hold the instrument, and the payload says why: it names the instrument, its official place, the reason and who to ask, an institution or an official service and never a person. Its payload carries
requested_identifier,official_source,reason,who_to_ask, and is held to lex-v3-out_of_corpus_scope-payload/1 (digest6b5f5a33e40ea970d5be326577fcba92139df76817bc4e8513c82eddff78b364). pinned_digest_mismatch- The digest a permalink pins is not one Lex holds for that version; the payload gives the current digest and its permalink. Its payload carries
requested_digest,current_digest,stable_coordinate,current_hash_pinned_url, and is held to lex-v3-pinned_digest_mismatch-payload/1 (digest6564294c7ea4852a7ddaff9f9e27a7a2b8a2b1dceebbbbec1e0c9c268510675c). profiles_differ- The two versions were read under different rule profiles, so they are not compared. Its payload carries
left_profile,right_profile, and is held to lex-v3-profiles_differ-payload/1 (digesta6c2313b0f99f99b2c4467bd6f199f6c6398786a466852ffe32849d5cf2ce544). rate_limited- Too many requests; the payload says when to ask again. Its payload carries
retry_after,retryable, and is held to lex-v3-rate_limited-payload/1 (digestea152733a9c0409d66202f140b7bbaf5b7b4ef7b902f49c8dbb1712b62e05445). snapshot_unknown- The snapshot or the log the request names is not one this server holds; the payload says what would answer. Its payload carries
snapshot_id,what_would_answer, and is held to lex-v3-snapshot_unknown-payload/1 (digest5f3e77d337e5363322251ad1d28532ac2f9a014be7bfb1e2e19d8cce344cd087). text_not_available- The publisher's file holds no text Lex can read, such as an annex given only as images; its official identity and source are given. Its payload carries
official_identity,official_source,retained_transport_evidence, and is held to lex-v3-text_not_available-payload/1 (digestd3f8945228912c77fdcc27d8628fcce3dfb2934d8b7e4d36a64d80232a6efb39). text_withheld- The licence of the text does not allow Lex to show it; its official link and digest are given. Its payload carries
official_identity,official_link,content_sha256, and is held to lex-v3-text_withheld-payload/1 (digest41cc8ebafcb63f15eb9d10391ca822fa2bf0555305bc9f3ef8a615b7c9addf73). upstream_unreachable- A source Lex depends on could not be reached; the payload says whether to ask again. Its payload carries
upstream,retryable, and is held to lex-v3-upstream_unreachable-payload/1 (digest4477c1e18093ae11ccaa5a96b9506a5705559c84870cbe195099137d84768078).
What Lex never holds
An identifier that names one of these is refused with out_of_corpus_scope by every operation that takes one, before anything is looked up. The list, lex-v3-out-of-scope/1, names for each its official place and who to ask, an institution or an official service and never a person; each refusal names the list's digest, d473256c14a1c973b441567d9bf9802532347643b5b3f384704f9027b07a06b7.
- a circular of the Commission de surveillance du secteur financier (CSSF), or of the Institut Monétaire Luxembourgeois (IML) before it: CSSF circulars, and the IML's before them, are published by the CSSF, not by Legilux or EUR-Lex, and Lex does not collect them. For example
Circulaire CSSF 20/747,CSSF circular 22/806,CSSF 20/747,Circ. CSSF 12/552 telle que modifiée,Circulaire IML 98/143. Official place: https://www.cssf.lu/. Who to ask: Commission de surveillance du secteur financier (CSSF). - a decision or opinion of the Commission nationale pour la protection des données (CNPD): Decisions and opinions of the CNPD are issued and published by the CNPD, not by Legilux or EUR-Lex, and Lex does not collect them. For example
Délibération CNPD n° 12/2023,CNPD decision 3/2021,Délibération n° 36FR/2021 de la CNPD. Official place: https://cnpd.public.lu/. Who to ask: Commission nationale pour la protection des données (CNPD). - a judgment, order or opinion of the Court of Justice of the European Union: Decisions of the EU courts are published by the Court of Justice of the European Union; Lex holds EU legislation, not case law, and does not collect them. For example
ECLI:EU:C:2014:317,62012CJ0131,C-131/12,Case C-131/12 Google Spain,Joined Cases C-293/12 and C-594/12. Official place: https://curia.europa.eu/. Who to ask: Court of Justice of the European Union (CJEU). - a publication in the Recueil électronique des sociétés et associations (RESA): The RESA publishes the filings of companies and associations; it is published by Luxembourg Business Registers, not by Legilux, and Lex does not collect it. For example
RESA_2020_123.456,Recueil électronique des sociétés et associations. Official place: https://www.lbr.lu/. Who to ask: Luxembourg Business Registers (LBR).
Not listed yet: communal regulations, whose official place is each commune's own, and the decisions of Luxembourg's courts, which no identifier names exactly. Each still answers identifier_unknown.
An EU act outside the EU population this site holds, named by its CELEX, is refused with out_of_corpus_scope too, though it is on no list: whether an act is outside depends on the EU index the server mounts. The refusal names the rule that population follows, with the number of acts on its seed list, and gives the act's page on EUR-Lex as its official place; it names neither the out-of-scope list nor its digest.
Two answers that are not refusals
assistant_v3_unavailable: whataskanswers to every question, since the assistant is off; it names the operations that answer from the law Lex holds.localization_unavailable: the page a reader in German or Luxembourgish is shown, since only French and English are reviewed; it links the pages in both.
Failures below the envelope
A request the server cannot read or route gets no envelope: it is answered with a problem document, lex-v3-transport-problem/1, with an HTTP status and one of these codes. Unlike a refusal, it is not an answer about the law.
malformed_json, HTTP 400: Malformed JSONduplicate_json_member, HTTP 400: Duplicate JSON membertrailing_json_content, HTTP 400: Trailing JSON contentrequest_too_large, HTTP 413: Request too largerequest_too_deep, HTTP 400: Request too deepparameters_not_object, HTTP 400: Parameters must be an objectrequest_schema_invalid, HTTP 400: Request schema invalidunknown_operation, HTTP 400: Unknown operationmethod_not_allowed, HTTP 405: Method not allowedunknown_route, HTTP 404: Unknown routeinternal_response_invalid, HTTP 500: Internal response invalidinternal_failure, HTTP 500: Internal failureservice_in_maintenance, HTTP 503: Service in maintenance
Quoting and citing
Every quoted article carries text_sha256, the digest of its text; body_sha256, the digest of the publisher's file it was read from; official_source, its official source; and article_permalink, which pins the publisher, the act, the date and digest of the version or EU wording, the language and the article: /{publisher}/{work}/{date}--{digest}/{language}/{article}.
verify checks a permalink's digest against the one the index holds, from what this server holds: it never asks the publisher.
Each release of Lex is signed. The keys that sign releases, each with its identity, role, validity and status, are published at https://law.soufien.lu/.well-known/lex-keys.json: check a release's signatures against that set, never only against the key the release carries.
On the reading page, an article is cited in three forms, “Usual citation”, “With its permalink” and “Evidence form”, and an export carries all three. In a document, cite the official text by its official reference.
Limits
There is no key and no account, and the server keeps no record of a request; for the per-client limit below, it counts requests in its working memory alone: see the privacy notice.
A request body is at most 1,048,576 bytes; a larger one is answered with request_too_large.
Lists are paged: limit sets a page's size, within the bounds each request schema states, and after continues from where the last page stopped.
Each client, known by its IP address, may send 60 API requests a minute, REST and MCP together, with at most 4 being answered at once. Past either limit, a request to an operation (over MCP, a tool call) is refused with rate_limited, which carries retry_after, the seconds to wait before asking again, as the Retry-After header does; over REST its status is 429. The service is small: send one request at a time and poll gently.
The pages the server renders itself have a budget of their own, 300 a minute for each client; past it, a page is sent as built, and the browser then asks the API for its answer. No page is refused.
Nothing is promised about availability: see the terms of use.
Following changes
events reads the log of what each build of the index found: when a log begins, one first_sighting event for each version held, then each later build's comparison events, each dated by its build, never by when it was observed. Poll it with after, the cursor the last answer gave as next_after, and limit, and filter it with event.
Delivery is at least once: the same cursor can answer the same events again, so a client keeps the last cursor and skips the events it has seen, by seq within log_id. There are no webhooks and no push: poll.
The events a log may hold: first_sighting, resighted, metadata_revised, validity_revised, interval_closed, withdrawn_from_source, expression_added, file_replaced, relation_asserted, relation_retracted, future_state_scheduled, future_state_activated.
A cursor matches ^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$.
answer_drift lists the past dated answers that a later publisher revision invalidated, found from the log's revising events.
The events answer states its own delivery, as the server sends it:
cursor polling, at least once: while this index is mounted a request with the same cursor answers the same events again, so a reader deduplicates by seq within log_id; next_after is always the cursor to poll next; a build chained to this one carries this log forward with the same numbers, so a cursor of this log reads on in its successor (log.ancestors lists the logs a log honours); a build not chained to this one starts a new log, under which a cursor of this log refuses snapshot_unknown; there is no push delivery and no subscription (Decision 93)
Replay guarantees
What a program can rely on when it asks again: the guarantees the specification names G1 to G5, each as this server supports it today. Each is held by a test of tests/Lex.V3.Ingest.Tests/V3ReplayGuaranteesTests.cs, named beside it, which runs the real API on test mounts.
- G1: Versions are never rewritten
- A version is named by the digest of its text. When a later build reads a publisher's file that has been replaced, the log records it as
file_replaced; the version stays the same when the text is unchanged, and a new version is named only when the text changed. A permalink to the earlier version still verifies while a kept build holds its text, naming the version that replaced it. Test:AReplacedPublisherFileIsAFileReplacedEventAndANewVersionIdOnlyWhenItsTextChanged. - G2: The same request, the same bytes
- On a server built from the same commit (
context.commits.serving_runtime_source_commit), every served operation answers the same request, asked of the same snapshot, with the same canonical bytes, asked again later or of a byte copy of the mount, apart from what belongs to the request or to the moment it is answered. The request's own members arecontext.freshness.observed_atandrequest_ref. The moment's are each channel's data age and whether it is past the maximum,context.freshness.channels[].age_daysandcontext.freshness.channels[].stale, and the envelope'scontext.freshness.stale, counted to the server's answer; and, when a search reads an exact reference that names no date, the date it is read at, today in Luxembourg (result.value.reference.recognised.date) if the search names none either, the version, or for an EU act the wording, that date selects, and the address the answer opens, the act's readable address or the permalink of that version or wording: a search date that is today's is no date given. A request past its client's limit is refused withrate_limitedinstead. The release is signed as a whole; an answer carries no signature of its own. Test:EveryServedOperationAnswersTheSameBytesFromTheSameSnapshotFromACopyOfItAndLater. - G3: Nothing is deleted from the log
- Each build's events are the start of the next build's log, row for row. The code can keep earlier builds beside the one a server mounts, by a retention rule: every build listed as referenced by a published permalink, the last build of each day for 90 days and the first of each month. Lex does not keep them yet: the release this site serves holds only the build its server mounts. So a version the log names is re-verifiable only while a kept build holds its text, which today means the mounted build; one whose text no kept build holds is still named by the log, without its text, and a permalink to it no longer verifies. Test:
NothingIsHardDeletedAcrossBuildsEveryEventIsCarriedAndEveryStateTheLogNamesStillVerifies. - G4: Answers as one build held them
as_observedanswers what one build of the log held, named by its index digest, bounded by that build's time, which is an upper bound on when its texts were observed. No observation time is held, so a time is refused, andknowable_on, which needs one, is not served. Test:EverySnapshotTheLogNamesAnswersAsObservedWhatThatBuildAnsweredBoundedByItsBuildTime.- G5: Checked without Lex
- The answers of
evidence_bundlefor a version, page by page, and the publisher's file are enough to check each article's text and to recompute the file's digest, each text digest, the digest of the article identities and the version's own digest, from the derivationsprovenancepublishes. Each article's identity, the wording digest, the rule-profile digests and the receipt are not recomputable: the wording digest reads a token stream the answer does not carry, and the others' derivations are not published. Test:OneEvidenceBundleAndThePublisherFileAreEnoughToCheckItsTextAndRecomputeItsDerivedDigests.
How the API changes
Each schema's identity ends in its version, as lex-v3-envelope/1 does, and so does the registry's, lex-v3-operation-registry/2. A change that removes or renames a member, or changes what one means, raises that version; the envelope admits no member it does not list, so a new member of the envelope raises its version too.
An answer's object, and a refusal's payload, may gain members within a version: a program ignores the members it does not know. Within a version of the registry, a payload never loses a field the registry requires of its code.
Any change to an operation's definition, to a schema the registry names or to a refusal code changes the registry's digest, which every envelope carries: a program that keeps it learns of the change from the first answer after it. A fix to how an operation behaves that leaves its definition as it is keeps the digest, so the digest says when the contract changes, not when an answer does. The out-of-scope list is not part of the registry: every out_of_corpus_scope refusal the list decides names the list's identity, scope_list, and its digest, scope_list_sha256, which changes with any change to the list.
One member of the envelope names the registry's version, registry_schema: a new version of the registry changes the one value that member admits, and so the envelope's schema and its digest, without raising the envelope's own version. A program that holds the envelope's schema takes it again when the registry's version changes, and checks it against the digest the registry names.
The operations and the refusal codes are closed sets, changed only by a decision of the specification. An operation not served from data becomes served without a new version of the registry: its refusal gives way to answers.
There is no period of notice and no deprecation window: a change is published with the release that makes it, on this page and in the schemas it links.
Since , the registry, lex-v3-operation-registry/2, names each refusal code's payload schema and gives out_of_corpus_scope its reason and who to ask; lex-v3-operation-registry/1 named neither.
The schemas
Each schema is a JSON Schema document (https://json-schema.org/draft/2020-12/schema), served here byte for byte as the server holds it, with the digest of its bytes; when the server loads a schema, it checks that digest against the one the registry names.
- The envelope: lex-v3-envelope/1 (digest
d135633d801092e5b1d46c0a5c168f1354b1c0e5595d07372c23744dd0e7c255) - The refusal: lex-v3-refusal/1 (digest
2705723884d22104188d9e9fe6673efc5a2563e4549af6f774dbadf974dc5c98) - Each refusal code's payload: one schema per code, linked beside its code under the refusals.