Try our Chrome extension

Chrome store icon Chrome Webstore

Easily add the current web-page from your browser directly into your changedetection.io tool, more great features coming soon!

Changedetection.io needs your support!

You can help us by supporting changedetection.io on these platforms;

The more popular changedetection.io is, the more time we can dedicate to adding amazing features!

Many thanks :)

changedetection.io team

Automatically applies this tag to any watch whose URL matches. Supports wildcards: *example.com* or plain substring: github.com/myorg
Leave unchecked to use the auto-generated colour based on the tag name.
On – every watch in this group uses the AI settings below, unless it fills in its own. Off – no AI for any watch in this group. Leave it to each watch – this group has no say; each watch uses its own AI settings.

Set a change intent for all watches in this tag/group. Each watch can override with its own.

Describe how changes should be summarised in notifications for all watches in this group.

Modify default prompt
Appending keeps the prompt inherited from global settings and adds your text after it, so later edits to that prompt still reach this group.

These settings are added to any existing watch configurations.

One CSS, xPath 1 & 2, JSON Path/JQ selector per line, any rules that matches will be used.
Show advanced help and tips
  • Remove HTML element(s) by CSS and XPath selectors before text conversion.
  • Don't paste HTML here, use only CSS and XPath selectors
  • Add multiple elements, CSS or XPath selectors per line to ignore multiple parts of the HTML.

Text filtering

  • Text to wait for before triggering a change/notification, all text and regex are tested case-insensitive.
  • Trigger text is processed from the result-text that comes out of any CSS/JSON Filters for this monitor
  • Each line is processed separately (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • You can also use conditions - "Page text" - with Contains, Starts With, Not Contains and many more /foo\d/
  • Matching text will be ignored in the text snapshot (you can still see it but it wont trigger a change)
  • Each line processed separately, any line matching will be ignored (removed before creating the checksum)
  • Regular Expression support, wrap the entire line in forward slash /regex/
  • Changing this will affect the comparison checksum which may trigger an alert


  • Block change-detection while this text is on the page, all text and regex are tested case-insensitive, good for waiting for when a product is available again
  • Block text is processed from the result-text that comes out of any CSS/JSON Filters for this monitor
  • All lines here must not exist (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • Keep only lines that contain any of these words or phrases (plain text, case-insensitive)
  • One entry per line — any line in the page text that contains a match is kept
  • Simpler alternative to regex — use this when you just want lines about a specific topic
  • Example: enter celsius to keep only lines mentioning temperature readings
  • Extracts text in the final output (line by line) after other filters using regular expressions or string match:
    • Regular expression - example /reports.+?2022/i
    • Don't forget to consider the white-space at the start of a line /.+?reports.+?2022/i
    • Use //(?aiLmsux)) type flags (more information here)
    • Keyword example - example: Out of stock
    • Use groups to extract just that text - example /reports.+?(\d+)/i returns a list of years only
    • Example - match lines containing a keyword /.*icecream.*/
  • One line per regular-expression/string match
Used for watches in "Restock & Price detection" mode
Changes in price should trigger a notification
Minimum amount, Trigger a change/notification when the price drops below this value.
Maximum amount, Trigger a change/notification when the price rises above this value.
Price must change more than this % since the previous check to trigger a change.
For example, if the previous check saw the product at $1,000 USD, 2% would mean it has to change more than $20 since then.
Use with caution! This will easily fill up your email storage quota or flood other storages.
Use system defaults

Tip: Use AppRise Notification URLs for notification to just about any service! Please read the notification services wiki here for important configuration notes.

Show advanced help and tips
  • discord:// (or https://discord.com/api/webhooks...)) only supports a maximum 2,000 characters of notification text, including the title.
  • tgram:// bots can't send messages to other bots, so you should specify chat ID of non-bot user.
  • tgram:// only supports very limited HTML and can fail when extra tags are sent, read more here (or use plaintext/markdown format)
  • gets://, posts://, puts://, deletes:// for direct API calls (or omit the "s" for non-SSL ie get://) more help here
  • Accepts the {{token}} placeholders listed below
Customise notifications
Title for all notifications
Body for all notifications — You can use Jinja2 templating in the notification title, body and URL, and tokens from below.
Show token/placeholders
Token Description
{{base_url}} The URL of the changedetection.io instance you are running.
{{watch_url}} The URL being watched.
{{watch_open_url}} The Open Link Override set on the watch, otherwise the same as watch_url. Use this when the watched URL is an API endpoint or RSS feed but you want to link to the real page.
{{watch_uuid}} The UUID of the watch.
{{watch_title}} The page title of the watch, uses <title> if not set, falls back to URL
{{watch_tag}} The watch group / tag
{{preview_url}} The URL of the preview page generated by changedetection.io.
{{change_datetime}} Date/time of the change, accepts format=, change_datetime(format='%A'), default is '%Y-%m-%d %H:%M:%S %Z'
{{diff_url}} The URL of the diff output for the watch.
{{diff}} The diff output - only changes, additions, and removals
All diff variants accept lines=, context=, word_diff=, ignore_junk= args, e.g. {{diff(lines=10)}}, {{diff_added(lines=5, context=2)}}
{{diff_clean}} The diff output - only changes, additions, and removals — Without (added) prefix or colors
{{diff_added}} The diff output - only changes and additions
{{diff_added_clean}} The diff output - only changes and additions — Without (added) prefix or colors
{{diff_removed}} The diff output - only changes and removals
{{diff_removed_clean}} The diff output - only changes and removals — Without (added) prefix or colors
{{diff_full}} The diff output - full difference output
{{diff_full_clean}} The diff output - full difference output — Without (added) prefix or colors
{{diff_patch}} The diff output - patch in unified format
{{diff_changed_from}} Only the changed words/values from the previous version — e.g. the old price. Best when a single value changes per line; multiple changed fragments are joined by newline.
{{diff_changed_to}} Only the changed words/values from the new version — e.g. the new price. Best when a single value changes per line; multiple changed fragments are joined by newline.
{{current_snapshot}} The current snapshot text contents value, useful when combined with JSON or CSS filters
{{triggered_text}} Text that tripped the trigger from filters
{{diff}} (upgraded) When AI Change Summary is configured, contains the AI-generated description instead of the raw diff. Falls back to raw diff when not configured.
{{raw_diff}} Always the raw +/- diff, regardless of AI Change Summary setting.
{{llm_summary}} The AI Change Summary text (same as the upgraded {{diff}} — explicit reference).
{{llm_intent}} The AI Change Intent that was evaluated.
{{restock.price}} Price detected
{{restock.in_stock}} In stock status
{{restock.last_price}} Price at the previous check
{{restock.previous_price}} Previous price in history

Warning: Contents of {{diff}}, {{diff_removed}}, and {{diff_added}} depend on how the difference algorithm perceives the change.
For example, an addition or removal could be perceived as a change in some cases. More Here
  • For JSON payloads, use |tojson without quotes for automatic escaping, for example - { "name": {{ watch_title|tojson }} }
  • URL encoding, use |urlencode, for example - gets://hook-website.com/test.php?title={{ watch_title|urlencode }}
  • Regular-expression replace, use |regex_replace, for example - {{ "hello world 123" | regex_replace('[0-9]+', 'no-more-numbers') }}
  • For a complete reference of all Jinja2 built-in filters, users can refer to the https://jinja.palletsprojects.com/en/3.1.x/templates/#builtin-filters

Format for all notifications