Lex MachinePortail API

Accès développeur

Votre clé API.

Indiquez votre adresse e-mail. Nous vous enverrons un lien personnel pour générer votre clé Lex Machine.

1. Recevez le lien
2. Vérifiez votre adresse
3. Générez et copiez votre clé

Lex Machine · inventaire pédagogique · 11 août 2026

Contenu des bases Lex Machine

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.

10familles documentaires décrites
6,55 Mentrées documentaires, addition technique non dédoublonnée
11,28 Mlignes de vecteurs attestées par les reçus
1 024dimensions par vecteur BGE‑M3

Vue d’ensemble

Les compteurs proviennent des reçus finaux des candidats vérifiés.

FamilleÉtatDocumentsPassagesVecteursVolume brut
des vecteurs
Stockage
principal
Amendementsmarie.dbPrésent868 642—868 6423,31 Gio6,83 Gio +
base vectorielle partagée
LEGIcodes et textes consolidésPrésent922 959—922 9593,52 Gio5,22 Gio +
base vectorielle partagée
DOLEdossiers législatifs LégifrancePrésent3 5787 196 unités sémantiques7 19628,1 Mio
Propositions de loippl.dbPrésent687—52208 Kio648 Kio +
base vectorielle partagée
PLFPrésent7 550—6 85326,8 Mio8,2 Mio +
base vectorielle partagée
Questions écrites ANquestions_ecrites.dbPrésent45 935218 554 unités sémantiques218 554853,7 Mio415,6 Mio +
base vectorielle partagée
Cour des comptescatalogue + textes découpésPrésent38 088 au catalogue
18 319 découpés
283 395283 3951,08 Gio5,14 Gio avec cache
Questions historiques Sénatcorpus isoléPrésent1 2274 6314 63118,1 Mio124,1 Mio avec index
Complément DILAJORF, KALI, CNIL, circulairesPrésent3 472 6794 147 2544 147 25415,82 Gio61,45 Gio avec cache
Jurisprudence officielleCASS, INCA, CAPP, JADE, CONSTITPrésent1 183 898 décisions4 822 2704 822 27018,40 Gio88,85 Gio

Périmètres et sources officielles

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.

Parlement

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

Légifrance / DILA

LEGI et DOLE

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.

  • DILA — répertoire Open Data officiel
  • data.gouv.fr — jeu DOLE

Fichiers : legi_dole.db · marie_embeddings.db · semantic_cache_legi · semantic_cache_dole

Parlement

PPL et textes budgétaires

Les propositions de loi et les ensembles PLF servent à retrouver les textes et dossiers parlementaires, notamment budgétaires.

  • Assemblée nationale — dossiers législatifs
  • Sénat — base DOSLEG

Fichiers : ppl.db · marie_embeddings.db

Parlement

Questions écrites

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.

  • Assemblée nationale — questions écrites
  • Sénat — base Questions

Fichiers : questions_ecrites.db · questions_senat_historiques_chunks.db · questions_senat_historiques_embeddings_bge_m3.db

Institution financière

Cour des comptes

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.

  • Cour des comptes — publications officielles

Fichiers : ccomptes.db · ccomptes_chunks.sqlite · semantic_cache_ccomptes

Légifrance / DILA

Complément DILA

Quatre matières qui complètent LEGI : Journal officiel (JORF), conventions collectives (KALI), délibérations et décisions CNIL, et circulaires administratives.

  • DILA — JORF, KALI, CNIL et CIRCULAIRES
  • Légifrance — Open Data et API

Fichiers : dila_complement_juridique.db · dila_complement_embeddings_bge_m3.db · semantic_cache_dila_complement

Déployée

Jurisprudence officielle

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.

  • DILA / Légifrance — catalogues de jurisprudence
  • data.gouv.fr — jeu JADE

Lot vérifié : jurisprudence_officielle_fine_chunks.db · jurisprudence_v2_embeddings_bge_m3.db · semantic_cache_jurisprudence_v2 — 95 399 377 064 octets

Technique

Cache Légifrance

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.

Caractéristiques :

RAG

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.

BGE‑M3 · 1 024 dimensions

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.

Chunks

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.

FAISS

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 · FTS5

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.

NumPy · float32

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.

Recherche sémantique : requête → BGE‑M3 → vecteur NumPy/float32 → FAISS → chunks.
Recherche par mots-clés : requête → SQLite FTS5 → passages classés.
Recherche hybride : classements sémantique + FTS5 → déduplication → fusion RRF → passages reclassés. Ce mode réutilise les index existants sans recalculer les embeddings.

README de l’API

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".

Accès et authentification

RessourceAdresse
Création d’une cléapi.lexmachine.net
Contrat OpenAPI/api/v1/openapi.json
État de l’API/api/v1/health
Racine des routeshttps://api.lexmachine.net/api/v1

Obtenir une clé

  1. Ouvrir api.lexmachine.net et saisir son adresse e-mail.
  2. Cliquer sur le lien reçu par e-mail dans les 15 minutes.
  3. Cliquer sur Générer ma clé, puis la copier immédiatement.

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.

Routes et découverte automatique

MéthodeRouteAuthentification
GET/api/v1/healthPublique
GET/api/v1/openapi.jsonPublique
GET/api/v1/indexesClé API
POST/api/v1/indexes/{index_id}/searchClé API
POST/api/v1/indexes/legislation/resolveClé API
POST/api/v1/indexes/legislation/compareClé 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.

Effectuer une recherche

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.

Activer la recherche hybride

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.

Exemple curl

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"}'

Exemple Python

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"])

Exemple JavaScript

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);

Résolution documentaire exacte

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é.

Comparer deux dates

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"]
}

Lire par identifiant

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.

Routage conseillé pour un plugin

  1. Appeler GET /api/v1/indexes au début de la session.
  2. Pour un identifiant LEGIARTI… ou JORFARTI…, appeler /documents/{official_id}.
  3. Pour une même référence à deux dates, appeler /compare.
  4. Pour une référence précise à une date, appeler /resolve.
  5. Pour une recherche exploratoire, appeler /search en hybrid, keywords ou semantic selon l’intention.

Format des résultats

{
  "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.

Erreurs, quotas et périmètre

Erreurs courantes

StatutSignification
400JSON ou requête incorrecte
401Clé absente, invalide, expirée ou révoquée
404Corpus inexistant ou non autorisé
413Requête trop volumineuse
415Content-Type incorrect
422Paramètre, mode ou top_k invalide
429Quota ou capacité momentanément atteint
503Moteur temporairement indisponible

Clé libre-service

  • 10 requêtes API par minute, toutes opérations confondues ;
  • top_k limité à 10 ;
  • expiration après 90 jours ;
  • accès aux douze corpus, à V2, V3 et V3.1 ;
  • remplacement de l’ancienne clé créée pour la même adresse e-mail.

L’API n’expose pas

  • d’accès SQL direct ou de téléchargement des bases ;
  • de filtres SQL ou d’expressions arbitraires ;
  • de modification, ajout ou suppression de documents ;
  • le secret d’une clé après sa génération.

Les erreurs utilisent le format application/problem+json et comportent un request_id utilisable pour le diagnostic.