Skip to main content
PUT
cURL

Authorizations

x-api-key
string
header
required

API key for authentication. You can find your API key in the Site Spy dashboard under Settings → API.

Path Parameters

uuid
string<uuid>
required

Web page change monitor (watch) unique ID

Body

application/json
url
string<uri>

URL to monitor for changes

Maximum string length: 5000
title
string | null

Custom title for the web page change monitor (watch), not to be confused with page_title

Maximum string length: 5000
tag
string

Tag UUID to associate with this web page change monitor (watch)

Maximum string length: 5000
tags
string[]

Array of tag UUIDs

paused
boolean

Whether the web page change monitor (watch) is paused

notification_muted
boolean

Whether notifications are muted

notification_rate_limit_per_hour
integer | null

Per-watch cap on notifications sent per hour. null uses the system default, 0 means unlimited.

Required range: x >= 0
notification_rate_limit_per_day
integer | null

Per-watch cap on notifications sent per day. null uses the system default, 0 means unlimited.

Required range: x >= 0
method
enum<string>

HTTP method to use

Available options:
GET,
POST,
DELETE,
PUT
fetch_backend
string
default:system

Backend to use for fetching content. Common values:

  • system (default) - Use the system-wide default fetcher
  • html_requests - Fast requests-based fetcher
  • html_webdriver - Browser-based fetcher (Playwright/Puppeteer)
  • extra_browser_* - Custom browser configurations (if configured)
  • Plugin-provided fetchers (if installed)
Pattern: ^(system|html_requests|html_hybrid|html_webdriver|extra_browser_.+)$
headers
object

HTTP headers to include in requests

body
string | null

HTTP request body

Maximum string length: 5000
proxy
string | null

Proxy configuration

Maximum string length: 5000
ignore_status_codes
boolean | null

Ignore HTTP status code errors (boolean or null)

webdriver_delay
integer | null

Seconds to wait after page load before extracting content (browser backends only). null uses the system default.

Required range: 0 <= x <= 60
disable_javascript
boolean
default:false

Render the page in the browser with JavaScript execution disabled. Forces a browser backend.

mobile_view
boolean
default:false

Render the page with a mobile viewport, device pixel ratio, touch support and a mobile User-Agent. Forces a browser backend.

noise_reduction_ads
boolean | null

Block ads and cookie banners for this watch; null inherits the account-level setting of the same name

webdriver_js_execute_code
string | null

JavaScript code to execute

Maximum string length: 5000
time_between_check
object

Time intervals between checks. All fields must be non-negative. At least one non-zero value required when not using default settings.

time_between_check_use_default
boolean
default:true

Whether to use global settings for time between checks - defaults to true if not set

notification_urls
string[]

Notification URLs for this web page change monitor (watch). Maximum 100 URLs.

Maximum array length: 100
Maximum string length: 1000
notification_title
string | null

Custom notification title

Maximum string length: 5000
notification_body
string | null

Custom notification body

Maximum string length: 5000
notification_format
enum<string>

Format for notifications

Available options:
text,
html,
htmlcolor,
markdown,
System default
track_ldjson_price_data
boolean | null

Whether to track JSON-LD price data

browser_steps
object[]

Browser automation steps. Maximum 100 steps allowed.

Maximum array length: 100
processor
enum<string>
default:text_json_diff

Optional processor mode to use for change detection. image_ssim_diff (screenshot monitoring) requires Pro plan. Defaults to text_json_diff if not specified.

Available options:
restock_diff,
text_json_diff,
image_ssim_diff
screenshot_enabled
boolean
default:false

When true, capture and store screenshots alongside text snapshots on each check. Requires Pro plan and fetch_backend set to a browser-based fetcher (e.g. html_webdriver).

include_filters
string[]

CSS/XPath selectors naming the part of the page this watch follows, and the only part that can trigger a notification. In the dashboard, the AI chat and the browser extension this is set by pointing at the page in the element picker rather than typed; the API accepts it directly. A watch with an empty list follows the whole page, which means every timestamp, banner and counter on it counts as a change. Selectors that the backend cannot compile are dropped on save rather than rejected.

Maximum array length: 100
Maximum string length: 5000
subtractive_selectors
string[]

CSS/XPath selectors to remove content from the page

Maximum array length: 100
Maximum string length: 5000
ignore_text
string[]

Text patterns to ignore in change detection

Maximum array length: 100
Maximum string length: 5000
auto_noise_reduction_enabled
boolean | null

Enable automatic noise reduction for this watch; null inherits the account smart-filter setting

trigger_text
string[]

Text/regex patterns that must be present to trigger a change

Maximum array length: 100
Maximum string length: 5000
text_should_not_be_present
string[]

Text that should NOT be present (triggers alert if found)

Maximum array length: 100
Maximum string length: 5000
alert_on_state_change
boolean | null

Notify on the check where text_should_not_be_present stops matching, and stay silent otherwise, instead of notifying on every page diff while it does not match. Null derives it: a watch with text_should_not_be_present is waiting for that message to clear unless its stated intent is a generic "any change".

extract_text
string[]

Regex patterns to extract specific text after filtering

Maximum array length: 100
Maximum string length: 5000
trim_text_whitespace
boolean
default:false

Strip leading/trailing whitespace from text

sort_text_alphabetically
boolean
default:false

Sort lines alphabetically before comparison

remove_duplicate_lines
boolean
default:false

Remove duplicate lines from content

check_unique_lines
boolean
default:false

Compare against all history for unique lines

strip_ignored_lines
boolean | null

Remove lines matching ignore patterns

filter_text_added
boolean
default:true

Include added text in change detection

filter_text_removed
boolean
default:true

Include removed text in change detection

filter_text_replaced
boolean
default:true

Include replaced text in change detection

in_stock_only
boolean
default:true

Only trigger on in-stock transitions (restock_diff processor)

follow_price_changes
boolean
default:true

Monitor and track price changes (restock_diff processor)

price_change_threshold_percent
number | null

Minimum price change percentage to trigger notification

notification_screenshot
boolean
default:false

Include screenshot in notifications (if supported by notification URL)

filter_failure_notification_send
boolean
default:true

Send notification when filters fail to match content

use_page_title_in_list
boolean | null

Display page title in watch list (null = use system default)

history_snapshot_max_length
integer | null

Maximum number of history snapshots to keep (null = use system default)

Required range: 1 <= x <= 1000
time_schedule_limit
object

Weekly schedule limiting when checks can run

conditions
object[]

Array of condition rules for change detection logic (empty array when not set)

Maximum array length: 100
conditions_match_logic
enum<string>
default:ALL

Logic operator - ALL (match all conditions) or ANY (match any condition)

Available options:
ALL,
ANY
ai_alert_condition
string | null

Plain-English condition for AI smart alerts (Pro+ only). When set, AI evaluates each change against this condition and suppresses notifications that don't match. Example - "Only notify me if the price drops below $50".

Maximum string length: 500
track_what
string | null

User's monitoring intent, e.g. "price changes", "new job listings". Set by the add-watch form or AI chat when the user describes what they want to track.

Maximum string length: 500
ai_tuning_started_at
integer
default:0

Unix timestamp set while an automatic filter repair is running for this watch, and zero when it is not. Lets the dashboard show the work as watch state that survives a page refresh.

filters_source
enum<string>
default:manual

Who chose this watch's include filter - 'manual' for a person, 'smart' for the removed smart-configure generator. It decides what happens when the include filter stops matching: a person's selector raises an error, a machine's silently falls back to the whole page. Nothing writes 'smart' any more, and watches configured before it was removed still carry the value with their filters honoured unchanged - but an edit that changes include_filters now records 'manual', since whoever made that edit chose the selector. Send the field explicitly to override that.

Available options:
manual,
smart
last_viewed
integer

Unix timestamp in seconds of the last time the watch was viewed. Setting it to a value higher than last_changed in the "Update watch" endpoint marks the watch as viewed.

Required range: x >= 0

Response

Web page change monitor (watch) updated successfully

The response is of type string.

Example:

"OK"