curl -X GET "https://api.sitespy.app/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
-H "x-api-key: YOUR_API_KEY"import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.get(f'https://api.sitespy.app/api/v1/watch/{uuid}', headers=headers)
print(response.json())
const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sitespy.app/api/v1/watch/{uuid}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"date_created": 123,
"owner_api_key": "<string>",
"url": "<string>",
"title": "<string>",
"tag": "<string>",
"tags": [
"<string>"
],
"paused": true,
"paused_by": "plan_limit",
"paused_at": 123,
"notification_muted": true,
"notification_rate_limit_per_hour": 1,
"notification_rate_limit_per_day": 1,
"method": "GET",
"fetch_backend": "system",
"headers": {},
"body": "<string>",
"proxy": "<string>",
"ignore_status_codes": true,
"webdriver_delay": 30,
"disable_javascript": false,
"mobile_view": false,
"noise_reduction_ads": true,
"webdriver_js_execute_code": "<string>",
"time_between_check": {
"weeks": 26000,
"days": 182500,
"hours": 4380000,
"minutes": 262800000,
"seconds": 15768000000
},
"time_between_check_use_default": true,
"notification_urls": [
"<string>"
],
"notification_title": "<string>",
"notification_body": "<string>",
"notification_format": "text",
"track_ldjson_price_data": true,
"browser_steps": [
{
"operation": "<string>",
"selector": "<string>",
"optional_value": "<string>"
}
],
"processor": "text_json_diff",
"screenshot_enabled": false,
"include_filters": [
"<string>"
],
"subtractive_selectors": [
"<string>"
],
"ignore_text": [
"<string>"
],
"auto_ignore_text": [
"<string>"
],
"auto_noise_reduction_enabled": true,
"trigger_text": [
"<string>"
],
"text_should_not_be_present": [
"<string>"
],
"alert_on_state_change": true,
"extract_text": [
"<string>"
],
"trim_text_whitespace": false,
"sort_text_alphabetically": false,
"remove_duplicate_lines": false,
"check_unique_lines": false,
"strip_ignored_lines": true,
"filter_text_added": true,
"filter_text_removed": true,
"filter_text_replaced": true,
"in_stock_only": true,
"follow_price_changes": true,
"price_change_threshold_percent": 123,
"has_ldjson_price_data": true,
"notification_screenshot": false,
"filter_failure_notification_send": true,
"use_page_title_in_list": true,
"history_snapshot_max_length": 500,
"time_schedule_limit": {
"enabled": false,
"monday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"tuesday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"wednesday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"thursday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"friday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"saturday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"sunday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
}
},
"conditions": [
{
"field": "<string>",
"operator": "<string>",
"value": "<string>"
}
],
"conditions_match_logic": "ALL",
"ai_alert_condition": "<string>",
"last_ai_summary": "<string>",
"last_ai_summary_from": 1,
"last_ai_summary_to": 1,
"last_filter_degraded_alert_ts": 1,
"state_blocked": true,
"state_last_transition_at": 1,
"state_waiting_alert_ts": 1,
"track_what": "<string>",
"ai_tuning_started_at": 0,
"filters_source": "manual",
"last_checked": 123,
"last_changed": 123,
"last_error": "<string>",
"failure_category": "internal_error",
"failure_code": "<string>",
"consecutive_failures": 1,
"failure_started_at": 1,
"last_failure_at": 1,
"next_retry_at": 1,
"recovery_stage": 1,
"last_viewed": 1,
"link": "<string>",
"label": "<string>",
"page_title": "<string>",
"check_count": 123,
"filter_count": 123,
"fetch_time": 123,
"previous_md5": "<string>",
"previous_md5_before_filters": "<string>",
"consecutive_filter_failures": 123,
"tune_count_today": 123,
"tune_limit": 123,
"last_notification_error": "<string>",
"notification_alert_count": 123,
"notifications_per_day": 123,
"noisy_notifications_per_day": 123,
"last_notification_delivery_reason": "<string>",
"last_notification_delivery_ts": 123,
"change_detected_but_not_delivered_count": 123,
"content-type": "<string>",
"remote_server_reply": "<string>",
"browser_steps_last_error_step": 123,
"viewed": 123,
"history_n": 123,
"community_published": true,
"community_slug": "<string>",
"community_published_at": 123,
"community_clone_count": 1,
"community_cloned_by": [
"<string>"
],
"community_category": "<string>",
"community_author_name": "<string>",
"consecutive_check_failures": 1,
"last_broken_alert_ts": 1,
"last_health_alert_category": "<string>",
"last_health_alert_ts": 1,
"paused_alert_ts": 1,
"last_fetch_backend_used": "<string>",
"last_fetch_content_length": 1,
"last_fetch_suspicious": {},
"filter_signature": "<string>",
"last_filter_empty_at": 1,
"last_filter_output_length": 1,
"last_filter_selector_matches": {},
"last_filter_degraded": "<string>",
"last_filter_degraded_at": 1,
"consecutive_filter_degraded": 1,
"filter_heal_in_flight_since": 1,
"last_watch_quality_intervention_id": "<string>",
"tune_count": 1,
"tune_day_start": 1,
"tune_source": "<string>",
"last_ai_summary_error": "<string>",
"notification_window_start": 1,
"notification_window_count": 1,
"notification_day_start": 1,
"notification_day_count": 1,
"notifications_suppressed_count": 1,
"notifications_suppressed_since": 1,
"notification_failure_count": 1,
"notification_next_retry_at": 1,
"notification_recovery_stage": 1,
"checking_now": true,
"queued": true,
"health": {
"state": "healthy",
"reason": "<string>",
"action": "retry_fetch",
"next_step": "<string>",
"pointing_repairs": true,
"since_ts": 123,
"category": "internal_error",
"code": "<string>",
"consecutive_failures": 1,
"next_retry_at": 1,
"recovery_stage": 1,
"auto_paused": true,
"delivery_reason": "<string>",
"missed_deliveries": 1
}
}{
"message": "<string>"
}Get single watch
Retrieve web page change monitor (watch) information and set muted/paused status. Returns the FULL Watch JSON.
curl -X GET "https://api.sitespy.app/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
-H "x-api-key: YOUR_API_KEY"import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.get(f'https://api.sitespy.app/api/v1/watch/{uuid}', headers=headers)
print(response.json())
const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sitespy.app/api/v1/watch/{uuid}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"date_created": 123,
"owner_api_key": "<string>",
"url": "<string>",
"title": "<string>",
"tag": "<string>",
"tags": [
"<string>"
],
"paused": true,
"paused_by": "plan_limit",
"paused_at": 123,
"notification_muted": true,
"notification_rate_limit_per_hour": 1,
"notification_rate_limit_per_day": 1,
"method": "GET",
"fetch_backend": "system",
"headers": {},
"body": "<string>",
"proxy": "<string>",
"ignore_status_codes": true,
"webdriver_delay": 30,
"disable_javascript": false,
"mobile_view": false,
"noise_reduction_ads": true,
"webdriver_js_execute_code": "<string>",
"time_between_check": {
"weeks": 26000,
"days": 182500,
"hours": 4380000,
"minutes": 262800000,
"seconds": 15768000000
},
"time_between_check_use_default": true,
"notification_urls": [
"<string>"
],
"notification_title": "<string>",
"notification_body": "<string>",
"notification_format": "text",
"track_ldjson_price_data": true,
"browser_steps": [
{
"operation": "<string>",
"selector": "<string>",
"optional_value": "<string>"
}
],
"processor": "text_json_diff",
"screenshot_enabled": false,
"include_filters": [
"<string>"
],
"subtractive_selectors": [
"<string>"
],
"ignore_text": [
"<string>"
],
"auto_ignore_text": [
"<string>"
],
"auto_noise_reduction_enabled": true,
"trigger_text": [
"<string>"
],
"text_should_not_be_present": [
"<string>"
],
"alert_on_state_change": true,
"extract_text": [
"<string>"
],
"trim_text_whitespace": false,
"sort_text_alphabetically": false,
"remove_duplicate_lines": false,
"check_unique_lines": false,
"strip_ignored_lines": true,
"filter_text_added": true,
"filter_text_removed": true,
"filter_text_replaced": true,
"in_stock_only": true,
"follow_price_changes": true,
"price_change_threshold_percent": 123,
"has_ldjson_price_data": true,
"notification_screenshot": false,
"filter_failure_notification_send": true,
"use_page_title_in_list": true,
"history_snapshot_max_length": 500,
"time_schedule_limit": {
"enabled": false,
"monday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"tuesday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"wednesday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"thursday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"friday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"saturday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
},
"sunday": {
"enabled": true,
"start_time": "00:00",
"duration": {
"hours": "24",
"minutes": "00"
}
}
},
"conditions": [
{
"field": "<string>",
"operator": "<string>",
"value": "<string>"
}
],
"conditions_match_logic": "ALL",
"ai_alert_condition": "<string>",
"last_ai_summary": "<string>",
"last_ai_summary_from": 1,
"last_ai_summary_to": 1,
"last_filter_degraded_alert_ts": 1,
"state_blocked": true,
"state_last_transition_at": 1,
"state_waiting_alert_ts": 1,
"track_what": "<string>",
"ai_tuning_started_at": 0,
"filters_source": "manual",
"last_checked": 123,
"last_changed": 123,
"last_error": "<string>",
"failure_category": "internal_error",
"failure_code": "<string>",
"consecutive_failures": 1,
"failure_started_at": 1,
"last_failure_at": 1,
"next_retry_at": 1,
"recovery_stage": 1,
"last_viewed": 1,
"link": "<string>",
"label": "<string>",
"page_title": "<string>",
"check_count": 123,
"filter_count": 123,
"fetch_time": 123,
"previous_md5": "<string>",
"previous_md5_before_filters": "<string>",
"consecutive_filter_failures": 123,
"tune_count_today": 123,
"tune_limit": 123,
"last_notification_error": "<string>",
"notification_alert_count": 123,
"notifications_per_day": 123,
"noisy_notifications_per_day": 123,
"last_notification_delivery_reason": "<string>",
"last_notification_delivery_ts": 123,
"change_detected_but_not_delivered_count": 123,
"content-type": "<string>",
"remote_server_reply": "<string>",
"browser_steps_last_error_step": 123,
"viewed": 123,
"history_n": 123,
"community_published": true,
"community_slug": "<string>",
"community_published_at": 123,
"community_clone_count": 1,
"community_cloned_by": [
"<string>"
],
"community_category": "<string>",
"community_author_name": "<string>",
"consecutive_check_failures": 1,
"last_broken_alert_ts": 1,
"last_health_alert_category": "<string>",
"last_health_alert_ts": 1,
"paused_alert_ts": 1,
"last_fetch_backend_used": "<string>",
"last_fetch_content_length": 1,
"last_fetch_suspicious": {},
"filter_signature": "<string>",
"last_filter_empty_at": 1,
"last_filter_output_length": 1,
"last_filter_selector_matches": {},
"last_filter_degraded": "<string>",
"last_filter_degraded_at": 1,
"consecutive_filter_degraded": 1,
"filter_heal_in_flight_since": 1,
"last_watch_quality_intervention_id": "<string>",
"tune_count": 1,
"tune_day_start": 1,
"tune_source": "<string>",
"last_ai_summary_error": "<string>",
"notification_window_start": 1,
"notification_window_count": 1,
"notification_day_start": 1,
"notification_day_count": 1,
"notifications_suppressed_count": 1,
"notifications_suppressed_since": 1,
"notification_failure_count": 1,
"notification_next_retry_at": 1,
"notification_recovery_stage": 1,
"checking_now": true,
"queued": true,
"health": {
"state": "healthy",
"reason": "<string>",
"action": "retry_fetch",
"next_step": "<string>",
"pointing_repairs": true,
"since_ts": 123,
"category": "internal_error",
"code": "<string>",
"consecutive_failures": 1,
"next_retry_at": 1,
"recovery_stage": 1,
"auto_paused": true,
"delivery_reason": "<string>",
"missed_deliveries": 1
}
}{
"message": "<string>"
}Authorizations
API key for authentication. You can find your API key in the Site Spy dashboard under Settings → API.
Path Parameters
Web page change monitor (watch) unique ID
Query Parameters
Recheck this web page change monitor (watch)
1, true Set pause state
paused, unpaused Set mute state
muted, unmuted Response
Watch information or operation result
Unique identifier
Unix timestamp of creation
API key that owns this watch (multi-tenant isolation)
URL to monitor for changes
5000Custom title for the web page change monitor (watch), not to be confused with page_title
5000Tag UUID to associate with this web page change monitor (watch)
5000Array of tag UUIDs
Whether the web page change monitor (watch) is paused
Non-null when paused=true was set automatically. Values:
plan_limit— owner exceeded their plan's watch cap; auto-deleted 30d afterpaused_atunless user upgrades or un-pauses.reliability— persistent classified failure; retained until a user or administrator resumes it. Null means the watch was paused manually by the user (no auto-delete).
plan_limit, reliability, null Unix timestamp when auto-pause was applied. Starts the auto-delete clock for
paused_by != null watches. 0 when never auto-paused.
Whether notifications are muted
Per-watch cap on notifications sent per hour. null uses the system default, 0 means unlimited.
x >= 0Per-watch cap on notifications sent per day. null uses the system default, 0 means unlimited.
x >= 0HTTP method to use
GET, POST, DELETE, PUT Backend to use for fetching content. Common values:
system(default) - Use the system-wide default fetcherhtml_requests- Fast requests-based fetcherhtml_webdriver- Browser-based fetcher (Playwright/Puppeteer)extra_browser_*- Custom browser configurations (if configured)- Plugin-provided fetchers (if installed)
^(system|html_requests|html_hybrid|html_webdriver|extra_browser_.+)$HTTP headers to include in requests
Show child attributes
Show child attributes
HTTP request body
5000Proxy configuration
5000Ignore HTTP status code errors (boolean or null)
Seconds to wait after page load before extracting content (browser backends only). null uses the system default.
0 <= x <= 60Render the page in the browser with JavaScript execution disabled. Forces a browser backend.
Render the page with a mobile viewport, device pixel ratio, touch support and a mobile User-Agent. Forces a browser backend.
Block ads and cookie banners for this watch; null inherits the account-level setting of the same name
JavaScript code to execute
5000Time intervals between checks. All fields must be non-negative. At least one non-zero value required when not using default settings.
Show child attributes
Show child attributes
Whether to use global settings for time between checks - defaults to true if not set
Notification URLs for this web page change monitor (watch). Maximum 100 URLs.
1001000Custom notification title
5000Custom notification body
5000Format for notifications
text, html, htmlcolor, markdown, System default Whether to track JSON-LD price data
Browser automation steps. Maximum 100 steps allowed.
100Show child attributes
Show child attributes
Optional processor mode to use for change detection. image_ssim_diff (screenshot monitoring) requires Pro plan. Defaults to text_json_diff if not specified.
restock_diff, text_json_diff, image_ssim_diff 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).
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.
1005000CSS/XPath selectors to remove content from the page
1005000Text patterns to ignore in change detection
1005000Reversible noise patterns applied by automatic watch-quality remediation
205000Enable automatic noise reduction for this watch; null inherits the account smart-filter setting
Text/regex patterns that must be present to trigger a change
1005000Text that should NOT be present (triggers alert if found)
1005000Notify 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".
Regex patterns to extract specific text after filtering
1005000Strip leading/trailing whitespace from text
Sort lines alphabetically before comparison
Remove duplicate lines from content
Compare against all history for unique lines
Remove lines matching ignore patterns
Include added text in change detection
Include removed text in change detection
Include replaced text in change detection
Only trigger on in-stock transitions (restock_diff processor)
Monitor and track price changes (restock_diff processor)
Minimum price change percentage to trigger notification
Whether page has LD-JSON price data (auto-detected)
Include screenshot in notifications (if supported by notification URL)
Send notification when filters fail to match content
Display page title in watch list (null = use system default)
Maximum number of history snapshots to keep (null = use system default)
1 <= x <= 1000Weekly schedule limiting when checks can run
Show child attributes
Show child attributes
Array of condition rules for change detection logic (empty array when not set)
100Show child attributes
Show child attributes
Logic operator - ALL (match all conditions) or ANY (match any condition)
ALL, ANY 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".
500AI-generated plain-English summary of the most recent change (Pro+ only, read-only — generated automatically when a change is detected).
The older of the two snapshot timestamps last_ai_summary was written from. The summary
describes one change, so a client rendering it beside a diff must check that this pair is
the pair being shown — otherwise it captions one change with another change's summary.
0 means the pair was not recorded (a summary written before this field existed), in which
case the summary is only trustworthy against the watch's newest pair.
x >= 0The newer of the two snapshot timestamps last_ai_summary was written from. 0 when not recorded.
x >= 0When the owner was last told this watch's filters had degraded.
x >= 0The state gate's verdict at the previous check; null before the first one.
When the state gate last changed its verdict.
x >= 0When the owner was last sent a "still waiting" note.
x >= 0User'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.
500Unix 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.
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.
manual, smart Unix timestamp of last check
Unix timestamp of last change
Last error message (false when no error, string when error occurred, null if not checked yet)
Stable category for the active monitoring failure.
internal_error, network_error, target_unavailable, blocked_or_challenged, rate_limited, authentication_required, not_found, empty_content, filter_broken, browser_failure, self_reference, notification_failure, null Stable machine-readable code for the active failure.
Consecutive failures in the active category.
x >= 0Unix timestamp when the active failure lifecycle started.
x >= 0Unix timestamp of the most recent failed check.
x >= 0Unix timestamp for the next scheduled recovery attempt; 0 when none is scheduled.
x >= 0Current category-aware retry/backoff stage.
x >= 0Unix 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.
x >= 0The watch URL rendered in case of any Jinja2 markup, always use this for listing.
What to call this watch on screen: the stored title, or the page's own when the stored title is only the watch's own address, or the URL. Resolved server-side so every surface that names a watch — the dashboard row, the email subject, the web push body, the RSS item — agrees. Use title instead when you need the raw stored value, for example to pre-fill a rename field.
HTML tag extracted from the page
Total number of checks performed
Number of filters configured on this watch (include filters, subtractive selectors and ignore text combined). Distinguishes a watch the user deliberately filtered from an untouched one, since filters_source defaults to 'manual' either way.
Duration of last fetch in seconds
MD5 hash of previous content (false if not set)
MD5 hash before filters applied (false if not set)
Counter for consecutive filter match failures
User-initiated filter tunes charged to this watch inside the current 24-hour window. Automatic repairs are not counted.
How many user-initiated filter tunes this watch's owner may spend on it per day, from their plan. Zero or less means unlimited.
Last notification error message
Number of notifications sent
Notifications queued per day this watch actually ran, over the last 30 days. The denominator is days observed, never the check count — the check interval comes from the owner's plan, so the same daily volume would otherwise score sixty times lower on a one-minute watch than on an hourly one.
The daily-volume mark above which this watch counts as loud, resolved for its
owner's plan. Compare notifications_per_day against this rather than against
a locally held constant: it is the same mark the server's own noise-healing
gate reads, and it moves with the deployment's configuration.
Why the most recent delivery attempt succeeded or failed. Populated on every
change-detected event so the dashboard can explain a silent watch to the user.
Possible values include delivered_via_user_email, delivered_via_telegram,
delivered_via_user_webhook, delivered_via_webpush, delivered_via_watch_url,
delivered_via_tag_url, delivered_via_global_url, email_unverified,
email_notifications_muted, smtp_not_configured, no_owner_api_key,
no_urls_configured, rate_limited, web_push_send_failed,
held_search_term_never_seen, held_rotating_selector.
Unix timestamp of the most recent delivery attempt (success or silent drop)
Incremented every time a change was detected but no notification was queued.
A non-zero value combined with notification_alert_count=0 means the detection
engine is working but delivery is blocked — check last_notification_delivery_reason.
Content-Type from last fetch
Server header from last response
Last browser step that caused an error
Computed property - true if watch has been viewed, false otherwise (deprecated, use last_viewed instead)
Number of history snapshots available
Whether this watch is published to the community library.
URL slug of the published community entry.
Unix timestamp the watch was published.
Historical count, frozen. One-click cloning of a community entry was removed; the field is still returned for entries that were cloned while it existed and can no longer increase.
x >= 0Historical list, frozen. API keys that cloned the entry while one-click cloning existed. No new entries are added.
Category chosen when publishing.
Display name shown on the published entry.
Failed checks in a row, used for owner health alerts.
x >= 0Unix timestamp of the last generic broken-watch alert.
x >= 0failure_category last emailed to the owner this episode.
Unix timestamp of that category-specific health alert.
x >= 0Unix timestamp the owner was told about an auto-pause; 0 when not yet told.
x >= 0Fetcher that actually ran, e.g. html_webdriver or html_requests.
Size in bytes of the last raw HTML body; 0 before the first check.
x >= 0Set when the last fetch looked like a block or challenge page.
Hash of the filter config that produced the newest stored snapshot.
Unix timestamp when include_filters last returned nothing; 0 when healthy.
x >= 0Size in characters of the latest filter output.
x >= 0Match count per configured selector from the last check.
Code for how the filter degraded, e.g. include_no_match; null when healthy.
Unix timestamp the filter was first seen degraded.
x >= 0Consecutive checks where the filter was degraded.
x >= 0Unix timestamp an automatic filter repair started; 0 when none is running.
x >= 0Identifier of the most recent quality intervention on this watch.
AI filter tunes used inside the current day window.
x >= 0Unix timestamp the current tune-quota day started.
x >= 0Who requested the last tune - user or system.
Last error from AI summary generation.
Start of the current hourly notification budget.
x >= 0Notifications already sent inside the current hour.
x >= 0Start of the current daily notification budget.
x >= 0Notifications already sent inside the current day.
x >= 0Changes held back by the budget, reported by the next send.
x >= 0Unix timestamp suppression started; 0 when nothing is held back.
x >= 0Consecutive notification delivery failures.
x >= 0Unix timestamp of the next notification retry; 0 when none is scheduled.
x >= 0Current notification retry/backoff stage.
x >= 0Whether a worker is fetching this watch right now.
Whether this watch is waiting in the recheck queue.
User-facing health summary derived from the persisted failure lifecycle. Messages are safe to display and do not include stack traces or URL secrets.
Show child attributes
Show child attributes

