Continuous checks
Enroll a subject once; an order is placed only when a reportable change appears.
Livehttps://api.offendersearch.appSandboxhttps://sandbox.offendersearch.appHow it works
A continuous check keeps watching a subject after the first report. You enroll the subject with the same name, date of birth, aliases, address history, purpose and searches as an order, plus an evergreen authorization. We take a baseline at once, then re-evaluate on the interval you set (30 days by default). An evaluation searches the stored data and runs the identity, jurisdiction and dispute controls with no live work; a candidate record that was not in the baseline is a change, and a change places an order with source: "continuous" — the order then does the live re-verification, the evidence, the report and the receipt exactly as any other. Nothing is reported from the evaluation itself, and a record that disappears from the baseline is noted, never reported.
- Enrollment and evaluations are free; only the order a change places is billed ($4.95, or your custom price). Each evaluation records a
fcra_monitor_evaluationusage event for reference. monitor.change_foundcarries the monitor and the order;order.createdand the rest follow as usual.- Adverse action started on an order the monitor placed deactivates the monitor (
inactiveReason: "adverse_action"): re-enroll after the decision if the relationship continues. - An evergreen authorization is required. A one-time authorization for a single report does not cover ongoing checks; collect it in your own flow or ask us about adding it to the hosted flow.
- An order a continuous check places runs with
liveScope: "relevant". - A continuous check with a
healthcaresearch follows the lists: every day we check whether any healthcare source’s file was refreshed (the HHS-OIG list is replaced by the 10th of each month), and evaluate when one was and at least seven days have passed since the last evaluation, or when the interval is up. A list entry matched on the name alone is never a change.
Enroll a subject
curl -X POST "https://api.offendersearch.app/v1/fcra/monitors" \
-H "X-API-Key: $OFFENDERSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"endUserId": "eu_0b44acbeefeaa7d7",
"permissiblePurpose": "employment",
"consent": { "obtainedAt": "2026-10-20T10:00:00Z", "method": "esign", "evergreen": true },
"subject": { "firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12",
"addresses": [{ "state": "OH", "city": "Columbus", "postalCode": "43215", "from": "2019-01" }] },
"searches": [{ "type": "sex_offender" }, { "type": "criminal" }],
"useLocation": { "state": "OH", "city": "Columbus" },
"intervalDays": 30,
"clientReference": "emp-2041"
}'Enroll a subject in a continuous check — POST /v1/fcra/monitors
Takes a baseline now with no live work, then re-evaluates on the interval. A new reportable candidate places an order with source: "continuous".
Request
| Field | Type | Description |
|---|---|---|
| endUserId required | string | Your id for the end user the checks are for. |
| permissiblePurpose required | string one of "employment", "tenant_screening", "consumer_written_instructions", "legitimate_business_need" | employment, tenant_screening, consumer_written_instructions or legitimate_business_need. Sets which forms and state notices apply. |
| consent required | EvergreenConsent | The consumer's continuing (evergreen) authorization. A one-time authorization does not cover a continuous check. |
| subject required | Subject | The person: name, date of birth and address history, as for an order. |
| searches required | array of SearchSpec | One to three searches (sex_offender, criminal, healthcare) to keep running. |
| useLocation optional | UseLocation or null | Where the person works or lives, for the state rules that apply. null when not given. |
| annualSalary optional | integer or null | Annual salary in whole dollars, for salary-threshold state rules. null when not given. |
| clientReference optional | string or null | Carried onto every order the monitor places. |
| metadata optional | object or null | Carried onto every order the monitor places. |
| intervalDays optional | integer or null | How often to evaluate, 1 to 365. Default 30. |
| baselineOrderId optional | string or null | A complete order on this subject, recorded as the starting point. |
Response
The body is the Monitor object. A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.
| Status | Code | When |
|---|---|---|
| 401 | — | No valid X-API-Key (the body is { "detail": "…" }, a string). |
| 403 | fcra_not_enabled | This account has no active FCRA partner agreement. |
| 403 | fcra_not_on_trial | FCRA orders are not available on a trial account. |
| 403 | fcra_purpose_not_allowed | |
| 404 | unknown_end_user | |
| 404 | not_found | baselineOrderId is not yours. |
| 422 | end_user_suspended | |
| 422 | — | consent.evergreen is not true, or a field failed validation. |
The EvergreenConsent object
The consumer's authorization to be checked on an ongoing basis. A one-time authorization does not cover a continuous check: evergreen must be true.
Returned or accepted by POST /v1/fcra/monitors, GET /v1/fcra/monitors, GET /v1/fcra/monitors/{monitor_id}, DELETE /v1/fcra/monitors/{monitor_id}, POST /v1/fcra/monitors/{monitor_id}/evaluate.
| Field | Type | Description |
|---|---|---|
| obtainedAt required | string (date-time) | When the consumer gave the continuing authorization. |
| method required | string one of "esign", "wet_signature", "electronic_click", "recorded_verbal", "other" | How it was given: esign, wet_signature, electronic_click, recorded_verbal or other. |
| documentRef optional | string or null | Your reference to the signed authorization. |
| evergreen required | boolean | Must be true. |
The Monitor object — a continuous check
A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.
Returned or accepted by POST /v1/fcra/monitors, GET /v1/fcra/monitors, GET /v1/fcra/monitors/{monitor_id}, DELETE /v1/fcra/monitors/{monitor_id}, POST /v1/fcra/monitors/{monitor_id}/evaluate.
| Field | Type | Description |
|---|---|---|
| id | string | The monitor's id (mon_…).Example "fm_5a6b7c8d9e0f1a2b" |
| status | string one of "active", "inactive" | active while checks run; inactive once deactivated. |
| inactiveReason | string or null | client_unenrolled, adverse_action (an order it placed went to adverse action) or partner_or_end_user_unavailable. |
| endUserId | string | Your id for the end user the checks are for. |
| permissiblePurpose | string one of "employment", "tenant_screening", "consumer_written_instructions", "legitimate_business_need" | The permissible purpose the monitor was created with. |
| subject | Subject | The person being checked, as submitted. |
| consent | EvergreenConsent | The continuing authorization on file. |
| searches | array of SearchSpec | The searches that run at each check. |
| useLocation | object or null | Where the person works or lives, when given. null otherwise. |
| useLocation.state | string | Two-letter state code. |
| useLocation.city | string or null | City, when one applies. null otherwise. |
| annualSalary | integer or null | Annual salary in whole dollars, when given. null otherwise. |
| clientReference | string or null | Your own reference, echoed back unchanged. null when none. |
| metadata | object or null | Up to 50 string key/value pairs of your own. null when none. |
| intervalDays | integer | Days between checks, 1 to 365. Default 30. |
| baseline | object or null | What the monitor knows and has done. |
| baseline.takenAt | string (date-time) | When the baseline was taken. |
| baseline.candidates | integer | Candidate records in the baseline (not furnished: a count). |
| baseline.evaluations | integer | How many checks have run since enrollment. |
| baseline.ordersPlaced | integer | How many of those checks found something new and placed an order. |
| baseline.lastChangeAt | string (date-time) or null | When a check last found a new candidate. null until one does. |
| baseline.lastRemoved | integer | Baseline candidates no longer found on the last evaluation (noted, never reported). |
| firstOrderId | string or null | The baselineOrderId you sent. |
| lastOrderId | string or null | The last order a change placed. |
| lastEvaluatedAt | string (date-time) or null | When the last check ran. null before the first. |
| nextEvaluateAt | string (date-time) or null | When the next check is due. null once deactivated. |
| sandbox | boolean | true on the sandbox server; false in production. |
| createdAt | string (date-time) | When the monitor was created. |
| updatedAt | string (date-time) | When it last changed. |
| deactivatedAt | string (date-time) or null | When it was deactivated. null while active. |
Evaluate, unenroll
Evaluations run on the schedule; POST /v1/fcra/monitors/{id}/evaluate runs one now and moves the next out by the interval. DELETE /v1/fcra/monitors/{id} unenrolls; orders already placed stay. The monitor object shows the baseline’s candidate count, the number of evaluations and orders, and the last change.
List continuous checks — GET /v1/fcra/monitors
Request
| Field | Type | Description |
|---|---|---|
| status optional | string one of "active", "inactive" | |
| endUserId optional | string | |
| limit optional · default 100 | integer | 1 to 500. |
Response
| Field | Type | Description |
|---|---|---|
| monitors | array of Monitor |
| Status | Code | When |
|---|---|---|
| 401 | — | No valid X-API-Key (the body is { "detail": "…" }, a string). |
| 403 | fcra_not_enabled | This account has no active FCRA partner agreement. |
| 403 | fcra_not_on_trial | FCRA orders are not available on a trial account. |
Retrieve a continuous check — GET /v1/fcra/monitors/{monitor_id}
Request
| Field | Type | Description |
|---|---|---|
| monitor_id required | string | Example "fm_5a6b7c8d9e0f1a2b" |
Response
The body is the Monitor object. A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.
| Status | Code | When |
|---|---|---|
| 401 | — | No valid X-API-Key (the body is { "detail": "…" }, a string). |
| 403 | fcra_not_enabled | This account has no active FCRA partner agreement. |
| 403 | fcra_not_on_trial | FCRA orders are not available on a trial account. |
| 404 | not_found |
Evaluate a continuous check now — POST /v1/fcra/monitors/{monitor_id}/evaluate
Runs an evaluation outside the schedule. The next scheduled one moves out by the interval.
Request
| Field | Type | Description |
|---|---|---|
| monitor_id required | string | Example "fm_5a6b7c8d9e0f1a2b" |
Response
The monitor after the evaluation.
The body is the Monitor object. A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.
| Status | Code | When |
|---|---|---|
| 401 | — | No valid X-API-Key (the body is { "detail": "…" }, a string). |
| 403 | fcra_not_enabled | This account has no active FCRA partner agreement. |
| 403 | fcra_not_on_trial | FCRA orders are not available on a trial account. |
| 404 | not_found | |
| 409 | not_active |
Unenroll a subject — DELETE /v1/fcra/monitors/{monitor_id}
No further evaluations. Orders already placed are unaffected.
Request
| Field | Type | Description |
|---|---|---|
| monitor_id required | string | Example "fm_5a6b7c8d9e0f1a2b" |
Response
The body is the Monitor object. A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.
| Status | Code | When |
|---|---|---|
| 401 | — | No valid X-API-Key (the body is { "detail": "…" }, a string). |
| 403 | fcra_not_enabled | This account has no active FCRA partner agreement. |
| 403 | fcra_not_on_trial | FCRA orders are not available on a trial account. |
| 404 | not_found | |
| 409 | not_active | Already inactive. |
Test FCRA orders on the sandbox server
With a test key (os_test_…) every account is a sandbox FCRA partner on the sandbox server, with the same last-name rules. Register an end user, then place orders against it; nothing is billed. An order finishes right after the 202: read it once with GET /v1/fcra/orders/{orderId}.
- Base URL
https://sandbox.offendersearch.appNothttps://api.offendersearch.app, which takes live keys only.- Test key
- In the dashboard, Developers → API keys → Create test key. Test keys begin
os_test_; send yours in theX-API-Keyheader.
curl -X POST "https://sandbox.offendersearch.app/v1/fcra/end-users" \
-H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Sample Staffing LLC",
"permissiblePurposes": [
"employment"
],
"certification": {
"text": "End user certifies it will use reports only for employment purposes.",
"version": "v1",
"certifiedAt": "2026-10-01T12:00:00Z"
}
}'curl -X POST "https://sandbox.offendersearch.app/v1/fcra/orders" \
-H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"endUserId": "{endUserId}",
"permissiblePurpose": "employment",
"consent": {
"obtainedAt": "2026-10-01T12:00:00Z",
"method": "esign"
},
"subject": {
"firstName": "Pat",
"lastName": "Records",
"dob": "1980-01-01"
},
"searches": [
{
"type": "sex_offender"
},
{
"type": "criminal"
}
]
}'Try it here
Pick a scenario, edit the request, and run it against the sandbox from this page. The explorer accepts os_test_ keys only and never reaches the live host, so nothing here is billed; the “production” code it copies is for your own backend with a live key.
Copy this request as code
Sandbox code uses your test key. Production code calls the live host and is billed per call; run it from your backend with an os_live_… key.
curl -X POST https://sandbox.offendersearch.app/v1/fcra/end-users \
-H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Sample Staffing LLC", "permissiblePurposes": [ "employment" ], "certification": { "text": "End user certifies it will use reports only for employment purposes.", "version": "v1", "certifiedAt": "2026-10-01T12:00:00Z" } }'Every test name: FCRA API sandbox ordersPostman collectionFCRA API sandbox