# Continuous checks

> Enroll a subject with an evergreen authorization; we re-evaluate on a schedule with no live cost and place an order only when something reportable appears.

- **HTML:** https://offendersearch.app/docs/fcra/continuous-checks
- **Base URL (live):** https://api.offendersearch.app — live keys (`os_live_…`)
- **Base URL (sandbox):** https://sandbox.offendersearch.app — test keys (`os_test_…`), never billed; see https://offendersearch.app/docs/fcra/sandbox.md
- **Authentication:** `X-API-Key` request header, on an account with FCRA Partner Access
- **FCRA API reference as markdown:** https://offendersearch.app/docs/fcra.md

## How 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_evaluation` usage event for reference.
- `monitor.change_found` carries the monitor and the order; `order.created` and 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 `healthcare` search 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

POST /v1/fcra/monitors

```bash
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

`POST /v1/fcra/monitors` · auth: `X-API-Key`

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

**Body** (application/json)

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `endUserId` | `string` | required | Your id for the end user the checks are for. |
| `permissiblePurpose` | `string` — one of `"employment"`, `"tenant_screening"`, `"consumer_written_instructions"`, `"legitimate_business_need"` | required | `employment`, `tenant_screening`, `consumer_written_instructions` or `legitimate_business_need`. Sets which forms and state notices apply. |
| `consent` | [EvergreenConsent](https://offendersearch.app/docs/fcra/continuous-checks#object-evergreenconsent) | required | The consumer's continuing (evergreen) authorization. A one-time authorization does not cover a continuous check. |
| `subject` | [Subject](https://offendersearch.app/docs/fcra/orders#object-subject) | required | The person: name, date of birth and address history, as for an order. |
| `searches` | array of [SearchSpec](https://offendersearch.app/docs/fcra/orders#object-searchspec) | required | One to three searches (`sex_offender`, `criminal`, `healthcare`) to keep running. |
| `useLocation` | [UseLocation](https://offendersearch.app/docs/fcra/orders#object-uselocation) or null | optional | Where the person works or lives, for the state rules that apply. `null` when not given. |
| `annualSalary` | `integer` or null | optional | Annual salary in whole dollars, for salary-threshold state rules. `null` when not given. |
| `clientReference` | `string` or null | optional | Carried onto every order the monitor places. |
| `metadata` | `object` or null | optional | Carried onto every order the monitor places. |
| `intervalDays` | `integer` or null | optional | How often to evaluate, 1 to 365. Default 30. |
| `baselineOrderId` | `string` or null | optional | A complete order on this subject, recorded as the starting point. |

### Response

**201** (application/json) — 

The body is [the `Monitor` object](https://offendersearch.app/docs/fcra/continuous-checks#object-monitor). A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.

**Errors**

| 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`](https://offendersearch.app/docs/fcra/continuous-checks#reference-post-v1-fcra-monitors), [`GET /v1/fcra/monitors`](https://offendersearch.app/docs/fcra/continuous-checks#reference-get-v1-fcra-monitors), [`GET /v1/fcra/monitors/{monitor_id}`](https://offendersearch.app/docs/fcra/continuous-checks#reference-get-v1-fcra-monitors-monitor-id), [`DELETE /v1/fcra/monitors/{monitor_id}`](https://offendersearch.app/docs/fcra/continuous-checks#reference-delete-v1-fcra-monitors-monitor-id), [`POST /v1/fcra/monitors/{monitor_id}/evaluate`](https://offendersearch.app/docs/fcra/continuous-checks#reference-post-v1-fcra-monitors-monitor-id-evaluate).

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `obtainedAt` | `string (date-time)` | required | When the consumer gave the continuing authorization. |
| `method` | `string` — one of `"esign"`, `"wet_signature"`, `"electronic_click"`, `"recorded_verbal"`, `"other"` | required | How it was given: `esign`, `wet_signature`, `electronic_click`, `recorded_verbal` or `other`. |
| `documentRef` | `string` or null | optional | Your reference to the signed authorization. |
| `evergreen` | `boolean` | required | 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`](https://offendersearch.app/docs/fcra/continuous-checks#reference-post-v1-fcra-monitors), [`GET /v1/fcra/monitors`](https://offendersearch.app/docs/fcra/continuous-checks#reference-get-v1-fcra-monitors), [`GET /v1/fcra/monitors/{monitor_id}`](https://offendersearch.app/docs/fcra/continuous-checks#reference-get-v1-fcra-monitors-monitor-id), [`DELETE /v1/fcra/monitors/{monitor_id}`](https://offendersearch.app/docs/fcra/continuous-checks#reference-delete-v1-fcra-monitors-monitor-id), [`POST /v1/fcra/monitors/{monitor_id}/evaluate`](https://offendersearch.app/docs/fcra/continuous-checks#reference-post-v1-fcra-monitors-monitor-id-evaluate).

| Field | Type | Default | 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](https://offendersearch.app/docs/fcra/orders#object-subject) |  | The person being checked, as submitted. |
| `consent` | [EvergreenConsent](https://offendersearch.app/docs/fcra/continuous-checks#object-evergreenconsent) |  | The continuing authorization on file. |
| `searches` | array of [SearchSpec](https://offendersearch.app/docs/fcra/orders#object-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

`GET /v1/fcra/monitors` · auth: `X-API-Key`



### Request

**Query parameters**

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `status` | `string` — one of `"active"`, `"inactive"` | optional |  |
| `endUserId` | `string` | optional |  |
| `limit` | `integer` | optional · default `100` | 1 to 500. |

### Response

**200** (application/json) — 

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `monitors` | array of [Monitor](https://offendersearch.app/docs/fcra/continuous-checks#object-monitor) |  |  |

**Errors**

| 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}

`GET /v1/fcra/monitors/{monitor_id}` · auth: `X-API-Key`



### Request

**Path parameters**

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `monitor_id` | `string` | required | Example `"fm_5a6b7c8d9e0f1a2b"`. |

### Response

**200** (application/json) — 

The body is [the `Monitor` object](https://offendersearch.app/docs/fcra/continuous-checks#object-monitor). A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.

**Errors**

| 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

`POST /v1/fcra/monitors/{monitor_id}/evaluate` · auth: `X-API-Key`

Runs an evaluation outside the schedule. The next scheduled one moves out by the interval.

### Request

**Path parameters**

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `monitor_id` | `string` | required | Example `"fm_5a6b7c8d9e0f1a2b"`. |

### Response

**200** (application/json) — The monitor after the evaluation.

The body is [the `Monitor` object](https://offendersearch.app/docs/fcra/continuous-checks#object-monitor). A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.

**Errors**

| 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}

`DELETE /v1/fcra/monitors/{monitor_id}` · auth: `X-API-Key`

No further evaluations. Orders already placed are unaffected.

### Request

**Path parameters**

| Field | Type | Required / default | Description |
| --- | --- | --- | --- |
| `monitor_id` | `string` | required | Example `"fm_5a6b7c8d9e0f1a2b"`. |

### Response

**200** (application/json) — 

The body is [the `Monitor` object](https://offendersearch.app/docs/fcra/continuous-checks#object-monitor). A subject enrolled in a continuous check: its baseline, when it was last evaluated and will be next, and the orders it placed.

**Errors**

| 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. |

---

## Related

- Previous: [The consumer portal](https://offendersearch.app/docs/fcra/consumer-portal.md)
- Next: [FCRA API reference](https://offendersearch.app/docs/fcra/api-reference.md)
- Index: [FCRA API reference](https://offendersearch.app/docs/fcra.md)
