diff --git a/changedetectionio/api/Watch.py b/changedetectionio/api/Watch.py index f6860365..3ab87109 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 = dict(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 e73ceef1..a9f63b2c 100644 --- a/changedetectionio/tests/test_api.py +++ b/changedetectionio/tests/test_api.py @@ -905,6 +905,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:', config reflects the tag's settings + regardless of what the watch itself has stored. + """ + api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token') + test_url = url_for('test_endpoint', _external=True) + + # --- Case 1: watch-level config, no tag override --- + res = client.post( + url_for("createwatch"), + data=json.dumps({ + "url": test_url, + "processor": "restock_diff", + "processor_config_restock_diff": { + "in_stock_processing": "all_changes", + "follow_price_changes": False, + "price_change_min": 1.23, + } + }), + headers={'content-type': 'application/json', 'x-api-key': api_key}, + ) + assert res.status_code == 201 + watch_uuid = res.json.get('uuid') + + res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key}) + assert res.status_code == 200 + data = res.json + assert 'processor_config_restock_diff' in data, "GET should include processor_config_restock_diff" + assert 'processor_config_restock_diff_source' in data, "GET should include processor_config_restock_diff_source" + assert data['processor_config_restock_diff_source'] == 'watch' + assert data['processor_config_restock_diff'].get('in_stock_processing') == 'all_changes' + assert data['processor_config_restock_diff'].get('follow_price_changes') == False + assert data['processor_config_restock_diff'].get('price_change_min') == 1.23 + + # --- Case 2: tag with overrides_watch=True overrides watch-level config --- + res = client.post( + url_for("tag"), + data=json.dumps({ + "title": "Override tag", + "overrides_watch": True, + "processor_config_restock_diff": { + "in_stock_processing": "in_stock_only", + "follow_price_changes": True, + "price_change_min": 999.0, + } + }), + headers={'content-type': 'application/json', 'x-api-key': api_key}, + ) + assert res.status_code == 201 + tag_uuid = res.json.get('uuid') + + # Assign the tag to the watch + res = client.put( + url_for("watch", uuid=watch_uuid), + data=json.dumps({"tags": [tag_uuid]}), + headers={'content-type': 'application/json', 'x-api-key': api_key}, + ) + assert res.status_code == 200 + + res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key}) + assert res.status_code == 200 + data = res.json + assert data['processor_config_restock_diff_source'] == f'tag:{tag_uuid}', \ + "Source should show the overriding tag UUID" + assert data['processor_config_restock_diff'].get('in_stock_processing') == 'in_stock_only', \ + "Tag config should override watch-level config" + assert data['processor_config_restock_diff'].get('price_change_min') == 999.0, \ + "Tag price_change_min should override watch-level value" + + # processor_config_restock_diff is readonly — PUT attempts to set the resolved field should be + # silently ignored (the field is stripped before the watch is updated, same as other readOnly fields) + res = client.put( + url_for("watch", uuid=watch_uuid), + data=json.dumps({"processor_config_restock_diff": {"in_stock_processing": "off"}}), + headers={'content-type': 'application/json', 'x-api-key': api_key}, + ) + # PUT with processor_config_restock_diff is still valid (sets watch-level config), + # but the GET response continues to reflect the tag override + assert res.status_code == 200 + res = client.get(url_for("watch", uuid=watch_uuid), headers={'x-api-key': api_key}) + data = res.json + assert data['processor_config_restock_diff_source'] == f'tag:{tag_uuid}', \ + "Tag override should still be active after PUT" + assert data['processor_config_restock_diff'].get('in_stock_processing') == 'in_stock_only', \ + "Tag config should still win after PUT attempted to change watch-level config" + + delete_all_watches(client) + + def test_api_conflict_UI_password(client, live_server, measure_memory_usage, datastore_path): diff --git a/docs/api-spec.yaml b/docs/api-spec.yaml index 6cb29652..859e3bc4 100644 --- a/docs/api-spec.yaml +++ b/docs/api-spec.yaml @@ -28,7 +28,7 @@ info: For example: `x-api-key: YOUR_API_KEY` - version: 0.1.6 + version: 0.1.7 contact: name: ChangeDetection.io url: https://github.com/dgtlmoon/changedetection.io @@ -727,6 +727,37 @@ components: description: Number of history snapshots available readOnly: true x-computed: true + processor_config_restock_diff: + type: object + readOnly: true + x-computed: true + description: | + Resolved restock/price processor config for this watch. + If a tag with `overrides_watch: true` is assigned to this watch, the tag's config is + returned here instead of the watch's own config. Use `processor_config_restock_diff_source` + to determine where the config originated. + properties: + in_stock_processing: + type: string + enum: [in_stock_only, all_changes, 'off'] + follow_price_changes: + type: boolean + price_change_min: + type: [number, 'null'] + price_change_max: + type: [number, 'null'] + price_change_threshold_percent: + type: [number, 'null'] + minimum: 0 + maximum: 100 + processor_config_restock_diff_source: + type: string + readOnly: true + x-computed: true + description: | + Indicates the origin of `processor_config_restock_diff`. + - `watch`: config comes from the watch itself + - `tag:`: config is overridden by the tag with the given UUID CreateWatch: allOf: diff --git a/docs/api_v1/index.html b/docs/api_v1/index.html index d9036991..3055bbf6 100644 --- a/docs/api_v1/index.html +++ b/docs/api_v1/index.html @@ -455,7 +455,7 @@ data-styled.g138[id="sc-enPhjR"]{content:"SikXG,"}/*!sc*/ 55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864 -231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688, -104.0616 -231.873,-231.248 z - " fill="currentColor">

ChangeDetection.io API (0.1.6)

Download OpenAPI specification:

ChangeDetection.io Web page monitoring and notifications API

ChangeDetection.io API (0.1.7)

Download OpenAPI specification:

ChangeDetection.io Web page monitoring and notifications API

REST API for managing Page watches, Group tags, and Notifications.

changedetection.io can be driven by its built in simple API, in the examples below you will also find curl command line and python examples to help you get started faster.

@@ -619,8 +619,12 @@ notification preferences, and content filtering options.

" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr">

Weekly schedule limiting when checks can run

Array of objects <= 100 items

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

-
conditions_match_logic
string
Default: "ALL"
Enum: "ALL" "ANY"
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.

Responses

Request samples

curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
   -H "x-api-key: YOUR_API_KEY"
-

Response samples

Content type
{
  • "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
  • "date_created": 0,
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "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
}

Update watch

Response samples

Content type
{
  • "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
  • "date_created": 0,
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "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": {
    },
  • "processor_config_restock_diff_source": "string"
}

Update watch

Update an existing web page change monitor (watch) using JSON. Accepts the same structure as returned in get single watch information.

Authorizations:
ApiKeyAuth
path Parameters
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 last_changed in the "Update watch" endpoint marks the watch as viewed.

Responses

Custom server

-
{protocol}://{host}/api/v1/watch/{uuid}

Request samples

Content type
application/json
{
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "conditions_match_logic": "ALL",
  • "last_viewed": 0
}

Delete watch

{protocol}://{host}/api/v1/watch/{uuid}

Request samples

Content type
application/json
{
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "conditions_match_logic": "ALL",
  • "llm_intent": "",
  • "llm_change_summary": "",
  • "last_viewed": 0
}

Delete watch

Delete a web page change monitor (watch) and all related history

Authorizations:
ApiKeyAuth
path Parameters
uuid
required
string <uuid>

Web page change monitor (watch) unique ID

@@ -1155,6 +1163,10 @@ multiple related watches.

" 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.

overrides_watch
boolean or null

Custom server

{protocol}://{host}/api/v1/tag/{uuid}

Request samples

curl -X GET "http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000" \
   -H "x-api-key: YOUR_API_KEY"
-

Response samples

Content type
{
  • "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
  • "date_created": 0,
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "conditions_match_logic": "ALL",
  • "overrides_watch": true,
  • "url_match_pattern": "string"
}

Update tag

Response samples

Content type
{
  • "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
  • "date_created": 0,
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "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,
  • "overrides_watch": true,
  • "url_match_pattern": "string"
}

Update tag

Update an existing tag using JSON

Authorizations:
ApiKeyAuth
path Parameters
uuid
required
string <uuid>

Tag unique ID

@@ -1319,6 +1331,10 @@ Leave empty to disable auto-matching.

" 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.

overrides_watch
boolean or null

Production server

https://yourdomain.com/api/v1/tag/{uuid}

Custom server

-
{protocol}://{host}/api/v1/tag/{uuid}

Request samples

Content type
application/json
{
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "conditions_match_logic": "ALL",
  • "overrides_watch": true,
  • "url_match_pattern": "string"
}

Delete tag

{protocol}://{host}/api/v1/tag/{uuid}

Request samples

Content type
application/json
{
  • "title": "string",
  • "tag": "string",
  • "tags": [
    ],
  • "paused": true,
  • "notification_muted": true,
  • "method": "GET",
  • "fetch_backend": "system",
  • "headers": {
    },
  • "body": "string",
  • "proxy": "string",
  • "ignore_status_codes": true,
  • "webdriver_delay": 0,
  • "webdriver_js_execute_code": "string",
  • "time_between_check": {
    },
  • "time_between_check_use_default": true,
  • "notification_urls": [
    ],
  • "notification_title": "string",
  • "notification_body": "string",
  • "notification_format": "text",
  • "track_ldjson_price_data": true,
  • "browser_steps": [
    ],
  • "processor": "restock_diff",
  • "include_filters": [
    ],
  • "subtractive_selectors": [
    ],
  • "ignore_text": [
    ],
  • "trigger_text": [
    ],
  • "text_should_not_be_present": [
    ],
  • "extract_lines_containing": [
    ],
  • "extract_text": [
    ],
  • "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": {
    },
  • "conditions": [
    ],
  • "conditions_match_logic": "ALL",
  • "llm_intent": "",
  • "llm_change_summary": "",
  • "overrides_watch": true,
  • "url_match_pattern": "string"
}

Delete tag

Delete a tag/group and remove it from all web page change monitors (watches)

Authorizations:
ApiKeyAuth
path Parameters
uuid
required
string <uuid>

Tag unique ID

@@ -1848,7 +1864,7 @@ installed processors (e.g. processor_config_restock_diff from the b curl -X GET "http://localhost:5000/api/v1/full-spec"