Monitor a web page for changes
Create a scheduled web-change monitor whose detected changes arrive as an ordinary followed source — query, watch, and mutate it like any feed. Naming a collection that does not exist creates it. Active monitor limits are Free 3, Patron 10, and Pro 100; scheduled monthly credits are 150, 720, and 7,200, respectively. Page and sitemap runs reserve 1 credit; extract runs reserve 10. The shortest interval is 60 minutes and the default schedule is daily. The response reports remaining slots and scheduled credits.
curl --request POST \
--url https://api.smry.ai/v1/feeds/monitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Example page changes",
"target": {
"type": "page",
"url": "https://example.com"
}
}
'import requests
url = "https://api.smry.ai/v1/feeds/monitors"
payload = {
"name": "Example page changes",
"target": {
"type": "page",
"url": "https://example.com"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Example page changes',
target: {type: 'page', url: 'https://example.com'}
})
};
fetch('https://api.smry.ai/v1/feeds/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"monitor": {},
"subscription": {},
"limits": {}
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}Authorizations
Clerk OAuth 2.0 Authorization Code flow with PKCE. Request the minimum scope required by the operation.
Body
1 - 200"page" watches one URL, "sitemap" watches URL additions/removals, "extract" watches for meaningful site-wide changes per your instructions.
Collection id or name. A new name is created. Omit for Unsorted.
x >= 1181 - 50curl --request POST \
--url https://api.smry.ai/v1/feeds/monitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Example page changes",
"target": {
"type": "page",
"url": "https://example.com"
}
}
'import requests
url = "https://api.smry.ai/v1/feeds/monitors"
payload = {
"name": "Example page changes",
"target": {
"type": "page",
"url": "https://example.com"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Example page changes',
target: {type: 'page', url: 'https://example.com'}
})
};
fetch('https://api.smry.ai/v1/feeds/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"monitor": {},
"subscription": {},
"limits": {}
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}{
"error": "cursor: expected a next_cursor from a previous response.",
"code": "invalid_request",
"field": "where.published_after",
"hint": "<string>",
"retryable": true,
"retryAfter": 123,
"details": "<string>"
}