# Verification reports

> Generate a branded, timestamped PDF attesting a criminal search was performed, with a neutral public citation on every record and the FCRA notice in full.

- **HTML:** https://offendersearch.app/docs/criminal/verification-reports
- **Base URL:** https://api.offendersearch.app
- **Authentication:** `X-API-Key` request header
- **OpenAPI:** https://offendersearch.app/openapi.json · https://offendersearch.app/openapi.yaml
- **Criminal reference as markdown:** https://offendersearch.app/docs/criminal.md

## A defensible artifact for your audit file

A verification report is a branded, timestamped PDF that attests a criminal-records search was **performed** — the criminal analogue of the Sex-Offender API's report. It shows the query, the run timestamp and a report id (`rpt_…`), the matching records **grouped by DOB/age match strength**, each record with its identity and its **public source citation** (the neutral jurisdiction code plus a last-checked stamp), a records-searched count, and the FCRA "not a consumer report" notice, prominently. A zero-match search renders a clean "no records found" attestation.

> **The report names states, counties and record kinds — never sources.** Every citation is a neutral public code (`OK-COURT`, `TX-DALLAS`) with a freshness stamp. No portal, platform or vendor name appears anywhere in the PDF.

## POST /v1/criminal/report

**Authentication:** `X-API-Key`, available on every account exactly like `/search` — no entitlement required. Provide **exactly one** of two inputs.

| Field | Required | Notes |
| --- | --- | --- |
| `searchId` | one of these two | Id from a prior `/v1/criminal/search` on your account. Renders the stored result — it does **not** re-run the search. Bills **only** the report. |
| `query` | one of these two | Runs the search inline (same shape and validation as `/search`). Bills the call **and** the report. |
| `live` | optional | One-shot mode only — the same `live` block as `/search`. Runs the live checks inline (no `202`/poll). |
| `viewerName` / `viewerEmail` / `purpose` / `reference` | optional | Printed on the document as a record of who ran it and why. Not an access gate. |

The response is **the PDF bytes** (`application/pdf`), with the report id in the `x-report-id` header (`rpt_` + 12 hex) and the meter events in `x-meter-events`.

```bash
curl -sS -X POST "https://api.offendersearch.app/v1/criminal/report" \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" -H "Content-Type: application/json" \
  -d '{"searchId":"crs_7f2a1c9e0b4d6a8f1e23","viewerName":"Case Worker","purpose":"Records verification"}' \
  -D headers.txt -o verification.pdf
grep -i '^x-report-id' headers.txt
# → x-report-id: rpt_dc990869ac3c
```

> **The report is a snapshot of one search, not a live query.** A `searchId` report renders the stored result set, so the completeness the search reported is the completeness the document reflects. Billing: `criminal_report` is a small fixed per-PDF charge; a `searchId` report bills only that, an inline-`query` report bills the search and the report.

---

## Related

- Previous: [The Criminal Record object](https://offendersearch.app/docs/criminal/record-object.md)
- Next: [Migrating from another provider](https://offendersearch.app/docs/criminal/migration.md)
- Index: [Criminal Search API reference](https://offendersearch.app/docs/criminal.md)
