Amendements parlementaires
Texte, objet, auteurs, sort et contexte des amendements déposés à l’Assemblée nationale et au Sénat.
- Assemblée nationale — Amendements Open Data
- Sénat — base AMELI
Fichiers : marie.db · marie_embeddings.db · semantic_cache
Accès développeur
Indiquez votre adresse e-mail. Nous vous enverrons un lien personnel pour générer votre clé Lex Machine.
Lex Machine · inventaire pédagogique · 11 août 2026
Une carte simple des corpus juridiques et parlementaires : leur périmètre, leur source officielle, leur nombre de documents et de vecteurs, ainsi que la place occupée par leurs fichiers.
Les compteurs proviennent des reçus finaux des candidats vérifiés.
| Famille | État | Documents | Passages | Vecteurs | Volume brut des vecteurs | Stockage principal |
|---|---|---|---|---|---|---|
Amendementsmarie.db | Présent | 868 642 | — | 868 642 | 3,31 Gio | 6,83 Gio + base vectorielle partagée |
| LEGIcodes et textes consolidés | Présent | 922 959 | — | 922 959 | 3,52 Gio | 5,22 Gio + base vectorielle partagée |
| DOLEdossiers législatifs Légifrance | Présent | 3 578 | 7 196 unités sémantiques | 7 196 | 28,1 Mio | |
Propositions de loippl.db | Présent | 687 | — | 52 | 208 Kio | 648 Kio + base vectorielle partagée |
| PLF | Présent | 7 550 | — | 6 853 | 26,8 Mio | 8,2 Mio + base vectorielle partagée |
Questions écrites ANquestions_ecrites.db | Présent | 45 935 | 218 554 unités sémantiques | 218 554 | 853,7 Mio | 415,6 Mio + base vectorielle partagée |
| Cour des comptescatalogue + textes découpés | Présent | 38 088 au catalogue 18 319 découpés | 283 395 | 283 395 | 1,08 Gio | 5,14 Gio avec cache |
| Questions historiques Sénatcorpus isolé | Présent | 1 227 | 4 631 | 4 631 | 18,1 Mio | 124,1 Mio avec index |
| Complément DILAJORF, KALI, CNIL, circulaires | Présent | 3 472 679 | 4 147 254 | 4 147 254 | 15,82 Gio | 61,45 Gio avec cache |
| Jurisprudence officielleCASS, INCA, CAPP, JADE, CONSTIT | Présent | 1 183 898 décisions | 4 822 270 | 4 822 270 | 18,40 Gio | 88,85 Gio |
Une base locale n’est pas la source juridique elle-même : elle est une copie structurée et indexée de données publiées par les institutions.
Texte, objet, auteurs, sort et contexte des amendements déposés à l’Assemblée nationale et au Sénat.
Fichiers : marie.db · marie_embeddings.db · semantic_cache
LEGI contient les codes et textes dans leurs versions consolidées. DOLE décrit les dossiers législatifs suivis par Légifrance. DOLE relève bien de l’écosystème DILA/Légifrance, même si son sujet est parlementaire.
Fichiers : legi_dole.db · marie_embeddings.db · semantic_cache_legi · semantic_cache_dole
Les propositions de loi et les ensembles PLF servent à retrouver les textes et dossiers parlementaires, notamment budgétaires.
Fichiers : ppl.db · marie_embeddings.db
Questions adressées au Gouvernement et réponses publiées. Le corpus Assemblée nationale et le corpus historique Sénat restent techniquement séparés.
Fichiers : questions_ecrites.db · questions_senat_historiques_chunks.db · questions_senat_historiques_embeddings_bge_m3.db
Rapports, observations, référés et autres publications de la Cour des comptes et des juridictions financières, avec découpage des textes pour la recherche sémantique.
Fichiers : ccomptes.db · ccomptes_chunks.sqlite · semantic_cache_ccomptes
Quatre matières qui complètent LEGI : Journal officiel (JORF), conventions collectives (KALI), délibérations et décisions CNIL, et circulaires administratives.
Fichiers : dila_complement_juridique.db · dila_complement_embeddings_bge_m3.db · semantic_cache_dila_complement
Décisions judiciaires, administratives et constitutionnelles provenant des catalogues officiels CASS, INCA, CAPP, JADE et CONSTIT. Chaque décision est découpée en passages fins.
Lot vérifié : jurisprudence_officielle_fine_chunks.db · jurisprudence_v2_embeddings_bge_m3.db · semantic_cache_jurisprudence_v2 — 95 399 377 064 octets
legifrance_cache.db mémorise des réponses techniques pour éviter certains appels répétés. Ce n’est pas un corpus autonome et il ne possède pas de vecteurs.
Taille observée : 15,4 Mio. À ne pas additionner aux documents juridiques.
L’application récupère d’abord les passages pertinents dans les index, puis les fournit comme contexte au modèle génératif. L’API expose la couche de recherche ; la génération reste à la charge du client.
Le modèle d’embedding multilingue transforme les requêtes et les chunks en vecteurs denses de 1 024 valeurs. Leur proximité mesure une similarité de sens, même lorsque les mêmes mots ne sont pas employés.
Les documents longs sont découpés en passages qui deviennent les unités d’indexation et de restitution. Un document peut donc produire plusieurs chunks et plusieurs vecteurs.
L’index vectoriel recherche les embeddings les plus proches de celui de la requête. Il évite de parcourir toutes les lignes SQL pour chaque recherche sémantique.
SQLite conserve les textes, identifiants et métadonnées. FTS5 ajoute un index inversé pour la recherche lexicale et alimente le mode « mots-clés » de l’API.
Les embeddings sont manipulés sous forme de tableaux NumPy en nombres float32. À quatre octets par valeur, un vecteur de 1 024 dimensions représente 4 Kio de données brutes.
API HTTP en lecture seule pour rechercher les douze corpus Lex Machine et consulter exactement les versions législatives, sans accès direct aux fichiers SQLite, aux index FAISS ni au serveur.
Toutes les fonctions sont ouvertes aux clés créées sur le portail. Chaque clé donne accès aux douze corpus et aux recherches semantic, keywords et hybrid. Pour legislation, elle donne aussi accès à la V2 (resolve), à la V3 (compare et document) et à la V3.1.
En V3.1, une anomalie temporelle de la source est restituée avec status: source_anomaly, temporal_quality.status: zero_length ou reversed, et applicability: not_asserted. L’API conserve les dates brutes, ne les corrige pas et n’affirme aucune applicabilité.
Après authentification, GET /api/v1/indexes reste la source de vérité. Pour legislation, toutes les clés du portail annoncent actuellement operations: ["search", "resolve", "compare", "document"] et document_anomaly_policy: "report".
| Ressource | Adresse |
|---|---|
| Création d’une clé | api.lexmachine.net |
| Contrat OpenAPI | /api/v1/openapi.json |
| État de l’API | /api/v1/health |
| Racine des routes | https://api.lexmachine.net/api/v1 |
La clé doit être envoyée dans l’en-tête HTTP Authorization :
Authorization: Bearer VOTRE_CLE_API
Une clé ressemble à lxm_live_identifiant.secret. Ne jamais la placer dans une URL, un dépôt Git, une capture d’écran ou un message public.
| Méthode | Route | Authentification |
|---|---|---|
GET | /api/v1/health | Publique |
GET | /api/v1/openapi.json | Publique |
GET | /api/v1/indexes | Clé API |
POST | /api/v1/indexes/{index_id}/search | Clé API |
POST | /api/v1/indexes/legislation/resolve | Clé API |
POST | /api/v1/indexes/legislation/compare | Clé API |
GET | /api/v1/documents/{official_id} | Clé API |
Le client peut appeler GET /api/v1/indexes pour obtenir les corpus autorisés pour sa clé et les capacités de chacun. Il n’a pas besoin de conserver cette liste localement.
{
"indexes": [
{
"id": "legislation",
"name": "Législation consolidée",
"capabilities": {
"modes": ["semantic", "keywords", "hybrid"],
"default_mode": "semantic",
"filters": [],
"operations": ["search", "resolve", "compare", "document"],
"document_anomaly_policy": "report"
}
}
],
"count": 1
}
Le contrat OpenAPI permet également à ChatGPT, à un client généré ou à tout outil compatible OpenAPI de découvrir automatiquement les routes et leurs paramètres. Le profil public actif annonce resolve, compare et document pour legislation, avec document_anomaly_policy: report. Le client doit néanmoins relire GET /api/v1/indexes, car une capacité peut être coupée à chaud en cas d’incident.
POST /api/v1/indexes/{identifiant_du_corpus}/search
Content-Type: application/json
Authorization: Bearer VOTRE_CLE_API
Corps JSON :
{
"query": "responsabilité de l’État pour délai excessif",
"top_k": 5,
"mode": "semantic"
}
query est obligatoire ;top_k est optionnel et limite le nombre de passages renvoyés : maximum général 20, ou 10 pour une clé libre-service ;mode vaut semantic pour la recherche vectorielle, keywords pour la recherche FTS ou hybrid pour leur fusion RRF.Il n’y a pas de nouvelle route à appeler. Utilisez la route de recherche habituelle et donnez simplement la valeur hybrid au champ mode :
{
"query": "responsabilité de l’État pour délai excessif",
"top_k": 5,
"mode": "hybrid"
}
Le serveur interroge alors BGE‑M3/FAISS et FTS5/BM25, déduplique leurs candidats et les reclasse par RRF. Si le champ mode est omis, la recherche reste en mode semantic par défaut.
curl --request POST \
--url https://api.lexmachine.net/api/v1/indexes/jurisprudence/search \
--header "Authorization: Bearer VOTRE_CLE_API" \
--header "Content-Type: application/json" \
--data '{"query":"responsabilité de l’État pour délai excessif","top_k":5,"mode":"semantic"}'
import os
import requests
response = requests.post(
"https://api.lexmachine.net/api/v1/indexes/jurisprudence/search",
headers={"Authorization": f"Bearer {os.environ['LEXMACHINE_API_KEY']}"},
json={
"query": "responsabilité de l’État pour délai excessif",
"top_k": 5,
"mode": "semantic",
},
timeout=60,
)
response.raise_for_status()
print(response.json()["hits"])
const response = await fetch(
"https://api.lexmachine.net/api/v1/indexes/jurisprudence/search",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LEXMACHINE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query: "responsabilité de l’État pour délai excessif",
top_k: 5,
mode: "semantic",
}),
},
);
if (!response.ok) throw new Error(`Erreur API : ${response.status}`);
const result = await response.json();
console.log(result.hits);
La recherche classe des passages. Pour identifier précisément un article et sa version applicable à une date, utilisez resolve lorsqu’il est annoncé par GET /api/v1/indexes :
POST /api/v1/indexes/legislation/resolve
Content-Type: application/json
Authorization: Bearer VOTRE_CLE_API
{
"article_number": "L. 3121-18",
"parent_title": "Code du travail",
"parent_nature": "CODE",
"effective_date": "2026-08-11"
}
Le résultat vaut resolved, not_found ou ambiguous. L’égalité porte sur le numéro canonique, le texte parent, sa nature et l’intervalle temporel. L’état brut, les dates, le contenu intégral, son hash et l’URL Légifrance qualifiée sont rendus sans score ni fallback vectoriel.
URL qualifiée décrit la construction du bon chemin Légifrance à partir des métadonnées. Ce n’est pas un test HTTP du site externe : un 404 de Légifrance peut provenir de sa protection anti-robot et ne prouve pas, à lui seul, que le document est absent. La décision de l’API repose uniquement sur le snapshot structuré.
POST /api/v1/indexes/legislation/compare exécute exactement la même résolution à deux dates et rend les deux versions séparément, sans interprétation.
{
"article_number": "L. 3121-18",
"parent_title": "Code du travail",
"parent_nature": "CODE",
"dates": ["2024-01-01", "2026-08-11"]
}
GET /api/v1/documents/{official_id} lit directement une version LEGIARTI… ou JORFARTI…, sans recherche.
En V3.1, un intervalle DILA nul ou inversé est rendu à toutes les clés du portail avec status: source_anomaly, temporal_quality.status: zero_length ou reversed, et applicability: not_asserted. Les dates et le contenu restent bruts : l’API ne corrige rien et n’affirme aucune applicabilité. Un retour arrière ciblé peut replacer ce cas derrière un 503 contrôlé.
retrieval.source_latest indique la dernière archive DILA intégrée. Une date postérieure reste limitée aux informations déjà connues de ce snapshot.
Les capacités resolve, compare et document restent indépendantes pour permettre un retour arrière rapide. Un 404 operation_not_found indique qu’une opération a été coupée ou que la clé n’a pas accès à legislation, et non que le document est absent.
GET /api/v1/indexes au début de la session.LEGIARTI… ou JORFARTI…, appeler /documents/{official_id}./compare./resolve./search en hybrid, keywords ou semantic selon l’intention.{
"request_id": "req_...",
"index": {
"id": "jurisprudence",
"name": "Jurisprudence officielle"
},
"hits": [
{
"rank": 1,
"score": 0.91,
"document_id": "...",
"title": "...",
"content": "Passage documentaire...",
"source_url": "https://...",
"metadata": {}
}
],
"count": 1,
"retrieval": {
"mode": "semantic",
"elapsed_ms": 84.2
}
}
Les champs disponibles dépendent du corpus source. content contient le passage documentaire normalisé et metadata les informations complémentaires non binaires.
| Statut | Signification |
|---|---|
400 | JSON ou requête incorrecte |
401 | Clé absente, invalide, expirée ou révoquée |
404 | Corpus inexistant ou non autorisé |
413 | Requête trop volumineuse |
415 | Content-Type incorrect |
422 | Paramètre, mode ou top_k invalide |
429 | Quota ou capacité momentanément atteint |
503 | Moteur temporairement indisponible |
top_k limité à 10 ;Les erreurs utilisent le format application/problem+json et comportent un request_id utilisable pour le diagnostic.