FCRA Partner API · v1.0.0 · approved partners

Continuous checks

Enroll a subject once; an order is placed only when a reportable change appears.

Livehttps://api.offendersearch.appSandboxhttps://sandbox.offendersearch.app

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
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/monitorsAuth: 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
FieldTypeDescription
endUserId
required
stringYour 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
EvergreenConsentThe consumer's continuing (evergreen) authorization. A one-time authorization does not cover a continuous check.
subject
required
SubjectThe person: name, date of birth and address history, as for an order.
searches
required
array of SearchSpecOne to three searches (sex_offender, criminal, healthcare) to keep running.
useLocation
optional
UseLocation or nullWhere the person works or lives, for the state rules that apply. null when not given.
annualSalary
optional
integer or nullAnnual salary in whole dollars, for salary-threshold state rules. null when not given.
clientReference
optional
string or nullCarried onto every order the monitor places.
metadata
optional
object or nullCarried onto every order the monitor places.
intervalDays
optional
integer or nullHow often to evaluate, 1 to 365. Default 30.
baselineOrderId
optional
string or nullA complete order on this subject, recorded as the starting point.

Response

201 · application/json

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.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.
403fcra_purpose_not_allowed
404unknown_end_user
404not_foundbaselineOrderId is not yours.
422end_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.

FieldTypeDescription
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 nullYour reference to the signed authorization.
evergreen
required
booleanMust 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.

FieldTypeDescription
id
stringThe monitor's id (mon_…).
Example "fm_5a6b7c8d9e0f1a2b"
status
string
one of "active", "inactive"
active while checks run; inactive once deactivated.
inactiveReason
string or nullclient_unenrolled, adverse_action (an order it placed went to adverse action) or partner_or_end_user_unavailable.
endUserId
stringYour 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
SubjectThe person being checked, as submitted.
consent
EvergreenConsentThe continuing authorization on file.
searches
array of SearchSpecThe searches that run at each check.
useLocation
object or nullWhere the person works or lives, when given. null otherwise.
useLocation.state
stringTwo-letter state code.
useLocation.city
string or nullCity, when one applies. null otherwise.
annualSalary
integer or nullAnnual salary in whole dollars, when given. null otherwise.
clientReference
string or nullYour own reference, echoed back unchanged. null when none.
metadata
object or nullUp to 50 string key/value pairs of your own. null when none.
intervalDays
integerDays between checks, 1 to 365. Default 30.
baseline
object or nullWhat the monitor knows and has done.
baseline.takenAt
string (date-time)When the baseline was taken.
baseline.candidates
integerCandidate records in the baseline (not furnished: a count).
baseline.evaluations
integerHow many checks have run since enrollment.
baseline.ordersPlaced
integerHow many of those checks found something new and placed an order.
baseline.lastChangeAt
string (date-time) or nullWhen a check last found a new candidate. null until one does.
baseline.lastRemoved
integerBaseline candidates no longer found on the last evaluation (noted, never reported).
firstOrderId
string or nullThe baselineOrderId you sent.
lastOrderId
string or nullThe last order a change placed.
lastEvaluatedAt
string (date-time) or nullWhen the last check ran. null before the first.
nextEvaluateAt
string (date-time) or nullWhen the next check is due. null once deactivated.
sandbox
booleantrue 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 nullWhen 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/monitorsAuth: X-API-Key

Request

Query parameters
FieldTypeDescription
status
optional
string
one of "active", "inactive"
endUserId
optional
string
limit
optional · default 100
integer1 to 500.

Response

200 · application/json

FieldTypeDescription
monitors
array of Monitor
Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA 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
FieldTypeDescription
monitor_id
required
string
Example "fm_5a6b7c8d9e0f1a2b"

Response

200 · application/json

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.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.
404not_found

Evaluate a continuous check now — POST /v1/fcra/monitors/{monitor_id}/evaluate

POST/v1/fcra/monitors/{monitor_id}/evaluateAuth: X-API-Key

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

Request

Path parameters
FieldTypeDescription
monitor_id
required
string
Example "fm_5a6b7c8d9e0f1a2b"

Response

200 · application/json

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.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.
404not_found
409not_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
FieldTypeDescription
monitor_id
required
string
Example "fm_5a6b7c8d9e0f1a2b"

Response

200 · application/json

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.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.
404not_found
409not_activeAlready 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.app Not https://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 the X-API-Key header.
1. POST /v1/fcra/end-users
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"
      }
    }'
2. POST /v1/fcra/orders
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.

Create a test key under Dashboard → API keys. Live keys are refused here.
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" } }'

Product overview