> For the complete documentation index, see [llms.txt](https://docs.visualsentinel.com/llms.txt)

# Monitors API

Website and endpoint monitoring CRUD and operations. This page lists all 51 endpoints in the Monitors area of the Visual Sentinel REST API.

Base URL: `https://visualsentinel.com`. Unless an endpoint says otherwise it accepts an API key or a session cookie, see [Authentication](https://docs.visualsentinel.com/guides/authentication.md). Most error responses use the [ErrorResponse](https://docs.visualsentinel.com/reference/models/error-response.md) shape, see [Errors](https://docs.visualsentinel.com/guides/errors.md) and [Rate limits](https://docs.visualsentinel.com/guides/rate-limits.md).

## Endpoints

- [List monitors](#list-monitors): `GET /api/monitors`
- [Create monitor](#create-monitor): `POST /api/monitors`
- [Bulk delete monitors](#bulk-delete-monitors): `DELETE /api/monitors`
- [Get monitor](#get-monitor): `GET /api/monitors/{id}`
- [Update monitor](#update-monitor): `PUT /api/monitors/{id}`
- [Delete monitor](#delete-monitor): `DELETE /api/monitors/{id}`
- [Trigger manual check](#trigger-check): `POST /api/monitors/{id}/check`
- [Get check history](#get-monitor-checks): `GET /api/monitors/{id}/checks`
- [Get uptime statistics](#get-uptime): `GET /api/monitors/{id}/uptime`
- [Get response time metrics](#get-response-time): `GET /api/monitors/{id}/response-time`
- [Get DNS records](#get-monitor-dns): `GET /api/monitors/{id}/dns`
- [Get PageSpeed data](#get-monitor-pagespeed): `GET /api/monitors/{id}/pagespeed`
- [Trigger PageSpeed check](#trigger-monitor-pagespeed): `POST /api/monitors/{id}/pagespeed`
- [Get content snapshots](#get-monitor-snapshots): `GET /api/monitors/{id}/snapshots`
- [Get monitor notification channels](#get-monitor-channels): `GET /api/monitors/{id}/channels`
- [Update monitor notification channels](#update-monitor-channels): `PUT /api/monitors/{id}/channels`
- [Get anomalies](#get-monitor-anomalies): `GET /api/monitors/{id}/anomalies`
- [Create anomaly](#create-monitor-anomaly): `POST /api/monitors/{id}/anomalies`
- [Update anomaly](#update-monitor-anomaly): `PATCH /api/monitors/{id}/anomalies`
- [Get monitor report](#get-monitor-report): `GET /api/monitors/{id}/report`
- [Generate monitor report](#generate-monitor-report): `POST /api/monitors/{id}/report`
- [Update monitor report settings](#update-monitor-report): `PUT /api/monitors/{id}/report`
- [List sub-pages](#list-sub-pages): `GET /api/monitors/{id}/sub-pages`
- [Add sub-page](#add-sub-page): `POST /api/monitors/{id}/sub-pages`
- [Update sub-page](#update-sub-page): `PUT /api/monitors/{id}/sub-pages`
- [Delete sub-page](#delete-sub-page): `DELETE /api/monitors/{id}/sub-pages`
- [Get monitor alert settings](#get-monitor-alert-settings): `GET /api/monitors/alert-settings`
- [Bulk update monitor alerts](#bulk-update-alerts): `PUT /api/monitors/bulk-alerts`
- [Content change detection](#check-content): `POST /api/monitors/content`
- [Export monitors](#export-monitors): `GET /api/monitors/export`
- [Test monitor URL](#test-monitor): `POST /api/monitors/test`
- [Populate favicons](#populate-favicons): `POST /api/monitors/populate-favicons`
- [Restore a deleted monitor](#restore-monitor): `POST /api/monitors/{id}/restore`
- [List recently deleted monitors](#list-deleted-monitors): `GET /api/monitors/deleted`
- [List service dependencies](#list-service-dependencies): `GET /api/dependencies`
- [Get a service's provider status](#get-service-dependency-status): `GET /api/dependencies/{slug}`
- [Choose the parts a service monitor follows](#update-service-dependency-components): `PATCH /api/dependencies/{slug}`
- [Check region availability](#get-monitoring-regions): `GET /api/monitoring/regions`
- [Resume a monitor's alert email to an unsubscribed address](#resume-monitor-alert-email): `DELETE /api/monitors/{id}/alert-email-mute`
- [Mute a monitor's alerts](#mute-monitor-alerts): `POST /api/monitors/{id}/mute`
- [Unmute a monitor's alerts](#unmute-monitor-alerts): `DELETE /api/monitors/{id}/mute`
- [Match a monitor to your servers](#resolve-monitor-servers): `POST /api/monitors/{id}/resolve`
- [List servers linked to a monitor](#list-monitor-servers): `GET /api/monitors/{id}/servers`
- [Link a server to a monitor](#link-monitor-server): `POST /api/monitors/{id}/servers`
- [Confirm or dismiss a server link](#update-monitor-server-link): `PATCH /api/monitors/{id}/servers/{msId}`
- [Remove a server link](#unlink-monitor-server): `DELETE /api/monitors/{id}/servers/{msId}`
- [Delete a batch of monitors](#bulk-remove-monitors): `POST /api/monitors/bulk-delete`
- [Pause or resume a batch of monitors](#bulk-set-monitors-enabled): `PUT /api/monitors/bulk-enabled`
- [Change settings on a batch of monitors](#bulk-update-monitor-settings): `PUT /api/monitors/bulk-settings`
- [Add tags to a batch of monitors](#bulk-add-monitor-tags): `PUT /api/monitors/bulk-tags`
- [Link a batch of monitors to a server](#bulk-link-monitors-to-server): `POST /api/monitors/bulk-link-server`

## List monitors

`GET /api/monitors`

Get all monitors for the current organization with pagination and filtering.

**Parameters**

- `page` (query, integer, optional): Page number. Results are paginated only when `page` is sent; otherwise up to 2,000 monitors are returned in one response. Default: `1`. Minimum 1.
- `limit` (query, integer, optional): Default: `50`. Minimum 1, maximum 100.
- `status` (query, string, optional): Filter by status. `all` (or no value) returns every monitor; `paused` returns paused monitors. One of: `all`, `operational`, `degraded`, `down`, `pending`, `changed`, `paused`.
- `scope` (query, string, optional): Product-level one-tap scope. api includes API and GraphQL; site includes every other monitor type. One of: `site`, `api`.
- `type` (query, string, optional): Filter by monitor type. One value or a comma-separated list, any case, for example `api,graphql`. Values: see StoredMonitorType.
- `enabled` (query, boolean, optional)
- `search` (query, string, optional): Search by name or URL
- `tags` (query, string, optional): Comma-separated list of tags
- `sortBy` (query, string, optional): One of: `createdAt`, `name`, `status`, `uptime`. Default: `createdAt`.
- `sortOrder` (query, string, optional): One of: `asc`, `desc`. Default: `desc`.
- `includeSummary` (query, boolean, optional): On page 1, include exact fleet-wide status/type counts and average uptime without loading every monitor row. Default: `false`.

**Responses**

- `200`: List of monitors. By default (no `page` query parameter) the response is a bare array of Monitor objects for backward compatibility. When the request sends `Accept: application/json` AND includes a `page` query parameter, the response is the `data`-wrapped paginated envelope shown below. Body: array of [Monitor](https://docs.visualsentinel.com/reference/models/monitor.md) or [MonitorListResponse](https://docs.visualsentinel.com/reference/models/monitor-list-response.md).

## Create monitor

`POST /api/monitors`

Create a website or endpoint monitor. Uptime checks start right away. Use `locations` for check regions (EU, US, ASIA) and `visualEnabled` / `visualRegion` for screenshots.

Request body (required): [CreateMonitorRequest](https://docs.visualsentinel.com/reference/models/create-monitor-request.md).

**Responses**

- `200`: Monitor created. Body: [Monitor](https://docs.visualsentinel.com/reference/models/monitor.md).
- `400`: Validation failed. Codes include `INVALID_LOCATION`, `LOCATION_UNSUPPORTED_FOR_TYPE`, `REGION_UNAVAILABLE`, `INVALID_API_CONFIG`, `INVALID_ASSERTION_PATTERN`, `unsafe_url` and `domain_not_found`.
- `403`: Plan or role restriction: `LIMIT_EXCEEDED` (monitor or visual slot limit), `FEATURE_RESTRICTED`, `LOCATION_RESTRICTED`, `VISUAL_VIEWPORT_LIMIT`, or an API key without `monitors:write`.
- `409`: `DEPENDENCY_EXISTS`: that service is already monitored.
- `429`: Too many monitors created in the last hour.

## Bulk delete monitors

`DELETE /api/monitors`

Delete multiple monitors at once.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ids` | array of string (uuid) | Yes |   |

**Responses**

- `200`: Monitors deleted. Body: object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `message` | string | No |   |
| `deletedCount` | integer | No |   |

## Get monitor

`GET /api/monitors/{id}`

Get detailed information about a specific monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Monitor details. Body: [Monitor](https://docs.visualsentinel.com/reference/models/monitor.md).
- `404`: Monitor not found.

## Update monitor

`PUT /api/monitors/{id}`

Update a monitor. Every field is optional; send only what changes. Send `enabled: false` to pause and `enabled: true` to resume. `locations` and `visualRegion` move checks between regions (EU, US, ASIA).

**Parameters**

- `id` (path, string (uuid), required)

Request body (required): [UpdateMonitorRequest](https://docs.visualsentinel.com/reference/models/update-monitor-request.md).

**Responses**

- `200`: Monitor updated. Body: [Monitor](https://docs.visualsentinel.com/reference/models/monitor.md).
- `400`: Validation failed. Codes include `INVALID_LOCATION`, `LOCATION_UNSUPPORTED_FOR_TYPE`, `REGION_UNAVAILABLE`, `INVALID_API_CONFIG` (also: `apiConfig` that differs from the saved value on a monitor that is not API or GRAPHQL), `INVALID_KEYWORD_CONFIG` (an unknown field inside `keywordConfig`, or `enabled: true` for a keyword check with no words), `UNSUPPORTED_FIELD` (`retryCount`, `retryDelay`, `environment`, `priority` or `expectedHeaders`, which are not stored; `fields` lists them) and `INVALID_ASSERTION_PATTERN`.
- `403`: Plan or role restriction, for example `LOCATION_RESTRICTED` or `FEATURE_RESTRICTED`.
- `404`: Monitor not found.
- `409`: `ASSERTIONS_CHANGED`: the stored response checks changed since `expectedAssertions` was read.

## Delete monitor

`DELETE /api/monitors/{id}`

Delete a monitor. The monitor and its history can be restored for 24 hours via the restore endpoint; after that it is permanently removed.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Monitor deleted.

## Trigger manual check

`POST /api/monitors/{id}/check`

Manually trigger a monitor check and get immediate results.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Check result. Body: [CheckResult](https://docs.visualsentinel.com/reference/models/check-result.md).

## Get check history

`GET /api/monitors/{id}/checks`

Get recent check results for a monitor with timing breakdown (DNS, connect, TLS, TTFB). Supports time range filtering and optional response body inclusion for API monitors.

**Parameters**

- `id` (path, string (uuid), required)
- `limit` (query, integer, optional): Number of checks to return Default: `50`. Minimum 1, maximum 500.
- `timeRange` (query, string, optional): Time range to fetch checks for One of: `1h`, `6h`, `24h`, `7d`, `30d`. Default: `24h`.
- `includeBody` (query, boolean, optional): Include response body (API monitors only, increases payload size) Default: `false`.

**Responses**

- `200`: Check history. Body: object.
- `404`: Monitor not found.
- `503`: Database unavailable.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `checks` | array of object | No |   |
| `checks[].id` | string | No |   |
| `checks[].status` | string | No | One of: `SUCCESS`, `FAILURE`, `TIMEOUT`, `ERROR`. |
| `checks[].statusCode` | integer or null | No |   |
| `checks[].responseTime` | number or null | No | Total response time in ms |
| `checks[].location` | string or null | No | Checker source location for this result. |
| `checks[].error` | string or null | No |   |
| `checks[].createdAt` | string (date-time) | No |   |
| `checks[].assertionResults` | any | No | API assertion results if configured |
| `checks[].responseBody` | string or null | No | Only included when includeBody=true |
| `checks[].firstByteTime` | number or null | No | Time to first byte in ms |
| `checks[].dnsTime` | number or null | No | DNS resolution time in ms |
| `checks[].connectTime` | number or null | No | TCP connection time in ms |
| `checks[].tlsTime` | number or null | No | TLS handshake time in ms |

## Get uptime statistics

`GET /api/monitors/{id}/uptime`

Get uptime percentage and history for a monitor.

**Parameters**

- `id` (path, string (uuid), required)
- `period` (query, string, optional): Preset window. `window` is accepted as an alias. One of: `1h`, `6h`, `24h`, `7d`, `30d`, `90d`, `365d`. Default: `24h`.
- `from` (query, string, optional): Custom range start (ISO date or date-time). Send with `to`.
- `to` (query, string, optional): Custom range end (ISO date or date-time, a date includes that whole day).

**Responses**

- `200`: Uptime statistics. Body: [UptimeResponse](https://docs.visualsentinel.com/reference/models/uptime-response.md).

## Get response time metrics

`GET /api/monitors/{id}/response-time`

Get response time history and statistics.

**Parameters**

- `id` (path, string (uuid), required)
- `period` (query, string, optional): One of: `1h`, `24h`, `7d`, `30d`. Default: `24h`.

**Responses**

- `200`: Response time metrics. Body: [ResponseTimeResponse](https://docs.visualsentinel.com/reference/models/response-time-response.md).

## Get DNS records

`GET /api/monitors/{id}/dns`

Get DNS record details for a monitor's domain.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: DNS records for the monitor's domain.

## Get PageSpeed data

`GET /api/monitors/{id}/pagespeed`

Get cached PageSpeed Insights data for a monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: PageSpeed results. Body: object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `metrics` | object or null | No | The last successful result is retained when later tests fail. |
| `metrics.fetchedAt` | string (date-time) | No | When the result was measured. |
| `lastError` | [PageSpeedFailure](https://docs.visualsentinel.com/reference/models/page-speed-failure.md) | No |   |

## Trigger PageSpeed check

`POST /api/monitors/{id}/pagespeed`

Trigger a fresh PageSpeed Insights analysis.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: PageSpeed analysis triggered.

## Get content snapshots

`GET /api/monitors/{id}/snapshots`

Get content change detection snapshots for a monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Content snapshots.

## Get monitor notification channels

`GET /api/monitors/{id}/channels`

Get notification channels assigned to a specific monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Assigned notification channels.

## Update monitor notification channels

`PUT /api/monitors/{id}/channels`

Set which notification channels are assigned to a monitor.

**Parameters**

- `id` (path, string (uuid), required)

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `channelIds` | array of string (uuid) | No |   |

**Responses**

- `200`: Channels updated.

## Get anomalies

`GET /api/monitors/{id}/anomalies`

Get detected anomalies for a monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Anomaly data.

## Create anomaly

`POST /api/monitors/{id}/anomalies`

Manually create an anomaly record for a monitor.

Authentication: session cookie only. API keys are refused.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `201`: Anomaly created.

## Update anomaly

`PATCH /api/monitors/{id}/anomalies`

Update or acknowledge an anomaly.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Anomaly updated.

## Get monitor report

`GET /api/monitors/{id}/report`

Get a comprehensive report for a monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Monitor report data.

## Generate monitor report

`POST /api/monitors/{id}/report`

Trigger generation of a new report for a monitor.

Authentication: session cookie only. API keys are refused.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Report generated.

## Update monitor report settings

`PUT /api/monitors/{id}/report`

Update report generation settings for a monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Report settings updated.

## List sub-pages

`GET /api/monitors/{id}/sub-pages`

Get all sub-pages configured for visual monitoring on this monitor.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: List of sub-pages.

## Add sub-page

`POST /api/monitors/{id}/sub-pages`

Add a new sub-page for visual monitoring.

**Parameters**

- `id` (path, string (uuid), required)

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `path` | string | Yes |   |
| `name` | string | No |   |

**Responses**

- `201`: Sub-page added.

## Update sub-page

`PUT /api/monitors/{id}/sub-pages`

Update a sub-page configuration: rename it, turn it on or off, reset its baseline to the newest capture, or accept one of its captures (`setBaselineFile`) as the baseline. `setBaselineFile` must name a capture of this sub-page (of the given `visualTargetId`, or of its desktop target when left out); any other file name returns 400 `BASELINE_FILE_NOT_FOUND`.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Sub-page updated.
- `400`: Invalid request, or `BASELINE_FILE_NOT_FOUND` (the file is not a capture of this sub-page).
- `404`: Monitor, sub-page or visual target not found.

## Delete sub-page

`DELETE /api/monitors/{id}/sub-pages`

Remove a sub-page from visual monitoring.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Sub-page deleted.

## Get monitor alert settings

`GET /api/monitors/alert-settings`

Get alert settings for all monitors in the organization.

**Responses**

- `200`: Monitor alert settings.

## Bulk update monitor alerts

`PUT /api/monitors/bulk-alerts`

Changes alert settings and notification channels on up to 2,000 monitors in one all-or-nothing change. Every monitor and channel must belong to your organization, or nothing changes. Any role except Viewer; API keys need the `monitors:write` scope. Limited to 30 requests per minute per organization.

Request body (required): [BulkUpdateAlertsRequest](https://docs.visualsentinel.com/reference/models/bulk-update-alerts-request.md).

**Responses**

- `200`: Updated. Body: object.
- `400`: Fails validation (`details` holds `formErrors` and `fieldErrors`)
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, the API key lacks the `monitors:write` scope or plan API access, a monitor ID is not in your organization or repeats, or a channel ID is not in your organization.
- `429`: More than 30 requests in a minute to this bulk route for the organization. Header `Retry-After`: Seconds until the window resets. Header `X-RateLimit-Limit`. Header `X-RateLimit-Remaining`. Header `X-RateLimit-Reset`: ISO time the window resets. Body: [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `updatedCount` | integer | No | Monitors whose alert fields were updated, or the number of IDs sent when `updates` changed no fields. |

## Content change detection

`POST /api/monitors/content`

Check content changes for a URL.

**Responses**

- `200`: Content check result.

## Export monitors

`GET /api/monitors/export`

Export all monitors data as CSV or JSON.

**Parameters**

- `format` (query, string, optional): One of: `csv`, `json`. Default: `csv`.

**Responses**

- `200`: Exported monitor data.

## Test monitor URL

`POST /api/monitors/test`

Test a URL before creating a monitor to verify it's reachable.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string (uri) | Yes |   |

**Responses**

- `200`: Test result.

## Populate favicons

`POST /api/monitors/populate-favicons`

Fetch and store favicons for all monitors that don't have one.

**Responses**

- `200`: Favicons populated.

## Restore a deleted monitor

`POST /api/monitors/{id}/restore`

Restore a monitor deleted within the last 24 hours, including its full check and incident history. Returns 410 when the restore window has passed.

**Parameters**

- `id` (path, string (uuid), required)

**Responses**

- `200`: Monitor restored.
- `404`: Monitor not found or not deleted.
- `410`: Restore window has passed.

## List recently deleted monitors

`GET /api/monitors/deleted`

Monitors deleted within the last 24 hours that can still be restored.

**Responses**

- `200`: List of restorable monitors.

## List service dependencies

`GET /api/dependencies`

The catalog of third-party services you can monitor as dependencies, each with your workspace's monitor for it when you have one. API keys need the `monitors:read` scope.

**Responses**

- `200`: Service catalog with your monitors. Body: [ServiceDependencyCatalog](https://docs.visualsentinel.com/reference/models/service-dependency-catalog.md).
- `401`: Not signed in, or no valid API key.
- `403`: The key lacks the monitors:read scope, or the plan does not include API access.
- `500`: The catalog could not be loaded.

## Get a service's provider status

`GET /api/dependencies/{slug}`

What the service's provider reports on its own status page right now: overall state, each part (component), open incidents and scheduled maintenance. When the provider publishes no feed we can read, `available` is false and `statusUrl` still links to its public status page. API keys need the `monitors:read` scope.

**Parameters**

- `slug` (path, string, required): Service slug from GET /api/dependencies, e.g. `github`.

**Responses**

- `200`: Provider status, or why there is none. Body: [ServiceDependencyStatus](https://docs.visualsentinel.com/reference/models/service-dependency-status.md) or [ServiceDependencyNoFeed](https://docs.visualsentinel.com/reference/models/service-dependency-no-feed.md).
- `401`: Not signed in, or no valid API key.
- `403`: The key lacks the monitors:read scope, or the plan does not include API access.
- `404`: Unknown service.
- `502`: The provider's status feed is not answering right now.

## Choose the parts a service monitor follows

`PATCH /api/dependencies/{slug}`

Sets which of the provider's parts (components) your monitor for this service alerts on. An empty list follows everything the provider reports. The monitor must exist (start monitoring the service first) and the provider must publish a status feed. Requires a role that can change monitors; API keys need the `monitors:write` scope.

**Parameters**

- `slug` (path, string, required): Service slug from GET /api/dependencies, e.g. `github`.

Request body (required): [UpdateServiceDependencyComponentsRequest](https://docs.visualsentinel.com/reference/models/update-service-dependency-components-request.md).

**Responses**

- `200`: Saved. Body: [UpdateServiceDependencyComponentsResponse](https://docs.visualsentinel.com/reference/models/update-service-dependency-components-response.md).
- `400`: Invalid selection, or the service has no status feed to follow parts of.
- `401`: Not signed in, or no valid API key.
- `403`: Your role cannot change monitors, the key lacks the monitors:write scope, or the plan does not include API access.
- `404`: Unknown service, or no monitor for it in this workspace yet.
- `409`: One or more of the parts are no longer listed by the provider.
- `502`: The provider's status feed is not answering right now.

## Check region availability

`GET /api/monitoring/regions`

Whether this workspace can use the Asia Pacific (ASIA) region for uptime `locations` and `visualRegion`. Use ASIA only when both `apac.available` and `apacAllowed` are true; otherwise monitor create and update with ASIA return 400 `REGION_UNAVAILABLE` (or 403 `LOCATION_RESTRICTED` when the plan excludes it). EU and US do not depend on this check. API key scope: `monitors:read`.

**Responses**

- `200`: Region availability. Body: object.
- `403`: No organization membership, or an API key without `monitors:read`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `apac` | object | Yes |   |
| `apac.available` | boolean | Yes | A healthy Asia Pacific check node is online. |
| `apac.label` | string | Yes | Display name of the region. |
| `apacAllowed` | boolean | Yes | This workspace is enabled for Asia Pacific and its plan allows the region. |

## Resume a monitor's alert email to an unsubscribed address

`DELETE /api/monitors/{id}/alert-email-mute`

Turns a monitor's alert email back on for an address that used the unsubscribe link of one of its alert emails. Each unsubscribe is listed in `emailMutes` of GET /api/notification-channels. Other addresses and channels are not affected. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `address` | string (email) | Yes | The address that unsubscribed. |

**Responses**

- `200`: Alert email to the address is on again. Body: object.
- `400`: No address, or a body that is not JSON.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Monitor not found, or the address is not unsubscribed from it.
- `503`: Service temporarily unavailable.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `resumed` | constant `true` | Yes |   |

## Mute a monitor's alerts

`POST /api/monitors/{id}/mute`

Stops this monitor's alerts from going to any notification channel for the chosen duration. Checks keep running, incidents still open and close, alerts still appear in the dashboard, and possible-malware alerts are always sent; a new request replaces the current end time. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

Request body (required): [MonitorAlertMuteRequest](https://docs.visualsentinel.com/reference/models/monitor-alert-mute-request.md).

**Responses**

- `200`: Muted. Body: [MonitorAlertMuteResponse](https://docs.visualsentinel.com/reference/models/monitor-alert-mute-response.md).
- `400`: Body is not JSON, or `durationMinutes` is not 60, 480, 1440 or 10080 (the response then lists `allowedDurationMinutes`) Body: object.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Monitor not found.
- `503`: Service temporarily unavailable.

## Unmute a monitor's alerts

`DELETE /api/monitors/{id}/mute`

Ends the monitor's alert mute at once. Alerts held back during the mute are not sent afterwards; a problem that is still going alerts again at its next reminder. Succeeds when the monitor is not muted. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

**Responses**

- `200`: Unmuted (`alertsMutedUntil` is null) Body: [MonitorAlertMuteResponse](https://docs.visualsentinel.com/reference/models/monitor-alert-mute-response.md).
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Monitor not found.
- `503`: Service temporarily unavailable.

## Match a monitor to your servers

`POST /api/monitors/{id}/resolve`

Looks up the addresses the monitor's URL points to now (with origin addresses behind Cloudflare when a Cloudflare integration is connected), saves them on the monitor, and records matching servers as suggestions. Dismissed and manual links are never changed; automatic links can be confirmed, moved, or returned to a suggestion when the site's address changed. Takes no body. Any role except Viewer; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

**Responses**

- `200`: Lookup done. Body: [MonitorServerResolveResponse](https://docs.visualsentinel.com/reference/models/monitor-server-resolve-response.md).
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Monitor not found.

## List servers linked to a monitor

`GET /api/monitors/{id}/servers`

Returns the servers confirmed as hosting this monitor's site, the automatic matches waiting for a decision, and the addresses from the last lookup. Dismissed links are not returned. API keys need the `monitors:read` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

**Responses**

- `200`: Linked servers and suggestions. Body: [MonitorServerListResponse](https://docs.visualsentinel.com/reference/models/monitor-server-list-response.md).
- `401`: Not signed in, or no valid API key.
- `404`: Monitor not found.

## Link a server to a monitor

`POST /api/monitors/{id}/servers`

Records that the monitor's site runs on this server, as a confirmed manual link. An existing suggested or dismissed link to the same server becomes a confirmed manual link. Any role except Viewer; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `serverId` | string (uuid) | Yes | A server of your organization. |

**Responses**

- `201`: Linked. Body: [MonitorServerLink](https://docs.visualsentinel.com/reference/models/monitor-server-link.md).
- `400`: `serverId` is missing or not a string.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Monitor not found, or server not found.

## Confirm or dismiss a server link

`PATCH /api/monitors/{id}/servers/{msId}`

`confirm` makes the link confirmed (source `auto`); `dismiss` hides it, and the server is not suggested again for this monitor. Any role except Viewer; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.
- `msId` (path, string (uuid), required): ID of the monitor-to-server link (the `id` of an entry in `linked` or `suggestions` from GET /api/monitors/{id}/servers).

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `action` | string | Yes | One of: `confirm`, `dismiss`. |

**Responses**

- `200`: Updated link. Body: [MonitorServerLink](https://docs.visualsentinel.com/reference/models/monitor-server-link.md).
- `400`: `action` is not "confirm" or "dismiss".
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Link not found for this monitor in your organization.

## Remove a server link

`DELETE /api/monitors/{id}/servers/{msId}`

Deletes the link. Unlike dismissing, a later lookup can suggest the same server again. Any role except Viewer; API keys need the `monitors:write` scope.

**Parameters**

- `id` (path, string (uuid), required): Monitor ID.
- `msId` (path, string (uuid), required): ID of the monitor-to-server link (the `id` of an entry in `linked` or `suggestions` from GET /api/monitors/{id}/servers).

**Responses**

- `200`: Removed. Body: object.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Link not found for this monitor in your organization.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `success` | boolean | No | One of: `true`. |

## Delete a batch of monitors

`POST /api/monitors/bulk-delete`

Deletes up to 2,000 monitors, each through the same rules as DELETE /api/monitors/{id}: checks stop at once and each monitor can be restored for 24 hours. Monitors that cannot be deleted are reported in `skipped` with the reason, so the request can partly succeed. Requires the Owner or Admin role; API keys need the `monitors:write` scope. Limited to 30 requests per minute per organization.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `monitorIds` | array of string (uuid) | Yes | Monitor IDs. Duplicates are collapsed; IDs that are not monitors of your organization are reported in `skipped` with the reason "Monitor not found." Min items 1, max items 2000. |

**Responses**

- `200`: Processed. `unchanged` is always empty here. Body: [MonitorBulkResult](https://docs.visualsentinel.com/reference/models/monitor-bulk-result.md).
- `400`: Body is missing or not JSON, or fails validation. `details` holds `formErrors` and `fieldErrors`.
- `401`: Not signed in, or no valid API key.
- `403`: Developer, Member or Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `429`: More than 30 requests in a minute to this bulk route for the organization. Header `Retry-After`: Seconds until the window resets. Header `X-RateLimit-Limit`. Header `X-RateLimit-Remaining`. Header `X-RateLimit-Reset`: ISO time the window resets. Body: [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md).

## Pause or resume a batch of monitors

`PUT /api/monitors/bulk-enabled`

Pauses or resumes up to 2,000 monitors, each through PUT /api/monitors/{id}. Resumes run one at a time in the order sent, so when the plan allowance runs out the remaining monitors are reported in `skipped` with the reason. Monitors already in the requested state are listed in `unchanged`. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope. Limited to 30 requests per minute per organization.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `monitorIds` | array of string (uuid) | Yes | Monitor IDs. Duplicates are collapsed; IDs that are not monitors of your organization are reported in `skipped` with the reason "Monitor not found." Min items 1, max items 2000. |
| `enabled` | boolean | Yes | `false` pauses, `true` resumes. |

**Responses**

- `200`: Processed. Each monitor is reported in exactly one of `updated`, `skipped` or `unchanged`, in the order the IDs were sent. Body: [MonitorBulkResult](https://docs.visualsentinel.com/reference/models/monitor-bulk-result.md).
- `400`: Body is missing or not JSON, or fails validation. `details` holds `formErrors` and `fieldErrors`.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `429`: More than 30 requests in a minute to this bulk route for the organization. Header `Retry-After`: Seconds until the window resets. Header `X-RateLimit-Limit`. Header `X-RateLimit-Remaining`. Header `X-RateLimit-Reset`: ISO time the window resets. Body: [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md).

## Change settings on a batch of monitors

`PUT /api/monitors/bulk-settings`

Applies the same settings to up to 2,000 monitors, each through PUT /api/monitors/{id}, so plan limits (check interval floor, regions, visual and certificate features) apply per monitor. A monitor the plan or its type does not allow is reported in `skipped` with the reason. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope. Limited to 30 requests per minute per organization.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `monitorIds` | array of string (uuid) | Yes | Monitor IDs. Duplicates are collapsed; IDs that are not monitors of your organization are reported in `skipped` with the reason "Monitor not found." Min items 1, max items 2000. |
| `settings` | [MonitorBulkSettings](https://docs.visualsentinel.com/reference/models/monitor-bulk-settings.md) | Yes |   |

**Responses**

- `200`: Processed. `unchanged` is always empty here. Body: [MonitorBulkResult](https://docs.visualsentinel.com/reference/models/monitor-bulk-result.md).
- `400`: Body is missing or not JSON, or fails validation. `details` holds `formErrors` and `fieldErrors`.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `429`: More than 30 requests in a minute to this bulk route for the organization. Header `Retry-After`: Seconds until the window resets. Header `X-RateLimit-Limit`. Header `X-RateLimit-Remaining`. Header `X-RateLimit-Reset`: ISO time the window resets. Body: [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md).

## Add tags to a batch of monitors

`PUT /api/monitors/bulk-tags`

Adds tags to up to 2,000 monitors. Each monitor keeps its existing tags in order with new ones after, without duplicates. A monitor that would end up with more than 20 tags is skipped; one that already has every tag is listed in `unchanged`. Requires the Owner, Admin or Developer role; API keys need the `monitors:write` scope. Limited to 30 requests per minute per organization.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `monitorIds` | array of string (uuid) | Yes | Monitor IDs. Duplicates are collapsed; IDs that are not monitors of your organization are reported in `skipped` with the reason "Monitor not found." Min items 1, max items 2000. |
| `add` | array of string | Yes | Tags to add. Min items 1, max items 20. |

**Responses**

- `200`: Processed. Each monitor is reported in exactly one of `updated`, `skipped` or `unchanged`, in the order the IDs were sent. Body: [MonitorBulkResult](https://docs.visualsentinel.com/reference/models/monitor-bulk-result.md).
- `400`: Body is missing or not JSON, or fails validation. `details` holds `formErrors` and `fieldErrors`.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer or Member role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `429`: More than 30 requests in a minute to this bulk route for the organization. Header `Retry-After`: Seconds until the window resets. Header `X-RateLimit-Limit`. Header `X-RateLimit-Remaining`. Header `X-RateLimit-Reset`: ISO time the window resets. Body: [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md).

## Link a batch of monitors to a server

`POST /api/monitors/bulk-link-server`

Records up to 2,000 monitors as running on one server, as confirmed manual links. IDs that are not monitors of your organization are ignored without being reported. Any role except Viewer; API keys need the `monitors:write` scope. Not rate limited.

Request body (required): object.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `monitorIds` | array of string | Yes | Min items 1, max items 2000. |
| `serverId` | string | Yes | A server of your organization. Min length 1. |

**Responses**

- `200`: Processed. Body: [MonitorBulkLinkServerResponse](https://docs.visualsentinel.com/reference/models/monitor-bulk-link-server-response.md).
- `400`: Body is missing or not JSON, or fails validation (`error` is "Invalid request" and `details` is the list of validation issues) Body: object.
- `401`: Not signed in, or no valid API key.
- `403`: Viewer role, paused seat (code `SEAT_PAUSED_BY_PLAN`), missing or invalid CSRF token, no membership in the organization, or the API key lacks the `monitors:write` scope or plan API access.
- `404`: Server not found.

## Data models

Request and response shapes these endpoints use: [Monitor](https://docs.visualsentinel.com/reference/models/monitor.md), [MonitorListResponse](https://docs.visualsentinel.com/reference/models/monitor-list-response.md), [CreateMonitorRequest](https://docs.visualsentinel.com/reference/models/create-monitor-request.md), [UpdateMonitorRequest](https://docs.visualsentinel.com/reference/models/update-monitor-request.md), [CheckResult](https://docs.visualsentinel.com/reference/models/check-result.md), [UptimeResponse](https://docs.visualsentinel.com/reference/models/uptime-response.md), [ResponseTimeResponse](https://docs.visualsentinel.com/reference/models/response-time-response.md), [PageSpeedFailure](https://docs.visualsentinel.com/reference/models/page-speed-failure.md), [BulkUpdateAlertsRequest](https://docs.visualsentinel.com/reference/models/bulk-update-alerts-request.md), [MonitorBulkRateLimitError](https://docs.visualsentinel.com/reference/models/monitor-bulk-rate-limit-error.md), [ServiceDependencyCatalog](https://docs.visualsentinel.com/reference/models/service-dependency-catalog.md), [ServiceDependencyStatus](https://docs.visualsentinel.com/reference/models/service-dependency-status.md), [ServiceDependencyNoFeed](https://docs.visualsentinel.com/reference/models/service-dependency-no-feed.md), [UpdateServiceDependencyComponentsRequest](https://docs.visualsentinel.com/reference/models/update-service-dependency-components-request.md), [UpdateServiceDependencyComponentsResponse](https://docs.visualsentinel.com/reference/models/update-service-dependency-components-response.md), [MonitorAlertMuteRequest](https://docs.visualsentinel.com/reference/models/monitor-alert-mute-request.md), [MonitorAlertMuteResponse](https://docs.visualsentinel.com/reference/models/monitor-alert-mute-response.md), [MonitorServerResolveResponse](https://docs.visualsentinel.com/reference/models/monitor-server-resolve-response.md), [MonitorServerListResponse](https://docs.visualsentinel.com/reference/models/monitor-server-list-response.md), [MonitorServerLink](https://docs.visualsentinel.com/reference/models/monitor-server-link.md), [MonitorBulkResult](https://docs.visualsentinel.com/reference/models/monitor-bulk-result.md), [MonitorBulkSettings](https://docs.visualsentinel.com/reference/models/monitor-bulk-settings.md), [MonitorBulkLinkServerResponse](https://docs.visualsentinel.com/reference/models/monitor-bulk-link-server-response.md).

Generated from the OpenAPI 3.1 specification at [https://docs.visualsentinel.com/openapi.json](https://docs.visualsentinel.com/openapi.json), the same file the interactive reference reads.
