HTTP Monitors

Create, update, delete, and query HTTP monitors. Get check results and performance statistics.

HTTP monitors check your websites and APIs for availability, performance, and content validity.

List Monitors

GET/api/v1/monitors

Retrieve all HTTP monitors for your team.

Monitors arrive a page at a time. See Pagination for how to walk the whole list.

Required scope: monitors:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Errors (3)
StatusTypeMeaning
400bad-requestThe request is malformed
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • monitorsMonitor[]Required
      Show nested fields
      • idstringRequired
      • namestringRequired
      • urlstringRequired
      • methodstringRequired

        One of GET, POST, PUT, PATCH, DELETE, HEAD.

      • expectedStatusintegerRequired
      • intervalSecondsintegerRequired
      • degradedAfterMsintegerRequired
      • timeoutSecondsintegerRequired
      • locationHintstringRequired

        One of wnam, enam, sam, weur, eeur, apac, oc, afr, me.

      • enabledAtinteger | nullRequired

        When checks resumed; null if paused

      • sslMonitoringEnabledbooleanRequired
      • sslExpiryWarningDaysintegerRequired
      • sslExpiresAtinteger | nullRequired

        Epoch milliseconds

      • sslIssuerstring | nullRequired
      • sslStatusstring | nullRequired

        One of unknown, valid, expiring, expired, error.

      • sslLastCheckedAtinteger | nullRequired

        Epoch milliseconds

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger
Terminal
curl "https://uptime.sergiodxa.com/api/v1/monitors?perPage=50" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors?perPage=50", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"monitors": [
			{
				"id": "mon_abc123",
				"name": "Production API",
				"url": "https://api.example.com/health",
				"method": "GET",
				"expectedStatus": 200,
				"intervalSeconds": 60,
				"degradedAfterMs": 5000,
				"timeoutSeconds": 10,
				"locationHint": "wnam",
				"enabledAt": 1767225600000,
				"sslMonitoringEnabled": true,
				"sslExpiryWarningDays": 30,
				"sslExpiresAt": 1773748800000,
				"sslIssuer": "Let's Encrypt",
				"sslStatus": "valid",
				"sslLastCheckedAt": 1771070400000,
				"createdAt": 1767225600000,
				"updatedAt": 1768473000000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": "eyJkIjoiYWZ0ZXIi",
			"prev": null,
			"perPage": 50,
			"total": 128
		}
	}
}

Create Monitor

POST/api/v1/monitors

Create a new HTTP monitor.

Required scope: monitors:write

Request Body

  • namestringRequired

    Monitor name (1-255 characters)

  • urlstringRequired

    URL to monitor (must be valid URL)

  • methodstring

    HTTP method (default: HEAD)

  • expectedStatusinteger

    Expected status code 100-599 (default: 200)

  • intervalSecondsinteger

    Check interval 60-3600 (default: 60)

  • degradedAfterMsinteger

    Degraded threshold 1000-30000ms (default: 5000)

  • timeoutSecondsinteger

    Request timeout 1-60 (default: 10)

  • locationHintstring

    Region hint (default: wnam)

  • sslMonitoringEnabledboolean

    Enable SSL monitoring (default: false)

  • sslExpiryWarningDaysinteger

    SSL warning threshold 1-365 days (default: 30)

Supported HTTP methods: GET, POST, PUT, PATCH, DELETE, HEAD

Location hints: wnam (Western North America), enam (Eastern North America), sam (South America), weur (Western Europe), eeur (Eastern Europe), apac (Asia-Pacific), oc (Oceania), afr (Africa), me (Middle East)

Errors (6)
StatusTypeMeaning
400validation-errorThe request failed validation
400idempotency-key-invalidThe Idempotency-Key header is not valid
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
409idempotency-key-in-useA request with this idempotency key is still being processed
422idempotency-key-reusedThis idempotency key was already used for a different request
Response fields (201)
  • dataobjectRequired
    Show nested fields
    • monitorobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • urlstringRequired
      • methodstringRequired

        One of GET, POST, PUT, PATCH, DELETE, HEAD.

      • expectedStatusintegerRequired
      • intervalSecondsintegerRequired
      • degradedAfterMsintegerRequired
      • timeoutSecondsintegerRequired
      • locationHintstringRequired

        One of wnam, enam, sam, weur, eeur, apac, oc, afr, me.

      • enabledAtinteger | nullRequired

        When checks resumed; null if paused

      • sslMonitoringEnabledbooleanRequired
      • sslExpiryWarningDaysintegerRequired
      • sslExpiresAtinteger | nullRequired

        Epoch milliseconds

      • sslIssuerstring | nullRequired
      • sslStatusstring | nullRequired

        One of unknown, valid, expiring, expired, error.

      • sslLastCheckedAtinteger | nullRequired

        Epoch milliseconds

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production API",
    "url": "https://api.example.com/health",
    "method": "GET",
    "expectedStatus": 200,
    "intervalSeconds": 60,
    "degradedAfterMs": 3000,
    "sslMonitoringEnabled": true,
    "sslExpiryWarningDays": 30
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Production API",
		"url": "https://api.example.com/health",
		"method": "GET",
		"expectedStatus": 200,
		"intervalSeconds": 60,
		"degradedAfterMs": 3000,
		"sslMonitoringEnabled": true,
		"sslExpiryWarningDays": 30
	}),
});
let result = await response.json();

Response

Returns 201 Created on success.

json
{
	"data": {
		"monitor": {
			"id": "mon_abc123",
			"name": "Production API",
			"url": "https://api.example.com/health",
			"method": "GET",
			"expectedStatus": 200,
			"intervalSeconds": 60,
			"degradedAfterMs": 3000,
			"timeoutSeconds": 10,
			"locationHint": "wnam",
			"enabledAt": 1771070400000,
			"sslMonitoringEnabled": true,
			"sslExpiryWarningDays": 30,
			"sslExpiresAt": null,
			"sslIssuer": null,
			"sslStatus": "unknown",
			"sslLastCheckedAt": null,
			"createdAt": 1771070400000,
			"updatedAt": 1771070400000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Get Monitor

GET/api/v1/monitors/:id

Retrieve a single HTTP monitor by ID.

Required scope: monitors:read

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • monitorobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • urlstringRequired
      • methodstringRequired

        One of GET, POST, PUT, PATCH, DELETE, HEAD.

      • expectedStatusintegerRequired
      • intervalSecondsintegerRequired
      • degradedAfterMsintegerRequired
      • timeoutSecondsintegerRequired
      • locationHintstringRequired

        One of wnam, enam, sam, weur, eeur, apac, oc, afr, me.

      • enabledAtinteger | nullRequired

        When checks resumed; null if paused

      • sslMonitoringEnabledbooleanRequired
      • sslExpiryWarningDaysintegerRequired
      • sslExpiresAtinteger | nullRequired

        Epoch milliseconds

      • sslIssuerstring | nullRequired
      • sslStatusstring | nullRequired

        One of unknown, valid, expiring, expired, error.

      • sslLastCheckedAtinteger | nullRequired

        Epoch milliseconds

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123 \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"monitor": {
			"id": "mon_abc123",
			"name": "Production API",
			"url": "https://api.example.com/health",
			"method": "GET",
			"expectedStatus": 200,
			"intervalSeconds": 60,
			"degradedAfterMs": 5000,
			"timeoutSeconds": 10,
			"locationHint": "wnam",
			"enabledAt": 1767225600000,
			"sslMonitoringEnabled": true,
			"sslExpiryWarningDays": 30,
			"sslExpiresAt": 1773748800000,
			"sslIssuer": "Let's Encrypt",
			"sslStatus": "valid",
			"sslLastCheckedAt": 1771070400000,
			"createdAt": 1767225600000,
			"updatedAt": 1768473000000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Update Monitor

PATCH/api/v1/monitors/:id

Update an existing HTTP monitor with a JSON merge patch.

Required scope: monitors:write

Request Body

All fields from Create Monitor are accepted, plus enabled, with the same limits. Include only the fields you want to change; null resets a field to its default, and name and url cannot be removed.

  • enabledboolean

    false pauses checks and clears enabledAt; true resumes them and sets it, if paused

Update With PUT

PUT /api/v1/monitors/:id takes the same fields, for integrations written before PATCH existed. A field you leave out keeps its value, null is refused, and enabled: true sets enabledAt to now on every request.

Required scope: monitors:write

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • monitorobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • urlstringRequired
      • methodstringRequired

        One of GET, POST, PUT, PATCH, DELETE, HEAD.

      • expectedStatusintegerRequired
      • intervalSecondsintegerRequired
      • degradedAfterMsintegerRequired
      • timeoutSecondsintegerRequired
      • locationHintstringRequired

        One of wnam, enam, sam, weur, eeur, apac, oc, afr, me.

      • enabledAtinteger | nullRequired

        When checks resumed; null if paused

      • sslMonitoringEnabledbooleanRequired
      • sslExpiryWarningDaysintegerRequired
      • sslExpiresAtinteger | nullRequired

        Epoch milliseconds

      • sslIssuerstring | nullRequired
      • sslStatusstring | nullRequired

        One of unknown, valid, expiring, expired, error.

      • sslLastCheckedAtinteger | nullRequired

        Epoch milliseconds

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123 \
  -X PATCH \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "name": "Production API v2",
    "intervalSeconds": 120
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123", {
	method: "PATCH",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/merge-patch+json",
	},
	body: JSON.stringify({
		"name": "Production API v2",
		"intervalSeconds": 120
	}),
});
let result = await response.json();

Response

json
{
	"data": {
		"monitor": {
			"id": "mon_abc123",
			"name": "Production API v2",
			"url": "https://api.example.com/health",
			"method": "GET",
			"expectedStatus": 200,
			"intervalSeconds": 120,
			"degradedAfterMs": 5000,
			"timeoutSeconds": 10,
			"locationHint": "wnam",
			"enabledAt": 1767225600000,
			"sslMonitoringEnabled": true,
			"sslExpiryWarningDays": 30,
			"sslExpiresAt": 1773748800000,
			"sslIssuer": "Let's Encrypt",
			"sslStatus": "valid",
			"sslLastCheckedAt": 1771070400000,
			"createdAt": 1767225600000,
			"updatedAt": 1771072200000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Delete Monitor

DELETE/api/v1/monitors/:id

Permanently delete an HTTP monitor and all its check history.

Required scope: monitors:delete

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • deletedtrueRequired
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123 \
  -X DELETE \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123", {
	method: "DELETE",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

Returns 200 OK on success.

json
{
	"data": {
		"deleted": true
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Get Check Results

GET/api/v1/monitors/:id/results

Retrieve the check history for a monitor.

A check result's id pairs the monitor it belongs to with the minute the check was scheduled for, which is what makes each scheduled check appear once. Treat it as an opaque string.

This endpoint is paginated. See Pagination for how to page back through the history.

Required scope: monitors:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Errors (5)
StatusTypeMeaning
400bad-requestThe request is malformed
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • resultsMonitorResult[]Required
      Show nested fields
      • idstringRequired
      • responseStatusinteger | nullRequired
      • responseTimeMsinteger | nullRequired
      • completedAtinteger | nullRequired

        Epoch milliseconds

      • createdAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger
Terminal
curl "https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/results?perPage=100" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/results?perPage=100", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"results": [
			{
				"id": "8e03978e-40d5-43e8-bc93-6894a57f9324:29387451",
				"responseStatus": 200,
				"responseTimeMs": 245,
				"completedAt": 1771070400000,
				"createdAt": 1771070400000
			},
			{
				"id": "8e03978e-40d5-43e8-bc93-6894a57f9324:29387450",
				"responseStatus": 200,
				"responseTimeMs": 5200,
				"completedAt": 1771070340000,
				"createdAt": 1771070340000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": "eyJkIjoiYWZ0ZXIi",
			"prev": null,
			"perPage": 100
		}
	}
}

Get Alert Events

GET/api/v1/monitors/:id/alert-events

Retrieve the alert delivery history for a monitor.

This endpoint is paginated. See Pagination for how to page back through the history.

Required scope: alerts:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Event types: down, up, degraded

Delivery statuses: sent, skipped_cooldown, skipped_cap, failed

Errors (5)
StatusTypeMeaning
400bad-requestThe request is malformed
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • eventsAlertEvent[]Required
      Show nested fields
      • idstringRequired
      • alertIdstringRequired
      • monitorIdstringRequired
      • eventTypestringRequired

        One of down, up, degraded.

      • statusstringRequired

        One of pending, sent, skipped_cooldown, skipped_cap, failed.

      • sentAtintegerRequired

        Epoch milliseconds

      • errorMessagestring | nullRequired
      • createdAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger
Terminal
curl "https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/alert-events?perPage=50" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/alert-events?perPage=50", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"events": [
			{
				"id": "evt_01h455vb4pex5vsknk084sn02q",
				"alertId": "alt_01h455vb4pex5vsknk084sn031",
				"monitorId": "mon_abc123",
				"eventType": "down",
				"status": "sent",
				"sentAt": 1771070400000,
				"errorMessage": null,
				"createdAt": 1771070400000
			},
			{
				"id": "evt_01h455vb4pex5vsknk084sn02p",
				"alertId": "alt_01h455vb4pex5vsknk084sn031",
				"monitorId": "mon_abc123",
				"eventType": "up",
				"status": "skipped_cooldown",
				"sentAt": 1771066800000,
				"errorMessage": null,
				"createdAt": 1771066800000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": "eyJkIjoiYWZ0ZXIi",
			"prev": null,
			"perPage": 50
		}
	}
}

Get Monitor Stats

GET/api/v1/monitors/:id/stats

Retrieve performance statistics for a single monitor.

Required scope: monitors:read

total counts completed checks. uptime is the percentage of those checks that answered the monitor's expected status, and lastCheck is when the most recent one completed (epoch milliseconds); both are null until a check completes. p99 is the 99th-percentile response time in milliseconds over the last 24 hours, null when that window holds no checks.

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • statsobjectRequired
      Show nested fields
      • totalintegerRequired
      • uptimenumber | nullRequired

        Percentage of checks that passed

      • lastCheckinteger | nullRequired

        Epoch milliseconds

      • p99number | nullRequired

        p99 response time in ms, last 24 hours

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/stats \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/stats", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"stats": {
			"total": 43200,
			"uptime": 99.95,
			"lastCheck": 1771070400000,
			"p99": 780
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Get Aggregated Stats

GET/api/v1/monitors/stats

Retrieve aggregated statistics across all monitors.

Required scope: monitors:read

total counts completed checks across every monitor on the team. uptime is the percentage of those checks that answered the monitor's expected status, and lastCheck is when the most recent one completed (epoch milliseconds); both are null until a check completes. p99 is the 99th-percentile response time in milliseconds over the last 24 hours, null when that window holds no checks.

Errors (2)
StatusTypeMeaning
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • statsobjectRequired
      Show nested fields
      • totalintegerRequired
      • uptimenumber | nullRequired

        Percentage of checks that passed

      • lastCheckinteger | nullRequired

        Epoch milliseconds

      • p99number | nullRequired

        p99 response time in ms, last 24 hours

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/monitors/stats \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/stats", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"stats": {
			"total": 648000,
			"uptime": 99.3,
			"lastCheck": 1771070400000,
			"p99": 780
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Backfill Daily Stats

POST/api/v1/backfill-daily-stats

Re-run yesterday's daily-stats rollup, which writes the uptime bars and reports of every team at once. The rollup already runs every day at 01:00 UTC, so this endpoint exists for the operator of the service to repeat a missed run; a team's API key gets 403 Forbidden, whatever its scopes.

The job runs in the background, so the response confirms that it was queued rather than that it has finished.

Authentication: the operator's API key

Errors (2)
StatusTypeMeaning
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
Response fields (202)
  • dataobjectRequired
    Show nested fields
    • status"queued"Required
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Terminal
curl https://uptime.sergiodxa.com/api/v1/backfill-daily-stats \
  -X POST \
  -H "Authorization: Bearer uptime_operator_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/backfill-daily-stats", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_operator_api_key",
	},
});
let result = await response.json();

Response

Returns 202 Accepted on success.

json
{
	"data": {
		"status": "queued"
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Content Checks

Manage content validation rules for a monitor. Content checks verify that responses contain (or don't contain) specific text or patterns. See Content Checks for usage details.

List Content Checks

GET/api/v1/monitors/:id/content-checks

Retrieve the content checks configured on a monitor.

Content checks arrive a page at a time. See Pagination for how to walk the whole list.

Required scope: monitors:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Errors (5)
StatusTypeMeaning
400bad-requestThe request is malformed
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • contentChecksContentCheck[]Required
      Show nested fields
      • idstringRequired
      • monitorIdstringRequired
      • typestringRequired

        One of contains, not_contains, regex.

      • valuestringRequired
      • caseSensitivebooleanRequired
      • isEnabledbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger
Terminal
curl "https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/content-checks?perPage=50" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/monitors/mon_abc123/content-checks?perPage=50", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"contentChecks": [
			{
				"id": "chk_01h455vb4pex5vsknk084sn02q",
				"monitorId": "mon_abc123",
				"type": "contains",
				"value": "\"status\":\"ok\"",
				"caseSensitive": false,
				"isEnabled": true,
				"createdAt": 1767225600000,
				"updatedAt": 1768473000000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": null,
			"prev": null,
			"perPage": 50,
			"total": 1
		}
	}
}

Create Content Check

POST/api/v1/monitors/:id/content-checks

Required scope: monitors:write

Request Body

  • typestringRequired

    Check type: contains, not_contains, regex

  • valuestringRequired

    Text or pattern to match (at least 1 character; a valid regex for regex)

  • caseSensitiveboolean

    Enable case-sensitive matching (default: false)

  • isEnabledboolean

    Whether the check runs (default: true)

Errors (7)
StatusTypeMeaning
400validation-errorThe request failed validation
400idempotency-key-invalidThe Idempotency-Key header is not valid
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
409idempotency-key-in-useA request with this idempotency key is still being processed
422idempotency-key-reusedThis idempotency key was already used for a different request
Response fields (201)
  • dataobjectRequired
    Show nested fields
    • contentCheckobjectRequired
      Show nested fields
      • idstringRequired
      • monitorIdstringRequired
      • typestringRequired

        One of contains, not_contains, regex.

      • valuestringRequired
      • caseSensitivebooleanRequired
      • isEnabledbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Response

Returns 201 Created on success.

json
{
	"data": {
		"contentCheck": {
			"id": "chk_01h455vb4pex5vsknk084sn02q",
			"monitorId": "mon_abc123",
			"type": "contains",
			"value": "\"status\":\"ok\"",
			"caseSensitive": false,
			"isEnabled": true,
			"createdAt": 1767225600000,
			"updatedAt": 1767225600000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Delete Content Check

DELETE/api/v1/monitors/:id/content-checks/:contentCheckId

Required scope: monitors:write

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • successtrueRequired
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Response

Returns 200 OK on success.

json
{
	"data": {
		"success": true
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}
Documentation