Ldata.fr

Référence technique

Référence API

Générée depuis /openapi.yaml · Docs texte · llms.txt

Endpoints authentifiés : créez une clé dans le dashboard puis envoyez Authorization: Bearer oj_…. Base : https://ldata.fr/api


GET /api/health Call once to see if corpora are up and how stale they are

Réponses : 200 Corpus available (may be stale) 503 Corpus missing or degraded

GET /api/find One full-text query over every corpus (federated search — start here when unsure where to look)

Fans out to each corpus search and returns one hit list grouped by corpus (best match first within a corpus; scores are not comparable across corpora). Costs **one** quota unit whatever the number of corpora. Ids are `<corpus>:<id>` — open them with `/fetch/{id}`. A corpus that fails is listed in `meta.unavailable` instead of failing the whole search.

Param In Type Description
q * query string FTS5 query (phrases in double quotes)
corpora query string Comma list or `all`. Default: caselaw, codes, statutes, admin_caselaw, constitutional, eu, collective_agreements, tax_doctrine, authorities, circulars, official_journal, legislative_dossiers. Opt-in: company_agreements, commercial_notices, public_procurement.
limit query integer · défaut 3 Hits per corpus

Réponses : 200 Federated hits (`results[]` with id, corpus, title, date, url, snippet) 400 BadRequest 401 Unauthorized 429 RateLimited

GET /api/fetch/{id} Open any /find hit by its `<corpus>:<id>` (text + metadata + official url)

Normalized document: `id`, `corpus`, `title`, `text`, `url` (official verify link) and the corpus-specific fields under `metadata`. LEGI ids are `codes:<slug>/<number>` or `statutes:<slug>/<number>`. One quota unit.

Param In Type Description
id * path string e.g. `caselaw:607975589ba5988459c49ed9`, `codes:code-civil/373-2-2`
as_of query string codes/statutes only — article text in force that day (404 if none, no fallback)
full query boolean Untruncated text

Réponses : 200 Normalized document 400 BadRequest 401 Unauthorized 404 Unknown id in that corpus 429 RateLimited

GET /api/sql/schema Corpus databases available to /sql, or the tables, columns and FTS tables of one
Param In Type Description
database query string (justice | legis | eu | admin | kali | bofip | constit | authorities | circ | jorf | dole | acco | bodacc | boamp) Omit to list databases

Réponses : 200 `databases[]` or `tables[]` (name, type table|view|virtual, columns, indexes) 400 BadRequest 401 Unauthorized 503 Database not built on this server

POST /api/sql One read-only SQLite SELECT on one corpus database (GET with the same params also works)

For counts, aggregations, joins and lists the search endpoints cannot express. Runs in a sandbox: read-only connection, authorizer allowlist (no ATTACH, writes, or pragmas other than introspection), one statement, stopped after 60 s, paged (`max_rows` ≤ 1000 + `offset`, follow `next_offset`). Never reaches the users database. Full-text: `SELECT d.* FROM documents_fts JOIN documents d ON d.rowid = documents_fts.rowid WHERE documents_fts MATCH 'terme' ORDER BY rank`.

Réponses : 200 columns, rows (arrays), row_count, offset, has_more, next_offset, truncated_cells, took_ms 400 BadRequest 401 Unauthorized 422 sql_limit_exceeded — over the plan time budget or result too large (charged) 429 RateLimited 503 Database not built on this server

GET /api/search Find judicial decisions (Cassation, cours d'appel, TJ, commerce) — not statute text, not CE/CAA/TA

Judicial case-law only (cc/ca/tj/tcom). For the statute text use `/codes/...` or `/statutes/...`. For CE/CAA/TA use `/admin-caselaw/search`.

Param In Type Description
q query string FTS5 query (`"phrase"`, AND/OR/NOT, NEAR/20, prefix*)
mode query string (fts | semantic | hybrid) · défaut fts fts = FTS5 keyword search. semantic = vector search (bge-m3 cosine) over embedded decisions; plain-language q, fact patterns work. hybrid = RRF fusion of both rankings (recommended for natural language; ranking depth grows with the page up to 200 — deeper offset+limit is 400). semantic/hybrid allow only jurisdiction/ after/before/limit/offset alongside q; hits gain `similarity` when the vector leg saw them; meta gains `mode` (always set), `hybrid_depth` (hybrid only), `semantic_corpus` (filtered embedded coverage — a subset of the corpus) and `semantic_index`. Falls back to FTS with `meta.mode=fts` + `meta.semantic_fallback` (stable code) when the embedding backend is unavailable.
semantic query boolean Legacy alias of mode=semantic.
jurisdiction query string cc | ca | tj | tcom, or comma list e.g. cc,ca
location query string
number query string
article query string e.g. 1240, L132-1, 373-2-2
outcome query string (cassation | rejet | irrecevabilite | infirmation | confirmation | autre)
after query string
before query string
sort query string (authority | rank | date) · défaut authority
syn query boolean
reversed query boolean
cites query string Decision id — returns Cassation decisions it cites
cited_by query string Cassation decision id — returns decisions citing it
facets query string FTS only. `true` / `1` for both solution+chamber, or comma list `solution,chamber`. Counts are over the top-2000 FTS rank pool (not the full MATCH). meta.facets.solution buckets via norm_solution; meta.facets.chamber top 30 raw chamber labels (empty string → `(none)`).
limit query integer · défaut 10
offset query integer · défaut 0 Pagination offset (max 1000). sort=authority|date re-rank a candidate pool — offset+limit must stay ≤ 2000. hybrid max offset+limit is 200 (see meta.hybrid_depth).

Réponses : 200 Search results 400 BadRequest 401 Unauthorized 429 RateLimited

GET /api/decisions/{id} Open one judicial decision by id from /search (prefer full=false)
Param In Type Description
id * path string
full query boolean Return full text (default truncated)

Réponses : 200 Decision payload 401 Unauthorized 404 Not found 429 RateLimited

GET /api/caselaw/by-article/{code} Find decisions that cite this article number (visa) — not the statute text

Returns **judicial decisions** that cite this article as a visa. This is **not** the statute text — use `/codes/{slug}/articles/{num}` for LEGI. Legacy alias: `/articles/{code}` (same payload, less clear).

Param In Type Description
code * path string e.g. 373-2-2 or L132-1
jurisdiction query string (cc | ca | tj | tcom)
after query string
before query string
sort query string (authority | rank | date) · défaut authority
limit query integer · défaut 10

Réponses : 200 Case-law hits citing this visa 401 Unauthorized 429 RateLimited

GET /api/articles/{code} [Legacy] Same as /caselaw/by-article/{code}

Deprecated path name — prefer `/caselaw/by-article/{code}`. Not statute text.

Param In Type Description
code * path string
jurisdiction query string (cc | ca | tj | tcom)
after query string
before query string
sort query string (authority | rank | date) · défaut authority
limit query integer · défaut 10

Réponses : 200 Same as caselaw/by-article 401 Unauthorized 429 RateLimited

GET /api/codes Discover a code's instrument_slug (Code civil, …). Default = codes only
Param In Type Description
kind query string (code | text) Default is codes only
nature query string e.g. CODE, LOI, DECRET, ORDONNANCE
q query string Filter title / slug / NOR
limit query integer

Réponses : 200 Instrument catalogue 503 Legis corpus missing

GET /api/codes/search Full-text search article bodies inside codes — not case-law, not the JO, not consolidated lois/décrets

Code articles only (C. civ., C. trav., …). For consolidated lois/décrets use `/statutes/search`. For the JO as published use `/official-journal/search`.

Param In Type Description
q * query string
code query string Restrict to instrument slug
kind query string (code | text)
nature query string
as_of query string
limit query integer · défaut 10

Réponses : 200 Matching articles (snippets) 400 BadRequest 401 Unauthorized 429 RateLimited

GET /api/codes/{id} Metadata for one LEGI instrument by slug — not the article text
Param In Type Description
id * path string Slug, e.g. code-civil

Réponses : 200 Instrument metadata + links 404 Unknown slug 503 Legis corpus missing

GET /api/codes/{code_id}/articles Table of contents of one code or consolidated text (structure only, no bodies)
Param In Type Description
code_id * path string
q query string Filter num / breadcrumb
as_of query string Structure as of this date (default today)
limit query integer · défaut 500

Réponses : 200 TOC rows (no full text) 401 Unauthorized 404 Unknown slug

GET /api/codes/{code_id}/articles/{num} Read one article (code or consolidated law) as in force on as_of — not case-law

Selects the version in force on `as_of` (default today). Full history via `/versions`.

Param In Type Description
code_id * path string e.g. code-civil
num * path string e.g. 373-2-2 or L132-1
as_of query string

Réponses : 200 Article payload 401 Unauthorized 404 Article not found 429 RateLimited

GET /api/codes/{code_id}/articles/{num}/versions Version timeline for one code article number (after fetching the article)
Param In Type Description
code_id * path string
num * path string

Réponses : 200 Ordered list of versions (date_start, date_end, status, id) 401 Unauthorized 404 No versions

GET /api/statutes Discover a consolidated law/decree/arrêté (not a code) — slug, NOR or cid

Never returns CODE instruments. Codes stay on `/codes`.

Param In Type Description
nature query string LOI, DECRET, ORDONNANCE, ARRETE, …
q query string Filter title / slug / NOR
nor query string Exact NOR (case-insensitive)
limit query integer

Réponses : 200 TNC instrument catalogue 503 Legis corpus missing

GET /api/statutes/search Full-text search consolidated laws and decrees — not codes, not the JO as published

TNC (lois, décrets, ordonnances, arrêtés consolidés). Never returns CODE articles — those are `/codes/search`. Raw JO publication is `/official-journal/search`.

Param In Type Description
q * query string
nature query string
instrument_slug query string
nor query string
as_of query string
limit query integer · défaut 10

Réponses : 200 Matching TNC articles (snippets) 400 BadRequest 401 Unauthorized 429 RateLimited

GET /api/statutes/{id} One consolidated non-code text by slug, cid or NOR (codes 404 — use /codes/{slug})
Param In Type Description
id * path string instrument_slug, JORFTEXT/LEGITEXT cid, or NOR

Réponses : 200 Instrument metadata + links 404 Unknown, or this id is a code (use /codes) 503 Legis corpus missing

GET /api/statutes/{id}/articles Table of contents of one consolidated law/decree (structure only)
Param In Type Description
id * path string
q query string
as_of query string
limit query integer · défaut 500

Réponses : 200 TOC rows (no full text) 401 Unauthorized 404 Unknown or a code

GET /api/statutes/{id}/articles/{num} Read one consolidated-law article as in force on as_of
Param In Type Description
id * path string
num * path string
as_of query string

Réponses : 200 Article payload 401 Unauthorized 404 Article not found 429 RateLimited

GET /api/statutes/{id}/articles/{num}/versions Version timeline for one consolidated-law article number
Param In Type Description
id * path string
num * path string

Réponses : 200 Ordered list of versions 401 Unauthorized 404 No versions

GET /api/eu/search Search EU legislation (EUR-Lex FR) plus CJEU and ECHR — not French domestic courts

One FTS over EU legislation (EUR-Lex, consolidated versions, French), CJEU case-law and ECHR (HUDOC) judgments. Every hit carries `url` — re-verify on EUR-Lex / HUDOC before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
source query string (eurlex_law | cjeu | echr)
after query string Document date, inclusive
before query string Document date, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 EU search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 EU corpus missing

GET /api/eu/documents/{id} Open one EU document by id, CELEX or ECLI from /eu/search (prefer full=false)
Param In Type Description
id * path string Document id, CELEX (e.g. 32009R0004) or ECLI
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Document payload 401 Unauthorized 404 Unknown id / CELEX / ECLI 429 RateLimited 503 EU corpus missing

GET /api/admin-caselaw/search Find administrative-court decisions (CE, CAA, TA) — not judicial caselaw (/search)

FTS over the DILA JADE fund — Conseil d'État, cours administratives d'appel and tribunaux administratifs. Every hit carries `url` — re-verify on Légifrance before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
source query string (ce | caa | ta | autre)
after query string Decision date, inclusive
before query string Decision date, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Administrative case-law search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 Admin corpus missing

GET /api/admin-caselaw/decisions/{id} Open one administrative decision by CETATEXT id (prefer full=false)
Param In Type Description
id * path string CETATEXT id (e.g. CETATEXT000047520000)
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Decision payload 401 Unauthorized 404 Unknown CETATEXT id 429 RateLimited 503 Admin corpus missing

GET /api/collective-agreements/search Search industry collective agreements (IDCC / KALI) — not company-level ACCO

FTS over the DILA KALI fund — conventions collectives, their attached textes (avenants/accords) and articles. Every hit carries `url` — re-verify on Légifrance before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
idcc query string IDCC number of the collective agreement, e.g. 1979
doc_type query string (convention | texte | article)
after query string date_start, inclusive
before query string date_start, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Collective agreement search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 Kali corpus missing

GET /api/collective-agreements/documents/{id} Open one KALI document by id (prefer full=false)

Only `article` documents carry body text; `convention` and `texte` return their indexed titles.

Param In Type Description
id * path string KALI id (e.g. KALIARTI000000000202)
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Document payload 401 Unauthorized 404 Unknown KALI id 429 RateLimited 503 Kali corpus missing

GET /api/tax-doctrine/search Search BOFiP tax doctrine; pass as_of for the version opposable that day

FTS over BOFiP-Impôts (DGFiP open data) — versioned, opposable administrative doctrine. `as_of` restricts to the version opposable that day. Every hit carries `url` — re-verify on bofip.impots.gouv.fr before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
doc_type query string Normalized content type facet (source-driven, no fixed enum), e.g. commentaire, bareme
serie query string BOFiP series code, e.g. IF, TVA, IR, RFPI
as_of query string Only the version opposable that day
after query string Document date on or after (YYYY-MM-DD, inclusive)
before query string Document date strictly before (YYYY-MM-DD, exclusive)
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Tax doctrine search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 BOFiP corpus missing

GET /api/tax-doctrine/documents/{id} Open one BOFiP document (version id, BOI-… or node); optional as_of
Param In Type Description
id * path string Version id (BOI-…-YYYYMMDD), juridical identifiant (BOI-…) or node id (…-PGP)
as_of query string Version opposable that day (default latest version)
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Document payload 400 BadRequest 401 Unauthorized 404 Unknown id, or no version opposable as_of 429 RateLimited 503 BOFiP corpus missing

GET /api/constitutional/search Search Conseil constitutionnel decisions (DC, QPC, electoral) — not Cassation or CE

FTS over the DILA CONSTIT fund — Conseil constitutionnel decisions since 1958 (contrôle de constitutionnalité, QPC, lois de pays, contentieux électoral, and other contentieux). Every hit carries `url` — re-verify on conseil-constitutionnel.fr before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
decision_type query string (dc | qpc | lp | an | sen | autre)
after query string Decision date, inclusive
before query string Decision date, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Constitutional decisions search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 Constit corpus missing

GET /api/constitutional/decisions/{id} Open one Conseil constitutionnel decision by CONSTEXT id (prefer full=false)
Param In Type Description
id * path string CONSTEXT id (e.g. CONSTEXT000051585985)
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Decision payload 401 Unauthorized 404 Unknown CONSTEXT id 429 RateLimited 503 Constit corpus missing

GET /api/authorities/search Search ADLC (competition), CNIL (data protection) or AMF OAM filings (not AMF sanctions)

FTS over ADLC (Autorité de la concurrence — antitrust/merger control, sourced from its official data.gouv.fr dataset) and CNIL (data protection, DILA CNIL fund). Every hit carries `url` — re-verify on the authority's official site before citing.

Param In Type Description
q * query string FTS5 query over titles + full text
authority query string (adlc | cnil)
doc_type query string Source-driven, no fixed enum (ADLC d|a|mc|dcc|dex|soa; CNIL sanction|mise_en_demeure|...)
after query string Decision date, inclusive
before query string Decision date, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Authority decisions search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 Authorities corpus missing

GET /api/authorities/documents/{id} Open one ADLC or CNIL document by id (AMF hits already carry a PDF url)
Param In Type Description
id * path string CNILTEXT id (CNIL) or decision number e.g. 26-DCC-149 (ADLC)
full query boolean Return full text (default truncated at 50000 chars)

Réponses : 200 Decision payload 401 Unauthorized 404 Unknown document id 429 RateLimited 503 Authorities corpus missing

GET /api/circulars/search Search government circulaires; prefer the official PDF url (full_text=true means body extracted)

FTS over the DILA CIRCULAIRES fund. Circulaires are published as PDF; the XML carries only metadata. The PDF body is extracted with pdftotext at index time — `snippet` is the full body when `full_text` is true, title + résumé + mots-clés + destinataire otherwise (the 2009-2014 legacy bulk export has no PDF at all; some later drops may be missing one or fail to extract). Every hit carries `url` (the official PDF) — re-verify before citing regardless of `full_text`.

Param In Type Description
q * query string FTS5 query over titles + résumé/mots-clés
doc_type query string (organisation_services | directives_ministre | interpretation_juridique | autre)
after query string Date de signature, inclusive
before query string Date de signature, exclusive
limit query integer · défaut 10
offset query integer · défaut 0

Réponses : 200 Circulars search results 400 BadRequest 401 Unauthorized 429 RateLimited 503 Circ corpus missing

GET /api/circulars/documents/{id} Open one circulaire by ID_CIRCULAIRE (prefer full=false)
Param In Type Description
id * path string ID_CIRCULAIRE (e.g. 45652)
full query boolean Lift the 50000-char cap (only matters when `full_text` is true)

Réponses : 200 Circular payload 401 Unauthorized 404 Unknown ID_CIRCULAIRE 429 RateLimited 503 Circ corpus missing

GET /api/official-journal/search Search the Journal officiel as published — not the consolidated text (/statutes/search)
Param In Type Description
q * query string
nature query string LOI, DECRET, ARRETE, ORDONNANCE, DECISION, AVIS, …
ministry query string Substring, case-insensitive (e.g. agriculture) — trigram-indexed
doc_type query string (loi | decret | arrete | ordonnance | decision | avis | autre)
after query string
before query string
limit query integer · défaut 10
offset query integer

Réponses : 200 JORF hits with Légifrance url 400 BadRequest 401 Unauthorized 429 RateLimited 503 Jorf corpus missing

GET /api/official-journal/documents/{id} Open one JO text by JORFTEXT id (prefer full=false)
Param In Type Description
id * path string
full query boolean

Réponses : 200 JORF document payload 401 Unauthorized 404 Unknown JORFTEXT 429 RateLimited 503 Jorf corpus missing

GET /api/legislative-dossiers/search Find travaux préparatoires (dossiers) — not the statute text
Param In Type Description
q * query string
dossier_type query string (projet_loi | proposition_loi | autre)
after query string
before query string
limit query integer · défaut 10
offset query integer

Réponses : 200 DOLE hits with Légifrance url 400 BadRequest 401 Unauthorized 429 RateLimited 503 Dole corpus missing

GET /api/legislative-dossiers/documents/{id} Open one legislative dossier by JORFDOLE id
Param In Type Description
id * path string
full query boolean

Réponses : 200 DOLE document payload 401 Unauthorized 404 Unknown JORFDOLE 429 RateLimited 503 Dole corpus missing

GET /api/company-agreements/search Search company-level accords d'entreprise (ACCO) — not industry IDCC (KALI)
Param In Type Description
q * query string
idcc query string
after query string
before query string
limit query integer · défaut 10
offset query integer

Réponses : 200 ACCO hits with Légifrance url 400 BadRequest 401 Unauthorized 429 RateLimited 503 Acco corpus missing

GET /api/company-agreements/documents/{id} Open one ACCOTEXT id (prefer full=false)
Param In Type Description
id * path string
full query boolean

Réponses : 200 ACCO document payload 401 Unauthorized 404 Unknown ACCOTEXT 429 RateLimited 503 Acco corpus missing

GET /api/commercial-notices/search Search BODACC publication notices (RCS, insolvency, accounts) — not a live SIRENE register
Param In Type Description
q * query string
edition query string (a | b | c)
doc_type query string
siren query string
after query string
before query string
limit query integer · défaut 10
offset query integer

Réponses : 200 BODACC hits with bodacc.fr url 400 BadRequest 401 Unauthorized 429 RateLimited 503 Bodacc corpus missing

GET /api/commercial-notices/notices/{id} Open one BODACC notice by nojo or public_id
Param In Type Description
id * path string
full query boolean

Réponses : 200 BODACC notice payload 401 Unauthorized 404 Unknown notice 429 RateLimited 503 Bodacc corpus missing

GET /api/public-procurement/search Search BOAMP public-procurement notices
Param In Type Description
q * query string
doc_type query string
after query string
before query string
limit query integer · défaut 10
offset query integer

Réponses : 200 BOAMP hits with boamp.fr url 400 BadRequest 401 Unauthorized 429 RateLimited 503 Boamp corpus missing

GET /api/public-procurement/notices/{id} Open one BOAMP notice by IDWEB
Param In Type Description
id * path string
full query boolean

Réponses : 200 BOAMP notice payload 401 Unauthorized 404 Unknown IDWEB 429 RateLimited 503 Boamp corpus missing

GET /api/me Remaining daily quota for this API key (call near limits)

Réponses : 200 Account info 401 Unauthorized