changedetection.io/docs/api-spec.yaml

1266 wiersze
40 KiB
YAML

openapi: 3.0.3
info:
title: ChangeDetection.io API
description: |
# ChangeDetection.io Web page monitoring and notifications API
REST API for managing Page watches, Group tags, and Notifications.
changedetection.io can be driven by its built in simple API, in the examples below you will also find `curl` command line examples to help you.
## Where to find my API key?
The API key can be easily found under the **SETTINGS** then **API** tab of changedetection.io dashboard.
Simply click the API key to automatically copy it to your clipboard.
![Where to find the API key](./where-to-get-api-key.jpeg)
## Connection URL
The 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`.
If you are using the hosted/subscription version of changedetection.io, then the URL is based on your login URL, for example:
`https://<your login url>/api/v1/watch/cc0cfffa-f449-477b-83ea-0caafd1dc091/history`
## Authentication
Almost all API requests require some authentication, this is provided as an **API Key** in the header of the HTTP request.
For example: `x-api-key: YOUR_API_KEY`
version: 1.0.0
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.
Each watch represents a single URL being monitored for changes, with configurable settings for check intervals,
notification preferences, and content filtering options.
- name: Watch History
description: |
Access historical snapshots and change data for your watches. View the complete timeline of detected changes
and retrieve specific versions of monitored content for comparison and analysis.
- name: Snapshots
description: |
Retrieve individual snapshots of monitored content. Access both the processed change detection data and
the raw HTML content that was captured during monitoring checks.
- name: Favicon
description: |
Retrieve favicon images associated with monitored web pages. These are used in the dashboard interface
to visually identify different watches in your monitoring list.
- 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
notification preferences, and perform bulk operations like mass rechecking or status changes across
multiple related watches.
- name: Notifications
description: |
Configure global notification endpoints that can be used across all your watches. Supports various
notification services including email, Discord, Slack, webhooks, and many other popular platforms.
These settings serve as defaults that can be overridden at the individual watch or tag level.
- name: Search
description: |
Search and filter your watches by URL patterns, titles, or tags. Useful for quickly finding specific
monitors in large collections or identifying watches that match certain criteria.
- name: Import
description: |
Bulk import multiple URLs for monitoring. Accepts plain text lists of URLs and can automatically
apply tags, proxy settings, and other configurations to all imported watches simultaneously.
- name: System Information
description: |
Retrieve system status and statistics about your changedetection.io instance, including total watch
counts, uptime information, and version details.
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: |
API key for authentication. You can find your API key in the changedetection.io dashboard under Settings > API.
Enter your API key in the "Authorize" button above to automatically populate all code examples.
schemas:
Watch:
type: object
properties:
uuid:
type: string
format: uuid
description: Unique identifier for the watch
readOnly: true
url:
type: string
format: uri
description: URL to monitor for changes
maxLength: 5000
title:
type: string
description: Custom title for the watch
maxLength: 5000
tag:
type: string
description: Tag UUID to associate with this watch
maxLength: 5000
tags:
type: array
items:
type: string
description: Array of tag UUIDs
paused:
type: boolean
description: Whether the watch is paused
muted:
type: boolean
description: Whether notifications are muted
method:
type: string
enum: [GET, POST, DELETE, PUT]
description: HTTP method to use
fetch_backend:
type: string
enum: [html_requests, html_webdriver]
description: Backend to use for fetching content
headers:
type: object
additionalProperties:
type: string
description: HTTP headers to include in requests
body:
type: string
description: HTTP request body
maxLength: 5000
proxy:
type: string
description: Proxy configuration
maxLength: 5000
webdriver_delay:
type: integer
description: Delay in seconds for webdriver
webdriver_js_execute_code:
type: string
description: JavaScript code to execute
maxLength: 5000
time_between_check:
type: object
properties:
weeks:
type: integer
days:
type: integer
hours:
type: integer
minutes:
type: integer
seconds:
type: integer
description: Time intervals between checks
notification_urls:
type: array
items:
type: string
description: Notification URLs for this watch
notification_title:
type: string
description: Custom notification title
maxLength: 5000
notification_body:
type: string
description: Custom notification body
maxLength: 5000
notification_format:
type: string
enum: [Text, HTML, Markdown]
description: Format for notifications
track_ldjson_price_data:
type: boolean
description: Whether to track JSON-LD price data
browser_steps:
type: array
items:
type: object
properties:
operation:
type: string
maxLength: 5000
selector:
type: string
maxLength: 5000
optional_value:
type: string
maxLength: 5000
required: [operation, selector, optional_value]
description: Browser automation steps
last_checked:
type: integer
description: Unix timestamp of last check
readOnly: true
last_changed:
type: integer
description: Unix timestamp of last change
readOnly: true
last_error:
type: string
description: Last error message
readOnly: true
required:
- url
CreateWatch:
allOf:
- $ref: '#/components/schemas/Watch'
- type: object
required:
- url
Tag:
type: object
properties:
uuid:
type: string
format: uuid
description: Unique identifier for the tag
readOnly: true
title:
type: string
description: Tag title
maxLength: 5000
notification_urls:
type: array
items:
type: string
description: Default notification URLs for watches with this tag
notification_muted:
type: boolean
description: Whether notifications are muted for this tag
required:
- title
NotificationUrls:
type: object
properties:
notification_urls:
type: array
items:
type: string
format: uri
description: List of notification URLs
required:
- notification_urls
SystemInfo:
type: object
properties:
watch_count:
type: integer
description: Total number of watches
tag_count:
type: integer
description: Total number of tags
uptime:
type: string
description: System uptime
version:
type: string
description: Application version
SearchResult:
type: object
properties:
watches:
type: object
additionalProperties:
$ref: '#/components/schemas/Watch'
description: Dictionary of matching watches keyed by UUID
WatchHistory:
type: object
additionalProperties:
type: string
description: Path to snapshot file
description: Dictionary of timestamps and snapshot paths
Error:
type: object
properties:
message:
type: string
description: Error message
paths:
/watch:
get:
tags: [Watch Management]
summary: List all watches
description: Return concise list of available watches and basic info
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/watch" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
response = requests.get('http://localhost:5000/api/v1/watch', headers=headers)
print(response.json())
parameters:
- name: recheck_all
in: query
description: Set to 1 to force recheck of all watches
schema:
type: string
enum: ["1"]
- name: tag
in: query
description: Tag name to filter results
schema:
type: string
responses:
'200':
description: List of watches
content:
application/json:
schema:
type: object
additionalProperties:
$ref: '#/components/schemas/Watch'
example:
"095be615-a8ad-4c33-8e9c-c7612fbf6c9f":
uuid: "095be615-a8ad-4c33-8e9c-c7612fbf6c9f"
url: "http://example.com"
title: "Example Website Monitor"
tag: "550e8400-e29b-41d4-a716-446655440000"
tags: ["550e8400-e29b-41d4-a716-446655440000"]
paused: false
muted: false
method: "GET"
fetch_backend: "html_requests"
last_checked: 1640995200
last_changed: 1640995200
"7c9e6b8d-f2a1-4e5c-9d3b-8a7f6e4c2d1a":
uuid: "7c9e6b8d-f2a1-4e5c-9d3b-8a7f6e4c2d1a"
url: "https://news.example.org"
title: "News Site Tracker"
tag: "330e8400-e29b-41d4-a716-446655440001"
tags: ["330e8400-e29b-41d4-a716-446655440001"]
paused: false
muted: true
method: "GET"
fetch_backend: "html_webdriver"
last_checked: 1640998800
last_changed: 1640995200
post:
tags: [Watch Management]
summary: Create a new watch
description: Create a single watch. Requires at least 'url' to be set.
x-code-samples:
- lang: 'curl'
source: |
curl -X POST "http://localhost:5000/api/v1/watch" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"title": "Example Site Monitor",
"time_between_check": {
"hours": 1
}
}'
- lang: 'Python'
source: |
import requests
import json
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
data = {
'url': 'https://example.com',
'title': 'Example Site Monitor',
'time_between_check': {
'hours': 1
}
}
response = requests.post('http://localhost:5000/api/v1/watch',
headers=headers, json=data)
print(response.text)
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWatch'
example:
url: "https://example.com"
title: "Example Site Monitor"
time_between_check:
hours: 1
responses:
'200':
description: Watch created successfully
content:
text/plain:
schema:
type: string
example: "OK"
'500':
description: Server error
content:
text/plain:
schema:
type: string
/watch/{uuid}:
get:
operationId: getSingleWatch
tags: [Watch Management]
summary: Get single watch
description: Retrieve watch information and set muted/paused status. Returns the FULL Watch JSON.
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.get(f'http://localhost:5000/api/v1/watch/{uuid}', headers=headers)
print(response.json())
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
- name: recheck
in: query
description: Recheck this watch
schema:
type: string
enum: ["1", "true"]
- name: paused
in: query
description: Set pause state
schema:
type: string
enum: [paused, unpaused]
- name: muted
in: query
description: Set mute state
schema:
type: string
enum: [muted, unmuted]
responses:
'200':
description: Watch information or operation result
content:
application/json:
schema:
$ref: '#/components/schemas/Watch'
text/plain:
schema:
type: string
example: "OK"
'404':
description: Watch not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
put:
operationId: updateWatch
tags: [Watch Management]
summary: Update watch
description: Update an existing watch using JSON. Accepts the same structure as returned in [get single watch information](#operation/getSingleWatch).
x-code-samples:
- lang: 'curl'
source: |
curl -X PUT "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://updated-example.com",
"title": "Updated Monitor",
"paused": false
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
data = {
'url': 'https://updated-example.com',
'title': 'Updated Monitor',
'paused': False
}
response = requests.put(f'http://localhost:5000/api/v1/watch/{uuid}',
headers=headers, json=data)
print(response.text)
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Watch'
responses:
'200':
description: Watch updated successfully
content:
text/plain:
schema:
type: string
example: "OK"
'500':
description: Server error
delete:
tags: [Watch Management]
summary: Delete watch
description: Delete a watch and all related history
x-code-samples:
- lang: 'curl'
source: |
curl -X DELETE "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.delete(f'http://localhost:5000/api/v1/watch/{uuid}', headers=headers)
print(response.text)
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
responses:
'200':
description: Watch deleted successfully
content:
text/plain:
schema:
type: string
example: "OK"
/watch/{uuid}/history:
get:
tags: [Watch History]
summary: Get watch history
description: Get a list of all historical snapshots available for a watch
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f/history" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.get(f'http://localhost:5000/api/v1/watch/{uuid}/history', headers=headers)
print(response.json())
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
responses:
'200':
description: List of available snapshots
content:
application/json:
schema:
$ref: '#/components/schemas/WatchHistory'
example:
"1640995200": "/path/to/snapshot1.txt"
"1640998800": "/path/to/snapshot2.txt"
'404':
description: Watch not found
/watch/{uuid}/history/{timestamp}:
get:
tags: [Snapshots]
summary: Get single snapshot
description: Get single snapshot from watch. Use 'latest' for the most recent snapshot.
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f/history/latest" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
timestamp = 'latest' # or use specific timestamp like 1640995200
response = requests.get(f'http://localhost:5000/api/v1/watch/{uuid}/history/{timestamp}', headers=headers)
print(response.text)
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
- name: timestamp
in: path
required: true
description: Snapshot timestamp or 'latest'
schema:
oneOf:
- type: integer
- type: string
enum: [latest]
- name: html
in: query
description: Set to 1 to return the last HTML
schema:
type: string
enum: ["1"]
responses:
'200':
description: Snapshot content
content:
text/plain:
schema:
type: string
'404':
description: Snapshot not found
/watch/{uuid}/favicon:
get:
tags: [Favicon]
summary: Get watch favicon
description: Get the favicon for a watch as displayed in the watch overview list.
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/watch/095be615-a8ad-4c33-8e9c-c7612fbf6c9f/favicon" \
-H "x-api-key: YOUR_API_KEY" \
--output favicon.ico
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
uuid = '095be615-a8ad-4c33-8e9c-c7612fbf6c9f'
response = requests.get(f'http://localhost:5000/api/v1/watch/{uuid}/favicon', headers=headers)
with open('favicon.ico', 'wb') as f:
f.write(response.content)
parameters:
- name: uuid
in: path
required: true
description: Watch unique ID
schema:
type: string
format: uuid
responses:
'200':
description: Favicon binary data
content:
image/*:
schema:
type: string
format: binary
'404':
description: Favicon not found
/tags:
get:
tags: [Group / Tag Management]
summary: List all tags
description: Return list of available tags/groups
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/tags" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
response = requests.get('http://localhost:5000/api/v1/tags', headers=headers)
print(response.json())
responses:
'200':
description: List of tags
content:
application/json:
schema:
type: object
additionalProperties:
$ref: '#/components/schemas/Tag'
example:
"550e8400-e29b-41d4-a716-446655440000":
uuid: "550e8400-e29b-41d4-a716-446655440000"
title: "Production Sites"
notification_urls: ["mailto:admin@example.com"]
notification_muted: false
"330e8400-e29b-41d4-a716-446655440001":
uuid: "330e8400-e29b-41d4-a716-446655440001"
title: "News Sources"
notification_urls: ["discord://webhook_id/webhook_token"]
notification_muted: false
/tag/{uuid}:
get:
tags: [Group / Tag Management]
summary: Get single tag
description: Retrieve tag information, set notification_muted status, recheck all in tag.
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
tag_uuid = '550e8400-e29b-41d4-a716-446655440000'
response = requests.get(f'http://localhost:5000/api/v1/tag/{tag_uuid}', headers=headers)
print(response.json())
parameters:
- name: uuid
in: path
required: true
description: Tag unique ID
schema:
type: string
format: uuid
- name: muted
in: query
description: Set mute state
schema:
type: string
enum: [muted, unmuted]
- name: recheck
in: query
description: Queue all watches with this tag for recheck
schema:
type: string
enum: ["true"]
responses:
'200':
description: Tag information or operation result
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
text/plain:
schema:
type: string
example: "OK"
'404':
description: Tag not found
put:
tags: [Group / Tag Management]
summary: Update tag
description: Update an existing tag using JSON
x-code-samples:
- lang: 'curl'
source: |
curl -X PUT "http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Updated Production Sites",
"notification_muted": false
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
tag_uuid = '550e8400-e29b-41d4-a716-446655440000'
data = {
'title': 'Updated Production Sites',
'notification_muted': False
}
response = requests.put(f'http://localhost:5000/api/v1/tag/{tag_uuid}',
headers=headers, json=data)
print(response.text)
parameters:
- name: uuid
in: path
required: true
description: Tag unique ID
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
responses:
'200':
description: Tag updated successfully
'500':
description: Server error
delete:
tags: [Group / Tag Management]
summary: Delete tag
description: Delete a tag/group and remove it from all watches
x-code-samples:
- lang: 'curl'
source: |
curl -X DELETE "http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
tag_uuid = '550e8400-e29b-41d4-a716-446655440000'
response = requests.delete(f'http://localhost:5000/api/v1/tag/{tag_uuid}', headers=headers)
print(response.text)
parameters:
- name: uuid
in: path
required: true
description: Tag unique ID
schema:
type: string
format: uuid
responses:
'200':
description: Tag deleted successfully
post:
tags: [Group / Tag Management]
summary: Create tag
description: Create a single tag/group
x-code-samples:
- lang: 'curl'
source: |
curl -X POST "http://localhost:5000/api/v1/tag/550e8400-e29b-41d4-a716-446655440000" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Important Sites"
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
tag_uuid = '550e8400-e29b-41d4-a716-446655440000'
data = {'title': 'Important Sites'}
response = requests.post(f'http://localhost:5000/api/v1/tag/{tag_uuid}',
headers=headers, json=data)
print(response.text)
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Tag'
example:
title: "Important Sites"
responses:
'200':
description: Tag created successfully
'500':
description: Server error
/notifications:
get:
tags: [Notifications]
summary: Get notification URLs
description: Return the notification URL list from the configuration
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/notifications" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
response = requests.get('http://localhost:5000/api/v1/notifications', headers=headers)
print(response.json())
responses:
'200':
description: List of notification URLs
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
post:
tags: [Notifications]
summary: Add notification URLs
description: Add one or more notification URLs to the configuration
x-code-samples:
- lang: 'curl'
source: |
curl -X POST "http://localhost:5000/api/v1/notifications" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"notification_urls": [
"mailto:admin@example.com",
"discord://webhook_id/webhook_token"
]
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
data = {
'notification_urls': [
'mailto:admin@example.com',
'discord://webhook_id/webhook_token'
]
}
response = requests.post('http://localhost:5000/api/v1/notifications',
headers=headers, json=data)
print(response.json())
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
example:
notification_urls:
- "mailto:admin@example.com"
- "discord://webhook_id/webhook_token"
responses:
'201':
description: Notification URLs added successfully
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
'400':
description: Invalid input
put:
tags: [Notifications]
summary: Replace notification URLs
description: Replace all notification URLs with the provided list (can be empty)
x-code-samples:
- lang: 'curl'
source: |
curl -X PUT "http://localhost:5000/api/v1/notifications" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"notification_urls": [
"mailto:newadmin@example.com"
]
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
data = {
'notification_urls': [
'mailto:newadmin@example.com'
]
}
response = requests.put('http://localhost:5000/api/v1/notifications',
headers=headers, json=data)
print(response.json())
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
responses:
'200':
description: Notification URLs replaced successfully
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
'400':
description: Invalid input
delete:
tags: [Notifications]
summary: Delete notification URLs
description: Delete one or more notification URLs from the configuration
x-code-samples:
- lang: 'curl'
source: |
curl -X DELETE "http://localhost:5000/api/v1/notifications" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"notification_urls": [
"mailto:admin@example.com"
]
}'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
}
data = {
'notification_urls': [
'mailto:admin@example.com'
]
}
response = requests.delete('http://localhost:5000/api/v1/notifications',
headers=headers, json=data)
print(response.status_code)
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationUrls'
responses:
'204':
description: Notification URLs deleted successfully
'400':
description: No matching notification URLs found
/search:
get:
tags: [Search]
summary: Search watches
description: Search watches by URL or title text
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/search?q=example.com" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
params = {'q': 'example.com'}
response = requests.get('http://localhost:5000/api/v1/search',
headers=headers, params=params)
print(response.json())
parameters:
- name: q
in: query
required: true
description: Search query to match against watch URLs and titles
schema:
type: string
- name: tag
in: query
description: Tag name to limit results (name not UUID)
schema:
type: string
- name: partial
in: query
description: Allow partial matching of URL query
schema:
type: string
responses:
'200':
description: Search results
content:
application/json:
schema:
$ref: '#/components/schemas/SearchResult'
example:
watches:
"095be615-a8ad-4c33-8e9c-c7612fbf6c9f":
uuid: "095be615-a8ad-4c33-8e9c-c7612fbf6c9f"
url: "http://example.com"
title: "Example Website Monitor"
tag: "550e8400-e29b-41d4-a716-446655440000"
tags: ["550e8400-e29b-41d4-a716-446655440000"]
paused: false
muted: false
/import:
post:
tags: [Import]
summary: Import watch URLs
description: Import a list of URLs to monitor. Accepts line-separated URLs in request body.
x-code-samples:
- lang: 'curl'
source: |
curl -X POST "http://localhost:5000/api/v1/import" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: text/plain" \
-d $'https://example.com\nhttps://example.org\nhttps://example.net'
- lang: 'Python'
source: |
import requests
headers = {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'text/plain'
}
urls = 'https://example.com\nhttps://example.org\nhttps://example.net'
response = requests.post('http://localhost:5000/api/v1/import',
headers=headers, data=urls)
print(response.json())
parameters:
- name: tag_uuids
in: query
description: Tag UUID to apply to imported watches
schema:
type: string
- name: tag
in: query
description: Tag name to apply to imported watches
schema:
type: string
- name: proxy
in: query
description: Proxy key to use for imported watches
schema:
type: string
- name: dedupe
in: query
description: Remove duplicate URLs (default true)
schema:
type: boolean
default: true
requestBody:
required: true
content:
text/plain:
schema:
type: string
example: |
https://example.com
https://example.org
https://example.net
responses:
'200':
description: URLs imported successfully
content:
application/json:
schema:
type: array
items:
type: string
format: uuid
description: List of created watch UUIDs
'500':
description: Server error
/systeminfo:
get:
tags: [System Information]
summary: Get system information
description: Return information about the current system state
x-code-samples:
- lang: 'curl'
source: |
curl -X GET "http://localhost:5000/api/v1/systeminfo" \
-H "x-api-key: YOUR_API_KEY"
- lang: 'Python'
source: |
import requests
headers = {'x-api-key': 'YOUR_API_KEY'}
response = requests.get('http://localhost:5000/api/v1/systeminfo', headers=headers)
print(response.json())
responses:
'200':
description: System information
content:
application/json:
schema:
$ref: '#/components/schemas/SystemInfo'
example:
watch_count: 42
tag_count: 5
uptime: "2 days, 3:45:12"
version: "0.50.10"