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.appOne 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.
{
"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}.
| Field | Type | Description |
|---|---|---|
| id | string | The 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 null | Your 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 | object | Where alerts are delivered, normalised. |
| channels.emails | array of string | Every 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 null | When the monitor was canceled; null while it is active. |
| person | object | The person criteria, normalised. Present only on a person monitor. |
| person.firstName | string or null | Given name, or null when none was sent. |
| person.lastName | string | Surname. |
| person.dob | string (date) or null | Date of birth, YYYY-MM-DD, or null when none was sent. |
| location | object | The location criteria, normalised. Present only on a location monitor. |
| location.address | string or null | The address you sent, or null. |
| location.lat | number or null | Latitude of the centre, or null. |
| location.lng | number or null | Longitude of the centre, or null. |
| location.radiusMiles | number | Radius in miles; 3.0 when you did not send one. |
| recentAlerts | array of Alert | The 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
| status | Meaning |
|---|---|
active | The monitor is evaluated once per day and is billed on your monthly invoice. |
canceled | You 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. |
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"{
"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" }
]
}