Status Pages API

Status pages provide a public-facing view of your service health. You can customize the appearance, add custom domains, and manage announcements.

Public Endpoints

These endpoints are publicly accessible and do not require authentication.


Get Public Status

GET/api/status

Get public status page data including monitors, incidents, and settings

Query Parameters:

ParameterTypeRequiredDescription
domainstringNoCustom domain to look up status page

Success Response (200 OK):

{
  "monitors": [
    {
      "id": "monitor-uuid",
      "name": "Production API",
      "status": "UP",
      "response_time": 145,
      "last_check": "2024-01-15T10:30:00Z",
      "type": "HTTPS",
      "component_id": "component-uuid",
      "component_name": "API Services",
      "group_id": "group-uuid",
      "uptime": 99.95,
      "avgResponseTime": 142,
      "dailyUptime": [
        {
          "date": "2024-01-15",
          "uptime": 100,
          "totalChecks": 1440,
          "upChecks": 1440,
          "avgResponseTime": 142
        }
      ]
    }
  ],
  "components": [
    {
      "id": "component-uuid",
      "name": "API Services",
      "description": "Core API endpoints",
      "position": 1,
      "status": "OPERATIONAL",
      "group_id": "group-uuid",
      "group_name": "Backend"
    }
  ],
  "groups": [
    {
      "id": "group-uuid",
      "name": "Backend",
      "description": "Backend services",
      "position": 1,
      "components": [ ... ]
    }
  ],
  "ungroupedComponents": [],
  "activeIncidents": [
    {
      "id": "incident-uuid",
      "monitor_id": "monitor-uuid",
      "monitor_name": "Database",
      "title": "Database Performance Degradation",
      "status": "INVESTIGATING",
      "severity": "HIGH",
      "started_at": "2024-01-15T09:00:00Z"
    }
  ],
  "recentIncidents": [],
  "customCss": "",
  "statusPageSettings": {
    "title": "Acme Status",
    "logo_url": "/uploads/logo.png",
    "homepage_url": "https://acme.com",
    "layout_density": "wide",
    "layout_alignment": "left",
    "password_protected": false,
    "robots_meta": "index",
    "google_analytics_id": "G-XXXXXXXXXX",
    "show_bar_charts": true,
    "show_outage_details": true,
    "show_uptime_percentage": true,
    "enable_details_page": true,
    "enable_floating_status_bar": false,
    "show_monitor_url": false,
    "show_overall_percentage": true,
    "hide_paused_monitors": false,
    "show_footer_branding": true,
    "theme": "auto"
  },
  "activeAnnouncements": [
    {
      "id": "announcement-uuid",
      "title": "Scheduled Maintenance",
      "content": "We will be performing maintenance on Jan 20th.",
      "type": "maintenance",
      "status": "active",
      "starts_at": "2024-01-20T00:00:00Z",
      "ends_at": "2024-01-20T04:00:00Z",
      "created_at": "2024-01-15T10:00:00Z"
    }
  ]
}

Monitor URLs and sensitive configuration data are not exposed in public status page responses.


Verify Password (Protected Status Page)

POST/api/status/verify-password

Verify password for a password-protected status page

Request Body:

FieldTypeRequiredDescription
passwordstringYesStatus page password
userIdUUIDNoSpecific user's status page

Request Example:

{
  "password": "statuspage-secret"
}

Success Response (200 OK):

{
  "success": true
}

Error Responses:

StatusErrorDescription
400Password is requiredMissing password
400Status page is not password protectedNo password set
401Invalid passwordWrong password

Get Public Postmortems

GET/api/status/postmortems

Get published postmortems for resolved incidents

Success Response (200 OK):

{
  "postmortems": [
    {
      "id": "postmortem-uuid",
      "incident_id": "incident-uuid",
      "title": "January 14 Database Outage",
      "summary": "Root cause analysis and prevention measures",
      "timeline": "...",
      "root_cause": "...",
      "impact": "...",
      "action_items": "...",
      "published": true,
      "incident_title": "Database Connection Issues",
      "incident_status": "RESOLVED",
      "incident_severity": "CRITICAL",
      "incident_started_at": "2024-01-14T08:00:00Z",
      "incident_resolved_at": "2024-01-14T09:30:00Z",
      "monitor_name": "Database Server",
      "created_at": "2024-01-15T12:00:00Z"
    }
  ]
}

Widget Endpoints

Get Status Widget

GET/api/status/widget

Get embeddable status widget HTML

Query Parameters:

ParameterTypeDefaultOptions
modestringbadgebadge, full
themestringdarkdark, light

Badge Mode Response:

Returns a compact status badge (200x40 pixels) showing overall status.

Full Mode Response:

Returns a full status widget (400x300 pixels) showing all components and their status.

The widget auto-refreshes every 60 seconds.

Get Widget Embed Code

GET/api/status/widget/embed-code

Get embed code snippets for widgets (authenticated)

Headers:

HeaderValue
AuthorizationBearer {access_token}

Success Response (200 OK):

{
  "badge": {
    "iframe": "<iframe src=\"https://app.pixomonitor.com/api/status/widget?mode=badge\" width=\"200\" height=\"40\" frameborder=\"0\"></iframe>",
    "iframeDark": "...",
    "iframeLight": "..."
  },
  "full": {
    "iframe": "<iframe src=\"https://app.pixomonitor.com/api/status/widget?mode=full\" width=\"400\" height=\"300\" frameborder=\"0\"></iframe>",
    "iframeDark": "...",
    "iframeLight": "..."
  },
  "javascript": "<script>...</script>",
  "statusPageUrl": "https://app.pixomonitor.com/status"
}

Status Page Settings

All settings endpoints require authentication.

Get Settings

GET/api/status-page-settings

Get current user's status page settings

Headers:

HeaderValue
AuthorizationBearer {access_token}

Success Response (200 OK):

{
  "settings": {
    "id": "settings-uuid",
    "user_id": "user-uuid",
    "title": "Acme Status",
    "homepage_url": "https://acme.com",
    "custom_domain": "status.acme.com",
    "domain_verified": true,
    "domain_verified_at": "2024-01-10T15:00:00Z",
    "logo_url": "/uploads/logo.png",
    "layout_density": "wide",
    "layout_alignment": "left",
    "password_protected": false,
    "robots_meta": "index",
    "google_analytics_id": "G-XXXXXXXXXX",
    "show_bar_charts": true,
    "show_outage_details": true,
    "show_uptime_percentage": true,
    "enable_details_page": true,
    "enable_floating_status_bar": false,
    "show_monitor_url": false,
    "show_overall_percentage": true,
    "hide_paused_monitors": false,
    "show_footer_branding": true,
    "custom_css": "",
    "theme": "auto",
    "accent_color": "#5b8def",
    "custom_header": "",
    "custom_footer": "",
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-15T10:00:00Z"
  }
}

Update Settings

PUT/api/status-page-settings

Create or update status page settings

Headers:

HeaderValue
AuthorizationBearer {access_token}
Content-Typeapplication/json

Request Body:

FieldTypeDefaultValidation
titlestring-Status page title
homepage_urlstring-Link to your main website
custom_domainstring-Custom domain (e.g., status.acme.com)
logo_urlstring-URL to logo image
layout_densitystringwidewide or compact
layout_alignmentstringleftleft or center
password_protectedbooleanfalseEnable password protection
passwordstring-Status page password (required if enabling protection)
robots_metastringindexSEO robots directive
google_analytics_idstring-GA4 measurement ID
show_bar_chartsbooleantrueShow uptime bar charts
show_outage_detailsbooleantrueShow outage details
show_uptime_percentagebooleantrueShow uptime percentage
enable_details_pagebooleantrueEnable individual monitor pages
enable_floating_status_barbooleanfalseShow floating status bar
show_monitor_urlbooleanfalseDisplay monitor URLs publicly
show_overall_percentagebooleantrueShow overall uptime
hide_paused_monitorsbooleanfalseHide paused monitors
show_footer_brandingbooleantrueShow PixoMonitor branding
custom_cssstring-Custom CSS (sanitized)
themestringautolight, dark, or auto
accent_colorstring#5b8defAccent color hex code
custom_headerstring-Custom header HTML
custom_footerstring-Custom footer HTML

Request Example:

{
  "title": "Acme Status",
  "homepage_url": "https://acme.com",
  "theme": "dark",
  "show_bar_charts": true,
  "show_uptime_percentage": true
}

Success Response (200 OK):

{
  "settings": {
    "id": "settings-uuid",
    "title": "Acme Status",
    ...
  }
}

Error Responses:

StatusErrorDescription
400Invalid layout_densityMust be "wide" or "compact"
400Invalid layout_alignmentMust be "left" or "center"
400Invalid themeMust be "light", "dark", or "auto"
400Custom CSS contains disallowed contentDangerous CSS patterns detected

Custom CSS is sanitized to prevent XSS attacks. Dangerous patterns like javascript:, @import, and expression() are blocked.


POST/api/status-page-settings/logo

Upload a logo image for the status page

Headers:

HeaderValue
AuthorizationBearer {access_token}
Content-Typeimage/*

Request:

Send raw image data in the request body (max 5MB).

Success Response (200 OK):

{
  "logo_url": "/uploads/logo_user-uuid_1705312200000.png"
}

Custom Domain

Verify Domain

POST/api/status-page-settings/verify-domain

Verify DNS CNAME record for custom domain

Headers:

HeaderValue
AuthorizationBearer {access_token}
Content-Typeapplication/json

Request Body:

{
  "domain": "status.acme.com"
}

Setup Instructions:

  1. Add a CNAME record for your subdomain pointing to pixomonitor.com
  2. Call this endpoint to verify the DNS configuration

Success Response (200 OK) - Verified:

{
  "verified": true,
  "domain": "status.acme.com",
  "records": ["pixomonitor.com."],
  "message": "Domain verified successfully! Your status page is now accessible at https://status.acme.com"
}

Response - Not Verified:

{
  "verified": false,
  "domain": "status.acme.com",
  "error": "CNAME record not found. Please add a CNAME record pointing to pixomonitor.com",
  "message": "CNAME record found but does not point to pixomonitor.com"
}

Error Responses:

StatusErrorDescription
400Domain is requiredMissing domain
400Invalid domain formatNot a valid hostname
400This domain is already in useDomain registered to another user

Remove Custom Domain

DELETE/api/status-page-settings/custom-domain

Remove custom domain from status page

Headers:

HeaderValue
AuthorizationBearer {access_token}

Success Response (200 OK):

{
  "success": true,
  "message": "Custom domain removed"
}

Announcements

List Announcements

GET/api/status-page-settings/announcements

Get all announcements for the current user

Headers:

HeaderValue
AuthorizationBearer {access_token}

Success Response (200 OK):

{
  "announcements": [
    {
      "id": "announcement-uuid",
      "user_id": "user-uuid",
      "title": "Scheduled Maintenance",
      "content": "We will be performing maintenance on Jan 20th from 12am-4am UTC.",
      "type": "maintenance",
      "status": "active",
      "starts_at": "2024-01-20T00:00:00Z",
      "ends_at": "2024-01-20T04:00:00Z",
      "created_at": "2024-01-15T10:00:00Z",
      "updated_at": "2024-01-15T10:00:00Z"
    }
  ]
}

Create Announcement

POST/api/status-page-settings/announcements

Create a new announcement

Headers:

HeaderValue
AuthorizationBearer {access_token}
Content-Typeapplication/json

Request Body:

FieldTypeRequiredDefaultValidation
titlestringYes-Announcement title
contentstringYes-Announcement content
typestringNoinfoinfo, warning, critical, maintenance
statusstringNoactiveactive, archived
starts_atISO 8601NonullWhen to start showing
ends_atISO 8601NonullWhen to stop showing

Request Example:

{
  "title": "Scheduled Maintenance",
  "content": "We will be performing database maintenance on Jan 20th from 12am-4am UTC. Expect brief service interruptions.",
  "type": "maintenance",
  "starts_at": "2024-01-19T00:00:00Z",
  "ends_at": "2024-01-20T05:00:00Z"
}

Success Response (201 Created):

{
  "announcement": {
    "id": "announcement-uuid",
    "user_id": "user-uuid",
    "title": "Scheduled Maintenance",
    "content": "...",
    "type": "maintenance",
    "status": "active",
    "starts_at": "2024-01-19T00:00:00Z",
    "ends_at": "2024-01-20T05:00:00Z",
    "created_at": "2024-01-15T10:00:00Z",
    "updated_at": "2024-01-15T10:00:00Z"
  }
}

Update Announcement

PUT/api/status-page-settings/announcements/:id

Update an existing announcement

Path Parameters:

ParameterTypeDescription
idUUIDAnnouncement ID

Request Body:

Same fields as create, all optional.

Request Example:

{
  "status": "archived"
}

Delete Announcement

DELETE/api/status-page-settings/announcements/:id

Delete an announcement

Path Parameters:

ParameterTypeDescription
idUUIDAnnouncement ID

Success Response (200 OK):

{
  "success": true
}

Announcement Types

TypeDisplayUse Case
infoBlue/neutralGeneral information
warningYellow/amberPotential issues or degradation
criticalRedActive incidents or outages
maintenancePurple/specialPlanned maintenance windows

Announcements automatically appear on your status page when starts_at is in the past and ends_at is in the future (or both are null for always-visible announcements).