Use case
Watch fields on a list of people or companies and read what changed. Use these endpoints to create a monitor from rows or from a file, inspect its rows and events, export the table at any point in time, and change or stop it. See Monitors Overview for how checks work.Monitors are available to organizations with Monitors enabled. Requests from other organizations return
403.API Reference
See the full request/response schema and parameters in the API Reference.
Pricing
After a row’s first check, every tick bills a probe per active row. A full re-check at the monitor’s tier is billed only when the probe finds a likely change. See Credits & Pricing Guide for more information.Errors
For error responses (400, 403, 404, 409, etc.), see Handling Errors.Create monitor
Create one monitor from a table, with one row per subject.
Unknown request fields are rejected. The
struct field uses the same name in monitor and row responses.
Creation is all or nothing. If any row is invalid, nothing is created. The response is 201 with the monitor, without its rows. Read them with List rows.
Example request
Example response
Create monitor from a file
Create one monitor from an uploaded file, with one row per subject. Use this endpoint for large tables: the request returns as soon as the file is validated, and the rows are added afterwards.multipart/form-data with two parts.
config takes the same fields as Create monitor, except rows and idempotency_key: name, key_columns, struct, frequency, tier, subject_type, research_plan, webhook_url, webhook_event_types, metadata, is_active, and first_check. Unknown fields are rejected. Every column in key_columns must exist in the file.
The file is validated in full before anything is created. If any row is invalid, nothing is created.
The response is
202 with the monitor, without its rows. status is starting and row_count is 0. Rows are then added in the background, in the file’s order, and row_count rises as they arrive. When every row is in, status becomes active, next_run_times is populated, and setup runs only for incomplete rows if first_check is now. Complete rows wait for the schedule; next_tick defers all rows. Poll GET /monitors/{monitor_id} to follow progress.
While status is starting, no row is checked or billed. POST /monitors/{monitor_id}/trigger returns 409, and so does POST /monitors/{monitor_id}/update when it changes frequency or is_active. POST /monitors/{monitor_id}/cancel is accepted: the rows finish adding and the monitor stays cancelled.
Uploads are limited to 10 per minute per organization. Replayed requests count toward the limit.
Example request
Example response
Interrupted uploads
If adding rows fails,status becomes failed and disabled_reason explains the failure. Send the same request again to finish it: rows that were already added are kept, and only the missing rows are written.
A monitor that stays in starting with a row_count that has stopped rising was interrupted. Send the same request again once five minutes have passed since updated_at.
List monitors
Retrieve your team’s monitors, newest first. Rows are not included.
The response is
{ "monitors": [...], "next_cursor": "..." }. next_cursor is null on the last page.
Get monitor
Retrieve a monitor: its settings,status, and row counts. Rows are not included; read them with List rows.
status:
Paused and cancelled monitors return
next_run_times: [].
List rows
Retrieve a page of a monitor’s rows, switched-off rows included, in the order they were added.
The response is
{ "rows": [...], "next_cursor": "..." }. next_cursor is null on the last page. To read the whole table at once as CSV, download a snapshot instead.
A row has no schedule of its own. Its next_run_times are the monitor’s, and are empty when the row is switched off or the monitor is paused or cancelled.
Example response
Get the monitor a workflow run started
Retrieve the monitor that a workflow’smonitor block started. Read its rows with List rows.
404 when that block did not start a monitor, or when the monitor belongs to another team. See the monitor block.
Update monitor
Change a monitor’s settings, including how often it runs, how deeply it researches, and where it notifies.struct is fixed at creation. Changing watched fields requires a new monitor, with its own baseline and history.
All body fields are optional: name, frequency, tier, webhook_url, webhook_event_types, metadata, is_active. Changes apply to every row. Send null for webhook_url or metadata to clear them. Unknown fields are rejected. Cancelled monitors cannot be updated.
webhook_event_types replaces the subscription with a nonempty list of monitor.field.changed, monitor.execution.completed, monitor.execution.failed, or monitor.run.completed. Omit it to keep the current subscription, or send null to restore ["monitor.field.changed"]. Duplicate names collapse in first-occurrence order. The monitor and all its rows return the effective subscription in webhook_event_types.
is_active: false pauses the whole monitor; is_active: true resumes a paused monitor. Pausing through this endpoint sets disabled_reason: "paused", and resuming clears it. A row you switched off stays off when the monitor resumes.
Example request
Trigger monitor
Check every active row now, without waiting for the next scheduled fire.202 with { "status": "accepted", "monitor_id": "..." }. Returns 409 if the monitor is not active, or its status is starting or failed. If a check of the monitor is already running, the triggered one is skipped.
Cancel monitor
Permanently stop future checks for the whole monitor. Existing baselines and history remain readable. Cancellation cannot be undone; create a new monitor to start checks again. To stop checks temporarily, pause the monitor instead.status: "cancelled", is_active: false, disabled_reason: "cancelled", and next_run_times: []. Cancelling again returns the cancelled monitor.
Get row
Retrieve one row, including the values its watched fields currently hold inbaseline.
Switch a row on or off
Include or exclude one row from checks.is_active is a required boolean in the JSON body. Send true to include the row again. Unknown body fields are rejected. Rows of a cancelled monitor cannot be changed. A switched-off row is skipped on every tick, is not billed, and keeps its baseline and history. Its disabled_reason is excluded.
List row events
Retrieve one row’s events, newest first.Example response
List snapshots
List every moment the monitor’s data changed, newest first, each with a download link. A snapshot is recorded per change, not per check: the changes from one tick share one snapshot.limit — 1–500, default 100.
Example response
Download snapshot
Download the table as it stood at a moment, as CSV: one row per subject, with the key columns followed by the watched fields.as_of is an as_of value from the snapshot list, URL-encoded, or latest for the current values. Any ISO 8601 timestamp is accepted and returns the values held at that time.