What a monitor is
A monitor is a saved URL, an extraction schema, and a list of fields to watch. Scrapio runs it on a cron schedule, extracts the watched fields, and delivers a webhook only when one of them actually differs from the previous run.extract declares every field to pull off the page; watch.fields is the subset to actually compare between runs. Fields you extract but don’t watch are still visible in run history, just not compared.
Numeric tolerance
number-typed watched fields can set a threshold, so sub-cent rounding or normal price jitter doesn’t fire a false alarm:
abs and pct are OR’d — crossing either one counts as a change. Set only one if you want a single rule (e.g. pct alone for a percentage-only tolerance regardless of the item’s price). A field with no threshold entry uses strict equality: any difference triggers.
Watching a list of items
string[]-typed fields (e.g. a list of review snippets, tags, or headlines) compare as a set, not as an ordered value:
Watching a whole page (no schema)
For pages where you don’t want to define an extraction schema,watch.mode: "content" hashes the page’s markdown output and compares the hash between runs:
extract and watch.fields/watch.thresholds are not valid in this mode. watch.ignore_patterns is a list of regular expressions stripped from the markdown before hashing, so incidental content (timestamps, rotating widgets) doesn’t cause false positives. Markdown is hashed rather than raw HTML deliberately — the extraction pipeline already strips navigation and ad chrome down to main content, which does most of the noise-filtering work for free.
Digest delivery
By default, every detected change fires its own webhook. To batch changes into a periodic summary instead, setwatch.digest_interval_minutes (minimum 15):
GET /v1/monitors/{id}/changes regardless of this setting — only webhook delivery is batched. A digest-mode monitor delivers a monitor.digest_delivered event instead of monitor.change_detected, containing every change recorded since the last digest.
Trigger condition
watch.on controls how multiple watched fields combine:
"any"(default) — fires when at least one watched field changes"all"— fires only when every watched field changes on the same run
First-run behavior
The first run establishes a baseline and does not notify by default. Setwatch.notify_on_first_run: true to receive an event on the very first run instead of waiting for a subsequent change.