Développeurs
L’API de Lex, pour les programmes et les agents d’IA
Les réponses que montrent les pages de ce site viennent d’une même API, et ces mêmes réponses sont ouvertes à tout programme, en REST et en MCP, à l’adresse même de ce site. L’usage de l’API est gratuit et anonyme : il n’y a ni clé, ni compte, ni formule payante. Cette page est générée à partir du registre des opérations et des schémas au regard desquels ce déploiement vérifie chaque requête et chaque réponse ; elle décrit donc ce que fait le serveur.
Deux accès, une seule réponse
REST : POST /api/v3/{operation}, avec un corps JSON qui nomme l’opération et ses paramètres, {"operation_id": "…", "parameters": {…}}. Le chemin n’accepte aucune chaîne de requête, et toute autre méthode ne reçoit qu’un échec sous l’enveloppe.
MCP : des messages JSON-RPC envoyés par POST à https://law.soufien.lu/mcp, par le transport Streamable HTTP, version du protocole 2025-06-18. Le serveur répond à initialize, ping, tools/list, tools/call ; chaque opération enregistrée est un outil du même nom, dont le schéma d’entrée est le membre parameters du schéma de requête de l’opération.
Les deux donnent la même enveloppe pour la même requête : un appel d’outil est converti en document de requête REST et traité par le même code, et son résultat porte l’enveloppe comme contenu structuré. Un refus est une réponse, non une erreur : REST l’envoie comme une réponse HTTP réussie, et MCP comme un résultat d’outil avec isError: false ; seul le refus d’une requête au-delà de la limite de son client a un autre statut en REST, indiqué ci-dessous.
En MCP, la réponse à initialize porte instructions, qu’un client peut transmettre à son modèle de langage, et il est répondu à ping par un résultat vide. Les instructions, telles que le serveur les envoie :
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.
Par exemple, le rapport de couverture, demandé avec curl :
curl -X POST https://law.soufien.lu/api/v3/coverage \
-H 'content-type: application/json' \
-d '{"operation_id":"coverage","parameters":{}}'La même requête en MCP, sous forme de message tools/call :
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "coverage",
"arguments": {}
}
}Un client qui prend en charge le transport Streamable HTTP reçoit l’adresse https://law.soufien.lu/mcp ; pour un client qui lit la liste de ses serveurs dans un fichier JSON, par exemple :
{
"mcpServers": {
"lex": {
"type": "http",
"url": "https://law.soufien.lu/mcp"
}
}
}Demandé à ce serveur, maintenant
En servant cette page, ce serveur a répondu à cette requête à partir du droit qu’il détient :
curl -X POST https://law.soufien.lu/api/v3/browse \
-H 'content-type: application/json' \
-d '{"operation_id":"browse","parameters":{"limit":1}}'Sa réponse, en entier :
{
"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-31T01:59:54.8104933Z",
"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_20854d1e0fe15a660ddf89371b3c77398b0c3c3824c084a8a9fea99531f3e730",
"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, le premier acte qu’il détient, dont le dossier est demandé en REST, puis, en MCP, le texte au 2025-12-26, date de sa dernière version :
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"
}
}
}Les opérations
Le registre recense 27 opérations ; ce serveur en sert 24. Chacune indique son chemin REST, son outil MCP, ses paramètres tels que son schéma de requête les énonce, les objets que porte sa réponse, et ses deux schémas.
Pour un identifiant de l’UE, certaines opérations servies refusent avec retrieval_mode_unavailable, en nommant les modes disponibles ; lorsqu’un index de l’UE est monté, le membre operations.refused_for_eu de la réponse de couverture les recense.
answer_drift
Les réponses datées passées qu’une révision ultérieure de l’éditeur a invalidées, retrouvées à partir du journal des événements.
- REST
POST /api/v3/answer_drift- Outil MCP
answer_drift- Paramètres
identifier(facultatif){"type":"string","minLength":1,"pattern":"\\S"}after(facultatif){"type":"string","pattern":"^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}
- La réponse porte
answer_drift
article_history
Un article d’un acte luxembourgeois à travers les versions détenues : si son libellé a changé de l’une à la suivante, et quelles versions ne le contiennent pas.
- REST
POST /api/v3/article_history- Outil MCP
article_history- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}anchor(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
provision_history
as_observed
La version d’un acte luxembourgeois applicable à une date, telle qu’une construction du journal des événements la détenait, l’heure de cette construction étant une borne supérieure de son observation.
- REST
POST /api/v3/as_observed- Outil MCP
as_observed- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}snapshot(facultatif){"type":"string","pattern":"^[0-9a-f]{64}$"}at(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
quote,version_state
as_of
La version d’un acte luxembourgeois applicable à une date, avec ses articles ; pour un acte de l’UE, le libellé qui sert de réponse pour cette date.
- REST
POST /api/v3/as_of- Outil MCP
as_of- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
quote,version_state
ask
L’assistant, qui est désactivé : chaque question reçoit le résultat de présentation qui le dit, en nommant les opérations qui répondent à partir du droit que Lex détient. Aucun modèle ne rédige de réponse.
- REST
POST /api/v3/ask- Outil MCP
ask- Paramètres
question(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
answer_dossier,handoff_card
browse
Les actes luxembourgeois détenus, en une seule liste ordonnée et paginée, avec leurs identifiants, leurs langues, les dates de leurs versions et les types de documents de l’éditeur.
- REST
POST /api/v3/browse- Outil MCP
browse- Paramètres
type(facultatif){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
classification,work_record
changes_in_period
Les versions luxembourgeoises dont l’applicabilité commence dans une période, pour un acte ou dans tout l’index.
- REST
POST /api/v3/changes_in_period- Outil MCP
changes_in_period- Paramètres
date_from(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}date_to(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(facultatif){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}
- La réponse porte
change_list
citation
Les références que l’éditeur a écrites dans le texte des articles d’une version luxembourgeoise.
- REST
POST /api/v3/citation- Outil MCP
citation- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}anchor(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
relation_edge
cited_by
Les références, dans toute version luxembourgeoise détenue, dont la cible est un acte donné.
- REST
POST /api/v3/cited_by- Outil MCP
cited_by- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
relation_edge
classification
Les données typées de l’éditeur sur un acte luxembourgeois, telles que l’éditeur les énonce : type de document, valeur juridique, organe responsable, identifiants historiques, dates de publication et du document.
- REST
POST /api/v3/classification- Outil MCP
classification- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
classification
concepts
Les concepts que l’Office des publications attache aux actes de l’UE : descripteurs EuroVoc, codes du répertoire et matières.
Opération non servie faute de données : une requête qui la vise reçoit, dans l’enveloppe, le refus retrieval_mode_unavailable, qui nomme le mode demandé, r5_concepts, et les modes que ce serveur sert ; les données qui permettraient de la servir : 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- Outil MCP
concepts- Paramètres
- aucun
- La réponse porte
classification
coverage
Ce que ce serveur détient et sert, compté à partir de son index, et ce qu’il ne détient pas.
- REST
POST /api/v3/coverage- Outil MCP
coverage- Paramètres
language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
coverage_report
diff
La différence, article par article, entre les versions d’un acte luxembourgeois applicables à deux dates.
- REST
POST /api/v3/diff- Outil MCP
diff- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date_from(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}date_to(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}page(facultatif){"type":"integer","minimum":1,"maximum":100000}
- La réponse porte
diff
dossier
La fiche d’un acte telle que l’index la détient : les intitulés et les versions d’un acte luxembourgeois, ou les expressions d’un acte de l’UE.
- REST
POST /api/v3/dossier- Outil MCP
dossier- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
work_record
events
Le journal des événements de ce que chaque construction de l’index a constaté, interrogé par curseur et délivré au moins une fois.
- REST
POST /api/v3/events- Outil MCP
events- Paramètres
after(facultatif){"type":"string","pattern":"^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}event(facultatif){"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"]}
- La réponse porte
event
evidence_bundle
Ce qu’il faut pour citer une version, une page à la fois : le texte de chaque article avec ses empreintes, le permalien de la version, ses sources et ses identités officielles, selon la règle des droits ; pour un acte de l’UE, il en va de même du libellé qui sert de réponse pour la date.
- REST
POST /api/v3/evidence_bundle- Outil MCP
evidence_bundle- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}article(facultatif){"type":"string","minLength":1,"pattern":"\\S"}page(facultatif){"type":"integer","minimum":1,"maximum":100000}contents(facultatif){"type":"boolean"}
- La réponse porte
evidence_bundle
in_force_on
Les actes luxembourgeois ayant une version applicable à une date.
- REST
POST /api/v3/in_force_on- Outil MCP
in_force_on- Paramètres
date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(facultatif){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after_work_key(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
version_state
knowable_on
Ce qu’un lecteur pouvait savoir à une date : la publication de chaque version à côté du moment où Lex l’a observée.
Opération non servie faute de données : une requête qui la vise reçoit, dans l’enveloppe, le refus retrieval_mode_unavailable, qui nomme le mode demandé, r6_knowable_on, et les modes que ce serveur sert ; les données qui permettraient de la servir : 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- Outil MCP
knowable_on- Paramètres
- aucun
- La réponse porte
quote,version_state
manifestation
Les manifestations, chez l’éditeur, des expressions d’un acte luxembourgeois, avec leurs formats et leurs fichiers, celle que Lex a conservée étant signalée avec son empreinte.
- REST
POST /api/v3/manifestation- Outil MCP
manifestation- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}format(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
manifestation
provenance
Les sources, les profils de règles et les empreintes sur lesquels repose une version luxembourgeoise.
- REST
POST /api/v3/provenance- Outil MCP
provenance- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
provenance_chain
relations
Les références d’un acte luxembourgeois dans les deux sens, en une seule liste ordonnée et paginée.
- REST
POST /api/v3/relations- Outil MCP
relations- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(facultatif){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}direction(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
relation_edge
resolve
L’acte et l’expression que désigne un identifiant luxembourgeois ou un permalien épinglé.
- REST
POST /api/v3/resolve- Outil MCP
resolve- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
work_resolution
search
Une référence exacte ouvre son acte ; toute autre expression est recherchée, sans tenir compte des majuscules ni des accents, dans le texte des articles luxembourgeois dont les droits le permettent, ou dans les libellés d’un acte de l’UE désigné par son identifiant.
- REST
POST /api/v3/search- Outil MCP
search- Paramètres
query(obligatoire){"type":"string","minLength":1,"maxLength":512,"pattern":"\\S"}language(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(facultatif){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}identifier(facultatif){"type":"string","minLength":1,"pattern":"\\S"}mode(facultatif){"type":"string","minLength":1,"pattern":"\\S"}limit(facultatif){"type":"integer","minimum":1,"maximum":200}after(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
quote,work_record
status_on
Les propres énoncés de l’éditeur sur l’entrée en vigueur d’un acte luxembourgeois et sur sa fin, mot pour mot, à côté de la version applicable à une date.
- REST
POST /api/v3/status_on- Outil MCP
status_on- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}date(obligatoire){"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
version_state
timeline
Chaque version détenue d’un acte luxembourgeois, dans l’ordre d’applicabilité de l’éditeur ; pour un acte de l’UE, chaque libellé découvert, dans l’ordre des dates.
- REST
POST /api/v3/timeline- Outil MCP
timeline- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
timeline
transposition
Les liens entre les directives de l’UE et les actes luxembourgeois qui les transposent, tels que chaque éditeur les affirme.
Opération non servie faute de données : une requête qui la vise reçoit, dans l’enveloppe, le refus retrieval_mode_unavailable, qui nomme le mode demandé, r4_transposition, et les modes que ce serveur sert ; les données qui permettraient de la servir : 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- Outil MCP
transposition- Paramètres
- aucun
- La réponse porte
relation_edge
verify
Vérifie un permalien épinglé au regard de l’empreinte que détient l’index, ou donne les empreintes actuelles à épingler.
- REST
POST /api/v3/verify- Outil MCP
verify- Paramètres
identifier(obligatoire){"type":"string","minLength":1,"pattern":"\\S"}language(facultatif){"type":"string","minLength":1,"pattern":"\\S"}
- La réponse porte
verification
L’enveloppe
Chaque réponse, en REST comme en MCP, est une enveloppe, lex-v3-envelope/1 (empreinte d135633d801092e5b1d46c0a5c168f1354b1c0e5595d07372c23744dd0e7c255), avec ces membres :
schema- L’identité du schéma de l’enveloppe.
version- La version de la plateforme.
object_type- Le type de l’objet : une enveloppe.
request_ref- Une référence opaque à cette seule requête, à l’usage propre du client.
operation_id- L’opération qui a répondu.
registry_schema- L’identité du schéma du registre des opérations.
registry_sha256- L’empreinte du registre des opérations qu’exécute ce serveur.
context- Ce sur quoi la réponse a été donnée, ci-dessous.
verdict- La nature de la réponse, ci-dessous.
result- L’objet de la réponse, avec son propre schéma et son type, ou null lorsque l’opération refuse.
refusal- Le refus, avec son code et sa charge utile, ou null lorsque l’opération répond.
Son membre context indique ce sur quoi la réponse a été donnée :
commits- Les révisions du code de Lex qui ont construit l’index,
index_builder_source_commit(« Révision du code ayant construit l’index »), et qui servent la réponse,serving_runtime_source_commit(« Révision du code du service en fonctionnement »). freshness- Dans quelle mesure les données sont à jour : quand l’index a été construit, la dernière collecte complète de chaque éditeur avec son âge et le décalage entre publication et collecte, l’âge maximal admis, et si les données sont plus anciennes que cet âge.
jurisdiction- L’ordre juridique du droit concerné : le Luxembourg ou l’UE.
provisional- Si la réponse est provisoire ; ce serveur envoie toujours
false. publisher- L’éditeur dont le droit fait l’objet de la réponse.
snapshot- L’instantané du corpus dont l’index a été dérivé, par son identité et son empreinte.
status- Si l’opération a répondu ou refusé.
timeline_semantics- Comment lire les dates de la réponse :
publisher_applicabilitypour le Luxembourg, les dates à partir desquelles l’éditeur indique que ses versions sont applicables ;official_consolidation_statepour l’UE, les dates des libellés de l’éditeur.
Son membre verdict relève de l’ensemble fermé du registre :
answer- L’opération a répondu.
answer_with_enrichment- Réservé à l’assistant, qui est désactivé ; ce serveur ne l’envoie pour aucune réponse.
point- La réponse renvoie ailleurs : c’est ce que donne
ask, puisque l’assistant est désactivé. clarify- Réservé à l’assistant, qui est désactivé ; ce serveur ne l’envoie pour aucune réponse.
refuse- L’opération a refusé, par un refus typé.
split- Réservé à l’assistant, qui est désactivé ; ce serveur ne l’envoie pour aucune réponse.
registry_sha256 vaut 627879b6718d746b944758378b9ea476919311a72857bcba0cb72e202fb70059 pour ce déploiement : c’est l’empreinte du registre, qui couvre chaque opération, l’empreinte de chaque schéma et chaque code de refus avec les champs que sa charge utile doit porter ; elle change donc dès que l’un d’eux change. L’identité de chaque schéma se termine par sa version.
Refus
Lorsqu’une opération ne peut pas répondre, elle refuse avec l’un des 20 codes, jamais par une réponse vide : le verdict de l’enveloppe est refuse, son résultat est null, et son refus, lex-v3-refusal/1 (empreinte 2705723884d22104188d9e9fe6673efc5a2563e4549af6f774dbadf974dc5c98), porte le code et une charge utile. Le registre fixe les champs que la charge utile de chaque code doit porter ; une charge utile peut en porter davantage.
Sur les pages de ce site, la phrase simple d’un refus vient en premier, et son code et sa charge utile la suivent.
advice_boundary- La question demande un conseil : Lex montre le texte, et ne l’applique à la situation de personne. Sa charge utile porte
descriptive_maximum,handoff, et doit être conforme à lex-v3-advice_boundary-payload/1 (empreinte76fe0961f4734b99f12bdc81e623faa3648952e66b3bbe5e9fb82365a7f98d64). ambiguous_identifier- L’identifiant désigne plus d’un acte ; les candidats sont listés, et aucun n’est choisi. Sa charge utile porte
requested_identifier,candidates, et doit être conforme à lex-v3-ambiguous_identifier-payload/1 (empreintef2ccba8567ad4c69b1a7247b0f05ab8e45dc1c164aac325d07d6307a532dff13). ambiguous_version- Plus d’une version couvre la date et l’éditeur ne dit pas laquelle s’applique ; chaque version candidate est listée, et aucune n’est choisie. Sa charge utile porte
requested_date,candidates, et doit être conforme à lex-v3-ambiguous_version-payload/1 (empreinte283beeada41bb31c342eb21262622add6a53b4dbc461ffaa7663254771a3f27e). anchor_not_in_version- L’index ne contient aucun article portant cet identifiant dans la version ; les identifiants d’article les plus proches sont donnés, et aucune recherche dans le texte n’est lancée à la place. Sa charge utile porte
requested_anchor,nearest_anchors,do_not_fall_back_to_full_text_search, et doit être conforme à lex-v3-anchor_not_in_version-payload/1 (empreintec869995a2de63355e7bb745ee886dd986a613c7ef4643618fd7b9fe23c8edd19). derivation_refused- Lex refuse de dériver du texte qu’il détient ce qui est demandé ; la charge utile indique ce qui est refusé et pourquoi. Sa charge utile porte
derivation,reason, et doit être conforme à lex-v3-derivation_refused-payload/1 (empreinte02c709e03d9ebb98fd3ed2d59d348c9556fc1130bff6cb2436877f1e93f7f1f3). format_not_available- Le format demandé n’est pas proposé pour cette réponse ; les formats proposés sont listés. Sa charge utile porte
requested_format,available_formats, et doit être conforme à lex-v3-format_not_available-payload/1 (empreinte6212f923de42878063c1f5f19bd60db37dd324fd5f0b1d265e731c9e5effaf45). identifier_unknown- Aucun acte détenu par l’index ne porte cet identifiant ; la charge utile donne la recherche officielle et ce qui permettrait de répondre. Sa charge utile porte
requested_identifier,official_search_actions,what_would_answer, et doit être conforme à lex-v3-identifier_unknown-payload/1 (empreinteb44b428735377e8a80b87c3d2a36d5a7bf088963dad2e9ea09eb20bc02589363). language_not_available- Le texte n’est pas détenu dans cette langue ; les langues détenues sont listées. Sa charge utile porte
requested_language,available_languages, et doit être conforme à lex-v3-language_not_available-payload/1 (empreinte16cc301311ff4b00eb411787c41f6a350bff402312ae1b945be5ce9cbb59c193). no_corpus_mounted- Ce serveur ne détient aucun droit pour le moment. Sa charge utile porte
required_corpus, et doit être conforme à lex-v3-no_corpus_mounted-payload/1 (empreintef630698422967772f3856d9ba9316b3dbbc3dca0db0fa32982a1f3958637f24d). no_version_for_date- Aucune version détenue par l’index ne couvre la date ; la charge utile donne la date à laquelle commence son historique et les dates détenues les plus proches, avant et après. Sa charge utile porte
requested_date,history_begins,nearest_earlier,nearest_later, et doit être conforme à lex-v3-no_version_for_date-payload/1 (empreinte96f500518a36236a9657373ddfbb30327dbcf48aff54019d832c4710878e370d). not_transposable- Seule une directive est transposée, et cet instrument n’en est pas une ; la charge utile dit pourquoi. Sa charge utile porte
instrument_type,explanation, et doit être conforme à lex-v3-not_transposable-payload/1 (empreinte889145a4c9e933214affde1a5a4241954d96ee51a7da7d68fd06e8664c1fb813). out_of_corpus_scope- Lex ne détient pas l’instrument, et la charge utile dit pourquoi : elle le nomme, avec son lieu officiel de publication, la raison et à qui s’adresser, une institution ou un service officiel et jamais une personne. Sa charge utile porte
requested_identifier,official_source,reason,who_to_ask, et doit être conforme à lex-v3-out_of_corpus_scope-payload/1 (empreinte6b5f5a33e40ea970d5be326577fcba92139df76817bc4e8513c82eddff78b364). pinned_digest_mismatch- L’empreinte qu’épingle un permalien n’est pas une empreinte que Lex détient pour cette version ; la charge utile donne l’empreinte actuelle et son permalien. Sa charge utile porte
requested_digest,current_digest,stable_coordinate,current_hash_pinned_url, et doit être conforme à lex-v3-pinned_digest_mismatch-payload/1 (empreinte6564294c7ea4852a7ddaff9f9e27a7a2b8a2b1dceebbbbec1e0c9c268510675c). profiles_differ- Les deux versions ont été lues selon des profils de règles différents ; elles ne sont donc pas comparées. Sa charge utile porte
left_profile,right_profile, et doit être conforme à lex-v3-profiles_differ-payload/1 (empreintea6c2313b0f99f99b2c4467bd6f199f6c6398786a466852ffe32849d5cf2ce544). rate_limited- Trop de requêtes ; la charge utile dit quand demander de nouveau. Sa charge utile porte
retry_after,retryable, et doit être conforme à lex-v3-rate_limited-payload/1 (empreinteea152733a9c0409d66202f140b7bbaf5b7b4ef7b902f49c8dbb1712b62e05445). snapshot_unknown- L’instantané ou le journal que nomme la requête n’est pas l’un de ceux que ce serveur détient ; la charge utile dit ce qui permettrait de répondre. Sa charge utile porte
snapshot_id,what_would_answer, et doit être conforme à lex-v3-snapshot_unknown-payload/1 (empreinte5f3e77d337e5363322251ad1d28532ac2f9a014be7bfb1e2e19d8cce344cd087). text_not_available- Le fichier de l’éditeur ne contient aucun texte que Lex puisse lire, comme une annexe fournie uniquement sous forme d’images ; son identité officielle et sa source sont données. Sa charge utile porte
official_identity,official_source,retained_transport_evidence, et doit être conforme à lex-v3-text_not_available-payload/1 (empreinted3f8945228912c77fdcc27d8628fcce3dfb2934d8b7e4d36a64d80232a6efb39). text_withheld- La licence du texte ne permet pas à Lex de le montrer ; son lien officiel et son empreinte sont donnés. Sa charge utile porte
official_identity,official_link,content_sha256, et doit être conforme à lex-v3-text_withheld-payload/1 (empreinte41cc8ebafcb63f15eb9d10391ca822fa2bf0555305bc9f3ef8a615b7c9addf73). upstream_unreachable- Une source dont Lex dépend n’a pas pu être jointe ; la charge utile dit s’il faut demander de nouveau. Sa charge utile porte
upstream,retryable, et doit être conforme à lex-v3-upstream_unreachable-payload/1 (empreinte4477c1e18093ae11ccaa5a96b9506a5705559c84870cbe195099137d84768078).
Ce que Lex ne détient jamais
Un identifiant qui désigne l’un de ces instruments est refusé avec out_of_corpus_scope par toute opération qui en accepte un, avant toute recherche. La liste, lex-v3-out-of-scope/1, nomme pour chacun son lieu officiel de publication et à qui s’adresser, une institution ou un service officiel et jamais une personne ; chaque refus nomme l’empreinte de la liste, 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. Par exemple
Circulaire CSSF 20/747,CSSF circular 22/806,CSSF 20/747,Circ. CSSF 12/552 telle que modifiée,Circulaire IML 98/143. Lieu officiel : https://www.cssf.lu/. À qui s’adresser : 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. Par exemple
Délibération CNPD n° 12/2023,CNPD decision 3/2021,Délibération n° 36FR/2021 de la CNPD. Lieu officiel : https://cnpd.public.lu/. À qui s’adresser : 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. Par exemple
ECLI:EU:C:2014:317,62012CJ0131,C-131/12,Case C-131/12 Google Spain,Joined Cases C-293/12 and C-594/12. Lieu officiel : https://curia.europa.eu/. À qui s’adresser : 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. Par exemple
RESA_2020_123.456,Recueil électronique des sociétés et associations. Lieu officiel : https://www.lbr.lu/. À qui s’adresser : Luxembourg Business Registers (LBR).
Pas encore listés : les règlements communaux, dont le lieu officiel de publication est propre à chaque commune, et les décisions des juridictions luxembourgeoises, qu’aucun identifiant ne désigne exactement. Une requête qui désigne l’un d’eux reçoit encore identifier_unknown.
Une requête qui désigne un acte de l’UE par son numéro CELEX est elle aussi refusée avec out_of_corpus_scope, bien que cet acte ne figure sur aucune liste, lorsqu’il est extérieur à la population d’actes de l’UE que détient ce site : qu’un acte soit extérieur à cette population dépend de l’index de l’UE que monte le serveur. Le refus énonce la règle qui délimite cette population, avec le nombre d’actes de sa liste de départ, et donne comme lieu officiel la page de l’acte sur EUR-Lex ; il ne nomme ni la liste de ce que Lex ne détient jamais ni son empreinte.
Deux réponses qui ne sont pas des refus
assistant_v3_unavailable: ce queaskrépond à chaque question, puisque l’assistant est désactivé ; il nomme les opérations qui répondent à partir du droit que Lex détient.localization_unavailable: la page présentée à un lecteur en allemand ou en luxembourgeois, puisque seuls le français et l’anglais sont relus ; elle renvoie aux pages dans ces deux langues.
Échecs sous l’enveloppe
Une requête que le serveur ne peut ni lire ni acheminer ne reçoit pas d’enveloppe : il y est répondu par un document de problème, lex-v3-transport-problem/1, avec un statut HTTP et l’un de ces codes. À la différence d’un refus, ce n’est pas une réponse sur le droit.
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
Citer
Chaque article cité porte text_sha256, l’empreinte de son texte ; body_sha256, l’empreinte du fichier de l’éditeur dont il a été lu ; official_source, sa source officielle ; et article_permalink, qui épingle l’éditeur, l’acte, la date et l’empreinte de la version ou du libellé de l’UE, la langue et l’article : /{publisher}/{work}/{date}--{digest}/{language}/{article}.
verify vérifie l’empreinte d’un permalien au regard de celle que détient l’index, à partir de ce que détient ce serveur : il n’interroge jamais l’éditeur.
Chaque mise en production de Lex est signée. Les clés qui les signent, chacune avec son identité, son rôle, sa validité et son statut, sont publiées à l’adresse https://law.soufien.lu/.well-known/lex-keys.json : vérifiez les signatures d’une mise en production au regard de cet ensemble, jamais au seul regard de la clé qu’elle contient.
Sur la page de lecture, un article est cité sous trois formes, « Citation usuelle », « Avec son permalien » et « Avec ses éléments de vérification », et un export porte les trois. Dans un document, citez le texte officiel par sa référence officielle.
Limites
Il n’y a ni clé ni compte, et le serveur ne garde aucune trace écrite d’une requête ; pour la limite par client ci-dessous, il compte les requêtes dans sa seule mémoire vive : voir la page sur la protection des données.
Le corps d’une requête compte au plus 1 048 576 octets ; il est répondu à un corps plus grand par request_too_large.
Les listes sont paginées : limit fixe la taille d’une page, dans les bornes qu’énonce chaque schéma de requête, et after reprend là où la dernière page s’est arrêtée.
Chaque client, reconnu à son adresse IP, peut envoyer 60 requêtes par minute à l’API, REST et MCP confondus, dont au plus 4 traitées en même temps. Au-delà de l’une ou l’autre limite, une requête adressée à une opération (en MCP, un appel d’outil) est refusée avec rate_limited, qui porte retry_after, le nombre de secondes à attendre avant de demander de nouveau, comme le fait l’en-tête Retry-After ; en REST, son statut est 429. Le service est de petite taille : envoyez une requête à la fois et interrogez avec modération.
Les pages que le serveur produit lui-même ont un budget distinct, de 300 par minute pour chaque client ; au-delà, une page est envoyée telle qu’elle a été construite, et le navigateur demande alors sa réponse à l’API. Aucune page n’est refusée.
Aucune disponibilité n’est garantie : voir les conditions d’utilisation.
Suivre les modifications
events lit le journal de ce que chaque construction de l’index a constaté : au début d’un journal, un événement first_sighting pour chaque version détenue, puis les événements de comparaison de chaque construction ultérieure, chacun daté par sa construction, jamais par le moment de son observation. Interrogez-le avec after, le curseur que la dernière réponse a donné comme next_after, et limit, et filtrez-le avec event.
La livraison se fait au moins une fois : un même curseur peut renvoyer les mêmes événements, si bien qu’un client conserve le dernier curseur et ignore les événements déjà vus, par seq au sein de log_id. Il n’y a ni webhook ni envoi spontané : interrogez.
Les événements qu’un journal peut contenir : 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.
Un curseur correspond à ^[0-9a-f]{64}:(0|[1-9][0-9]{0,17})$.
answer_drift liste les réponses datées passées qu’une révision ultérieure de l’éditeur a invalidées, retrouvées à partir des événements de révision du journal.
La réponse des événements énonce sa propre livraison, telle que le serveur l’envoie :
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)
Garanties de rejeu
Ce sur quoi un programme peut compter lorsqu’il demande de nouveau : les garanties que la spécification nomme de G1 à G5, chacune telle que ce serveur l’assure aujourd’hui. Chacune est vérifiée par un test de tests/Lex.V3.Ingest.Tests/V3ReplayGuaranteesTests.cs, nommé à côté d’elle, qui interroge l’API réelle sur des montages de test.
- G1: Les versions ne sont jamais réécrites
- Une version est désignée par l’empreinte de son texte. Lorsqu’une construction ultérieure lit un fichier de l’éditeur qui a été remplacé, le journal l’enregistre comme
file_replaced; la version reste la même si le texte n’a pas changé, et une nouvelle version n’est désignée que si le texte a changé. Un permalien vers la version antérieure se vérifie toujours tant qu’une construction conservée en détient le texte, en nommant la version qui l’a remplacée. Test :AReplacedPublisherFileIsAFileReplacedEventAndANewVersionIdOnlyWhenItsTextChanged. - G2: La même requête, les mêmes octets
- Sur un serveur construit à partir de la même révision du code (
context.commits.serving_runtime_source_commit), chaque opération servie répond à la même requête, adressée au même instantané, par les mêmes octets canoniques, qu’elle soit adressée de nouveau plus tard ou à une copie octet pour octet du montage, à l’exception de ce qui est propre à la requête ou dépend du moment de la réponse. Les membres propres à la requête sontcontext.freshness.observed_atetrequest_ref. Ceux qui dépendent de ce moment sont l’âge des données de chaque canal et le fait qu’il dépasse ou non l’âge maximal admis,context.freshness.channels[].age_daysetcontext.freshness.channels[].stale, ainsi quecontext.freshness.stalepour l’enveloppe, comptés jusqu’à la réponse du serveur ; et, lorsqu’une recherche lit une référence exacte qui n’indique aucune date, la date lue, celle d’aujourd’hui au Luxembourg (result.value.reference.recognised.date) si la recherche n’en indique pas non plus, la version, ou pour un acte de l’UE le libellé, qui sert de réponse pour cette date, et l’adresse qu’ouvre la réponse, l’adresse lisible de l’acte ou le permalien de cette version ou de ce libellé : une date de recherche égale à celle d’aujourd’hui équivaut à l’absence de date. Une requête au-delà de la limite de son client reçoit à la place le refusrate_limited. La mise en production est signée dans son ensemble ; une réponse ne porte pas de signature propre. Test :EveryServedOperationAnswersTheSameBytesFromTheSameSnapshotFromACopyOfItAndLater. - G3: Rien n’est supprimé du journal
- Les événements de chaque construction forment le début du journal de la construction suivante, ligne pour ligne. Le code peut conserver des constructions antérieures à côté de celle qu’un serveur monte, selon une règle de conservation : chaque construction listée comme référencée par un permalien publié, la dernière construction de chaque jour pendant 90 jours et la première de chaque mois. Lex ne les conserve pas encore : la mise en production déployée sur ce site ne contient que la construction que monte son serveur. Une version que nomme le journal ne peut donc être vérifiée de nouveau que tant qu’une construction conservée en détient le texte, c’est-à-dire aujourd’hui la construction montée ; une version dont aucune construction conservée ne détient le texte reste nommée par le journal, sans son texte, et un permalien vers elle ne se vérifie plus. Test :
NothingIsHardDeletedAcrossBuildsEveryEventIsCarriedAndEveryStateTheLogNamesStillVerifies. - G4: Répondre par ce que détenait une construction
as_observedrépond par ce que détenait une construction du journal, désignée par l’empreinte de son index, dans la limite de l’heure de cette construction, qui est une borne supérieure du moment où ses textes ont été observés. Aucune heure d’observation n’est détenue : une heure est donc refusée, et l’opérationknowable_on, qui en a besoin, n’est pas servie. Test :EverySnapshotTheLogNamesAnswersAsObservedWhatThatBuildAnsweredBoundedByItsBuildTime.- G5: Vérifiable sans Lex
- Les réponses de
evidence_bundlepour une version, page par page, et le fichier de l’éditeur suffisent pour vérifier le texte de chaque article et pour recalculer l’empreinte du fichier, l’empreinte de chaque texte, celle des identités des articles et l’empreinte propre de la version, à partir des dérivations que publieprovenance. L’identité de chaque article, l’empreinte du libellé, celles des profils de règles et le reçu ne peuvent pas être recalculés : l’empreinte du libellé se calcule sur une suite de jetons que la réponse ne porte pas, et les dérivations des autres ne sont pas publiées. Test :OneEvidenceBundleAndThePublisherFileAreEnoughToCheckItsTextAndRecomputeItsDerivedDigests.
Comment l’API évolue
L’identité de chaque schéma se termine par sa version, comme lex-v3-envelope/1, et il en va de même de celle du registre, lex-v3-operation-registry/2. Une modification qui retire ou renomme un membre, ou qui change ce qu’il signifie, fait monter cette version ; l’enveloppe n’admet aucun membre qu’elle ne liste pas, si bien qu’un nouveau membre de l’enveloppe fait aussi monter sa version.
L’objet d’une réponse, et la charge utile d’un refus, peuvent gagner des membres au sein d’une même version de leur schéma : un programme ne tient pas compte des membres qu’il ne connaît pas. Au sein d’une version du registre, une charge utile ne perd jamais un champ que le registre exige de son code.
Toute modification apportée à la définition d’une opération, à un schéma que nomme le registre ou à un code de refus change l’empreinte du registre, que porte chaque enveloppe : un programme qui conserve cette empreinte apprend la modification dès la première réponse qui la suit. Une correction apportée au comportement d’une opération sans modifier sa définition laisse l’empreinte inchangée : l’empreinte indique donc quand le contrat de l’API change, et non quand une réponse change. La liste de ce que Lex ne détient jamais ne fait pas partie du registre : chaque refus out_of_corpus_scope fondé sur la liste nomme l’identité de la liste, scope_list, et son empreinte, scope_list_sha256, qui change à chaque modification de la liste.
Un membre de l’enveloppe nomme la version du registre, registry_schema : une nouvelle version du registre change la seule valeur que ce membre admet, et donc le schéma de l’enveloppe et son empreinte, sans faire monter la version propre de l’enveloppe. Un programme qui conserve le schéma de l’enveloppe le récupère de nouveau lorsque la version du registre change, et le vérifie au regard de l’empreinte que nomme le registre.
Les opérations et les codes de refus forment des ensembles fermés, qui ne changent que par une décision de la spécification. Une opération non servie faute de données devient servie sans nouvelle version du registre : son refus cède la place à des réponses.
Il n’y a ni préavis ni période d’abandon progressif : une modification est publiée avec la mise en production qui l’apporte, sur cette page et dans les schémas auxquels elle renvoie.
Depuis le , le registre, lex-v3-operation-registry/2, nomme le schéma de la charge utile de chaque code de refus et donne à out_of_corpus_scope sa raison et l’organisme à qui s’adresser ; lex-v3-operation-registry/1 ne nommait ni l’un ni l’autre.
Les schémas
Chaque schéma est un document JSON Schema (https://json-schema.org/draft/2020-12/schema), servi ici octet pour octet tel que le serveur le détient, avec l’empreinte de ses octets ; lorsque le serveur charge un schéma, il vérifie cette empreinte au regard de celle que nomme le registre.
- L’enveloppe : lex-v3-envelope/1 (empreinte
d135633d801092e5b1d46c0a5c168f1354b1c0e5595d07372c23744dd0e7c255) - Le refus : lex-v3-refusal/1 (empreinte
2705723884d22104188d9e9fe6673efc5a2563e4549af6f774dbadf974dc5c98) - La charge utile de chaque code de refus : un schéma par code, dont le lien figure à côté de ce code dans la partie des refus.