{"openapi":"3.0.3","info":{"title":"Offenders.io Sex Offender Registry API","description":"Industry-leading API for searching the National Sex Offender Registry. Covers 184 U.S. registry jurisdictions spanning all 50 states, DC, U.S. territories, and tribal jurisdictions. Features include name search, GIS radius search, extensive mode with jurisdiction-specific enrichment where available, fuzzy name matching, and batch processing.","version":"2.1.1","contact":{"name":"Offenders.io Support","email":"support@offenders.io","url":"https://offenders.io/contact-us/"},"termsOfService":"https://offenders.io/terms-of-services/","x-logo":{"url":"https://assets.offenders.io/logo.png"}},"servers":[{"url":"https://api.offenders.io","description":"Production"}],"externalDocs":{"description":"Full API Documentation","url":"https://offenders.io/how-to-integrate-with-offender-registry-api-complete-developer-guide/"},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}],"paths":{"/sexoffender":{"get":{"operationId":"searchOffenders","summary":"Search sex offender records","description":"Search the national sex offender registry by name, address, zip code, GPS coordinates, or free-text query. For quick demos, GET with the key query parameter remains supported. For production, prefer POST with X-API-Key or Authorization: Bearer and JSON body fields. Send optional X-Request-Id for customer-side request correlation.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID. Use a UUID or similar request ID; do not include names, emails, DOBs, member IDs, patient IDs, search values, or other sensitive data.","example":"550e8400-e29b-41d4-a716-446655440000"},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"Your API key (required). If using POST, you can send it in X-API-Key or Authorization: Bearer instead."},{"name":"firstName","in":"query","schema":{"type":"string"},"description":"First name of offender","example":"John"},{"name":"lastName","in":"query","schema":{"type":"string"},"description":"Last name of offender","example":"Smith"},{"name":"dob","in":"query","schema":{"type":"string","format":"date"},"description":"Date of birth (YYYY-MM-DD). Regular Search matches exact records by full date, year_month records by year and month, and year records by year. Records with no stored DOB are excluded. A record with unknown precision but a stored date must match the full date. Extensive Mode may also return possible matches with a partial or missing DOB.","example":"1990-01-15"},{"name":"city","in":"query","schema":{"type":"string"},"description":"Residence city","example":"San Francisco"},{"name":"state","in":"query","schema":{"type":"string"},"description":"Residence state (full name or 2-letter code)","example":"California"},{"name":"zipcode","in":"query","schema":{"type":"string"},"description":"Residence zip code","example":"94104"},{"name":"address","in":"query","schema":{"type":"string"},"description":"Street address search. Fuzzy by default; supports common address abbreviations and is billed at the fuzzy search rate (+$0.02/call). Do not combine with q or lat/lng. If combined with mode=extensive, also send firstName and lastName so enriched name results can be filtered by address.","example":"123 Main St"},{"name":"lat","in":"query","schema":{"type":"number"},"description":"Latitude for GIS radius search","example":30.967},{"name":"lng","in":"query","schema":{"type":"number"},"description":"Longitude for GIS radius search","example":-91.116},{"name":"radius","in":"query","schema":{"type":"number","default":1,"maximum":100},"description":"Radius in miles for GIS search (default 1, max 100)"},{"name":"mode","in":"query","schema":{"type":"string","enum":["extensive"]},"description":"Set to 'extensive' to check additional live sources and return aliases, locations, and stateData where available. Results with a partial or missing DOB may still appear, so the result count can differ from Regular Search. +$0.05/call."},{"name":"fuzzy","in":"query","schema":{"type":"boolean"},"description":"Enable typo-tolerant fuzzy name matching for structured name fields. Handles spelling variations, partial first names, nicknames, aliases, and hyphenated surnames. Structured address searches are fuzzy by default and do not require this flag. +$0.02/call."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Free-text search across names, aliases, address, city, and zip code. Use with fuzzy=true instead of firstName/lastName.","example":"John Smith San Francisco"},{"name":"prefixMatch","in":"query","schema":{"type":"string","enum":["firstName","lastName"]},"description":"Enable prefix matching on the specified name field"},{"name":"uuid","in":"query","schema":{"type":"string"},"description":"Pull a single record by UUID"},{"name":"personUuid","in":"query","schema":{"type":"string"},"description":"Pull a single record by Person UUID"},{"name":"faceId","in":"query","schema":{"type":"string"},"description":"Face ID from Facial Search API"},{"name":"createdAtStart","in":"query","schema":{"type":"string","format":"date"},"description":"Filter by first appearance in system (YYYY-MM-DD)"},{"name":"createdAtEnd","in":"query","schema":{"type":"string","format":"date"},"description":"Filter by first appearance in system (YYYY-MM-DD)"},{"name":"updatedAtStart","in":"query","schema":{"type":"string","format":"date"},"description":"Filter by last update in system (YYYY-MM-DD)"},{"name":"updatedAtEnd","in":"query","schema":{"type":"string","format":"date"},"description":"Filter by last update in system (YYYY-MM-DD)"},{"name":"page","in":"query","schema":{"type":"integer","default":1},"description":"Page number for GIS search pagination. Each page is billed as a separate API call."}],"responses":{"200":{"description":"Successful search","headers":{"X-Offenders-Request-Id":{"$ref":"#/components/headers/XOffendersRequestId"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"type":"object","properties":{"offenders":{"type":"array","items":{"$ref":"#/components/schemas/Offender"}},"page":{"type":"integer","description":"Current page (GIS only)"},"totalPages":{"type":"integer","description":"Total pages (GIS only)"}}}}}},"400":{"description":"Bad request — missing or invalid parameters"},"401":{"description":"Unauthorized — missing or invalid API key"},"405":{"description":"Method not allowed"}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]},"post":{"operationId":"searchOffendersPost","summary":"Search sex offender records with JSON body","description":"Recommended production method. Send your API key in X-API-Key or Authorization: Bearer and send search fields in the JSON body. Send optional X-Request-Id for customer-side request correlation. The standard endpoint also remains compatible with key in the JSON body for existing clients.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID. Use a UUID or similar request ID; do not include names, emails, DOBs, member IDs, patient IDs, search values, or other sensitive data.","example":"550e8400-e29b-41d4-a716-446655440000"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"},"example":{"firstName":"Alice","lastName":"Smith"}}}},"responses":{"200":{"description":"Successful search","headers":{"X-Offenders-Request-Id":{"$ref":"#/components/headers/XOffendersRequestId"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"}},"content":{"application/json":{"schema":{"type":"object","properties":{"offenders":{"type":"array","items":{"$ref":"#/components/schemas/Offender"}},"page":{"type":"integer","description":"Current page (GIS only)"},"totalPages":{"type":"integer","description":"Total pages (GIS only)"}}}}}},"400":{"description":"Bad request — missing or invalid parameters"},"401":{"description":"Unauthorized — missing or invalid API key"},"405":{"description":"Method not allowed"}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]}},"/sexoffender/history":{"get":{"operationId":"getSexOffenderHistory","summary":"Retrieve known sex offender history by exact identifier","description":"History is available to all API accounts; normal authentication and usage rules apply. Send a record uuid. Results are returned from newest to oldest, with up to 50 records per page. Record links do not confirm identity; verify important details with the official registry. For a printable PDF of available History, use /sexoffender/report/history with the same uuid and API key.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID."},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"Your API key. Header authentication is recommended."},{"name":"uuid","in":"query","required":true,"schema":{"type":"string","format":"uuid"},"description":"Record UUID returned by Search."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number. The server returns 50 records per page."}],"responses":{"200":{"description":"Known records connected to the record UUID","headers":{"X-Offenders-Request-Id":{"$ref":"#/components/headers/XOffendersRequestId"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"},"Cache-Control":{"description":"History responses are not cached.","schema":{"type":"string","example":"private, no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"400":{"description":"A valid uuid is required; page must be a positive integer."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Account or environment restrictions prevent this request."},"405":{"description":"Method not allowed."},"429":{"description":"Rate limit exceeded."},"502":{"description":"The History lookup backend is temporarily unavailable."},"503":{"description":"History or required audit infrastructure is temporarily unavailable."}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]},"post":{"operationId":"getSexOffenderHistoryPost","summary":"Retrieve known sex offender history with a JSON body","description":"JSON-body form of Sex Offender History. Send a record uuid. Results are returned from newest to oldest, with up to 50 records per page. For a printable PDF of available History, use /sexoffender/report/history with the same uuid and API key.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryRequest"},"examples":{"recordUuid":{"value":{"uuid":"5893a310-37ce-58d8-b101-39e76a60e94a","page":1}}}}}},"responses":{"200":{"description":"Known records connected to the record UUID","headers":{"X-Offenders-Request-Id":{"$ref":"#/components/headers/XOffendersRequestId"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"},"Cache-Control":{"description":"History responses are not cached.","schema":{"type":"string","example":"private, no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"400":{"description":"A valid uuid is required; page must be a positive integer."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Account or environment restrictions prevent this request."},"405":{"description":"Method not allowed."},"429":{"description":"Rate limit exceeded."},"502":{"description":"The History lookup backend is temporarily unavailable."},"503":{"description":"History or required audit infrastructure is temporarily unavailable."}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]}},"/sexoffender/report/history":{"get":{"operationId":"downloadSexOffenderHistoryReport","summary":"Download complete sex offender history as PDF","description":"History is available to all API accounts; normal authentication and usage rules apply. Send a record uuid. A successful request returns a PDF containing the available History timeline for that record, within the supported limit of 500 displayed entries and 200 physical PDF pages. Over-limit reports return structured 422 errors rather than partial PDFs. One successful live report is billed as one base API call; synthetic Testing reports add no billed usage. For paginated JSON History in your application, use /sexoffender/history.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID."},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"Your API key. Header authentication is recommended."},{"name":"uuid","in":"query","required":true,"schema":{"type":"string","format":"uuid"},"description":"Record UUID returned by Search."}],"responses":{"200":{"description":"Complete available material History report","headers":{"Content-Disposition":{"description":"Attachment filename for the PDF download.","schema":{"type":"string","example":"attachment; filename=\"offender-history.pdf\""}},"X-Offenders-Request-Id":{"$ref":"#/components/headers/XOffendersRequestId"},"X-Request-Id":{"$ref":"#/components/headers/XRequestId"},"Cache-Control":{"description":"Reports are private and are not cached.","schema":{"type":"string","example":"private, no-store"}}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"A valid uuid is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account or environment restrictions prevent this request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No visible History is available for this identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The complete report exceeds the supported synchronous generation limits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit or monthly spend cap exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The PDF could not be generated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The History lookup backend is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"History or required audit infrastructure is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The report generation deadline expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]},"post":{"operationId":"downloadSexOffenderHistoryReportPost","summary":"Download complete sex offender history as PDF with a JSON body","description":"JSON-body form of the PDF report. Send a record uuid. Success returns PDF bytes; errors retain the structured JSON error shape. For paginated JSON History in your application, use /sexoffender/history.","parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"description":"Optional opaque client correlation ID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryReportRequest"},"examples":{"recordUuid":{"value":{"uuid":"5893a310-37ce-58d8-b101-39e76a60e94a"}}}}}},"responses":{"200":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/200"},"400":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/400"},"401":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/401"},"403":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/403"},"404":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/404"},"405":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/405"},"422":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/422"},"429":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/429"},"500":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/500"},"502":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/502"},"503":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/503"},"504":{"$ref":"#/paths/~1sexoffender~1report~1history/get/responses/504"}},"security":[{"apiKeyHeader":[]},{"bearerAuth":[]},{"apiKeyQuery":[]}]}}},"components":{"headers":{"XOffendersRequestId":{"description":"Offenders.io-generated request ID. Include this in support tickets when available.","schema":{"type":"string"}},"XRequestId":{"description":"Echoes the sanitized client-supplied X-Request-Id when provided; otherwise mirrors X-Offenders-Request-Id.","schema":{"type":"string"}}},"securitySchemes":{"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Recommended for production POST requests."},"bearerAuth":{"type":"http","scheme":"bearer","description":"Bearer token form using the same Offenders.io API key."},"apiKeyQuery":{"type":"apiKey","in":"query","name":"key","description":"Demo/compatibility API key location for GET requests."}},"schemas":{"Offender":{"type":"object","properties":{"name":{"type":"string","description":"Full name","example":"JOHN M DOE"},"firstName":{"type":"string","example":"JOHN"},"lastName":{"type":"string","example":"DOE"},"middleName":{"type":"string"},"aliases":{"type":"array","description":"Known aliases (Extensive Mode only)","items":{"$ref":"#/components/schemas/Alias"}},"dob":{"type":"string","format":"date-time","nullable":true,"description":"Normalized date of birth in UTC when available. Use dobPrecision to distinguish a full date from source-reported year-month, year-only, or unknown values.","example":"1990-01-15T00:00:00.000Z"},"dobPrecision":{"type":"string","enum":["exact","year","year_month","unknown"],"description":"Source precision of the dob field: exact, year_month, year, or unknown.","example":"exact"},"address":{"type":"string","example":"123 MAIN ST"},"city":{"type":"string","example":"RICHMOND"},"county":{"type":"string","description":"Residence county when available.","example":"RICHMOND CITY"},"state":{"type":"string","example":"Virginia"},"zipcode":{"type":"string","example":"23219"},"locations":{"type":"array","description":"All official addresses (Extensive Mode only)","items":{"$ref":"#/components/schemas/Location"}},"sex":{"type":"string","example":"Male"},"age":{"type":"string","example":"35"},"eyeColor":{"type":"string","example":"Brown"},"hairColor":{"type":"string","example":"Black"},"height":{"type":"string","example":"5 ft 10 in"},"weight":{"type":"string","example":"180 lbs."},"race":{"type":"string","example":"White"},"ethnicity":{"type":"string","example":"Non-Hispanic"},"marks":{"type":"string","description":"Formatted tattoos, scars, and marks. Multiple source entries are newline-delimited.","example":"TAT R ARM\nSC L KNEE"},"riskLevel":{"type":"string","example":"Tier 3"},"crime":{"type":"string","description":"Newline-delimited public summaries derived from validated official offense records.","example":"SEXUAL ASSAULT\nINDECENT EXPOSURE"},"content":{"type":"string","description":"Pre-formatted HTML summary when provided by the source response.","example":"<br><b>Zip Code:</b> 23219"},"registrationDate":{"type":"string","format":"date-time","nullable":true},"offenderUrl":{"type":"string","format":"uri","description":"URL to source state registry page"},"offenderImageUrl":{"type":"string","format":"uri","description":"Profile image URL from state registry"},"offenderImageUrlR2":{"type":"string","format":"uri","description":"Cached profile image URL"},"lat":{"type":"number","description":"Latitude (-1 if unknown)","example":37.5407},"lng":{"type":"number","description":"Longitude (-1 if unknown)","example":-77.436},"jurisdiction":{"type":"string","description":"State/jurisdiction code","example":"VA"},"isAbsconder":{"type":"boolean","nullable":true},"isPredator":{"type":"boolean","nullable":true},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","nullable":true},"uuid":{"type":"string","format":"uuid","description":"Unique identifier for this record."},"personUuid":{"type":"string","format":"uuid","description":"Identifier used to connect known records for the same person."},"locationHistory":{"type":"array","description":"Available address history for this record. Returned by Sex Offender History only.","items":{"$ref":"#/components/schemas/LocationHistoryEpisode"}},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"stateData":{"$ref":"#/components/schemas/StateData"}}},"Alias":{"type":"object","properties":{"prefix":{"type":"string","nullable":true},"givenName":{"type":"string"},"middleName":{"type":"string","nullable":true},"surName":{"type":"string"},"suffix":{"type":"string","nullable":true}}},"Location":{"type":"object","description":"Public location fields available in Extensive Mode. Field availability varies by jurisdiction.","properties":{"type":{"type":"string","example":"RES (Primary)"},"streetAddress":{"type":"string"},"city":{"type":"string"},"county":{"type":"string"},"state":{"type":"string"},"zipCode":{"type":"string"},"fromDate":{"type":"string"},"toDate":{"type":"string"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"}}},"LocationHistoryEpisode":{"type":"object","description":"An address previously recorded for this result. Availability and precision vary by source.","properties":{"address":{"type":"string","description":"Street address."},"addressFull":{"type":"string","description":"Full formatted address, when available."},"city":{"type":"string"},"state":{"type":"string"},"zipcode":{"type":"string"},"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"observedAt":{"type":"string","format":"date-time"},"basis":{"type":"string","description":"Address reference category: source means it came from a public registry record; vendor means an address reference; legacy means an earlier saved address record; synthetic means fake testing-key data.","enum":["source","vendor","legacy","synthetic"]}}},"Source":{"type":"object","properties":{"id":{"type":"string","example":"nsopw"},"name":{"type":"string","example":"National Sex Offender Public Website"},"url":{"type":"string","format":"uri"}}},"StateData":{"type":"object","description":"Allowlisted jurisdiction-specific registry data (Extensive Mode only). Availability varies by jurisdiction. Repeated entities such as offenses and photos are object arrays; marks is one formatted string with multiple source entries newline-delimited.","properties":{"stateOffenderId":{"type":"string"},"status":{"type":"string","example":"Active"},"designation":{"type":"string","example":"Sexually Violent Offender"},"complianceStatus":{"type":"string","example":"COMPLIANT"},"aliases":{"type":"array","items":{"type":"string"}},"initialRegistrationDate":{"type":"string"},"lastVerificationDate":{"type":"string"},"addressVerificationDate":{"type":"string"},"registrationEnds":{"type":"string"},"isLifetimeRegistration":{"type":"boolean"},"marks":{"type":"string","description":"Formatted scars, marks, and tattoos. Multiple source entries are newline-delimited."},"verificationRequirement":{"type":"string"},"lawAgency":{"type":"string"},"ethnicity":{"type":"string"},"incarcerationStatus":{"type":"string"},"school":{"type":"string"},"employer":{"type":"string"},"registrationStartDate":{"type":"string","description":"Official registration start date, when published by the jurisdiction"},"sourceModifiedAt":{"type":"string","description":"Official source-system modification value in the jurisdiction's native precision and format; not a registration, verification, conviction, release, or other offender business-event date"},"registrationEndDate":{"type":"string"},"registrationDuration":{"type":"string"},"comments":{"type":"string"},"judgmentOfConvictionUrl":{"type":"string","format":"uri"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/Location"}},"offenses":{"type":"array","items":{"type":"object","properties":{"offense":{"type":"string"},"convictionDate":{"type":"string"},"releaseDate":{"type":"string"},"statute":{"type":"string"},"victimAge":{"type":"string"},"victimSex":{"type":"string"},"jurisdiction":{"type":"string"},"caseNumber":{"type":"string"},"adjudication":{"type":"string"}}}},"vehicles":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"make":{"type":"string"},"model":{"type":"string"},"plate":{"type":"string"},"state":{"type":"string"},"color":{"type":"string"},"year":{"type":"string"},"hullNumber":{"type":"string","description":"Official vessel hull identifier, when published by the jurisdiction"}}}},"photos":{"type":"array","items":{"type":"object","properties":{"photoId":{"type":"string"},"isCurrent":{"type":"boolean"},"datePosted":{"type":"string"},"date":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"victimInfo":{"type":"array","items":{"type":"object","properties":{"gender":{"type":"string"},"sex":{"type":"string"},"age":{"type":"string"},"minor":{"type":"boolean"},"classification":{"type":"string"},"race":{"type":"string"}}}},"criminalHistory":{"type":"array","items":{"type":"object","properties":{"offense":{"type":"string"},"date":{"type":"string"},"charge":{"type":"string"},"arrestDate":{"type":"string"},"disposition":{"type":"string"},"dispositionDate":{"type":"string"}}}}}},"HistoryRequest":{"type":"object","description":"JSON body for POST /sexoffender/history. Send a record uuid.","properties":{"key":{"type":"string","description":"Your API key. Header authentication is recommended."},"uuid":{"type":"string","format":"uuid","description":"Record UUID returned by Search."},"page":{"type":"integer","minimum":1,"default":1}},"required":["uuid"],"additionalProperties":false},"HistoryReportRequest":{"type":"object","description":"JSON body for POST /sexoffender/report/history. Send a record uuid.","properties":{"uuid":{"type":"string","format":"uuid","description":"Record UUID returned by Search."}},"required":["uuid"],"additionalProperties":false},"ErrorResponse":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer","description":"HTTP status code."},"message":{"type":"string","description":"Human-readable error message."}},"additionalProperties":false},"HistoryResponse":{"type":"object","required":["offenders","page","totalPages"],"properties":{"offenders":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/Offender"}},"page":{"type":"integer","minimum":1},"totalPages":{"type":"integer","minimum":0}}},"SearchRequest":{"type":"object","description":"JSON body for POST /sexoffender. Uses the same fields as the GET query parameters. At least one search field is required.","properties":{"key":{"type":"string","description":"Your API key (required). If using POST, you can send it in X-API-Key or Authorization: Bearer instead."},"firstName":{"type":"string","description":"First name of offender","example":"John"},"lastName":{"type":"string","description":"Last name of offender","example":"Smith"},"dob":{"type":"string","format":"date","description":"Date of birth (YYYY-MM-DD). Regular Search matches exact records by full date, year_month records by year and month, and year records by year. Records with no stored DOB are excluded. A record with unknown precision but a stored date must match the full date. Extensive Mode may also return possible matches with a partial or missing DOB.","example":"1990-01-15"},"city":{"type":"string","description":"Residence city","example":"San Francisco"},"state":{"type":"string","description":"Residence state (full name or 2-letter code)","example":"California"},"zipcode":{"type":"string","description":"Residence zip code","example":"94104"},"address":{"type":"string","description":"Street address search. Fuzzy by default; supports common address abbreviations and is billed at the fuzzy search rate (+$0.02/call). Do not combine with q or lat/lng. If combined with mode=extensive, also send firstName and lastName so enriched name results can be filtered by address.","example":"123 Main St"},"lat":{"type":"number","description":"Latitude for GIS radius search","example":30.967},"lng":{"type":"number","description":"Longitude for GIS radius search","example":-91.116},"radius":{"type":"number","default":1,"maximum":100,"description":"Radius in miles for GIS search (default 1, max 100)"},"mode":{"type":"string","enum":["extensive"],"description":"Set to 'extensive' to check additional live sources and return aliases, locations, and stateData where available. Results with a partial or missing DOB may still appear, so the result count can differ from Regular Search. +$0.05/call."},"fuzzy":{"type":"boolean","description":"Enable typo-tolerant fuzzy name matching for structured name fields. Handles spelling variations, partial first names, nicknames, aliases, and hyphenated surnames. Structured address searches are fuzzy by default and do not require this flag. +$0.02/call."},"q":{"type":"string","description":"Free-text search across names, aliases, address, city, and zip code. Use with fuzzy=true instead of firstName/lastName.","example":"John Smith San Francisco"},"prefixMatch":{"type":"string","enum":["firstName","lastName"],"description":"Enable prefix matching on the specified name field"},"uuid":{"type":"string","description":"Pull a single record by UUID"},"personUuid":{"type":"string","description":"Pull a single record by Person UUID"},"faceId":{"type":"string","description":"Face ID from Facial Search API"},"createdAtStart":{"type":"string","format":"date","description":"Filter by first appearance in system (YYYY-MM-DD)"},"createdAtEnd":{"type":"string","format":"date","description":"Filter by first appearance in system (YYYY-MM-DD)"},"updatedAtStart":{"type":"string","format":"date","description":"Filter by last update in system (YYYY-MM-DD)"},"updatedAtEnd":{"type":"string","format":"date","description":"Filter by last update in system (YYYY-MM-DD)"},"page":{"type":"integer","default":1,"description":"Page number for GIS search pagination. Each page is billed as a separate API call."}},"additionalProperties":false}}}}