fix(api): accept an existing tag UUID in the watch tag field, and deprecate it (#4361)
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s

`tag` on POST /watch was documented as taking a tag UUID, but the value went to
add_tag(title): a UUID silently created a junk tag *titled* with that UUID and never
applied the tag the caller asked for. `tags` (UUIDs) was the only thing that worked.

- `tag=` now resolves an existing tag UUID to that tag, still falling back to title
  matching/creation for names. A UUID-shaped value matching nothing is skipped with a
  warning rather than becoming a group named after a UUID.
- Blank tokens ("One,,Two,") no longer store False in watch['tags'] - add_tag() returns
  False for an empty title and it was appended unguarded. Consumers tolerate it
  (get_all_tags_for_watch() dictfilt()s over known tags) but it is not valid data.
- add_tag()'s title search is extracted to tag_uuid_for_title(), so existence can be
  tested without creating as a side effect. add_tag()'s contract is unchanged.
- api-spec: `tag` is marked `deprecated: true` (so Redoc renders the badge) and states
  plainly that it takes names, not UUIDs. `tags` now says what it really does - applied
  verbatim, never creates, unknown UUIDs stored as dangling refs. Rendered docs rebuilt.

Every claim in the new field docs is asserted in test_api_tags.py against the real API.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
dgtlmoonandClaude Opus 5 authored and GitHub committed 2026-09-02 16:46:27 +02:00
1 parent 2669a5cee6
commit fbd9472218
4 files changed
+206 -32

No files matched your search

+44 -9
View File
@@ -49,6 +49,9 @@ dictfilt = lambda x, y: dict([(i, x[i]) for i in x if i in set(y)])
# Is there an existing library to ensure some data store (JSON etc) is in sync with CRUD methods?
# Open a github issue if you know something :)
# https://stackoverflow.com/questions/6190468/how-to-trigger-function-on-value-change
_TAG_UUID_RE = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$', re.IGNORECASE)
class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore):
__version_check = True
@@ -791,11 +794,31 @@ class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore):
return None
if tag and type(tag) == str:
# Then it's probably a string of the actual tag by name, split and add it
for t in tag.split(','):
# for each stripped tag, add tag as UUID
for a_t in t.split(','):
tag_uuid = self.add_tag(a_t)
# A comma separated string of tag *titles*, created when they don't exist yet.
# An existing tag's UUID is accepted here too: the API documented this field as taking
# a UUID for years, and honouring that beats creating a tag *titled* with the UUID.
existing_tag_uuids = self.__data['settings']['application'].get('tags', {})
for tag_name in tag.split(','):
tag_name = tag_name.strip()
if not tag_name:
continue
if _TAG_UUID_RE.match(tag_name):
if tag_name in existing_tag_uuids:
apply_extras['tags'].append(tag_name)
continue
# UUID-shaped but no such tag, and no tag literally titled that either -
# a stale or foreign ID. Skip it rather than leave behind a group named
# after a UUID, which is never what the caller wanted.
if not self.tag_uuid_for_title(tag_name):
logger.warning(f"Tag '{tag_name}' looks like a UUID but no such tag exists, skipping")
continue
tag_uuid = self.add_tag(tag_name)
# add_tag() returns False for a title it won't create - never let that into the list,
# a falsy entry blows up every lookup of watch['tags']
if tag_uuid:
apply_extras['tags'].append(tag_uuid)
# Or if UUIDs given directly
@@ -1069,6 +1092,18 @@ class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore):
return ret
def tag_uuid_for_title(self, title):
"""UUID of the tag with this title (case/space insensitive), or None. Creates nothing."""
n = title.strip().lower()
if not n:
return None
for uuid, tag in self.__data['settings']['application'].get('tags', {}).items():
if n == tag.get('title', '').lower().strip():
return uuid
return None
def add_tag(self, title):
# If name exists, return that
n = title.strip().lower()
@@ -1076,10 +1111,10 @@ class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore):
if not n:
return False
for uuid, tag in self.__data['settings']['application'].get('tags', {}).items():
if n == tag.get('title', '').lower().strip():
logger.warning(f"Tag '{title}' already exists, skipping creation.")
return uuid
existing_uuid = self.tag_uuid_for_title(title)
if existing_uuid:
logger.warning(f"Tag '{title}' already exists, skipping creation.")
return existing_uuid
# Eventually almost everything todo with a watch will apply as a Tag
# So we use the same model as a Watch
+77
View File
@@ -321,3 +321,80 @@ def test_roundtrip_API(client, live_server, measure_memory_usage, datastore_path
date_created = res.json.get('date_created')
assert date_created != 454444444444, "ReadOnly date_created should not be updateable"
assert date_created != "454444444444", "ReadOnly date_created should not be updateable"
def test_api_watch_tag_field_accepts_names_and_uuids(client, live_server, measure_memory_usage, datastore_path):
"""The `tag` field on a watch takes tag *names*, `tags` takes UUIDs.
`tag` was documented as taking a UUID for years while the code fed it to add_tag(title),
so a UUID silently created a junk group *titled* with that UUID and never applied the tag
the caller asked for. Both spellings now resolve to the same tag.
"""
api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token')
datastore = live_server.app.config['DATASTORE']
test_url = url_for('test_endpoint', _external=True)
hdr = {'x-api-key': api_key, 'content-type': 'application/json'}
def titles_of(watch_uuid):
tags = datastore.data['settings']['application']['tags']
return sorted(tags[t].get('title') for t in datastore.data['watching'][watch_uuid].get('tags'))
# A name creates the group
res = client.post(url_for("createwatch"), data=json.dumps({"url": test_url, "tag": "helloworld"}), headers=hdr)
assert res.status_code == 201
assert titles_of(res.json['uuid']) == ['helloworld']
# An existing tag's UUID links to that tag rather than making a group named after the UUID
res = client.post(url_for("tag"), data=json.dumps({"title": "RealTag"}), headers=hdr)
assert res.status_code == 201
real_tag_uuid = res.json['uuid']
tag_count_before = len(datastore.data['settings']['application']['tags'])
res = client.post(url_for("createwatch"), data=json.dumps({"url": f"{test_url}?p=2", "tag": real_tag_uuid}), headers=hdr)
assert res.status_code == 201
assert real_tag_uuid in datastore.data['watching'][res.json['uuid']].get('tags')
assert titles_of(res.json['uuid']) == ['RealTag']
assert len(datastore.data['settings']['application']['tags']) == tag_count_before, "No junk tag titled with a UUID"
# `tags` with UUIDs keeps working
res = client.post(url_for("createwatch"), data=json.dumps({"url": f"{test_url}?p=3", "tags": [real_tag_uuid]}), headers=hdr)
assert res.status_code == 201
assert titles_of(res.json['uuid']) == ['RealTag']
# Names and UUIDs can be mixed, and blank entries from a trailing comma are dropped -
# add_tag() returns False for those and a falsy entry breaks every watch['tags'] lookup
res = client.post(url_for("createwatch"),
data=json.dumps({"url": f"{test_url}?p=4", "tag": f"Mixed,,{real_tag_uuid},"}), headers=hdr)
assert res.status_code == 201
assert titles_of(res.json['uuid']) == ['Mixed', 'RealTag']
assert all(datastore.data['watching'][res.json['uuid']].get('tags')), "No falsy entries in tags"
# A UUID that matches no tag is skipped rather than becoming a group named after it
unknown_uuid = '0be0272a-19dc-4c97-8aae-5a68df319489'
tag_count_before = len(datastore.data['settings']['application']['tags'])
res = client.post(url_for("createwatch"),
data=json.dumps({"url": f"{test_url}?p=5", "tag": unknown_uuid}), headers=hdr)
assert res.status_code == 201
assert datastore.data['watching'][res.json['uuid']].get('tags') == []
assert len(datastore.data['settings']['application']['tags']) == tag_count_before
# Names are matched case-insensitively against existing tags, as the spec claims
tag_count_before = len(datastore.data['settings']['application']['tags'])
res = client.post(url_for("createwatch"),
data=json.dumps({"url": f"{test_url}?p=6", "tag": "rEaLtAg"}), headers=hdr)
assert res.status_code == 201
assert datastore.data['watching'][res.json['uuid']].get('tags') == [real_tag_uuid]
assert len(datastore.data['settings']['application']['tags']) == tag_count_before, "Casing must not fork a second tag"
# `tags` is applied verbatim and never creates: an unknown UUID is stored as a dangling
# reference that simply resolves to no group. Documented, and harmless because the lookup
# is a dictfilt() over known tags - pinned here so changing it has to be deliberate.
bogus = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
tag_count_before = len(datastore.data['settings']['application']['tags'])
res = client.post(url_for("createwatch"),
data=json.dumps({"url": f"{test_url}?p=7", "tags": [bogus]}), headers=hdr)
assert res.status_code == 201
assert datastore.data['watching'][res.json['uuid']].get('tags') == [bogus]
assert len(datastore.data['settings']['application']['tags']) == tag_count_before
assert datastore.get_all_tags_for_watch(res.json['uuid']) == {}
assert client.get(url_for("watchlist.index")).status_code == 200, "A dangling tag ref must not break the list"
+13 -2
View File
@@ -299,13 +299,24 @@ components:
maxLength: 5000
tag:
type: string
description: Tag UUID to associate with this web page change monitor (watch)
deprecated: true
description: |
**Deprecated - use `tags` instead.** Kept working for API v1 and may be removed in v2.
Takes comma-separated tag *names* (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don't exist yet. An existing tag's UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.
maxLength: 5000
example: "Production, Price tracking"
tags:
type: array
items:
type: string
description: Array of tag UUIDs
description: |
Array of tag UUIDs. Unlike `tag`, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.
paused:
type: boolean
description: Whether the web page change monitor (watch) is paused
+72 -21
View File
@@ -59,6 +59,9 @@ data-styled.g14[id="sc-kcLKEh"]{content:"fRdsOi,"}/*!sc*/
.jKYZgc{height:1.5em;width:1.5em;min-width:1.5em;vertical-align:middle;float:left;transition:transform 0.2s ease-out;transform:rotateZ(-90deg);}/*!sc*/
.jKYZgc polygon{fill:#d41f1c;}/*!sc*/
data-styled.g15[id="sc-dntSTA"]{content:"dUlzCe,FtowP,cGxVlA,iuNpUs,dOPmTa,jKYZgc,"}/*!sc*/
.cCjOXR{display:inline-block;padding:2px 8px;margin:0;background-color:#ffa500;color:#ffffff;font-size:13px;vertical-align:middle;line-height:1.6;border-radius:4px;font-weight:600;font-size:12px;}/*!sc*/
.cCjOXR +span[type]{margin-left:4px;}/*!sc*/
data-styled.g16[id="sc-kvnevz"]{content:"cCjOXR,"}/*!sc*/
.gdmNWp{border-left:1px solid #7c7cbb;box-sizing:border-box;position:relative;padding:10px 10px 10px 0;}/*!sc*/
@media screen and (max-width: 50rem){.gdmNWp{display:block;overflow:hidden;}}/*!sc*/
tr:first-of-type>.gdmNWp,tr.last>.gdmNWp{border-left-width:0;background-position:top left;background-repeat:no-repeat;background-size:1px 100%;}/*!sc*/
@@ -515,10 +518,22 @@ notification preferences, and content filtering options.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>URL to monitor for changes</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="title" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">title</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string or null</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Custom title for the web page change monitor (watch), not to be confused with page_title&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom title for the web page change monitor (watch), not to be confused with page_title</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tag" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Tag UUID to associate with this web page change monitor (watch)&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag UUID to associate with this web page change monitor (watch)</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs</p>
</div></div></div></td></tr><tr class=""><td class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ deprecated" kind="field" title="tag"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div><div><span type="warning" class="sc-kvnevz cCjOXR"> <!-- -->Deprecated<!-- --> </span></div> <div><div html="&lt;p&gt;&lt;strong&gt;Deprecated - use &lt;code&gt;tags&lt;/code&gt; instead.&lt;/strong&gt; Kept working for API v1 and may be removed in v2.&lt;/p&gt;
&lt;p&gt;Takes comma-separated tag &lt;em&gt;names&lt;/em&gt; (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&amp;#39;t exist yet. An existing tag&amp;#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p><strong>Deprecated - use <code>tags</code> instead.</strong> Kept working for API v1 and may be removed in v2.</p>
<p>Takes comma-separated tag <em>names</em> (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&#39;t exist yet. An existing tag&#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs. Unlike &lt;code&gt;tag&lt;/code&gt;, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs. Unlike <code>tag</code>, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="paused" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">paused</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether the web page change monitor (watch) is paused&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Whether the web page change monitor (watch) is paused</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="notification_muted" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">notification_muted</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether notifications are muted&lt;/p&gt;
@@ -681,7 +696,7 @@ No watch was created - delete one to make room.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/watch/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2abha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2abha_0" tabindex="0" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2abha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2abha_1" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2abha_0" aria-labelledby="tab_R_2abha_0"><div class="sc-cdmAjP gsEOpk"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button></div><pre class="sc-eVqvcJ sc-jytpVa kIppRw cCzeOT">curl <span class="token operator">-</span>X GET <span class="token string">"http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f"</span> \
<span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
</pre></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2abha_1" aria-labelledby="tab_R_2abha_1"></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Response samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2ebha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2ebha_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_2ebha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2ebha_1" data-rttab="true">404</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2ebha_0" aria-labelledby="tab_R_2ebha_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-cCVJLD sc-gsJsQu dbfEBv ehbHlf"><svg class="sc-pYNGo eyTvTk" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg><select class="dropdown-select"><option value="application/json" selected="">application/json</option><option value="text/plain">text/plain</option></select><label>application/json</label></div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"uuid"</span>: <span class="token string">&quot;095be615-a8ad-4c33-8e9c-c7612fbf6c9f&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"date_created"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&qLine truncated
</pre></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2abha_1" aria-labelledby="tab_R_2abha_1"></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Response samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2ebha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2ebha_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_2ebha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2ebha_1" data-rttab="true">404</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2ebha_0" aria-labelledby="tab_R_2ebha_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-cCVJLD sc-gsJsQu dbfEBv ehbHlf"><svg class="sc-pYNGo eyTvTk" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg><select class="dropdown-select"><option value="application/json" selected="">application/json</option><option value="text/plain">text/plain</option></select><label>application/json</label></div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"uuid"</span>: <span class="token string">&quot;095be615-a8ad-4c33-8e9c-c7612fbf6c9f&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"date_created"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;Production, Price tracking&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token stLine truncated
" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><p>Update an existing web page change monitor (watch) using JSON. Accepts the same structure as returned in <a href="#operation/getWatch">get single watch information</a>.</p>
</div></div><div class="sc-ikkVnJ deUlC"><div class="sc-hWgKua dPSGXF"><h5 class="sc-eqYatC sc-gFqXPY czjApA jCoZLr">Authorizations:</h5><svg class="sc-dntSTA FtowP" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jBaHRL fUkQtw"><span class="sc-iVnIWt gRXavu"><span class="sc-hqtLyI hRtRoN"><i>ApiKeyAuth</i></span></span></div></div><div><h5 class="sc-eqYatC czjApA">path<!-- --> Parameters</h5><table class="sc-eqNDNG icJLQx"><tbody><tr class="last "><td kind="field" title="uuid" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">uuid</span><div class="sc-bEjUoa sc-iIvHqT lhyyLL crXmiY">required</div></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq"> <!-- -->&lt;<!-- -->uuid<!-- -->&gt;<!-- --> </span></div> <div><div html="&lt;p&gt;Web page change monitor (watch) unique ID&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Web page change monitor (watch) unique ID</p>
@@ -689,10 +704,22 @@ No watch was created - delete one to make room.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>URL to monitor for changes</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="title" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">title</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string or null</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Custom title for the web page change monitor (watch), not to be confused with page_title&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom title for the web page change monitor (watch), not to be confused with page_title</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tag" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Tag UUID to associate with this web page change monitor (watch)&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag UUID to associate with this web page change monitor (watch)</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs</p>
</div></div></div></td></tr><tr class=""><td class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ deprecated" kind="field" title="tag"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div><div><span type="warning" class="sc-kvnevz cCjOXR"> <!-- -->Deprecated<!-- --> </span></div> <div><div html="&lt;p&gt;&lt;strong&gt;Deprecated - use &lt;code&gt;tags&lt;/code&gt; instead.&lt;/strong&gt; Kept working for API v1 and may be removed in v2.&lt;/p&gt;
&lt;p&gt;Takes comma-separated tag &lt;em&gt;names&lt;/em&gt; (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&amp;#39;t exist yet. An existing tag&amp;#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p><strong>Deprecated - use <code>tags</code> instead.</strong> Kept working for API v1 and may be removed in v2.</p>
<p>Takes comma-separated tag <em>names</em> (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&#39;t exist yet. An existing tag&#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs. Unlike &lt;code&gt;tag&lt;/code&gt;, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs. Unlike <code>tag</code>, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="paused" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">paused</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether the web page change monitor (watch) is paused&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Whether the web page change monitor (watch) is paused</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="notification_muted" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">notification_muted</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether notifications are muted&lt;/p&gt;
@@ -831,7 +858,7 @@ On a tag/group it is ternary and is that group&#39;s only AI control:</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Production server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>https://yourdomain.com/api/v1</span>/watch/{uuid}</div></div></div><div class="sc-iyBeIh icOxsG"><div html="&lt;p&gt;Custom server&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/watch/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2acha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2acha_0" tabindex="0" data-rttab="true">Payload</li><li class="react-tabs__tab" role="tab" id="tab_R_2acha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acha_1" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2acha_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acha_2" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2acha_0" aria-labelledby="tab_R_2acha_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-bAehkN iNRAJK">application/json</div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_status_codes"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_delay"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_js_execute_code"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoveLine truncated
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/watch/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2acha_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2acha_0" tabindex="0" data-rttab="true">Payload</li><li class="react-tabs__tab" role="tab" id="tab_R_2acha_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acha_1" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2acha_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acha_2" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2acha_0" aria-labelledby="tab_R_2acha_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-bAehkN iNRAJK">application/json</div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;Production, Price tracking&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_status_codes"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_delay"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_js_execute_code"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li>Line truncated
" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><p>Delete a web page change monitor (watch) and all related history</p>
</div></div><div class="sc-ikkVnJ deUlC"><div class="sc-hWgKua dPSGXF"><h5 class="sc-eqYatC sc-gFqXPY czjApA jCoZLr">Authorizations:</h5><svg class="sc-dntSTA FtowP" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jBaHRL fUkQtw"><span class="sc-iVnIWt gRXavu"><span class="sc-hqtLyI hRtRoN"><i>ApiKeyAuth</i></span></span></div></div><div><h5 class="sc-eqYatC czjApA">path<!-- --> Parameters</h5><table class="sc-eqNDNG icJLQx"><tbody><tr class="last "><td kind="field" title="uuid" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">uuid</span><div class="sc-bEjUoa sc-iIvHqT lhyyLL crXmiY">required</div></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq"> <!-- -->&lt;<!-- -->uuid<!-- -->&gt;<!-- --> </span></div> <div><div html="&lt;p&gt;Web page change monitor (watch) unique ID&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Web page change monitor (watch) unique ID</p>
@@ -1101,10 +1128,22 @@ multiple related watches.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>URL to monitor for changes</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="title" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">title</span><div class="sc-bEjUoa sc-iIvHqT lhyyLL crXmiY">required</div></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string or null</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Custom title for the web page change monitor (watch), not to be confused with page_title&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom title for the web page change monitor (watch), not to be confused with page_title</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tag" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Tag UUID to associate with this web page change monitor (watch)&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag UUID to associate with this web page change monitor (watch)</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs</p>
</div></div></div></td></tr><tr class=""><td class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ deprecated" kind="field" title="tag"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div><div><span type="warning" class="sc-kvnevz cCjOXR"> <!-- -->Deprecated<!-- --> </span></div> <div><div html="&lt;p&gt;&lt;strong&gt;Deprecated - use &lt;code&gt;tags&lt;/code&gt; instead.&lt;/strong&gt; Kept working for API v1 and may be removed in v2.&lt;/p&gt;
&lt;p&gt;Takes comma-separated tag &lt;em&gt;names&lt;/em&gt; (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&amp;#39;t exist yet. An existing tag&amp;#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p><strong>Deprecated - use <code>tags</code> instead.</strong> Kept working for API v1 and may be removed in v2.</p>
<p>Takes comma-separated tag <em>names</em> (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&#39;t exist yet. An existing tag&#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs. Unlike &lt;code&gt;tag&lt;/code&gt;, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs. Unlike <code>tag</code>, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="paused" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">paused</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether the web page change monitor (watch) is paused&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Whether the web page change monitor (watch) is paused</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="notification_muted" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">notification_muted</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether notifications are muted&lt;/p&gt;
@@ -1287,7 +1326,7 @@ Leave empty to use the colour auto-generated from the tag name.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/tag/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2abja_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2abja_0" tabindex="0" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2abja_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2abja_1" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2abja_0" aria-labelledby="tab_R_2abja_0"><div class="sc-cdmAjP gsEOpk"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button></div><pre class="sc-eVqvcJ sc-jytpVa kIppRw cCzeOT">curl <span class="token operator">-</span>X GET <span class="token string">"http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000"</span> \
<span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
</pre></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2abja_1" aria-labelledby="tab_R_2abja_1"></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Response samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2ebja_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2ebja_0" tabindex="0" data-rttab="true">200</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2ebja_0" aria-labelledby="tab_R_2ebja_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-cCVJLD sc-gsJsQu dbfEBv ehbHlf"><svg class="sc-pYNGo eyTvTk" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg><select class="dropdown-select"><option value="application/json" selected="">application/json</option><option value="text/plain">text/plain</option></select><label>application/json</label></div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"uuid"</span>: <span class="token string">&quot;095be615-a8ad-4c33-8e9c-c7612fbf6c9f&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"date_created"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_status_codes"</span>Line truncated
</pre></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_2abja_1" aria-labelledby="tab_R_2abja_1"></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Response samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_2ebja_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2ebja_0" tabindex="0" data-rttab="true">200</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2ebja_0" aria-labelledby="tab_R_2ebja_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-cCVJLD sc-gsJsQu dbfEBv ehbHlf"><svg class="sc-pYNGo eyTvTk" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg><select class="dropdown-select"><option value="application/json" selected="">application/json</option><option value="text/plain">text/plain</option></select><label>application/json</label></div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"uuid"</span>: <span class="token string">&quot;095be615-a8ad-4c33-8e9c-c7612fbf6c9f&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"date_created"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;Production, Price tracking&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_Line truncated
" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><p>Update an existing tag using JSON</p>
</div></div><div class="sc-ikkVnJ deUlC"><div class="sc-hWgKua dPSGXF"><h5 class="sc-eqYatC sc-gFqXPY czjApA jCoZLr">Authorizations:</h5><svg class="sc-dntSTA FtowP" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jBaHRL fUkQtw"><span class="sc-iVnIWt gRXavu"><span class="sc-hqtLyI hRtRoN"><i>ApiKeyAuth</i></span></span></div></div><div><h5 class="sc-eqYatC czjApA">path<!-- --> Parameters</h5><table class="sc-eqNDNG icJLQx"><tbody><tr class="last "><td kind="field" title="uuid" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">uuid</span><div class="sc-bEjUoa sc-iIvHqT lhyyLL crXmiY">required</div></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq"> <!-- -->&lt;<!-- -->uuid<!-- -->&gt;<!-- --> </span></div> <div><div html="&lt;p&gt;Tag unique ID&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag unique ID</p>
@@ -1295,10 +1334,22 @@ Leave empty to use the colour auto-generated from the tag name.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>URL to monitor for changes</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="title" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">title</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string or null</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Custom title for the web page change monitor (watch), not to be confused with page_title&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom title for the web page change monitor (watch), not to be confused with page_title</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tag" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div> <div><div html="&lt;p&gt;Tag UUID to associate with this web page change monitor (watch)&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag UUID to associate with this web page change monitor (watch)</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs</p>
</div></div></div></td></tr><tr class=""><td class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ deprecated" kind="field" title="tag"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tag</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span> <span class="sc-bEjUoa sc-goiVcJ lhyyLL bDfgbe"> <!-- -->&lt;= 5000 characters<!-- --> </span></span></div><div><span type="warning" class="sc-kvnevz cCjOXR"> <!-- -->Deprecated<!-- --> </span></div> <div><div html="&lt;p&gt;&lt;strong&gt;Deprecated - use &lt;code&gt;tags&lt;/code&gt; instead.&lt;/strong&gt; Kept working for API v1 and may be removed in v2.&lt;/p&gt;
&lt;p&gt;Takes comma-separated tag &lt;em&gt;names&lt;/em&gt; (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&amp;#39;t exist yet. An existing tag&amp;#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p><strong>Deprecated - use <code>tags</code> instead.</strong> Kept working for API v1 and may be removed in v2.</p>
<p>Takes comma-separated tag <em>names</em> (not UUIDs, despite what earlier revisions of this
document said). Names are matched case-insensitively against existing tags and created
when they don&#39;t exist yet. An existing tag&#39;s UUID is also accepted and resolves to that
tag; a UUID matching no tag is ignored.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="tags" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">tags</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP">Array of </span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">strings</span></div> <div><div html="&lt;p&gt;Array of tag UUIDs. Unlike &lt;code&gt;tag&lt;/code&gt;, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Array of tag UUIDs. Unlike <code>tag</code>, these are applied exactly as given - no tag is ever
created from this field. The UUIDs are not validated: an unknown one is stored but
resolves to no group.</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="paused" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">paused</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether the web page change monitor (watch) is paused&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Whether the web page change monitor (watch) is paused</p>
</div></div></div></td></tr><tr class=""><td kind="field" title="notification_muted" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">notification_muted</span></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">boolean</span></div> <div><div html="&lt;p&gt;Whether notifications are muted&lt;/p&gt;
@@ -1461,7 +1512,7 @@ Leave empty to use the colour auto-generated from the tag name.</p>
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Production server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>https://yourdomain.com/api/v1</span>/tag/{uuid}</div></div></div><div class="sc-iyBeIh icOxsG"><div html="&lt;p&gt;Custom server&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Custom server</p>
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/tag/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2acja_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2acja_0" tabindex="0" data-rttab="true">Payload</li><li class="react-tabs__tab" role="tab" id="tab_R_2acja_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acja_1" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2acja_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acja_2" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2acja_0" aria-labelledby="tab_R_2acja_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-bAehkN iNRAJK">application/json</div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_status_codes"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_delay"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_js_execute_code"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoveraLine truncated
</div><div tabindex="0" role="button"><div class="sc-xKhEK okJpy"><span>{protocol}://{host}/api/v1</span>/tag/{uuid}</div></div></div></div></div><div><h3 class="sc-lgpSej drJHMo"> <!-- -->Request samples<!-- --> </h3><div class="sc-cOpnSz fyxuKi" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_2acja_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_2acja_0" tabindex="0" data-rttab="true">Payload</li><li class="react-tabs__tab" role="tab" id="tab_R_2acja_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acja_1" data-rttab="true">curl</li><li class="react-tabs__tab" role="tab" id="tab_R_2acja_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_2acja_2" data-rttab="true">Python</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_2acja_0" aria-labelledby="tab_R_2acja_0"><div><div class="sc-bSFBcf iLdyBp"><span class="sc-gahYZc cXitJ">Content type</span><div class="sc-bAehkN iNRAJK">application/json</div></div><div class="sc-blIAwI eKKwxo"><div class="sc-dClGHI fdRrNy"><div class="sc-bbbBoY bBWkcI"><button><div class="sc-fYmhhH iNCOCX">Copy</div></button><button> Expand all </button><button> Collapse all </button></div><div tabindex="0" class="sc-eVqvcJ kIppRw sc-fhfEft dFvLDb"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"url"</span>: <span class="token string">&quot;</span><a href="http://example.com">http://example.com</a><span class="token string">&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"title"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tag"</span>: <span class="token string">&quot;Production, Price tracking&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tags"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">[</span><span class="ellipsis"></span><ul class="array collapsible"><li><div class="hoverable collapsed"><span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">]</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"paused"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"notification_muted"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"method"</span>: <span class="token string">&quot;GET&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"fetch_backend"</span>: <span class="token string">&quot;system&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"headers"</span>: <button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable collapsed"><span class="property token string">"property1"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable collapsed"><span class="property token string">"property2"</span>: <span class="token string">&quot;string&quot;</span></div></li></ul><span class="token punctuation">}</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"body"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"proxy"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"ignore_status_codes"</span>: <span class="token boolean">true</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_delay"</span>: <span class="token number">0</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"webdriver_js_execute_code"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><lLine truncated
" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><p>Delete a tag/group and remove it from all web page change monitors (watches)</p>
</div></div><div class="sc-ikkVnJ deUlC"><div class="sc-hWgKua dPSGXF"><h5 class="sc-eqYatC sc-gFqXPY czjApA jCoZLr">Authorizations:</h5><svg class="sc-dntSTA FtowP" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jBaHRL fUkQtw"><span class="sc-iVnIWt gRXavu"><span class="sc-hqtLyI hRtRoN"><i>ApiKeyAuth</i></span></span></div></div><div><h5 class="sc-eqYatC czjApA">path<!-- --> Parameters</h5><table class="sc-eqNDNG icJLQx"><tbody><tr class="last "><td kind="field" title="uuid" class="sc-kCuUfV sc-fbQrwq gdmNWp dFOJWJ"><span class="sc-hwddKA cteAyA"></span><span class="property-name">uuid</span><div class="sc-bEjUoa sc-iIvHqT lhyyLL crXmiY">required</div></td><td class="sc-gGKoUb ixGaBD"><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq"> <!-- -->&lt;<!-- -->uuid<!-- -->&gt;<!-- --> </span></div> <div><div html="&lt;p&gt;Tag unique ID&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Tag unique ID</p>
@@ -1966,7 +2017,7 @@ installed processors (e.g. <code>processor_config_restock_diff</code> from the b
curl <span class="token operator">-</span>X GET <span class="token string">"http://localhost:5000/api/v1/full-spec"</span>
</pre></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_156lq_1" aria-labelledby="tab_R_156lq_1"></div></div></div></div></div></div></div><div class="sc-evkzZa iZqpqg"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"ChangeDetection.io API","description":"# ChangeDetection.io Web page monitoring and notifications API\n\nREST API for managing Page watches, Group tags, and Notifications.\n\nchangedetection.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.\n\n## Where to find my API key?\n\nThe API key can be easily found under the **SETTINGS** then **API** tab of changedetection.io dashboard. \nSimply click the API key to automatically copy it to your clipboard.\n\n![Where to find the API key](./where-to-get-api-key.jpeg)\n\n## Connection URL\n\nThe API can be found at `/api/v1/`, so for example if you run changedetection.io locally on port 5000, then URL would be `http://localhost:5000/api/v1/watch/cc0cfffa-f449-477b-83ea-0caafd1dc091/history`.\n\nIf you are using the hosted/subscription version of changedetection.io, then the URL is based on your login URL, for example: \n`https://<your login url>/api/v1/watch/cc0cfffa-f449-477b-83ea-0caafd1dc091/history`\n\n## Authentication\n\nAlmost all API requests require some authentication, this is provided as an **API Key** in the header of the HTTP request.\n\nFor example: `x-api-key: YOUR_API_KEY`\n","version":"0.1.8","contact":{"name":"ChangeDetection.io","url":"https://github.com/dgtlmoon/changedetection.io"},"license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0.html"}},"servers":[{"url":"http://localhost:5000/api/v1","description":"Development server"},{"url":"https://yourdomain.com/api/v1","description":"Production server"},{"url":"{protocol}://{host}/api/v1","description":"Custom server","variables":{"protocol":{"enum":["http","https"],"default":"https"},"host":{"default":"yourdomain.com","description":"Your changedetection.io host"}}}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Watch Management","description":"Core functionality for managing web page monitors. Create, retrieve, update, and delete individual watches. \nEach watch represents a single URL being monitored for changes, with configurable settings for check intervals, \nnotification preferences, and content filtering options.\n"},{"name":"Watch History","description":"Get a list of timestamps of all changes detected for a watch.\n"},{"name":"Snapshots","description":"Retrieve individual text snapshot of monitored content according to the `timestamp`. The text snapshot is the HTML\nto Text at page check time. \n\nSet the query argument `html` to any value to retrieve the last HTML fetched, the system only keeps the last two \n(2) HTML files fetched.\n\nUse the Watch History API endpoint to get a list of timestamps to pass to this query.\n"},{"name":"Favicon","description":"Retrieve favicon images associated with monitored web pages. These are used in the dashboard interface \nto visually identify different watches in your monitoring list.\n"},{"name":"Group / Tag Management","description":"Organize your watches using tags and groups. Tags (also known as Groups) allow you to categorize monitors, set group-wide \nnotification preferences, and perform bulk operations like mass rechecking or status changes across \nmultiple related watches.\n"},{"name":"Notifications","description":"Configure global notification endpoints that can be used across all your watches. Supports various \nnotification services including email, Discord, Slack, webhooks, and many other popular platforms. \nThese settings serve as defaults that can be overridden at the individual watch or tag level.\n\nThe notification syntax uses [https://github.com/caronc/apprise](https://github.com/caronc/apprise).\n"},{"name":"Search","description":"Search and filter your watches by URL patterns, titles, or tags. Useful for quickly finding specific \nmonitors in large collections or identifying watches that match certain criteria.\n"},{"name":"Import","description":"Bulk import multiple URLs for monitoring. Accepts plain text lists of URLs and can automatically \napply tags, proxy settings, and other configurations to all imported watches simultaneously.\n"},{"name":"System Information","description":"Retrieve system status and statistics about your changedetection.io instance, including total watch\ncounts, uptime information, and version details.\n"},{"name":"Plugin API Extensions","description":"## How Processor Plugins Extend the API\n\nchangedetection.io uses a **processor plugin** system to handle different types of change detection.\nEach processor lives in `changedetectionio/processors/<name>/` and may include an `api.yaml` file\nthat extends the core Watch schema with processor-specific configuration fields.\n\n### How it works\n\nAt startup, changedetection.io scans all installed processors for an `api.yaml` file. Any schemas\nand code samples defined there are deep-merged into the live API speciLine truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"ChangeDetection.io API","description":"# ChangeDetection.io Web page monitoring and notifications API\n\nREST API for managing Page watches, Group tags, and Notifications.\n\nchangedetection.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.\n\n## Where to find my API key?\n\nThe API key can be easily found under the **SETTINGS** then **API** tab of changedetection.io dashboard. \nSimply click the API key to automatically copy it to your clipboard.\n\n![Where to find the API key](./where-to-get-api-key.jpeg)\n\n## Connection URL\n\nThe API can be found at `/api/v1/`, so for example if you run changedetection.io locally on port 5000, then URL would be `http://localhost:5000/api/v1/watch/cc0cfffa-f449-477b-83ea-0caafd1dc091/history`.\n\nIf you are using the hosted/subscription version of changedetection.io, then the URL is based on your login URL, for example: \n`https://<your login url>/api/v1/watch/cc0cfffa-f449-477b-83ea-0caafd1dc091/history`\n\n## Authentication\n\nAlmost all API requests require some authentication, this is provided as an **API Key** in the header of the HTTP request.\n\nFor example: `x-api-key: YOUR_API_KEY`\n","version":"0.1.8","contact":{"name":"ChangeDetection.io","url":"https://github.com/dgtlmoon/changedetection.io"},"license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0.html"}},"servers":[{"url":"http://localhost:5000/api/v1","description":"Development server"},{"url":"https://yourdomain.com/api/v1","description":"Production server"},{"url":"{protocol}://{host}/api/v1","description":"Custom server","variables":{"protocol":{"enum":["http","https"],"default":"https"},"host":{"default":"yourdomain.com","description":"Your changedetection.io host"}}}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Watch Management","description":"Core functionality for managing web page monitors. Create, retrieve, update, and delete individual watches. \nEach watch represents a single URL being monitored for changes, with configurable settings for check intervals, \nnotification preferences, and content filtering options.\n"},{"name":"Watch History","description":"Get a list of timestamps of all changes detected for a watch.\n"},{"name":"Snapshots","description":"Retrieve individual text snapshot of monitored content according to the `timestamp`. The text snapshot is the HTML\nto Text at page check time. \n\nSet the query argument `html` to any value to retrieve the last HTML fetched, the system only keeps the last two \n(2) HTML files fetched.\n\nUse the Watch History API endpoint to get a list of timestamps to pass to this query.\n"},{"name":"Favicon","description":"Retrieve favicon images associated with monitored web pages. These are used in the dashboard interface \nto visually identify different watches in your monitoring list.\n"},{"name":"Group / Tag Management","description":"Organize your watches using tags and groups. Tags (also known as Groups) allow you to categorize monitors, set group-wide \nnotification preferences, and perform bulk operations like mass rechecking or status changes across \nmultiple related watches.\n"},{"name":"Notifications","description":"Configure global notification endpoints that can be used across all your watches. Supports various \nnotification services including email, Discord, Slack, webhooks, and many other popular platforms. \nThese settings serve as defaults that can be overridden at the individual watch or tag level.\n\nThe notification syntax uses [https://github.com/caronc/apprise](https://github.com/caronc/apprise).\n"},{"name":"Search","description":"Search and filter your watches by URL patterns, titles, or tags. Useful for quickly finding specific \nmonitors in large collections or identifying watches that match certain criteria.\n"},{"name":"Import","description":"Bulk import multiple URLs for monitoring. Accepts plain text lists of URLs and can automatically \napply tags, proxy settings, and other configurations to all imported watches simultaneously.\n"},{"name":"System Information","description":"Retrieve system status and statistics about your changedetection.io instance, including total watch\ncounts, uptime information, and version details.\n"},{"name":"Plugin API Extensions","description":"## How Processor Plugins Extend the API\n\nchangedetection.io uses a **processor plugin** system to handle different types of change detection.\nEach processor lives in `changedetectionio/processors/<name>/` and may include an `api.yaml` file\nthat extends the core Watch schema with processor-specific configuration fields.\n\n### How it works\n\nAt startup, changedetection.io scans all installed processors for an `api.yaml` file. Any schemas\nand code samples defined there are deep-merged into the live API speciLine truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);