Documents and recitals
Read a document's metadata, its complete stored text and numbered recitals; fetch its PDF; correct its type.
A document ID looks like rdoc_at40861_20260720. Find IDs through GET /v1/radar/documents or a case report's documents.
#GET/v1/radar/documents/:id
Document metadata plus links: textPath, recitalsPath, extractionsPath.
Errors: 404 — no radar document with that ID.
#GET/v1/radar/documents/:id/text
The complete stored decision text. Never truncated.
Response 200: { documentId, sourceUrl, textSha256, fullTextSha256, text, sample }.
Errors: 404 when no full text has been stored for the document.
#GET/v1/radar/documents/:id/recitals
All parsed numbered recitals.
| Query | Description |
|---|---|
q | Optional verbatim search. Uses the same folding as the quote gate, so a pasted passage finds its recital across wrapped lines and footnote calls. |
Response 200: { documentId, sourceUrl, textSha256, sample, recitals, query }.
#GET/v1/radar/documents/:id/recitals/:n
One recital: { number, text, … } with the document's textSha256.
Errors: 404 when the recital number does not exist.
#POST/v1/radar/documents/:id/text
Retrieve the document's published PDF and parse its recitals.
| Body field | Type | Description |
|---|---|---|
refresh | boolean | true checks a previously fetched source again. |
Errors: 409 when offline. Not available in the hosted workspace (501).
#POST/v1/radar/documents/:id/doctype
Counsel corrects a mislabelled upstream document type. Recorded as radar.doctype.corrected.
| Body field | Required | Description |
|---|---|---|
docType | yes | A type from the level table. |
reason | yes | Why the upstream label is wrong. Max 500 characters. |
by | yes | Who corrected it. Max 120 characters. |
{ "docType": "statement_of_objections", "reason": "The case portal lists the SO as Initiation of Proceedings.", "by": "Ariel" }Response 200: the document with its new type and level.
#GET/v1/radar/documents/:id/claimant-research
Saved external research for the document's party candidates. Opening it also queues research and presence checks.
#POST/v1/radar/documents/:id/claimant-research
Run external research for one extracted party candidate: exact legal-name matches in the French SIRENE / Annuaire des Entreprises registry and GLEIF LEI records, then an online search for source-linked public leads.
| Body field | Required | Description |
|---|---|---|
candidateId | yes | An extraction party candidate, rextr_…. |
requestedBy | yes | Who asked. Max 120 characters. |
Results persist as radar.claimant.research.completed. Leads stay pending and never change party status, signals, standing, harm or damages. Duplicate requests return the saved research. Needs OPENROUTER_API_KEY.
Errors: 400 invalid body, 404 unknown candidate for this decision, 409 offline.
#POST/v1/radar/documents/:id/population-estimates
Record an affected-population estimate from official French registers.
| Body field | Description |
|---|---|
scope | businesses (SIRENE, by NAF/APE code, department or commune), residents (INSEE, per commune or summed over a department) or securities (answered not_connected). |
label | What the estimate counts. |
| filters | NAF/APE code, department or commune, by scope. |
estimatedBy | Optional; defaults to BINA method. |
Each estimate stores its formula, inputs, query URL and raw response hash, and is labelled an estimate — an upper bound, never a claimant finding.