---
title: "Generates the Legislation Citation Verification Dossier as a PDF"
method: POST
path: "/api/v1/verificacion/export-pdf"
tags: ["Legislation"]
---

# Generates the Legislation Citation Verification Dossier as a PDF

`POST /api/v1/verificacion/export-pdf`

## Request

- Base URL: `https://legal.nexusquantum.legal`
- URL: `https://legal.nexusquantum.legal/api/v1/verificacion/export-pdf`
- Auth: HTTP bearer

Takes a VerificacionResponse (the output of /api/v1/verificacion/analizar) and returns a downloadable PDF with the dossier (header, stats, citation table colored by status, EU AI Act Art. 50(2) marking). Deterministic, 0 credits. ZERO RETENTION: the PDF is generated in RAM and nothing is persisted — not the source document, not the result, not the PDF. Binary response (application/pdf), not exposed as an MCP tool.

## Request body

- object: The VerificacionResponse returned by /api/v1/verificacion/analizar, sent back UNMODIFIED. Do not strip fields on the way back: `results[i].meaning`, `mismatch_kind` and `note` are what the dossier prints as the reproach, and a response trimmed to `status` renders as a clean report.
  - `date` string, date: English twin of `fecha`. Either works; neither is retired.
  - `fecha` string, date
  - `total` integer
  - `found` integer
  - `not_found` integer
  - `derogated` integer
  - `unknown` integer
  - `flagged` integer: Citations that exist but carry a reproach. The dossier subtracts them from the verified count.
  - `verified_clean` integer
  - `review_required` boolean
  - `counts_by_meaning` object
  - `results` VerificacionResult[], required
    - `raw` string, required: The citation exactly as it appears in the document.
    - `alias` string, nullable, required: Recognised alias of the piece of legislation (ES/BOE pass), e.g. `CC`, `LEC`. `null` for case law and for citations resolved by the jurisdiction-agnostic pass.
    - `norma_label` string, nullable, required: Human-readable name of the legislation behind `alias`. `null` when there is no alias.
    - `numero_articulo` string, required: Article/section number, when the citation carries one. Empty string when it does not (a whole statute, or a judgment).
    - `status` 'found' | 'not_found' | 'derogated' | 'unknown', required: `found` = the citation EXISTS in the corpus of its jurisdiction. It is NOT a clean bill of health on its own: check `meaning`. `not_found` = it is absent from the active corpus. `derogated` = it existed but is not in force on `fecha`. `unknown` = it could not be checked (see `unknown_reason`) — a gap, never a pass. This enum is CLOSED and stays at four values: everything added since travels in additive optional fields, so a `switch` written against it keeps compiling. The price of that promise is that the enum cannot tell you the whole verdict by itself.
    - `content_checked` false: PRESENT AND `false` = the verdict establishes that the provision EXISTS, and the WORDING your document attributes to it was never compared against the official text. ABSENT = the content was compared (or the comparison does not apply). The field only appears when there is something to warn about, so `content_checked === false` is the test, not its truthiness. This is the case for the whole of the United Kingdom, where content comparison is deliberately not enabled. Until 2026-08-18 this fact travelled only inside the prose of `note`, behind the literal string `CONTENT NOT CHECKED`, and a client had to match on that string to recover it. It is the difference between «this section exists» and «this section says what you claim», which for a citation-checking product is the whole distinction.
    - `meaning` 'other_case' | 'diverges' | 'paraphrase': REPROACH on a citation that exists (so `status` is `found`). PRESENT ⇒ the row is flagged. **ABSENT DOES NOT MEAN CLEAN**: since v1.40.0 a row can be flagged by `party_check: "partial"` with no `meaning` at all. The exact predicate is `status === "found" && (meaning || party_check === "partial")`. `other_case` — the citation EXISTS but resolves to a DIFFERENT decision from the one the document names (incompatible party names, typically a transposed court: `Spandeck … [2007] SGHC 37` where the case is `[2007] SGCA 37`). NOTHING WAS COMPARED about the sense of the quotation: the defect is the IDENTITY of the authority, and `similarity` is deliberately left unmeasured. Do not present it as a paraphrase — it points somewhere else. `note` names the decision it actually resolves to and, when found, the sibling citation that does match. `diverges` — a meaning veto fired against the official text (negation, modality, quantifier, omitted exception, subject): a REAL divergence of sense. `paraphrase` — only the lexical ratio failed, or the quoted fragments are literal but assembled from non-continuous passages. A divergence of meaning has NOT been proven; it could not be checked literally. Use `mismatch_kind` to tell the two apart. Earlier versions of this document described the field as appearing "when the citation exists but the attributed sense does not match" and listed only two values. That was false for `other_case`, where no sense is compared at all.
    - `vigencia_desde` string, date, nullable: Date the provision came into force, when the verifier measured in-force status unambiguously. Present on `derogated` rows (ES/CO always; UK legislation since v1.41.0, repealed or not-yet-in-force alike) and on UK `found` rows confirmed currently in force. Absent = in-force status not measured for this row — never read absence as "in force with no known date".
    - `vigencia_hasta` string, date, nullable: Date the provision ceased to be in force (repeal date). Present only when the row is `derogated` for having been repealed — absent for a provision that never yet came into force.
    - `party_check` string, nullable: State of the PARTY-NAME contrast, where the jurisdiction performs one. Values are ADDITIVE and the list is OPEN: `match` · `no_name` · `unavailable` · `mismatch` · `partial`. Treat an unknown value as FLAGGED, never as clean. 🔴 `partial` FLAGS THE ROW ON ITS OWN, WITHOUT `meaning`. It means: the decision exists, but a party the document names appears neither in the name the record gives that decision nor in its text — identity half-confirmed. It does NOT assert the citation is wrong (the record may list only the lead party; you may be using an acronym; it may be a joined appeal) and it does NOT confirm it either. `note` carries the reason in prose. Travels separately from `meaning` deliberately: «a party you name does not appear» is NOT «resolves to another decision», and asserting the latter would be a reproach we cannot sustain.
    - `mismatch_kind` 'lexical' | 'meaning' | 'stitched' | 'party': The engine's reproach VERBATIM, before `meaning` collapses it. `stitched` and `lexical` both map to `meaning: "paraphrase"`, so without this field the two are indistinguishable on the wire and a formatter has to guess which one it is holding. `party` → `meaning: "other_case"`. `meaning` → `meaning: "diverges"`. `stitched` (literal fragments assembled from non-continuous passages, or reordered) and `lexical` (ratio only) → `meaning: "paraphrase"`. ADDITIVE and open to growth: treat an unrecognised value as flagged, never as clean.
    - `canonical_text` string, nullable, required: Official text the citation was checked against, trimmed to what is worth reading. `null` when the corpus returned no text.
    - `canonical_truncated` boolean, required: `true` when `canonical_text` stops short of the full official text: the rest of the article or judgment exists but is NOT written in this response. Do not read the excerpt as the whole provision, and do not conclude from it that the citation covers nothing else. `false` asserts the official text travels whole.
    - `url` string, nullable, required: Official source URL for that jurisdiction when one is located (BOE · CENDOJ · Singapore Statutes Online · eLitigation · SUIN-Juriscol…).
    - `context` string, required: The surrounding sentence of the document, so the citation can be located without the source file.
    - `kind` 'norma' | 'jurisprudencia', required: What was cited: legislation or case law. Without it a judgment gets reported as an "article not found in the corpus", which is a category error on top of the finding.
    - `note` string, nullable: Deterministic, server-side explanation of the verdict — never model prose. THE MOST ACTIONABLE PART OF A FLAGGED ROW: it says which decision the citation actually resolves to, and where the correct citation is. Render it; do not drop it.
    - `unknown_reason` 'not_verifiable' | 'error': Why the row is `unknown`, which used to collapse two different things. `not_verifiable` = no corpus is wired up for that jurisdiction/alias — a stable property of coverage you can decide with. `error` = the check ran and broke — ours, and worth retrying. Neither is a pass.
  - `locale` 'es' | 'en' | 'fr' | 'de': Language of the dossier. It is a deliverable the firm shows to third parties: send the language of the document, not ours.

## Response `200`

Binary PDF (application/pdf, Content-Disposition attachment).

## Other responses

- `400`: INVALID_PAYLOAD (the body is not a VerificacionResponse: `results` missing or not an array) | INVALID_JSON
- `402`: INSUFFICIENT_CREDITS — paywall from minute one (balance > 0 required).
- `403`: INSUFFICIENT_SCOPE — requires scope analyze | query | mcp | *.
- `429`: RATE_LIMITED — per API key or organization limit.

---

[API](https://skmtc.dev/nexusquantum/apis/nexus-legal-api.md) · [All operations](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/revisions/4084d8d4eb0b?raw)
