Sex Offender Search API enums
Every closed vocabulary the API accepts or returns, with every value and where it appears.
How to read the Sex Offender Search API enums
Every closed vocabulary the Sex Offender Search API accepts or returns, generated from the same reference data as the endpoint and object tables. Direction says whether a value is something you send, something you receive, or both. Treat a value you do not recognise as other and log it: values are added over time and announced on the changelog, never removed or renamed.
Fields whose values are the source's own text (for example a criminal record's currentStatus or a charge's disposition) are not enums and are not listed here; their closed twins live in the normalized object and are listed.
Sex Offender Search API enums — every value
| Field | Where | Direction | Values | Default |
|---|---|---|---|---|
clearanceModeWhat a `not_this_person` clearance does to the record it names. `suppress` (the default whenever `subjectId` is sent) removes the record from `records[]` and lists it in `cleared[]`. `annotate` keeps the record and attaches its `clearance` object, for an interface that shows cleared people greyed out. `ignore` answers as if no clearances existed. A `this_person` verdict, and a cleared person who has re-surfaced (`clearance.staleReason` set), are kept and annotated in every mode. | The SearchRequest object | request | suppressannotateignore | suppress |
evidence`"pdf"`: besides the live check, print each registry named in `jurisdictions` (up to 20) — its own public website, every result page and each matching registrant's detail page — to one PDF per registry behind a cover page, and return the documents with the records. The search then always answers `202` and is returned by `GET /v1/searches/{searchId}`, whose body carries `evidence[]`. $0.25 per completed registry document, $5.00 ceiling per search, on top of the live search's normal charge; an incomplete document bills nothing. Omit it, or send `"none"`, for today's search, byte for byte. See [Live evidence](/docs/live-evidence). | The LiveBlock object — live verification request fields | request | nonepdf | — |
excludeRecord fields to leave out. The only value is `stateData` — the 36-field per-state block that is on every record by default. Send it for a lighter payload on large result sets; the response then lists it in `omittedFields`. Any other value is a `422`. | The SearchRequest object | request | stateData | — |
formatDocument format: `pdf` or `html`. | The ProofRequest object — proof document request fields | request | pdfhtml | pdf |
includeAccepted for compatibility and has no effect: `stateData` is populated on every record by default. To drop it for a lighter payload send `exclude: ["stateData"]`. | The SearchRequest object | request | stateDatarawextensive | — |
matchName matching for every row; same values as `SearchRequest.match` (default `balanced`). | POST /v1/batch request | request | strictbalancedbroad | — |
matchHow widely names match, applied the same way in every registry searched. `strict`: exact names only. `balanced`: exact surname, plus nicknames, initials, prefixes, middle names and one-letter typos on the first name. `broad`: also prefix and typo matches on the surname, and two-letter typos on the first name. `query.prefixMatch` (which runs the search at `broad`), `query.fuzzy` and `query.nameMatch` override it. An unrecognised value is a `422`. See [Matching & confidence](/docs/matching). | The SearchRequest object | request | strictbalancedbroad | balanced |
nameMatch.firstNameStrategies for the first name. `prefix` needs at least 3 characters; `middle` (your given name is the person's middle name) needs at least 2. | The Query object — sex offender search request fields | request | exactprefixnicknamefuzzymiddle | — |
nameMatch.lastNameStrategies for the surname. `prefix` needs at least 3 characters. | The Query object — sex offender search request fields | request | exactprefixfuzzy | — |
onAgeMismatchA record that matches on name but whose published age contradicts your `dob` (or falls outside `ageTolerance` on an `age` search). `drop` omits it. `flag` returns it labelled `matchState: "age_mismatch"` and `unverified: true`. | The Query object — sex offender search request fields | request | dropflag | drop |
onDeadlineWhat a row does at `deadlineMs`; same values as `SearchRequest.onDeadline`. | POST /v1/batch request | request | partialerror | partial |
onDeadlineWhat happens at `deadlineMs`. `partial` returns what finished, with `status: "partial"` and every unfinished registry marked in `sourceStatus[]`. `error` returns `504` instead. | The SearchRequest object | request | partialerror | partial |
productThe dataset the verdict belongs to: `sex_offender` for a person returned by `POST /v1/search` or `POST /v1/batch`, `criminal` for one returned by `POST /v1/criminal/search`. A criminal `personRef` is scoped to one source, so a criminal clearance clears that source's records for the person — see [criminal clearances](/docs/criminal/clearances). | The ClearanceCreate object | request | sex_offendercriminal | sex_offender |
recordTypesRecord types to search. This endpoint searches sex offender registries only; criminal records are a separate product at `POST /v1/criminal/search`. Any other value is a `422`. | The SearchRequest object | request | sex_offender | sex_offender |
scope`"matched"` re-checks the registries that produced the Regular matches, instead of naming them. | The LiveBlock object — live verification request fields | request | matched | — |
verdict`not_this_person` — the returned person is someone else; later searches for the subject suppress (or annotate) them. `this_person` — the returned person **is** the subject; later searches keep them and annotate the record so your interface can show the confirmed match. | The ClearanceCreate object | request | not_this_personthis_person | — |
statusThe job's status. | GET /v1/searches/{searchId}/results · 202 | response | pendingrunning | — |
cappedReason`responseLimit` when `capped` is `true`; `null` otherwise. | The SearchResponse object | both | responseLimit | — |
detail.code`overloaded`: the service is at capacity; no result is implied about the person. `rate_limited`: a per-caller limit on the contact form and the consumer endpoints, never on search. | The RateLimitError object — 429 rate limit response fields | both | rate_limitedoverloaded | — |
dobPrecisionHow much of the birth date the registry published. `exact`: a full date, in `dob`. `year`: a year only, in `birthYear`, and `dob` is `null`. `unknown`: neither; read `age`. `year_month` is reserved and not currently emitted. | Field reference — every field on the sex offender Record object | both | exactyearyear_monthunknown | — |
dobVerificationThe engine's raw DOB/age verification token. Read `matchState` instead — it is the clean vocabulary (`dob_match`, `year_match`, `age_match`, `no_dob_age_year`, `age_mismatch`, `dob_mismatch`, or `null` when nothing was scored). The `(filtered)` tokens surface only where the contract exposes rejected candidates; `""` = no DOB or age was sent. | Field reference — every field on the sex offender Record object | both | dob_matchyear_matchage_matchunverified_no_dob_or_agedob_mismatch(filtered)age_mismatch(filtered)age_mismatch(flagged) | — |
documents.format`pdf` or `html`. | The ProofBundle object — proof document response fields | both | pdfhtml | — |
health.freshForLabels for how recent the registry's data is (`daily`, `weekly`). Informational: each registry contributes to every search whatever this says. | The SourceInfo object | both | dailyweekly | — |
housingStatusWhether the registrant is housed, homeless or incarcerated, normalized from however the registry states it. `null` when the registry states none of these. | Field reference — every field on the sex offender Record object | both | homelessincarceratedhoused | — |
incompleteReasonWhy this registry did not finish; set exactly when `incomplete` is `true`. `deadline`: it did not answer in time — retry, or raise `deadlineMs` if you lowered it. `truncated`: the query matched more candidates than one search examines — narrow it (add a surname); retrying does not help. `excluded`: a retired option on your request dropped this registry; send the request without it and its records come back. `not_searched`: nothing was available to search for this registry — treat the answer as a lower bound and re-run later. `unavailable`: the registry could not be read for this request — retry. `error`: the registry failed — retry. See [Result completeness](/docs/result-completeness). | The SourceStatus object — per-registry status fields | both | deadlinetruncatedexcludednot_searchedunavailableerror | — |
incompleteReasonWhy no document was produced; set exactly when `status` is `incomplete`. `no_recipe`: this registry cannot be printed yet. `renderer_unavailable`: the printing service was not available — retry. `source_unreachable`: the registry website did not answer — retry. `blocked`: the registry website refused the visit. `timed_out`: printing did not finish in time — retry. `no_results_page`: the registry website showed no results page for this query. `render_failed`: the pages were reached but could not be printed. `query_unsupported`: this registry's website cannot search on the fields the query supplied. | The EvidenceDocument object — one registry's printed page | both | no_reciperenderer_unavailablesource_unreachableblockedtimed_outno_results_pagerender_failedquery_unsupported | — |
kindHow the registry pages were produced. `text`: printed from the page, searchable. `image`: each page is a full-page capture rendered as an image (some registries only work this way). `mixed`: both in one document. Present only when `status` is `complete`. | The EvidenceDocument object — one registry's printed page | both | textimagemixed | — |
legal.commercialUse`allowed`, `restricted`, `prohibited` or `unknown`: what the registry's terms say about commercial use. Records from every US registry are returned in search results whatever this says. | The SourceInfo object | both | allowedrestrictedprohibitedunknown | — |
matchDetail.matchedNameType`legal` or `alias`; `null` when no name was queried. | Field reference — every field on the sex offender Record object | both | legalalias | — |
matchDetail.signalsFacts about the match as a whole: `matchedLegalName`, `matchedAlias`, `matchedMiddleName` (your given name is the person's middle name), `unverifiable` (no birth data to check). `linkedByRegistryId`: the record was pulled in through a registry id that links it to a matched record rather than by its own name. | Field reference — every field on the sex offender Record object | both | matchedLegalNamematchedAliasmatchedMiddleNameunverifiablelinkedByRegistryId | — |
matchedName.type`legal` for the registered name, `alias` for one of the record's aliases. | Field reference — every field on the sex offender Record object | both | legalalias | — |
matchStateHow this record was checked against the `dob` or `age` you sent, strongest first. `dob_match`: the registry's full date equals yours. `year_match`: the registry publishes only a year and it equals your date's year. `age_match`: the registry publishes only an age and it agrees with your date. `no_dob_age_year`: the registry publishes none of these, so nothing could be checked; the record matched on name and `unverified` is `true`. `age_mismatch`: the published age contradicts your date; returned only with `onAgeMismatch: "flag"`. `dob_mismatch`: excluded from results, documented for completeness. `null` when the query carried no `dob` or `age`. See [Searching by date of birth](/docs/date-of-birth). | Field reference — every field on the sex offender Record object | both | dob_matchyear_matchage_matchno_dob_age_yearage_mismatchdob_mismatch | — |
modeAlways `async`: a live evidence search never answers inline. | The EvidenceAccepted object | both | async | — |
productThe dataset the verdict belongs to. | The Clearance object — every field on a recorded verdict | both | sex_offendercriminal | — |
recordTypeAlways `sex_offender` on this endpoint. | Field reference — every field on the sex offender Record object | both | sex_offender | sex_offender |
scope`state` or `national`. | The SourceInfo object | both | statenational | — |
staleReasonWhy the person re-surfaced. `identity_changed` — their name or date of birth changed. `offenses_changed` — their offenses changed. `status_changed` — their registration status, tier or absconder/predator flag changed. `stronger_match` — this search matched the person more strongly than the search that was cleared (the subject's date of birth now matches where only the name did). `null` when the person has not re-surfaced. | The RecordClearance object — the clearance attached to a kept record | both | identity_changedoffenses_changedstatus_changedstronger_match | — |
status`complete`: every registry searched was searched to the end. `partial`: at least one was not — read `counts.sourcesIncomplete` and `sourceStatus[]` before treating an empty `records` as an answer. `pending` and `running` appear only on an async job still in progress; `error` only on an async job that failed. | The SearchResponse object | both | completepartialrunningpendingerror | — |
status`ok`: the registry was searched (its records can still be `[]`). `error`: the registry failed for this request. `restricted`: reserved for a registry whose terms restrict this use; no registry returns it today. `no_coverage`: the registry does not cover this query. `ok` describes whether the registry answered, not whether the search finished — read `incomplete` for that. A row appended by a `live` re-check reads `complete` (finished) or `partial` (`incomplete: true`) instead. | The SourceStatus object — per-registry status fields | both | okerrorrestrictedno_coveragecompletepartial | — |
statusAlways `pending` on acceptance. | The EvidenceAccepted object | both | pending | — |
status`complete`: the PDF was produced and can be downloaded. `incomplete`: it was not; read `incompleteReason`. | The EvidenceDocument object — one registry's printed page | both | completeincomplete | — |
status`pending` on acceptance. | The AsyncSearchAccepted object | both | pendingrunning | — |
status`ready`: at least one document rendered. `none`: nothing was rendered. `rendering` is reserved and not returned today. | The ProofBundle object — proof document response fields | both | nonerenderingready | — |
status`live` when the registry is searchable. | The SourceInfo object | both | buildinglive | — |
verdict`not_this_person` suppresses (or annotates) the person on later searches for the subject; `this_person` keeps and annotates them. | The Clearance object — every field on a recorded verdict | both | not_this_personthis_person | — |
verdictAlways `not_this_person`; a `this_person` verdict never removes a record. | The ClearedEntry object — one person a clearance hid from this response | both | not_this_person | — |
verdictThe verdict recorded for this person and subject. | The RecordClearance object — the clearance attached to a kept record | both | not_this_personthis_person | — |