Skip to content

One filtered, sorted, paged view of every monitor on the account: HTTP checks, heartbeats and browser checks together.

GET
/monitors
curl --request GET \
--url https://api.siteqwality.com/monitors \
--header 'Authorization: Bearer <token>'

total is the size of the whole filtered set, not the length of items.

This exists because the three monitor types cannot be paged separately and merged in the client. GET /monitors/list applies limit and offset to http_jobs and cron_jobs independently, so limit=10 can return twenty rows and one offset means two different things; browser checks were not in that endpoint at all and were merged in from an unfiltered list. A client asking for “the next page” of the combined array therefore asked for an offset that existed in none of the three sources, got nothing back, and concluded there was no more data while monitors it had never shown sat in the gap.

/monitors/list is unchanged: it is a documented public API surface.

limit
integer | null format: int64

Page size. Clamped to 1..=100.

offset
integer | null format: int64

Row offset into the filtered result set.

text
string | null

Free-text search over name and URI.

status
string | null

success, failed or pending_failure.

state
string | null

active or paused.

sort_field
string | null

Column to sort by. Unrecognized values fall back to the default order.

sort_order
string | null

asc or desc. Ignored without sort_field.

tags
Array<string>

Repeatable. A monitor matches when it carries every requested tag.

One page of monitors of every type

Media type application/json

One server-filtered, server-sorted page of the unified monitor list.

object
items
required
Array<object>

One row of the unified monitor list.

Fields are emitted as explicit null rather than omitted when they do not apply to the row’s type. The dashboard reads several of them positionally (an absent method and a null method are not the same thing to it), and bulk edit spreads the whole row back into an update request, so a missing key is a silently blanked setting rather than a cosmetic difference.

object
id
required
string format: uuid
monitor_type
required

http, cron or browser.

string
Allowed values: http cron browser
friendly_name

Display name. Browser checks store this as name; it is projected here so one column renderer serves all three types.

string | null
current_status
required

success, failed or (HTTP and browser only) pending_failure.

string
state
required

active or paused.

string
created_at
required
string format: date-time
last_status_change_at
string | null format: date-time
uptime_24h

Uptime percentage over the last 24h. HTTP monitors only, and null when the monitor has no checks in the window.

string | null
group_notifications

Notification groups, resolved in one batched query for the whole page.

array | null
object
id
required
string format: uuid
account_id
required
string format: uuid
friendly_name
required
string
delay_send_after_minutes
integer | null format: int32
resend_every_minutes
integer | null format: int32
created_at
required
string format: date-time
notifications
required
Array<object>
object
id
required
string format: uuid
account_id
required
string format: uuid
type
required
string
Allowed values: email sms slack webhook telegram discord microsoft_teams pagerduty opsgenie google_chat mattermost pushover pushbullet
details
required
One of:
object
email_address
required
string
created_at
required
string format: date-time
numb_of_sites
integer | null format: int64
service_id
string | null format: uuid
tags
array | null
last_run_at
string | null format: date-time
check_regions
array | null
min_healthy_regions
integer | null format: int32
timeout_ms

Milliseconds. Browser checks store seconds; the value is converted so the Timeout column reads true for them instead of blanking.

integer | null format: int32
uri
string | null
method

Explicitly null for heartbeats and browser checks. The dashboard’s legacy “no method means heartbeat” heuristic still exists as a fallback, so this must be present and null rather than omitted.

string | null
run_interval_seconds
integer | null format: int32
run_interval_thirty_seconds
boolean | null
follow_redirects
boolean | null
final_uri
string | null
keyword_search
string | null
keyword_search_inverted
boolean | null
keyword_search_case_sensitive
boolean | null
keyword_search_regex
boolean | null
request_body
string | null
content_type
One of:
null
auth_type
One of:
null
auth_username
string | null
has_auth

True when a basic-auth password or bearer token is stored for this monitor. The credentials themselves are write-only and are deliberately absent from this struct, so there is nothing here for a read-only viewer, a scoped API key, an M2M client or a read-only impersonation session to read back. See crate::model::api::secrets.

Bulk edit spreads a row back into an update request, and the update statement writes COALESCE($n, auth_password), so an absent key leaves the stored credential alone. That is why these two can be dropped from the shape outright rather than emitted as null.

boolean
success_http_codes
array | null
failure_http_codes
array | null
custom_http_headers

Header NAMES only: every value is replaced by secrets::REDACTED. Sending the placeholder back on an update keeps the stored value.

object | null
tls_job_id
string | null format: uuid
monitor_tls
required
boolean
dns_job_id
string | null format: uuid
monitor_dns
required
boolean
page_speed_job_id
string | null format: uuid
monitor_page_speed
required
boolean
http_version
One of:
null
confirmation_threshold
integer | null format: int32
check_interval_seconds
integer | null format: int32
last_received_at
string | null format: date-time
last_checked_at
string | null format: date-time
frequency

Browser check cadence label (5m, 10m, 15m, 30m, 1h).

string | null
timeout_seconds
integer | null format: int32
total
required

Number of monitors matching the filters, across every page. This is what “X-Y of N” is built from; it is not the length of items.

integer format: int64
Example
{
"items": [
{
"monitor_type": "http",
"group_notifications": [
{
"notifications": [
{
"type": "email",
"details": {
"pagerduty_severity": "critical"
}
}
]
}
],
"content_type": "json",
"auth_type": "basic",
"http_version": "auto"
}
]
}

Missing or invalid authentication

Internal server error