Offendersearch
Monitoring API Reference

The Monitor object

One object per watch — its predicate, its channels, its status — and how to read every field.

Base URL https://api.offendersearch.app

One object per watch

A monitor is the durable record of a standing watch. The same object is returned by POST /v1/monitors, by GET /v1/monitors (in a list), and by GET /v1/monitors/{id} (with its recent alerts attached). Every top-level key is always present — test the value, never for key existence.

A monitor
{
  "id": "mon_7f2a1c9e0b4d",
  "product": "sex-offender",
  "type": "person",
  "person": { "firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12" },
  "location": null,
  "minConfidence": "dob_match",
  "label": "Jordan Rivera — SO watch",
  "status": "active",
  "channels": { "email": "alerts@example.com", "webhookUrl": null },
  "createdAt": "2026-09-05T14:02:11+00:00"
}

Fields

FieldTypeNotes
idstringThe monitor identifier, mon_ + 12 hex. Use it on every /v1/monitors/{id} call.
productstringsex-offender or criminal — the dataset this monitor watches. One product per monitor.
typestringperson (watch a name + DOB) or location (watch a radius around an address).
personobject | nullPresent on a person monitor: firstName, lastName, dob. null on a location monitor.
locationobject | nullPresent on a location monitor: address (or lat/lng) and radiusMiles. null on a person monitor.
minConfidencestringThe confidence floor an alert must clear: dob_match or year_match. Defaults to dob_match.
labelstringYour own label for the monitor, echoed back on the object and the dashboard. Optional.
statusstringactive (evaluated daily, billing) or canceled (stopped; billing ends at the period end).
channelsobjectWhere alerts are delivered: email and/or webhookUrl. At least one is required at creation.
createdAtstringISO-8601 timestamp of when the monitor was created.

person and location are mutually exclusive

A monitor carries exactly one predicate. On a type: "person" monitor, person is populated and location is null; on a type: "location" monitor it is the reverse. Read type to know which to expect, then read the matching object. See Person monitoring and Location monitoring.

status and the monitor lifecycle

statusMeaning
activeThe monitor is evaluated once per day and is billed on your monthly invoice.
canceledYou cancelled it. It is no longer evaluated; billing stops at the end of the current period (prorated). It stays readable so its alert history is not lost.
A cancelled monitor is not deleted. GET /v1/monitors/{id} still returns it and its alerts. Cancelling is how you stop a watch; there is no separate delete. See Billing.

GET /v1/monitors/{id}

Retrieve one monitor together with its recent alerts. A monitor is visible only to the account that created it — another account’s id returns 404.

curl "https://api.offendersearch.app/v1/monitors/mon_7f2a1c9e0b4d" \
  -H "X-API-Key: $OFFENDERSEARCH_KEY"
200 OK
{
  "id": "mon_7f2a1c9e0b4d",
  "product": "sex-offender",
  "type": "person",
  "person": { "firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12" },
  "minConfidence": "dob_match",
  "label": "Jordan Rivera — SO watch",
  "status": "active",
  "channels": { "email": "alerts@example.com", "webhookUrl": null },
  "createdAt": "2026-09-05T14:02:11+00:00",
  "recentAlerts": [
    { "id": "alrt_a1b2c3d4e5f6", "eventType": "new", "matchLabel": "dob_match",
      "occurredAt": "2026-09-06T05:12:00+00:00" }
  ]
}