Skip to main content
Each page in each check gets one status:

Text mode

By default the page’s markdown is compared. diff.text holds a unified diff, and diff.hunks has the same hunks as structured lines. Rendering noise never counts as a change: whitespace and line endings, invisible characters and non-breaking spaces, and the tracking, session and signature parameters in link URLs (utm_source, fbclid, jsessionid, signed CDN URLs). A page that loads but renders no text at all is reported as an error, not as every line removed.

JSON mode

To watch specific facts instead of the whole text, use json mode. Describe the fields, and each check extracts them and compares them one by one:
A page is then changed only when a tracked field changes, and diff.fields says exactly which one: plans[0].price: "$19/mo" → "$24/mo". Pass json_schema instead of, or as well as, json_prompt to fix the shape. Use "modes": ["json", "markdown"] to get both diffs. The extraction runs again only when the page’s text changed. An unchanged page keeps its last extraction, so a model reading identical text a little differently is never a change, and costs nothing. List items are matched by identity (an id, url, name or title field), so one job inserted at the top of a list is one added field, not every job shifted.

Cutting noise

Most false alarms come from page furniture: a “last updated” date, a rotating testimonial, a visitor counter. These change_tracking options keep them quiet: ignore_text, ignore_dates and ignore_order change only what’s compared. A change still shows the page as it reads. notify_on and only_new_content decide whether a change notifies you. The page is still recorded as changed, and diff.alert says why it was held back. Changing any of these options re-baselines the target’s pages silently, instead of reporting them all as changed.
You can also leave parts of the page out with scrape_options.exclude_selectors, or switch to json mode and track only what you care about. Images are left out of the comparison by default, because their URLs change with every deploy.

Reading a change

GET /monitor/{id}/checks/{checkId}?status=changed lists the pages that changed in one check, with their diffs, the judge’s verdict and, in json mode, the full current extraction.