Skip to main content

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.
The request is 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.
This endpoint previously returned every row in a rows field. It now returns the monitor only. Read rows with GET /monitors/{monitor_id}/rows.
Every monitor response includes 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’s monitor block started. Read its rows with List rows.
Returns 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.
Returns 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.
Returns the monitor with 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 in baseline.

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

See Events for every event type.

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.
Optional query parameter: 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.

Example usage

Create from a file

Upload a file, then wait until every row is added.

Create from rows

Create a monitor, then read the changes for one of its rows.