Env var - PAGE_WATCH_LIMIT enhancements (#4359)

This commit is contained in:
dgtlmoon authored and GitHub committed 2026-09-02 13:37:55 +02:00
1 parent af234636b9
commit 68a445df1b
41 files changed
+290 -117

No files matched your search

+20 -1
View File
@@ -28,7 +28,7 @@ info:
For example: `x-api-key: YOUR_API_KEY`
version: 0.1.7
version: 0.1.8
contact:
name: ChangeDetection.io
url: https://github.com/dgtlmoon/changedetection.io
@@ -1046,6 +1046,15 @@ paths:
schema:
type: string
example: "OK"
'429':
description: |
Watch limit reached (server has `PAGE_WATCH_LIMIT` set; unlimited by default).
No watch was created - delete one to make room.
content:
text/plain:
schema:
type: string
example: "Watch limit reached (50/50 watches). Cannot add more watches."
'500':
description: Server error
content:
@@ -2140,6 +2149,16 @@ paths:
type: string
format: uuid
description: List of created watch UUIDs
'429':
description: |
Watch limit reached (server has `PAGE_WATCH_LIMIT` set; unlimited by default).
The batch is rejected whole - no watches are created - so the same request can be
retried unchanged once there is room.
content:
text/plain:
schema:
type: string
example: "Watch limit reached (48/50 watches), importing 5 URL(s) would exceed it. No watches were imported."
'500':
description: Server error
+12 -2
View File
@@ -455,7 +455,7 @@ data-styled.g138[id="sc-enPhjR"]{content:"SikXG,"}/*!sc*/
55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864
-231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688,
-104.0616 -231.873,-231.248 z
" fill="currentColor"></path></g></svg></div></div><div class="sc-fkYqBV buanwU api-content"><div class="sc-dTvVRJ bPmFpz"><div class="sc-jJLAfE gkiSyE"><div class="sc-ggWZvA fqkwbU api-info"><h1 class="sc-hwkwBN sc-jCWzJg wYHiz hPcPCj">ChangeDetection.io API<!-- --> <span>(<!-- -->0.1.7<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><div class="sc-erPUmh eAqtbt"><div class="sc-iRTMaw beOrEi"> <span class="sc-jVxTAy hijBKj">URL: <a href="https://github.com/dgtlmoon/changedetection.io">https://github.com/dgtlmoon/changedetection.io</a></span> <span class="sc-jVxTAy hijBKj">License:<!-- --> <a href="https://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0</a></span> </div></div></div><div data-role="redoc-summary" html="" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"></div><div data-role="redoc-description" html="" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"></div></div></div></div><div id="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" data-section-id="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" class="sc-dTvVRJ bPmFpz"><div class="sc-jJLAfE gkiSyE"><div class="sc-ggWZvA fqkwbU"><h2 class="sc-kNOymR iFSqkw"><a class="sc-kcLKEh fRdsOi" href="#section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" aria-label="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API"></a>ChangeDetection.io Web page monitoring and notifications API</h2></div></div><div class="sc-ggWZvA dCzIPc"><div class="sc-eVqvcJ sc-fszimp kIppRw kbZred redoc-markdown " html="&lt;p&gt;REST API for managing Page watches, Group tags, and Notifications.&lt;/p&gt;
" fill="currentColor"></path></g></svg></div></div><div class="sc-fkYqBV buanwU api-content"><div class="sc-dTvVRJ bPmFpz"><div class="sc-jJLAfE gkiSyE"><div class="sc-ggWZvA fqkwbU api-info"><h1 class="sc-hwkwBN sc-jCWzJg wYHiz hPcPCj">ChangeDetection.io API<!-- --> <span>(<!-- -->0.1.8<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-eVqvcJ sc-fszimp kIppRw kbZred"><div class="sc-erPUmh eAqtbt"><div class="sc-iRTMaw beOrEi"> <span class="sc-jVxTAy hijBKj">URL: <a href="https://github.com/dgtlmoon/changedetection.io">https://github.com/dgtlmoon/changedetection.io</a></span> <span class="sc-jVxTAy hijBKj">License:<!-- --> <a href="https://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0</a></span> </div></div></div><div data-role="redoc-summary" html="" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"></div><div data-role="redoc-description" html="" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"></div></div></div></div><div id="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" data-section-id="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" class="sc-dTvVRJ bPmFpz"><div class="sc-jJLAfE gkiSyE"><div class="sc-ggWZvA fqkwbU"><h2 class="sc-kNOymR iFSqkw"><a class="sc-kcLKEh fRdsOi" href="#section/ChangeDetection.io-Web-page-monitoring-and-notifications-API" aria-label="section/ChangeDetection.io-Web-page-monitoring-and-notifications-API"></a>ChangeDetection.io Web page monitoring and notifications API</h2></div></div><div class="sc-ggWZvA dCzIPc"><div class="sc-eVqvcJ sc-fszimp kIppRw kbZred redoc-markdown " html="&lt;p&gt;REST API for managing Page watches, Group tags, and Notifications.&lt;/p&gt;
&lt;p&gt;changedetection.io can be driven by its built in simple API, in the examples below you will also find &lt;code&gt;curl&lt;/code&gt; command line and &lt;code&gt;python&lt;/code&gt; examples to help you get started faster.&lt;/p&gt;
"><p>REST API for managing Page watches, Group tags, and Notifications.</p>
<p>changedetection.io can be driven by its built in simple API, in the examples below you will also find <code>curl</code> command line and <code>python</code> examples to help you get started faster.</p>
@@ -647,6 +647,10 @@ 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>Whether llm_change_summary replaces the prompt inherited from the tag/global settings, or is appended to the end of it.</p>
</div></div></div></td></tr></tbody></table><div><h3 class="sc-gDzyrw kjrVcG">Responses</h3><div><button class="sc-jIDBmd lkmdtA"><svg class="sc-dntSTA cGxVlA" 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><strong class="sc-eJvlPh fBhAXU">200<!-- --> </strong><div html="&lt;p&gt;Web page change monitor (watch) created successfully&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>Web page change monitor (watch) created successfully</p>
</div></button></div><div><button class="sc-jIDBmd ifAHvq"><svg class="sc-dntSTA jKYZgc" 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><strong class="sc-eJvlPh fBhAXU">429<!-- --> </strong><div html="&lt;p&gt;Watch limit reached (server has &lt;code&gt;PAGE_WATCH_LIMIT&lt;/code&gt; set; unlimited by default).
No watch was created - delete one to make room.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>Watch limit reached (server has <code>PAGE_WATCH_LIMIT</code> set; unlimited by default).
No watch was created - delete one to make room.</p>
</div></button></div><div><button class="sc-jIDBmd ifAHvq"><svg class="sc-dntSTA jKYZgc" 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><strong class="sc-eJvlPh fBhAXU">500<!-- --> </strong><div html="&lt;p&gt;Server error&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>Server error</p>
</div></button></div></div></div><div class="sc-jwTyAe sc-hjsuWn bDYKKx FFPsr"><div class="sc-eZSpzM jjnszm"><button class="sc-buTqWO iPCVMX"><span type="post" class="sc-fQLpxn kwcmyC http-verb post">post</span><span class="sc-jvKoal kZcHWP">/watch</span><svg class="sc-dntSTA iuNpUs" style="margin-right:-25px" 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></button><div aria-hidden="true" class="sc-ecJghI ga-DQLq"><div class="sc-iyBeIh icOxsG"><div html="&lt;p&gt;Development server&lt;/p&gt;
@@ -1603,6 +1607,12 @@ All parameters from the Watch schema are supported (processor, fetch_backend, no
" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"><p>Skip duplicate URLs (default true)</p>
</div></div></div></td></tr></tbody></table></div><h5 class="sc-eqYatC czjApA">Request Body schema: <span class="sc-dNFkOE cFlAeY">text/plain</span><div class="sc-bEjUoa sc-iIvHqT sc-eTCgfj lhyyLL crXmiY foplsk">required</div></h5><div html="" class="sc-eVqvcJ sc-fszimp kIppRw kbZred"></div><div><div><div><span class="sc-bEjUoa sc-boKDdR lhyyLL jYezsP"></span><span class="sc-bEjUoa sc-fOOuSg lhyyLL dbKJYq">string</span></div> <div><div html="" class="sc-eVqvcJ sc-fszimp kIppRw drqpJr"></div></div></div></div><div><h3 class="sc-gDzyrw kjrVcG">Responses</h3><div><button class="sc-jIDBmd lkmdtA"><svg class="sc-dntSTA cGxVlA" 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><strong class="sc-eJvlPh fBhAXU">200<!-- --> </strong><div html="&lt;p&gt;URLs imported successfully&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>URLs imported successfully</p>
</div></button></div><div><button class="sc-jIDBmd ifAHvq"><svg class="sc-dntSTA jKYZgc" 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><strong class="sc-eJvlPh fBhAXU">429<!-- --> </strong><div html="&lt;p&gt;Watch limit reached (server has &lt;code&gt;PAGE_WATCH_LIMIT&lt;/code&gt; set; unlimited by default).
The batch is rejected whole - no watches are created - so the same request can be
retried unchanged once there is room.&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>Watch limit reached (server has <code>PAGE_WATCH_LIMIT</code> set; unlimited by default).
The batch is rejected whole - no watches are created - so the same request can be
retried unchanged once there is room.</p>
</div></button></div><div><button class="sc-jIDBmd kQCDrg" disabled=""><strong class="sc-eJvlPh fBhAXU">500<!-- --> </strong><div html="&lt;p&gt;Server error&lt;/p&gt;
" class="sc-eVqvcJ sc-fszimp sc-etsjJW kIppRw jnwENr ljKHqG"><p>Server error</p>
</div></button></div></div></div><div class="sc-jwTyAe sc-hjsuWn bDYKKx FFPsr"><div class="sc-eZSpzM jjnszm"><button class="sc-buTqWO iPCVMX"><span type="post" class="sc-fQLpxn kwcmyC http-verb post">post</span><span class="sc-jvKoal kZcHWP">/import</span><svg class="sc-dntSTA iuNpUs" style="margin-right:-25px" 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></button><div aria-hidden="true" class="sc-ecJghI ga-DQLq"><div class="sc-iyBeIh icOxsG"><div html="&lt;p&gt;Development server&lt;/p&gt;
@@ -1956,7 +1966,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.7","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);