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. Most error responses use the ErrorResponse shape, see Errors and Rate limits.
Endpoints
- List monitors:
GET /api/monitors - Create monitor:
POST /api/monitors - Bulk delete monitors:
DELETE /api/monitors - Get monitor:
GET /api/monitors/{id} - Update monitor:
PUT /api/monitors/{id} - Delete monitor:
DELETE /api/monitors/{id} - Trigger manual check:
POST /api/monitors/{id}/check - Get check history:
GET /api/monitors/{id}/checks - Get uptime statistics:
GET /api/monitors/{id}/uptime - Get response time metrics:
GET /api/monitors/{id}/response-time - Get DNS records:
GET /api/monitors/{id}/dns - Get PageSpeed data:
GET /api/monitors/{id}/pagespeed - Trigger PageSpeed check:
POST /api/monitors/{id}/pagespeed - Get content snapshots:
GET /api/monitors/{id}/snapshots - Get monitor notification channels:
GET /api/monitors/{id}/channels - Update monitor notification channels:
PUT /api/monitors/{id}/channels - Get anomalies:
GET /api/monitors/{id}/anomalies - Create anomaly:
POST /api/monitors/{id}/anomalies - Update anomaly:
PATCH /api/monitors/{id}/anomalies - Get monitor report:
GET /api/monitors/{id}/report - Generate monitor report:
POST /api/monitors/{id}/report - Update monitor report settings:
PUT /api/monitors/{id}/report - List sub-pages:
GET /api/monitors/{id}/sub-pages - Add sub-page:
POST /api/monitors/{id}/sub-pages - Update sub-page:
PUT /api/monitors/{id}/sub-pages - Delete sub-page:
DELETE /api/monitors/{id}/sub-pages - Get monitor alert settings:
GET /api/monitors/alert-settings - Bulk update monitor alerts:
PUT /api/monitors/bulk-alerts - Content change detection:
POST /api/monitors/content - Export monitors:
GET /api/monitors/export - Test monitor URL:
POST /api/monitors/test - Populate favicons:
POST /api/monitors/populate-favicons - Restore a deleted monitor:
POST /api/monitors/{id}/restore - List recently deleted monitors:
GET /api/monitors/deleted - List service dependencies:
GET /api/dependencies - Get a service's provider status:
GET /api/dependencies/{slug} - Choose the parts a service monitor follows:
PATCH /api/dependencies/{slug} - Check region availability:
GET /api/monitoring/regions - Resume a monitor's alert email to an unsubscribed address:
DELETE /api/monitors/{id}/alert-email-mute - Mute a monitor's alerts:
POST /api/monitors/{id}/mute - Unmute a monitor's alerts:
DELETE /api/monitors/{id}/mute - Match a monitor to your servers:
POST /api/monitors/{id}/resolve - List servers linked to a monitor:
GET /api/monitors/{id}/servers - Link a server to a monitor:
POST /api/monitors/{id}/servers - Confirm or dismiss a server link:
PATCH /api/monitors/{id}/servers/{msId} - Remove a server link:
DELETE /api/monitors/{id}/servers/{msId} - Delete a batch of monitors:
POST /api/monitors/bulk-delete - Pause or resume a batch of monitors:
PUT /api/monitors/bulk-enabled - Change settings on a batch of monitors:
PUT /api/monitors/bulk-settings - Add tags to a batch of monitors:
PUT /api/monitors/bulk-tags - Link a batch of monitors to a 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 whenpageis 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;pausedreturns 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 exampleapi,graphql. Values: see StoredMonitorType.enabled(query, boolean, optional)search(query, string, optional): Search by name or URLtags(query, string, optional): Comma-separated list of tagssortBy(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 (nopagequery parameter) the response is a bare array of Monitor objects for backward compatibility. When the request sendsAccept: application/jsonAND includes apagequery parameter, the response is thedata-wrapped paginated envelope shown below. Body: array of Monitor or MonitorListResponse.
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.
Responses
200: Monitor created. Body: Monitor.400: Validation failed. Codes includeINVALID_LOCATION,LOCATION_UNSUPPORTED_FOR_TYPE,REGION_UNAVAILABLE,INVALID_API_CONFIG,INVALID_ASSERTION_PATTERN,unsafe_urlanddomain_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 withoutmonitors: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.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.
Responses
200: Monitor updated. Body: Monitor.400: Validation failed. Codes includeINVALID_LOCATION,LOCATION_UNSUPPORTED_FOR_TYPE,REGION_UNAVAILABLE,INVALID_API_CONFIG(also:apiConfigthat differs from the saved value on a monitor that is not API or GRAPHQL),INVALID_KEYWORD_CONFIG(an unknown field insidekeywordConfig, orenabled: truefor a keyword check with no words),UNSUPPORTED_FIELD(retryCount,retryDelay,environment,priorityorexpectedHeaders, which are not stored;fieldslists them) andINVALID_ASSERTION_PATTERN.403: Plan or role restriction, for exampleLOCATION_RESTRICTEDorFEATURE_RESTRICTED.404: Monitor not found.409:ASSERTIONS_CHANGED: the stored response checks changed sinceexpectedAssertionswas 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.
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.windowis 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 withto.to(query, string, optional): Custom range end (ISO date or date-time, a date includes that whole day).
Responses
200: Uptime statistics. Body: UptimeResponse.
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.
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 | 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, orBASELINE_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.
Responses
200: Updated. Body: object.400: Fails validation (detailsholdsformErrorsandfieldErrors)401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, the API key lacks themonitors:writescope 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. HeaderRetry-After: Seconds until the window resets. HeaderX-RateLimit-Limit. HeaderX-RateLimit-Remaining. HeaderX-RateLimit-Reset: ISO time the window resets. Body: MonitorBulkRateLimitError.
| 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.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 or ServiceDependencyNoFeed.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.
Responses
200: Saved. Body: UpdateServiceDependencyComponentsResponse.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 withoutmonitors: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 (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope 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.
Responses
200: Muted. Body: MonitorAlertMuteResponse.400: Body is not JSON, ordurationMinutesis not 60, 480, 1440 or 10080 (the response then listsallowedDurationMinutes) Body: object.401: Not signed in, or no valid API key.403: Viewer or Member role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope 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 (alertsMutedUntilis null) Body: MonitorAlertMuteResponse.401: Not signed in, or no valid API key.403: Viewer or Member role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope 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.401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, or the API key lacks themonitors:writescope 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.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.400:serverIdis missing or not a string.401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, or the API key lacks themonitors:writescope 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 (theidof an entry inlinkedorsuggestionsfrom 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.400:actionis not "confirm" or "dismiss".401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, or the API key lacks themonitors:writescope 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 (theidof an entry inlinkedorsuggestionsfrom GET /api/monitors/{id}/servers).
Responses
200: Removed. Body: object.401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, or the API key lacks themonitors:writescope 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.unchangedis always empty here. Body: MonitorBulkResult.400: Body is missing or not JSON, or fails validation.detailsholdsformErrorsandfieldErrors.401: Not signed in, or no valid API key.403: Developer, Member or Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope or plan API access.429: More than 30 requests in a minute to this bulk route for the organization. HeaderRetry-After: Seconds until the window resets. HeaderX-RateLimit-Limit. HeaderX-RateLimit-Remaining. HeaderX-RateLimit-Reset: ISO time the window resets. Body: MonitorBulkRateLimitError.
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 ofupdated,skippedorunchanged, in the order the IDs were sent. Body: MonitorBulkResult.400: Body is missing or not JSON, or fails validation.detailsholdsformErrorsandfieldErrors.401: Not signed in, or no valid API key.403: Viewer or Member role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope or plan API access.429: More than 30 requests in a minute to this bulk route for the organization. HeaderRetry-After: Seconds until the window resets. HeaderX-RateLimit-Limit. HeaderX-RateLimit-Remaining. HeaderX-RateLimit-Reset: ISO time the window resets. Body: MonitorBulkRateLimitError.
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 | Yes |
Responses
200: Processed.unchangedis always empty here. Body: MonitorBulkResult.400: Body is missing or not JSON, or fails validation.detailsholdsformErrorsandfieldErrors.401: Not signed in, or no valid API key.403: Viewer or Member role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope or plan API access.429: More than 30 requests in a minute to this bulk route for the organization. HeaderRetry-After: Seconds until the window resets. HeaderX-RateLimit-Limit. HeaderX-RateLimit-Remaining. HeaderX-RateLimit-Reset: ISO time the window resets. Body: MonitorBulkRateLimitError.
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 ofupdated,skippedorunchanged, in the order the IDs were sent. Body: MonitorBulkResult.400: Body is missing or not JSON, or fails validation.detailsholdsformErrorsandfieldErrors.401: Not signed in, or no valid API key.403: Viewer or Member role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope or plan API access.429: More than 30 requests in a minute to this bulk route for the organization. HeaderRetry-After: Seconds until the window resets. HeaderX-RateLimit-Limit. HeaderX-RateLimit-Remaining. HeaderX-RateLimit-Reset: ISO time the window resets. Body: MonitorBulkRateLimitError.
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.400: Body is missing or not JSON, or fails validation (erroris "Invalid request" anddetailsis the list of validation issues) Body: object.401: Not signed in, or no valid API key.403: Viewer role, paused seat (codeSEAT_PAUSED_BY_PLAN), missing or invalid CSRF token, no membership in the organization, or the API key lacks themonitors:writescope or plan API access.404: Server not found.
Data models
Request and response shapes these endpoints use: Monitor, MonitorListResponse, CreateMonitorRequest, UpdateMonitorRequest, CheckResult, UptimeResponse, ResponseTimeResponse, PageSpeedFailure, BulkUpdateAlertsRequest, MonitorBulkRateLimitError, ServiceDependencyCatalog, ServiceDependencyStatus, ServiceDependencyNoFeed, UpdateServiceDependencyComponentsRequest, UpdateServiceDependencyComponentsResponse, MonitorAlertMuteRequest, MonitorAlertMuteResponse, MonitorServerResolveResponse, MonitorServerListResponse, MonitorServerLink, MonitorBulkResult, MonitorBulkSettings, MonitorBulkLinkServerResponse.
Generated from the OpenAPI 3.1 specification at https://docs.visualsentinel.com/openapi.json, the same file the interactive reference reads.