Website Monitoring

Watch any page for changes on a schedule — get a webhook or email when it changes

The Website Monitoring API watches a URL on a schedule, captures a snapshot on every check, and records a change whenever the page differs from the previous snapshot. Each detected change can fire a signed webhook and/or email alert.

It reuses the same scraping pipeline as the URL Scraper (proxies, browser rendering, authenticated sessions), so anything you can scrape, you can monitor.

A monitor's scope is either page (default) — watch one URL — or site — crawl the whole site each run and track pages added, removed, and changed. See Site monitors.

How it works

  1. Create a monitor with a URL, a schedule (intervalMinutes), and what to watch.
  2. On every check the monitor scrapes the page and stores a snapshot.
  3. If the new snapshot differs from the last one, a change is recorded.
  4. If alerts are configured, the change is delivered to your webhook / email.

What to watch

watchModeWhat it comparesCost / check
full_page (default)The whole page body, in the watchFormat you choose (markdown, html, or cleaned_html).2 credits
specific_dataOnly the fields in your outputSchema (JSON Schema), extracted with AI. Ideal for price / stock / status tracking.3 credits

Enabling AI meaningful-change (aiMode: true) filters out trivial noise (ads, timestamps) and summarizes real changes — it adds +1 credit per check.

The Monitor object

{
  "id": "b1e7…",
  "userId": "u_123",
  "url": "https://example.com/product/123",
  "scope": "page",
  "maxPages": null,
  "maxDepth": null,
  "includePatterns": [],
  "excludePatterns": [],
  "excludedUrls": [],
  "watchMode": "specific_data",
  "watchFormat": "markdown",
  "useBrowser": false,
  "country": "us",
  "sessionId": null,
  "sessionExpired": false,
  "outputSchema": { "type": "object", "properties": { "price": { "type": "number" } }, "required": ["price"] },
  "aiMode": true,
  "aiGoal": "only when the price drops or it goes out of stock",
  "intervalMinutes": 60,
  "isActive": true,
  "nextRunAt": "2026-01-01T12:00:00Z",
  "lastCheckedAt": "2026-01-01T11:00:00Z",
  "creditCostPerRun": 4,
  "alertWebhookUrl": "https://your-app.com/hooks/anakin",
  "alertWebhookSecret": "whsec_…",
  "alertEmails": "you@example.com",
  "lastAlertedAt": "2026-01-01T11:00:00Z",
  "createdAt": "2025-12-01T09:00:00Z",
  "updatedAt": "2025-12-15T09:00:00Z"
}
FieldTypeDescription
idstringMonitor ID.
urlstringThe monitored URL (root URL for site scope).
scopestringpage or site. See Site monitors.
maxPages, maxDepthnumber | nullSite scope: pages-per-run cap and crawl depth.
includePatterns, excludePatterns, excludedUrlsstring[]Site scope: crawl include/exclude globs and pages removed from tracking.
watchModestringfull_page or specific_data.
watchFormatstringFor full_page: markdown, html, or cleaned_html. Always markdown for specific_data.
useBrowserbooleanWhether checks render with a headless browser. Forced true when a sessionId is set.
countrystringProxy country code. See Supported Countries.
sessionIdstring | nullSaved browser session used for authenticated pages.
sessionExpiredbooleantrue when the saved session is no longer valid (the monitor is paused until re-auth).
outputSchemaobject | nullJSON Schema of the tracked fields (specific_data mode).
aiModebooleanAI meaningful-change filtering is on.
aiGoalstring | nullOptional natural-language description of which changes count as meaningful.
intervalMinutesnumberCheck frequency. Minimum 15.
isActivebooleanWhether the monitor is running (false = paused).
nextRunAtstringISO 8601 timestamp of the next scheduled check.
lastCheckedAtstring | nullISO 8601 timestamp of the most recent check.
creditCostPerRunnumberCredits deducted per check (2/3 by mode, +1 with aiMode).
alertWebhookUrlstring | nullWebhook that receives change alerts.
alertWebhookSecretstring | nullHMAC signing secret for the webhook (see Alerts).
alertEmailsstring | nullComma-separated email recipients.
lastAlertedAtstring | nullISO 8601 timestamp of the last alert sent.

Limits

  • Minimum interval: 15 minutes.
  • Active monitors per plan: Free 5, Pro 20, Scale 100. Creating or resuming past the cap returns 402 monitor_limit_reached.

Endpoints

POST/v1/monitors

Create a monitor

GET/v1/monitors

List monitors, or get one by ID

PUT/v1/monitors/{id}

Update or delete a monitor

POST/v1/monitors/{id}/run

Pause, resume, or run a check now

GET/v1/monitors/{id}/changes

Snapshots & detected changes

POST/v1/monitors/{id}/test-alert

Alerts, deliveries & webhook signing