Status Pages

Create and manage public status pages. Associate monitors and customize appearance.

Status pages provide a public-facing view of your service health. Associate monitors and cron jobs to display their status to your users.

GET /api/v1/status-pages

Returns the status pages for your team. This endpoint is paginated; see Pagination for how to page through the full list.

Required scope: status-pages:read

Query Parameters

  • perPageinteger

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

  • cursorstring

    Page to fetch, taken from a Link header

The list leaves out each page's monitors and cron jobs; fetch a single status page to see them.

The cursors for this page arrive in meta.pagination:

  • meta.pagination.nextstring | null

    Cursor for the following page, null on the last

  • meta.pagination.prevstring | null

    Cursor for the preceding page, null on the first

  • meta.pagination.perPageinteger

    Results this page was built with

  • meta.pagination.totalinteger

    Status pages matching, across every page

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
    • statusPagesStatusPage[]Required
      Show nested fields
      • idstringRequired
      • namestringRequired
      • slugstringRequired
      • titlestringRequired
      • descriptionstring | nullRequired
      • logoUrlstring | nullRequired
      • customDomainstring | nullRequired
      • isPublicbooleanRequired
      • showOverallStatusbooleanRequired
      • 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

cURL

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

Response

json
{
	"data": {
		"statusPages": [
			{
				"id": "sp_abc123",
				"name": "Production Status",
				"slug": "production-status",
				"title": "Production Status",
				"description": "Real-time status of our production services",
				"logoUrl": "https://example.com/logo.png",
				"customDomain": "status.example.com",
				"isPublic": true,
				"showOverallStatus": true,
				"createdAt": 1770710400000,
				"updatedAt": 1771079400000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": "eyJkIjoiYWZ0ZXIi",
			"prev": null,
			"perPage": 25,
			"total": 28
		}
	}
}

POST /api/v1/status-pages

Creates a new status page.

Required scope: status-pages:write

Request Body

  • namestringRequired

    Internal name (1-255 characters)

  • slugstringRequired

    URL-friendly identifier (lowercase letters, numbers, hyphens only)

  • titlestring

    Display title (1-255 characters, defaults to name)

  • descriptionstring

    Page description (max 500 characters)

  • logoUrlstring

    URL to your logo image

  • customDomainstring

    Custom domain for the status page

  • isPublicboolean

    Whether the page is publicly accessible (default: true)

  • showOverallStatusboolean

    Whether to display the overall status indicator (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
409conflictThe resource's state prevents this request
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
    • statusPageobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • slugstringRequired
      • titlestringRequired
      • descriptionstring | nullRequired
      • logoUrlstring | nullRequired
      • customDomainstring | nullRequired
      • isPublicbooleanRequired
      • showOverallStatusbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/v1/status-pages \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production Status",
    "slug": "production-status",
    "title": "Service Status",
    "description": "Real-time status of our production services",
    "logoUrl": "https://example.com/logo.png",
    "isPublic": true,
    "showOverallStatus": true
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/status-pages", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Production Status",
		"slug": "production-status",
		"title": "Service Status",
		"description": "Real-time status of our production services",
		"logoUrl": "https://example.com/logo.png",
		"isPublic": true,
		"showOverallStatus": true
	}),
});
let result = await response.json();

Response

Returns 201 Created. Attach monitors and cron jobs afterwards with PUT /api/v1/status-pages/:id/monitors.

json
{
	"data": {
		"statusPage": {
			"id": "sp_abc123",
			"name": "Production Status",
			"slug": "production-status",
			"title": "Service Status",
			"description": "Real-time status of our production services",
			"logoUrl": "https://example.com/logo.png",
			"customDomain": null,
			"isPublic": true,
			"showOverallStatus": true,
			"createdAt": 1770710400000,
			"updatedAt": 1770710400000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

GET /api/v1/status-pages/:id

Returns a single status page with the ids of its attached HTTP monitors and cron jobs.

Required scope: status-pages:read

Path Parameters

  • idstring

    The status page ID

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
    • statusPageobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • slugstringRequired
      • titlestringRequired
      • descriptionstring | nullRequired
      • logoUrlstring | nullRequired
      • customDomainstring | nullRequired
      • isPublicbooleanRequired
      • showOverallStatusbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

      • monitorsstring[]Required
      • cronJobsstring[]Required
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

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

Response

json
{
	"data": {
		"statusPage": {
			"id": "sp_abc123",
			"name": "Production Status",
			"slug": "production-status",
			"title": "Service Status",
			"description": "Real-time status of our production services",
			"logoUrl": "https://example.com/logo.png",
			"customDomain": "status.example.com",
			"isPublic": true,
			"showOverallStatus": true,
			"createdAt": 1770710400000,
			"updatedAt": 1771079400000,
			"monitors": ["mon_def456", "mon_ghi789"],
			"cronJobs": ["cron_jkl012"]
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

PATCH /api/v1/status-pages/:id

Updates an existing status page with a JSON merge patch.

Required scope: status-pages:write

Path Parameters

  • idstring

    The status page ID

Request Body

All fields from POST /api/v1/status-pages are accepted, with the same limits. Include only the fields you want to change; fields outside this table are ignored. null clears description, logoUrl and customDomain, sets title back to name, and resets isPublic and showOverallStatus to true; name and slug cannot be removed.

  • namestring

    Internal name (1-255 characters)

  • slugstring

    URL-friendly identifier (lowercase letters, numbers, hyphens only)

  • titlestring

    Display title (1-255 characters); null sets it to name

  • descriptionstring

    Page description (max 500 characters); null clears it

  • logoUrlstring

    URL to your logo image; null clears it

  • customDomainstring

    Custom domain for the status page; null clears it

  • isPublicboolean

    Whether the page is publicly accessible; null resets to true

  • showOverallStatusboolean

    Whether to display the overall status indicator; null resets it

Update With PUT

PUT /api/v1/status-pages/:id takes the same fields, for integrations written before PATCH existed. A field you leave out keeps its value, and null clears description, logoUrl and customDomain; null on any other field is refused.

Required scope: status-pages:write

Errors (5)
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
409conflictThe resource's state prevents this request
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • statusPageobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • slugstringRequired
      • titlestringRequired
      • descriptionstring | nullRequired
      • logoUrlstring | nullRequired
      • customDomainstring | nullRequired
      • isPublicbooleanRequired
      • showOverallStatusbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

      • monitorsstring[]Required
      • cronJobsstring[]Required
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl -X PATCH https://uptime.sergiodxa.com/api/v1/status-pages/sp_abc123 \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "title": "Updated Service Status",
    "description": "Current status of all our services",
    "customDomain": "status.example.com"
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/status-pages/sp_abc123", {
	method: "PATCH",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/merge-patch+json",
	},
	body: JSON.stringify({
		"title": "Updated Service Status",
		"description": "Current status of all our services",
		"customDomain": "status.example.com"
	}),
});
let result = await response.json();

Response

The updated status page, with the ids of its attached HTTP monitors and cron jobs.

json
{
	"data": {
		"statusPage": {
			"id": "sp_abc123",
			"name": "Production Status",
			"slug": "production-status",
			"title": "Updated Service Status",
			"description": "Current status of all our services",
			"logoUrl": "https://example.com/logo.png",
			"customDomain": "status.example.com",
			"isPublic": true,
			"showOverallStatus": true,
			"createdAt": 1770710400000,
			"updatedAt": 1771084800000,
			"monitors": [],
			"cronJobs": []
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

DELETE /api/v1/status-pages/:id

Deletes a status page and its monitor and cron job attachments.

Required scope: status-pages:write

Path Parameters

  • idstring

    The status page ID

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.

cURL

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

Response

Returns 200 OK:

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

PUT /api/v1/status-pages/:id/monitors

Replaces the HTTP monitors and cron jobs attached to a status page. The lists you send become the page's full set of attachments: a list you omit, or send empty, detaches everything of that kind.

Required scope: status-pages:write

Path Parameters

  • idstring

    The status page ID

Request Body

  • monitorIdsarray

    HTTP monitor ids (mon_…) to attach (default: [])

  • cronJobIdsarray

    Cron job ids (cron_…) to attach (default: [])

An id listed more than once is attached once.

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
    • statusPageobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • slugstringRequired
      • titlestringRequired
      • descriptionstring | nullRequired
      • logoUrlstring | nullRequired
      • customDomainstring | nullRequired
      • isPublicbooleanRequired
      • showOverallStatusbooleanRequired
      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

    • monitorsstring[]Required
    • cronJobsstring[]Required
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl -X PUT https://uptime.sergiodxa.com/api/v1/status-pages/sp_abc123/monitors \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "monitorIds": ["mon_def456", "mon_ghi789"],
    "cronJobIds": ["cron_jkl012"]
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/status-pages/sp_abc123/monitors", {
	method: "PUT",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"monitorIds": [
			"mon_def456",
			"mon_ghi789"
		],
		"cronJobIds": [
			"cron_jkl012"
		]
	}),
});
let result = await response.json();

Response

The status page, with the attached ids beside it in monitors and cronJobs.

json
{
	"data": {
		"statusPage": {
			"id": "sp_abc123",
			"name": "Production Status",
			"slug": "production-status",
			"title": "Service Status",
			"description": "Real-time status of our production services",
			"logoUrl": "https://example.com/logo.png",
			"customDomain": "status.example.com",
			"isPublic": true,
			"showOverallStatus": true,
			"createdAt": 1770710400000,
			"updatedAt": 1771079400000
		},
		"monitors": ["mon_def456", "mon_ghi789"],
		"cronJobs": ["cron_jkl012"]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

Response Fields

FieldTypeDescription
idstringUnique status page identifier
namestringInternal name
slugstringURL-friendly identifier
titlestringDisplay title
descriptionstring | nullPage description
logoUrlstring | nullURL to the logo image
customDomainstring | nullCustom domain if configured
isPublicbooleanWhether the page is publicly accessible
showOverallStatusbooleanWhether the overall status indicator is displayed
createdAtintegerUnix timestamp in milliseconds of creation
updatedAtintegerUnix timestamp in milliseconds of the last update
monitorsarrayAttached HTTP monitor ids, on a single status page
cronJobsarrayAttached cron job IDs, on a single status page
Documentation