Monitoring API · v1.0.0

The Monitor object

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

Livehttps://api.offendersearch.appSandboxhttps://sandbox.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 recentAlerts attached). A person monitor carries a person key and a location monitor a location key, never both; every other key is on every monitor.

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

Fields — every field on the Monitor object

One standing watch, as POST /v1/monitors, GET /v1/monitors and GET /v1/monitors/{monitorId} return it. A person monitor carries person and no location key; a location monitor carries location and no person key — read type, then the matching object.

Returned or accepted by POST /v1/monitors, GET /v1/monitors, GET /v1/monitors/{monitorId}.

FieldTypeDescription
id
stringThe monitor id: mon_ followed by 16 hex characters. Use it in every /v1/monitors/{monitorId} path.
Example "mon_b8f40d7afb9dc0d8"
product
string
one of "sex-offender", "criminal"
The dataset this monitor watches.
type
string
one of "person", "location"
The predicate: which of person or location this monitor carries.
minConfidence
string or null
one of "dob_match", "year_match", "age_match", "name_match", "any"
The alert floor exactly as you set it. null when you did not set one, in which case the default floor applies (year_match with a dob, name_match without).
label
string or nullYour label, or null when you did not set one.
status
string
one of "active", "canceled"
active: evaluated and billed. canceled: no longer evaluated, and not charged on any invoice prepared after the cancel; the monitor and its alerts stay readable.
channels
objectWhere alerts are delivered, normalised.
channels.emails
array of stringEvery recipient address you set (email and emails merged, de-duplicated). [] when the monitor delivers by webhook only. The account owner's email receives the alert email in addition to these.
channels.webhookUrl
string (uri)The webhook endpoint. The key is absent when no webhook is set.
createdAt
string (date-time)When the monitor was created, ISO-8601 in UTC.
Example "2026-10-14T04:13:16.599893+00:00"
canceledAt
string (date-time) or nullWhen the monitor was canceled; null while it is active.
person
objectThe person criteria, normalised. Present only on a person monitor.
person.firstName
string or nullGiven name, or null when none was sent.
person.lastName
stringSurname.
person.dob
string (date) or nullDate of birth, YYYY-MM-DD, or null when none was sent.
location
objectThe location criteria, normalised. Present only on a location monitor.
location.address
string or nullThe address you sent, or null.
location.lat
number or nullLatitude of the centre, or null.
location.lng
number or nullLongitude of the centre, or null.
location.radiusMiles
numberRadius in miles; 3.0 when you did not send one.
recentAlerts
array of AlertThe ten most recently observed alerts, newest first. Present only on GET /v1/monitors/{monitorId}; GET /v1/monitors/{monitorId}/alerts returns up to 200.

person and location are mutually exclusive

A monitor carries exactly one predicate. On a type: "person" monitor, person is present and there is no location key; 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 canceled it with DELETE /v1/monitors/{id}. It stops being evaluated at once, it is not charged on any invoice prepared after you cancel it, and canceledAt records when. 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. Every request and response field is in the GET /v1/monitors/{id} reference.

curl "https://api.offendersearch.app/v1/monitors/mon_b8f40d7afb9dc0d8" \
  -H "X-API-Key: $OFFENDERSEARCH_KEY"
200 OK
{
  "id": "mon_b8f40d7afb9dc0d8",
  "product": "sex-offender",
  "type": "person",
  "minConfidence": "dob_match",
  "label": "Jordan Rivera — SO watch",
  "status": "active",
  "channels": { "emails": ["alerts@example.com"] },
  "createdAt": "2026-09-05T14:02:11+00:00",
  "canceledAt": null,
  "person": { "firstName": "Jordan", "lastName": "Rivera", "dob": "1988-04-12" },
  "recentAlerts": [
    { "id": "hit_7fa176c8889c7569", "eventType": "new", "matchLabel": "dob_match",
      "record": { "name": "JORDAN RIVERA", "jurisdiction": "TX", "locality": "Houston",
                  "matchLabel": "dob_match", "matchConfidence": 1.0 },
      "firstSeenAt": "2026-09-06T12:00:41+00:00",
      "occurredAt": "2026-09-06T12:00:41+00:00",
      "notifiedAt": "2026-09-06T12:01:03+00:00" }
  ]
}

Product overview