From 9da3113787a7a8d4638d5b1f520881413604fdfd Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Wed, 29 Apr 2026 19:24:05 +1000 Subject: [PATCH] API Aadd restock config to API /v1/watch/ json output #4099 --- changedetectionio/api/Watch.py | 21 +++++++ changedetectionio/tests/test_api.py | 95 +++++++++++++++++++++++++++++ docs/api-spec.yaml | 31 ++++++++++ docs/api_v1/index.html | 28 +++++++-- 4 files changed, 169 insertions(+), 6 deletions(-) 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:', 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..d3c30451 100644 --- a/docs/api-spec.yaml +++ b/docs/api-spec.yaml @@ -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..88fcf44f 100644 --- a/docs/api_v1/index.html +++ b/docs/api_v1/index.html @@ -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"