GET /v1/monitors
List your monitors and your plan limits.
Your monitors and the limits block (monitors and checks used against your
plan). cursor is the next_cursor of the last page.
Parameters
| name |
in |
required |
type or values |
what it is |
cursor |
query |
no |
string |
The next_cursor of the previous page, unchanged. Absent means the first page. |
limit |
query |
no |
integer, 1 to 100; default 50 |
Rows per page, 1 to 100. |
q |
query |
no |
string |
Part of the monitor name, at most 128 characters. |
status |
query |
no |
active, paused, failing |
|
sort |
query |
no |
next_run, last_change, credits; default next_run |
|
Answers
| status |
what it means |
200 |
Your monitors. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
POST /v1/monitors
Create a monitor.
Watches one page or a list of up to 100 pages on a schedule. Checks run on
the batch path: each delivered page costs its normal price plus monitor_check
(1 credit); failed, blocked and skipped checks are free. Plan caps are
checked here: monitors_max, the plan’s fastest schedule and
monitor_checks_month. There is no Idempotency-Key: a retried create makes a
second monitor.
Body
| field |
required |
type or values |
what it is |
name |
yes |
string |
Your label. Required on create; quote and test fill in their own. |
target |
no |
page, list |
Default page for one URL, list for more. site is refused in the beta. |
urls |
yes |
array of string |
|
scope |
no |
main, fields; default main |
main compares the page text as markdown; fields compares the extract rules one by one. selector is refused in the beta. |
extract |
no |
string |
With scope fields, required. name:css rules joined by |, as on POST /v1. |
ignore |
no |
array of object |
|
notify |
no |
changed, every_run; default changed |
|
webhook_url |
no |
string or null |
https only. Signed like batch.completed. |
every |
no |
1h, 6h, 12h, 1d, 7d |
A preset. Send every, or cron with timezone. Start times are spread by up to 5 minutes. |
cron |
no |
string |
Five parts (minute hour day month weekday), numbers, *, ranges, steps and lists only. No faster than your plan allows. |
timezone |
no |
string |
An IANA name. Needed with cron. |
max_credits_month |
no |
integer or null |
The monitor pauses when a check would pass it, and starts again on the 1st (UTC). |
goal |
no |
null |
Not offered in the beta. Any value but null is refused. |
Answers
| status |
what it means |
201 |
The monitor, with estimate. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
403 |
monitor_limit, monitor_checks_exceeded, forbidden_target or wrong_scope. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
POST /v1/monitors/quote
Price a monitor before you save it.
Takes the create body (name optional) and answers credits a month. The page
price comes from monitor_id’s own checks in the last 30 days, else a range: low
and high are the cheapest and the dearest route your plan allows. price_source
says which.
Parameters
| name |
in |
required |
type or values |
what it is |
monitor_id |
query |
no |
string |
When you edit a monitor, its id, so the price uses its last 30 days. |
Body
| field |
required |
type or values |
what it is |
name |
no |
string |
Your label. Required on create; quote and test fill in their own. |
target |
no |
page, list |
Default page for one URL, list for more. site is refused in the beta. |
urls |
yes |
array of string |
|
scope |
no |
main, fields; default main |
main compares the page text as markdown; fields compares the extract rules one by one. selector is refused in the beta. |
extract |
no |
string |
With scope fields, required. name:css rules joined by |, as on POST /v1. |
ignore |
no |
array of object |
|
notify |
no |
changed, every_run; default changed |
|
webhook_url |
no |
string or null |
https only. Signed like batch.completed. |
every |
no |
1h, 6h, 12h, 1d, 7d |
A preset. Send every, or cron with timezone. Start times are spread by up to 5 minutes. |
cron |
no |
string |
Five parts (minute hour day month weekday), numbers, *, ranges, steps and lists only. No faster than your plan allows. |
timezone |
no |
string |
An IANA name. Needed with cron. |
max_credits_month |
no |
integer or null |
The monitor pauses when a check would pass it, and starts again on the 1st (UTC). |
goal |
no |
null |
Not offered in the beta. Any value but null is refused. |
Answers
| status |
what it means |
200 |
The estimate. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
403 |
forbidden_target. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
POST /v1/monitors/test
Run a dry test of up to 3 pages.
Fetches the first 3 pages of the body now, billed like a batch (failures
free, no monitor_check), and answers what the monitor would compare. Waits up
to 60 s; still running after that answers 202 with test_id, then send the same
body to POST /v1/monitors/test/{id}. A finished test is read once and erased.
At most 3 tests run at once: a fourth is 429 rate_limited with Retry-After: 30.
Body
| field |
required |
type or values |
what it is |
name |
no |
string |
Your label. Required on create; quote and test fill in their own. |
target |
no |
page, list |
Default page for one URL, list for more. site is refused in the beta. |
urls |
yes |
array of string |
|
scope |
no |
main, fields; default main |
main compares the page text as markdown; fields compares the extract rules one by one. selector is refused in the beta. |
extract |
no |
string |
With scope fields, required. name:css rules joined by |, as on POST /v1. |
ignore |
no |
array of object |
|
notify |
no |
changed, every_run; default changed |
|
webhook_url |
no |
string or null |
https only. Signed like batch.completed. |
every |
no |
1h, 6h, 12h, 1d, 7d |
A preset. Send every, or cron with timezone. Start times are spread by up to 5 minutes. |
cron |
no |
string |
Five parts (minute hour day month weekday), numbers, *, ranges, steps and lists only. No faster than your plan allows. |
timezone |
no |
string |
An IANA name. Needed with cron. |
max_credits_month |
no |
integer or null |
The monitor pauses when a check would pass it, and starts again on the 1st (UTC). |
goal |
no |
null |
Not offered in the beta. Any value but null is refused. |
Answers
| status |
what it means |
200 |
The test. |
202 |
Still running. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
403 |
forbidden_target. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
POST /v1/monitors/test/{id}
Read a dry test that was still running.
Send the same body as the test. 202 while it runs; 200 once, then the test
is erased and answers 404.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
The test_id of POST /v1/monitors/test. |
Body
| field |
required |
type or values |
what it is |
name |
no |
string |
Your label. Required on create; quote and test fill in their own. |
target |
no |
page, list |
Default page for one URL, list for more. site is refused in the beta. |
urls |
yes |
array of string |
|
scope |
no |
main, fields; default main |
main compares the page text as markdown; fields compares the extract rules one by one. selector is refused in the beta. |
extract |
no |
string |
With scope fields, required. name:css rules joined by |, as on POST /v1. |
ignore |
no |
array of object |
|
notify |
no |
changed, every_run; default changed |
|
webhook_url |
no |
string or null |
https only. Signed like batch.completed. |
every |
no |
1h, 6h, 12h, 1d, 7d |
A preset. Send every, or cron with timezone. Start times are spread by up to 5 minutes. |
cron |
no |
string |
Five parts (minute hour day month weekday), numbers, *, ranges, steps and lists only. No faster than your plan allows. |
timezone |
no |
string |
An IANA name. Needed with cron. |
max_credits_month |
no |
integer or null |
The monitor pauses when a check would pass it, and starts again on the 1st (UTC). |
goal |
no |
null |
Not offered in the beta. Any value but null is refused. |
Answers
| status |
what it means |
200 |
The test. |
202 |
Still running. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
GET /v1/monitors/{id}
Read one monitor.
An id of another account answers 404, never 403.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
Answers
| status |
what it means |
200 |
The monitor. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
DELETE /v1/monitors/{id}
Delete a monitor, its snapshots and its diffs.
Works with any key of the account, a scrape key or an account key. Cancels a check in flight (its
queued pages are refunded), erases every snapshot and diff, then deletes the
monitor and its history. If the snapshots cannot be erased, it answers 503
busy with Retry-After and deletes nothing. It cannot be undone.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
Answers
| status |
what it means |
204 |
Deleted. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
PATCH /v1/monitors/{id}
Edit, pause or resume a monitor.
Send only what changes. paused true pauses; paused false resumes and checks
monitor_checks_month again. Any edit brings back dropped pages. Changing
scope, ignore or the scrape parameters starts the snapshots over (the next
check is new, not changed) and answers 409 monitor_running while a check runs.
null clears webhook_url, max_credits_month or one scrape parameter.
A plan downgrade keeps existing schedules until you change them; the monthly
checks cap still applies to scheduled checks, run now and any edit that adds
checks. A scheduled check over the cap is skipped for free and pauses the
monitor with checks_cap until the 1st (UTC).
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
Body
| field |
required |
type or values |
what it is |
paused |
no |
boolean |
|
name |
no |
string |
Your label. Required on create; quote and test fill in their own. |
target |
no |
page, list |
Default page for one URL, list for more. site is refused in the beta. |
urls |
yes |
array of string |
|
scope |
no |
main, fields; default main |
main compares the page text as markdown; fields compares the extract rules one by one. selector is refused in the beta. |
extract |
no |
string |
With scope fields, required. name:css rules joined by |, as on POST /v1. |
ignore |
no |
array of object |
|
notify |
no |
changed, every_run; default changed |
|
webhook_url |
no |
string or null |
https only. Signed like batch.completed. |
every |
no |
1h, 6h, 12h, 1d, 7d |
A preset. Send every, or cron with timezone. Start times are spread by up to 5 minutes. |
cron |
no |
string |
Five parts (minute hour day month weekday), numbers, *, ranges, steps and lists only. No faster than your plan allows. |
timezone |
no |
string |
An IANA name. Needed with cron. |
max_credits_month |
no |
integer or null |
The monitor pauses when a check would pass it, and starts again on the 1st (UTC). |
goal |
no |
null |
Not offered in the beta. Any value but null is refused. |
Answers
| status |
what it means |
200 |
The monitor. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
403 |
monitor_checks_exceeded. Only an edit that adds checks to this monitor, or resuming a monitor paused by you or after failed checks, is refused; a rename passes after a plan downgrade. |
404 |
not_found. No monitor with that id in your account. |
409 |
monitor_running. A check is running; edit urls, target, scope, ignore or the scrape parameters after it ends. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
POST /v1/monitors/{id}/run
Run a check now.
Moves the next check to now. It is billed like a scheduled check and counts
toward max_credits_month. 409 monitor_running while a check runs, 409
monitor_paused on a paused monitor, 409 monitor_too_soon when the last
check is closer than your plan’s fastest schedule (Retry-After in seconds).
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
Answers
| status |
what it means |
202 |
Queued. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
403 |
monitor_checks_exceeded. This month’s page checks plus this run’s pages would pass your plan’s monthly checks. |
404 |
not_found. No monitor with that id in your account. |
409 |
monitor_running, monitor_paused, or monitor_too_soon (the last check was sooner than your plan’s fastest schedule; Retry-After says when). |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
GET /v1/monitors/{id}/checks
List the checks of a monitor.
Newest first. History is kept 30 days.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
cursor |
query |
no |
string |
The next_cursor of the last page (a check id). |
limit |
query |
no |
integer, 1 to 100; default 50 |
Rows per page, 1 to 100. |
outcome |
query |
no |
new, same, changed, failed, skipped |
|
Answers
| status |
what it means |
200 |
The checks. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
GET /v1/monitors/{id}/checks/{check_id}
Read one check with its diff.
The diff object carries each page’s outcome, its url, and its diff (markdown)
or fields (JSON). Over 1 MB the diffs are left out (diff_omitted); read one
page with page=N, or download the whole object from download_url.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
check_id |
path |
yes |
string |
|
page |
query |
no |
integer |
Return only this page of the check, by position. |
Answers
| status |
what it means |
200 |
The check. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |
GET /v1/monitors/{id}/pages/{position}/snapshot
Download the current snapshot of one page.
A short-lived download link to what the next check compares against.
Parameters
| name |
in |
required |
type or values |
what it is |
id |
path |
yes |
string |
|
position |
path |
yes |
integer |
The page’s place in urls, from 1. |
Answers
| status |
what it means |
200 |
The link. |
400 |
bad_parameter. error.field names the parameter; the message says which values work. An unknown query key is this 400 too. |
401 |
bad_token. The key is missing, not valid, expired, revoked, of an unknown prefix or wrong length, or sent as the api_key query parameter, which no route accepts. |
404 |
not_found. No monitor with that id in your account. |
429 |
rate_limited. Too many requests to this endpoint right now. Wait Retry-After seconds, then send the same request again. |
500 |
internal. Our bug. Try again in a minute; if it stays, report the X-Request-Id. |
503 |
busy. A store we need did not answer, or is not configured on this server. Send the same request again after the Retry-After seconds. |