diff --git a/changedetectionio/api/Watch.py b/changedetectionio/api/Watch.py
index 18d1d30e..cb016868 100644
--- a/changedetectionio/api/Watch.py
+++ b/changedetectionio/api/Watch.py
@@ -105,6 +105,27 @@ class Watch(Resource):
watch['viewed'] = watch_obj.viewed
watch['link'] = watch_obj.link,
+ # Resolved processor config: tag override wins over watch-level config (mirrors restock processor logic)
+ import json
+ _restock_path = os.path.join(watch_obj.data_dir, 'restock_diff.json') if watch_obj.data_dir else None
+ restock_config = {}
+ if _restock_path and os.path.isfile(_restock_path):
+ try:
+ with open(_restock_path, 'r', encoding='utf-8') as _f:
+ restock_config = json.load(_f).get('restock_diff') or {}
+ except (json.JSONDecodeError, IOError) as e:
+ logger.warning(f"Failed to read restock_diff.json for watch {uuid}: {e}")
+ restock_source = 'watch'
+ tags = self.datastore.data['settings']['application'].get('tags', {})
+ for tag_uuid in (watch_obj.get('tags') or []):
+ tag = tags.get(tag_uuid, {})
+ if tag.get('overrides_watch'):
+ restock_config = tag.get('processor_config_restock_diff') or {}
+ restock_source = f'tag:{tag_uuid}'
+ break
+ watch['processor_config_restock_diff'] = restock_config
+ watch['processor_config_restock_diff_source'] = restock_source
+
return watch
@auth.check_token
diff --git a/changedetectionio/tests/test_api.py b/changedetectionio/tests/test_api.py
index fae2b2a1..b3b7f779 100644
--- a/changedetectionio/tests/test_api.py
+++ b/changedetectionio/tests/test_api.py
@@ -903,6 +903,101 @@ def test_api_restock_processor_config(client, live_server, measure_memory_usage,
delete_all_watches(client)
+def test_api_watch_get_returns_resolved_restock_processor_config(client, live_server, measure_memory_usage, datastore_path):
+ """
+ GET /api/v1/watch/{uuid} must include processor_config_restock_diff and
+ processor_config_restock_diff_source in the response.
+
+ Two cases:
+ - Watch-level config only: source == 'watch', config reflects the watch's own settings.
+ - Tag with overrides_watch=True: source == 'tag:
Weekly schedule limiting when checks can run
Array of condition rules for change detection logic (empty array when not set)
-Logic operator - ALL (match all conditions) or ANY (match any condition)
+Plain-English intent for AI-based change filtering. The AI evaluates every detected change against this and only notifies when it matches.
+Instructions for the AI to summarise changes in notifications. When set, replaces {{diff}} with a human-readable description.
curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \ -H "x-api-key: YOUR_API_KEY" -
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "date_created": 0,
- "title": "string",
- "tag": "string",
- "tags": [
- "string"
], - "paused": true,
- "notification_muted": true,
- "method": "GET",
- "fetch_backend": "system",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "body": "string",
- "proxy": "string",
- "ignore_status_codes": true,
- "webdriver_delay": 0,
- "webdriver_js_execute_code": "string",
- "time_between_check": {
- "weeks": 52000,
- "days": 365000,
- "hours": 8760000,
- "minutes": 525600000,
- "seconds": 31536000000
}, - "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": "restock_diff",
- "include_filters": [
- "string"
], - "subtractive_selectors": [
- "string"
], - "ignore_text": [
- "string"
], - "trigger_text": [
- "string"
], - "text_should_not_be_present": [
- "string"
], - "extract_lines_containing": [
- "string"
], - "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": 0,
- "has_ldjson_price_data": true,
- "notification_screenshot": false,
- "filter_failure_notification_send": true,
- "use_page_title_in_list": true,
- "history_snapshot_max_length": 1,
- "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",
- "last_checked": 0,
- "last_changed": 0,
- "last_error": "string",
- "last_viewed": 0,
- "link": "string",
- "page_title": "string",
- "check_count": 0,
- "fetch_time": 0,
- "previous_md5": "string",
- "previous_md5_before_filters": "string",
- "consecutive_filter_failures": 0,
- "last_notification_error": "string",
- "notification_alert_count": 0,
- "content-type": "string",
- "remote_server_reply": "string",
- "browser_steps_last_error_step": 0,
- "viewed": 0,
- "history_n": 0
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "date_created": 0,
- "title": "string",
- "tag": "string",
- "tags": [
- "string"
], - "paused": true,
- "notification_muted": true,
- "method": "GET",
- "fetch_backend": "system",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "body": "string",
- "proxy": "string",
- "ignore_status_codes": true,
- "webdriver_delay": 0,
- "webdriver_js_execute_code": "string",
- "time_between_check": {
- "weeks": 52000,
- "days": 365000,
- "hours": 8760000,
- "minutes": 525600000,
- "seconds": 31536000000
}, - "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": "restock_diff",
- "include_filters": [
- "string"
], - "subtractive_selectors": [
- "string"
], - "ignore_text": [
- "string"
], - "trigger_text": [
- "string"
], - "text_should_not_be_present": [
- "string"
], - "extract_lines_containing": [
- "string"
], - "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": 0,
- "has_ldjson_price_data": true,
- "notification_screenshot": false,
- "filter_failure_notification_send": true,
- "use_page_title_in_list": true,
- "history_snapshot_max_length": 1,
- "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",
- "llm_intent": "",
- "llm_change_summary": "",
- "llm_prefilter": "string",
- "llm_evaluation_cache": { },
- "llm_last_tokens_used": 0,
- "llm_tokens_used_cumulative": 0,
- "last_checked": 0,
- "last_changed": 0,
- "last_error": "string",
- "last_viewed": 0,
- "link": "string",
- "page_title": "string",
- "check_count": 0,
- "fetch_time": 0,
- "previous_md5": "string",
- "previous_md5_before_filters": "string",
- "consecutive_filter_failures": 0,
- "last_notification_error": "string",
- "notification_alert_count": 0,
- "content-type": "string",
- "remote_server_reply": "string",
- "browser_steps_last_error_step": 0,
- "viewed": 0,
- "history_n": 0,
- "processor_config_restock_diff": {
- "in_stock_processing": "in_stock_only",
- "follow_price_changes": true,
- "price_change_min": 0,
- "price_change_max": 0,
- "price_change_threshold_percent": 100
}, - "processor_config_restock_diff_source": "string"
}Update an existing web page change monitor (watch) using JSON. Accepts the same structure as returned in get single watch information.
| uuid required | string <uuid> Web page change monitor (watch) unique ID @@ -767,6 +771,10 @@ notification preferences, and content filtering options. " class="sc-eVqvcJ sc-fszimp kIppRw drqpJr">Array of condition rules for change detection logic (empty array when not set) |
| conditions_match_logic | string Default: "ALL" Enum: "ALL" "ANY" Logic operator - ALL (match all conditions) or ANY (match any condition) + |
| llm_intent | string <= 2000 characters Default: "" Plain-English intent for AI-based change filtering. The AI evaluates every detected change against this and only notifies when it matches. + |
| llm_change_summary | string <= 2000 characters Default: "" Instructions for the AI to summarise changes in notifications. When set, replaces {{diff}} with a human-readable description. |
| last_viewed | integer >= 0 Unix timestamp in seconds of the last time the watch was viewed. Setting it to a value higher than |
Custom server
-{- "title": "string",
- "tag": "string",
- "tags": [
- "string"
], - "paused": true,
- "notification_muted": true,
- "method": "GET",
- "fetch_backend": "system",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "body": "string",
- "proxy": "string",
- "ignore_status_codes": true,
- "webdriver_delay": 0,
- "webdriver_js_execute_code": "string",
- "time_between_check": {
- "weeks": 52000,
- "days": 365000,
- "hours": 8760000,
- "minutes": 525600000,
- "seconds": 31536000000
}, - "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": "restock_diff",
- "include_filters": [
- "string"
], - "subtractive_selectors": [
- "string"
], - "ignore_text": [
- "string"
], - "trigger_text": [
- "string"
], - "text_should_not_be_present": [
- "string"
], - "extract_lines_containing": [
- "string"
], - "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": 0,
- "notification_screenshot": false,
- "filter_failure_notification_send": true,
- "use_page_title_in_list": true,
- "history_snapshot_max_length": 1,
- "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",
- "last_viewed": 0
}{- "title": "string",
- "tag": "string",
- "tags": [
- "string"
], - "paused": true,
- "notification_muted": true,
- "method": "GET",
- "fetch_backend": "system",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "body": "string",
- "proxy": "string",
- "ignore_status_codes": true,
- "webdriver_delay": 0,
- "webdriver_js_execute_code": "string",
- "time_between_check": {
- "weeks": 52000,
- "days": 365000,
- "hours": 8760000,
- "minutes": 525600000,
- "seconds": 31536000000
}, - "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": "restock_diff",
- "include_filters": [
- "string"
], - "subtractive_selectors": [
- "string"
], - "ignore_text": [
- "string"
], - "trigger_text": [
- "string"
], - "text_should_not_be_present": [
- "string"
], - "extract_lines_containing": [
- "string"
], - "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": 0,
- "notification_screenshot": false,
- "filter_failure_notification_send": true,
- "use_page_title_in_list": true,
- "history_snapshot_max_length": 1,
- "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",
- "llm_intent": "",
- "llm_change_summary": "",
- "last_viewed": 0
}Delete a web page change monitor (watch) and all related history