Programmatic access to your StatusRooster monitors, checks, incidents, and heartbeat pings.
All API requests require an API key in the X-API-Key header.
Sign up to get one.
Response envelope: Every endpoint returns this shape:
All timestamps are UTC, formatted as ISO 8601 (2026-03-03T12:30:00+00:00).
Error codes:
| Code | Meaning |
|---|---|
401 | Missing or invalid API key |
403 | Monitor limit exceeded |
404 | Resource not found |
422 | Invalid or missing request body |
Error response example:
All features (SMS, Slack, webhooks, maintenance windows, custom headers, basic auth) are available on all plans. The only limit is the number of monitors: Free gets 10, Pro gets 200.
All code examples on this page assume these variables are defined:
Select a monitor type, fill in fields, and get ready-to-use code.
Monitor websites and URLs for availability. Checks HTTP status code, response time, body keyword matching, and auto-detects SSL certificate expiry. This is the default monitor type.
Provision a new HTTP/HTTPS uptime monitor. Begins checking immediately with pending status until the first check completes.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name for the monitor. Example: "Production API", "Blog Homepage" |
| url | string | required | Full URL including protocol. Must be http:// or https://. Example: "https://example.com/health". Private/internal IPs are blocked. |
| monitor_type | string | optional | "http" โ this is the default and can be omitted for HTTP monitors |
| expected_status_code | integer | optional | HTTP status code the checker expects. Default: 200. Common values: 200 (OK), 201 (Created), 204 (No Content), 301 (Redirect), 401 (to verify auth is enforced) |
| timeout | integer | optional | Max seconds to wait for a response. Range: 1โ60. Default: 10. Values outside this range return a 422 error. |
| http_method | string | optional | The HTTP method the checker uses to hit your URL. Values: GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS. Default: GET. Use HEAD for fast up/down checks without downloading the body. |
| follow_redirects | boolean | optional | Follow HTTP 3xx redirects. Default: true. Set to false to verify a redirect itself returns the expected 301/302 status. |
| basic_auth_user | string | optional | HTTP Basic Auth username. Sent as Authorization: Basic base64(user:pass) header. |
| basic_auth_pass | string | optional | HTTP Basic Auth password. Required if basic_auth_user is set. Ignored without basic_auth_user. |
| bearer_token | string | optional | Bearer token. Sent as Authorization: Bearer <token>. Example: "tok_live_abc123". If both Bearer and Basic are set, Bearer takes precedence. |
| request_body | string | optional | Request body to send. Only used with POST, PUT, PATCH, DELETE methods. Example: "{\"ping\": true}". Ignored for GET/HEAD. |
| request_content_type | string | optional | Content-Type header for the request body. Values: "application/json", "text/plain", "application/x-www-form-urlencoded". Only relevant when request_body is set. |
| custom_headers | array | optional | Custom request headers sent with each check. Array of objects: [{"key": "X-Custom-Header", "value": "my-value"}, {"key": "Accept", "value": "text/html"}] |
| keyword | string | optional | Mark down if keyword is missing from response body. Prefix with ! for "must NOT contain". Combine with AND / OR. Examples: "Welcome", "!maintenance", "OK AND !error", "healthy OR ready" |
| response_threshold_ms | string | optional | Mark down if response time violates this condition. Formats: "> 2000" (slower than 2s), "< 50" (suspiciously fast), "200-3000" (outside range). Value is in milliseconds. |
| check_interval | integer | optional | Seconds between checks. Free plan: 60โ300 (default 60). Pro plan: 60โ300 (default 60). Common values: 60 (1 min), 120 (2 min), 300 (5 min). |
| alert_email | string | optional | Override alert email. Defaults to your account email. Example: "ops@example.com" |
| alert_slack_webhook | string | optional | Slack incoming webhook URL for alerts. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | optional | URL to receive POST requests on status changes (up โ down, down โ up). Payload includes monitor ID, status, and timestamp. |
| public | boolean | optional | Include on your public status page at /s/{slug}. Default: true. Set to false for internal monitors. |
| paused | boolean | optional | Create in paused state โ no checks run until resumed. Default: false |
| group | string | optional | Group tag for organizing monitors on the dashboard. Free-form text. Examples: "Production", "Staging", "Payment Services" |
| maintenance_windows | array | optional | Suppress alerts during scheduled windows. Array of objects with day ("monday"โ"sunday" or "daily"), start_utc, and end_utc in "HH:MM" format. Example: [{"day": "daily", "start_utc": "02:00", "end_utc": "04:00"}] |
Response (201 Created):
Partial update โ include only the fields you want to change. Omitted fields are preserved. Both PUT and PATCH are accepted and behave identically.
| Field | Type | Description |
|---|---|---|
| name | string | Display name. Example: "Production API" |
| url | string | Monitored URL. Must include protocol (http:// or https://). Private IPs are blocked. |
| expected_status_code | integer | Expected HTTP status code. Common values: 200, 201, 204, 301 |
| timeout | integer | Request timeout in seconds. Range: 1โ60. Values outside this range return a 422 error. |
| http_method | string | HTTP method the checker uses to hit your URL. Values: GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS |
| follow_redirects | boolean | Follow HTTP 3xx redirects. Set false to verify redirects return the expected 301/302. |
| basic_auth_user | string | HTTP Basic Auth username. Sent as Authorization: Basic base64(user:pass). |
| basic_auth_pass | string | HTTP Basic Auth password. Set to "" to clear. Ignored without basic_auth_user. |
| bearer_token | string | Bearer token. Example: "tok_live_abc123". Set to "" to clear. Takes precedence over Basic Auth. |
| request_body | string | Request body for POST/PUT/PATCH/DELETE. Example: "{\"ping\": true}". Ignored for GET/HEAD. |
| request_content_type | string | Content-Type for request body. Values: "application/json", "text/plain", "application/x-www-form-urlencoded" |
| custom_headers | array | Custom headers. Replaces all existing headers. Example: [{"key": "Accept", "value": "text/html"}]. Send [] to clear. |
| keyword | string | Body keyword expression. Examples: "OK", "!error", "OK AND !maintenance". Set to "" to clear. |
| response_threshold_ms | string | Response time condition in ms. Formats: "> 2000", "< 50", "200-3000". Set to "" to clear. |
| check_interval | integer | Seconds between checks. Free: 60โ300. Pro: 60โ300. Common: 60 (1 min), 300 (5 min). |
| alert_email | string | Alert email address. Example: "ops@example.com". Set to "" to use account default. |
| alert_slack_webhook | string | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | URL to receive POST on status changes. Set to "" to disable. |
| public | boolean | Show on public status page (/s/{slug}). Set false for internal monitors. |
| paused | boolean | Pause (true) or resume (false) monitoring. Paused monitors run no checks. |
| group | string | Group tag. Examples: "Production", "Staging". Set to "" to clear. |
| slug | string | Custom status page URL slug (/s/{slug}). Auto-sanitized to lowercase alphanumeric + hyphens. Example: "my-api" |
| maintenance_windows | array | Replaces all maintenance windows. day: "monday"โ"sunday" or "daily". Times in "HH:MM" UTC. Send [] to clear. |
Response (200 OK): Returns the full updated monitor object.
Monitor REST API endpoints with deep JSON response validation. Supports Authorization headers and field-level assertions using dot-notation paths, comparison operators, and existence checks.
Provision a JSON/API monitor that validates HTTP status, parses the JSON response body, and evaluates field-level assertions.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name. Example: "Health API", "Payments Service" |
| monitor_type | string | required | Must be "json_api" |
| url | string | required | API endpoint URL. Must return JSON. Example: "https://api.example.com/v1/health". Private IPs are blocked. |
| expected_status_code | integer | optional | Expected HTTP status code. Default: 200. Common values: 200, 201, 204 |
| timeout | integer | optional | Max seconds to wait for a response. Range: 1โ60. Default: 10. Values outside this range return a 422 error. |
| auth_header | string | optional | Full Authorization header value. Examples: "Bearer tok_live_xxxx", "Basic dXNlcjpwYXNz", "Token my-api-key" |
| json_assertions | array | optional | Array of assertion objects to validate the JSON response (see schema below). All assertions must pass for the check to be "up". |
| response_threshold_ms | string | optional | Response time condition in ms. Formats: "> 2000" (slower than 2s), "< 50", "200-3000" (outside range) |
| check_interval | integer | optional | Seconds between checks. Free: 60โ300 (default 60). Pro: 60โ300 (default 30). Common: 60 (1 min), 300 (5 min). |
| alert_email | string | optional | Override alert email. Example: "ops@example.com". Defaults to your account email. |
| alert_slack_webhook | string | optional | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | optional | URL to receive POST on status changes (up โ down, down โ up) |
| public | boolean | optional | Include on public status page. Default: true. Set false for internal monitors. |
| paused | boolean | optional | Create in paused state โ no checks run until resumed. Default: false |
| group | string | optional | Group tag. Examples: "Production", "Microservices", "Third-Party" |
| maintenance_windows | array | optional | Suppress alerts during windows. day: "monday"โ"sunday" or "daily". Example: [{"day": "sunday", "start_utc": "03:00", "end_utc": "05:00"}] |
Assertion object schema:
| Field | Type | Description |
|---|---|---|
| path | string | JSON path using dot notation. Supports array indices. Examples: "status", "data.count", "data.users[0].name", "meta.pagination.total" |
| operator | string | Comparison operator. Values: "equals", "not_equals", "contains" (substring match), "not_contains", "greater_than" (numeric), "less_than" (numeric), "exists" (field is present), "not_exists" (field is absent) |
| value | string | Expected value as a string. Numeric comparisons parse the string: "100". Ignored for exists/not_exists (pass ""). Examples: "ok", "true", "42" |
Response (201 Created):
Only type-relevant fields shown. The full response includes all fields from the complete field reference.
Partial update โ include only the fields you want to change. Omitted fields are preserved. Both PUT and PATCH are accepted and behave identically.
| Field | Type | Description |
|---|---|---|
| name | string | Display name. Example: "Health API" |
| url | string | API endpoint URL. Must return JSON. Private IPs are blocked. |
| expected_status_code | integer | Expected HTTP status code. Common values: 200, 201, 204 |
| timeout | integer | Request timeout in seconds. Range: 1โ60. Values outside this range return a 422 error. |
| auth_header | string | Full Authorization header value. Examples: "Bearer tok_xxx", "Token my-key". Set to "" to clear. |
| json_assertions | array | Replaces all assertions. Array of {path, operator, value} objects. Send [] to clear all assertions. |
| response_threshold_ms | string | Response time condition in ms. Formats: "> 2000", "< 50", "200-3000". Set to "" to clear. |
| check_interval | integer | Seconds between checks. Free: 60โ300. Pro: 60โ300. Common: 60 (1 min), 300 (5 min). |
| alert_email | string | Alert email. Example: "ops@example.com". Set to "" to use account default. |
| alert_slack_webhook | string | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | URL to receive POST on status changes. Set to "" to disable. |
| public | boolean | Show on public status page. Set false for internal monitors. |
| paused | boolean | Pause (true) or resume (false) monitoring. |
| group | string | Group tag. Examples: "Production", "Microservices". Set to "" to clear. |
| slug | string | Custom status page URL slug (/s/{slug}). Auto-sanitized to lowercase + hyphens. Example: "health-api" |
| maintenance_windows | array | Replaces all maintenance windows. day: "monday"โ"sunday" or "daily". Send [] to clear. |
Response (200 OK): Returns the full updated monitor object.
Dead man's switch monitoring for cron jobs, scheduled tasks, and background workers. StatusRooster generates a unique ping URL โ your service hits it on schedule. If a ping is missed beyond the grace period, the monitor transitions to down and alerts fire.
Provision a heartbeat monitor. No url is needed โ a unique ping_url is generated automatically and returned in the response. Add this URL to the end of your cron job or scheduled task.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name. Examples: "Nightly Backup", "Invoice Cron", "Queue Worker" |
| monitor_type | string | required | Must be "heartbeat" |
| heartbeat_interval | integer | optional | How often your job should ping, in seconds. Range: 60โ86400. Default: 300. Common values: 300 (5 min), 900 (15 min), 3600 (1 hr), 86400 (daily) |
| heartbeat_grace_period | integer | optional | Extra seconds to wait before marking down. Range: 0โ3600. Default: 60. Use higher values for jobs with variable runtime. Example: 300 (5 min grace) |
| check_interval | integer | optional | How often StatusRooster verifies whether a ping was received on time. Free: 60โ300 (default 60). Pro: 60โ300 (default 30). |
| alert_email | string | optional | Override alert email. Example: "ops@example.com". Defaults to your account email. |
| alert_slack_webhook | string | optional | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | optional | URL to receive POST on status changes (up โ down, down โ up) |
| public | boolean | optional | Include on public status page. Default: true. Set false for internal jobs. |
| paused | boolean | optional | Create in paused state โ pings are accepted but not tracked. Default: false |
| group | string | optional | Group tag. Examples: "Infrastructure", "Cron Jobs", "Background Workers" |
| maintenance_windows | array | optional | Suppress alerts during windows. day: "monday"โ"sunday" or "daily". Example: [{"day": "daily", "start_utc": "03:00", "end_utc": "04:00"}] |
Response (201 Created):
Only type-relevant fields shown. The full response includes all fields from the complete field reference.
๐ก Use the ping_url from the response directly in your crontab โ it already includes the token.
Records a successful ping and resets the heartbeat timer. If no ping arrives within heartbeat_interval + heartbeat_grace_period, the monitor transitions to down. Accepts GET, POST, or HEAD โ use whichever fits your environment.
๐ A ?token= query parameter is required. Use the ping_url from the create response โ it already includes the token. Returns 403 if the token is missing or invalid.
โ ๏ธ The ping URL is /api/ping/{id}?token={ping_token} โ note there is no /v1/ in the path. This is a lightweight endpoint, separate from the API-key-authenticated API.
Response (200 OK):
next_expected_before is a Unix timestamp โ if no ping arrives before this time (plus grace period), the monitor goes down.
Response when paused (200 OK):
๐ก Tip: Use curl -fsS --retry 3 for silent operation with automatic retries on transient network errors.
Partial update โ include only the fields you want to change. Omitted fields are preserved. Both PUT and PATCH are accepted and behave identically.
| Field | Type | Description |
|---|---|---|
| name | string | Display name. Example: "Nightly Backup" |
| heartbeat_interval | integer | Expected ping frequency in seconds. Range: 60โ86400. Common: 300 (5 min), 3600 (1 hr), 86400 (daily) |
| heartbeat_grace_period | integer | Extra seconds before alerting. Range: 0โ3600. Example: 300 (5 min grace for slow jobs) |
| check_interval | integer | Seconds between status checks. Free: 60โ300. Pro: 60โ300. |
| alert_email | string | Alert email. Example: "ops@example.com". Set to "" to use account default. |
| alert_slack_webhook | string | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | URL to receive POST on status changes. Set to "" to disable. |
| public | boolean | Show on public status page. Set false for internal jobs. |
| paused | boolean | Pause (true) or resume (false). Paused monitors accept pings but don't track them. |
| group | string | Group tag. Examples: "Cron Jobs", "Infrastructure". Set to "" to clear. |
| slug | string | Custom status page URL slug (/s/{slug}). Auto-sanitized to lowercase + hyphens. Example: "nightly-backup" |
| maintenance_windows | array | Replaces all maintenance windows. day: "monday"โ"sunday" or "daily". Send [] to clear. |
Response (200 OK): Returns the full updated monitor object.
Dedicated SSL/TLS certificate expiry monitoring. Connects to a domain on port 443, reads the certificate chain, and warns before expiration. The only monitor type with a warn status โ triggered when the certificate is within the configured threshold of expiring.
Provision an SSL certificate monitor. No url required โ only the bare domain. StatusRooster checks the certificate chain and alerts before expiration.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name. Examples: "example.com SSL", "API Certificate" |
| monitor_type | string | required | Must be "ssl" |
| ssl_domain | string | required | Bare hostname โ no protocol, no path. Examples: "example.com", "api.example.com". Do NOT include https://. |
| ssl_expiry_threshold_days | integer | optional | Days before certificate expiry to trigger warn status. Range: 1โ90. Default: 30. Common values: 7 (tight), 14 (standard), 30 (conservative) |
| check_interval | integer | optional | Seconds between checks. Free: 60โ300 (default 60). Pro: 60โ300 (default 30). SSL checks are lightweight โ 300 (5 min) is usually sufficient. |
| alert_email | string | optional | Override alert email. Example: "security@example.com". Defaults to your account email. |
| alert_slack_webhook | string | optional | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | optional | URL to receive POST on status changes (up โ warn, warn โ down, etc.) |
| public | boolean | optional | Include on public status page. Default: true |
| paused | boolean | optional | Create in paused state. Default: false |
| group | string | optional | Group tag. Examples: "Infrastructure", "Certificates" |
| maintenance_windows | array | optional | Suppress alerts during windows. day: "monday"โ"sunday" or "daily". Example: [{"day": "daily", "start_utc": "02:00", "end_utc": "04:00"}] |
Response (201 Created):
Only type-relevant fields shown. The full response includes all fields from the complete field reference.
โ ๏ธ SSL monitors use three statuses: up (cert valid and not near expiry), warn (cert expires within threshold), down (cert expired, invalid, or unreachable).
Partial update โ include only the fields you want to change. Omitted fields are preserved. Both PUT and PATCH are accepted and behave identically.
| Field | Type | Description |
|---|---|---|
| name | string | Display name. Example: "example.com SSL" |
| ssl_domain | string | Bare hostname โ no protocol. Examples: "example.com", "api.example.com" |
| ssl_expiry_threshold_days | integer | Days before expiry to trigger warn. Range: 1โ90. Common: 7, 14, 30 |
| check_interval | integer | Seconds between checks. Free: 60โ300. Pro: 60โ300. SSL is lightweight โ 300 (5 min) is usually fine. |
| alert_email | string | Alert email. Example: "security@example.com". Set to "" to use account default. |
| alert_slack_webhook | string | Slack incoming webhook URL. Example: "https://hooks.slack.com/services/T00/B00/xxxx" |
| webhook_url | string | URL to receive POST on status changes. Set to "" to disable. |
| public | boolean | Show on public status page. Set false for internal domains. |
| paused | boolean | Pause (true) or resume (false) monitoring. |
| group | string | Group tag. Examples: "Certificates", "Infrastructure". Set to "" to clear. |
| slug | string | Custom status page URL slug (/s/{slug}). Auto-sanitized. Example: "example-ssl" |
| maintenance_windows | array | Replaces all maintenance windows. day: "monday"โ"sunday" or "daily". Send [] to clear. |
Response (200 OK): Returns the full updated monitor object.
Returns every monitor belonging to the authenticated user โ all types in a single array. Use the monitor_type field to filter client-side by type.
Response (200 OK):
| Field | Type | Description |
|---|---|---|
| Core Fields (all types) | ||
id | string | Unique monitor ID |
monitor_type | string | "http" ยท "json_api" ยท "heartbeat" ยท "ssl" |
name | string | Display name |
url | string | Monitored URL (or ping URL for heartbeat, https://domain for SSL) |
status | string | "pending" ยท "up" ยท "down" ยท "warn" (SSL only) |
check_interval | int | Seconds between checks (60โ300) |
uptime_percent | float | Lifetime uptime percentage |
checks_total | int | Total checks executed |
checks_failed | int | Total failed checks |
last_checked | datetime|null | Last check timestamp (null if never checked) |
alert_email | string | Email for alerts |
alert_slack_webhook | string | Slack webhook URL |
webhook_url | string | Status change webhook URL |
maintenance_windows | array | Array of {day, start_utc, end_utc} |
public | bool | Has a public status page |
paused | bool | Monitoring is paused |
group | string | Dashboard group tag (empty string if ungrouped) |
slug | string | Status page URL slug (/s/{slug}) |
created_at | datetime | Creation timestamp |
last_response_by_region | object|null | Last response time per region (e.g. {"us-east1": 120.5, "us-west1": 245.3}) |
| HTTP & JSON/API Fields | ||
last_status_code | int|null | HTTP status from most recent check |
last_response_ms | float|null | Response time in ms |
expected_status_code | int|null | Expected HTTP status (default 200) |
timeout | int|null | Request timeout in seconds |
keyword | string | Body keyword check string |
response_threshold_ms | string|null | Response time condition |
ssl_expiry | datetime|null | Auto-detected SSL cert expiry |
ssl_issuer | string|null | Auto-detected SSL cert issuer |
| HTTP Only | ||
http_method | string | HTTP method (GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS) |
follow_redirects | bool | Whether to follow 3xx redirects (default true) |
basic_auth_user | string | HTTP Basic Auth username |
basic_auth_pass | string | HTTP Basic Auth password |
bearer_token | string | Bearer token auth (sent as Authorization: Bearer <token>) |
request_body | string | Request body for POST/PUT/PATCH/DELETE |
request_content_type | string | Content-Type for request body |
custom_headers | array|null | Custom request headers. Array of {key, value} |
| JSON/API Only | ||
json_assertions | array|null | Array of {path, operator, value} |
auth_header | string | Authorization header value |
| Heartbeat Only | ||
ping_url | string | Unique ping URL |
heartbeat_interval | int|null | Expected ping interval in seconds |
heartbeat_grace_period | int|null | Grace period before alerting |
| SSL Only | ||
ssl_domain | string | Domain being checked |
ssl_expiry_threshold_days | int|null | Days before expiry to trigger warn |
Returns a single monitor document with all fields. Works with all monitor types.
Response (200 OK):
๐ก The response shape is identical to objects in the List endpoint. See the complete field reference for all type-specific fields.
Returns recent check results for any monitor type, newest first. For heartbeat monitors, each entry represents a scheduled check (not a ping).
| Query Param | Type | Default | Description |
|---|---|---|---|
| limit | integer | 100 | Number of checks to return. Range: 1โ500. Example: ?limit=10 for the most recent 10 checks. |
Response (200 OK):
| Field | Type | Description |
|---|---|---|
id | string | Unique check ID |
timestamp | datetime | When the check executed |
status_code | int|null | HTTP status (null for heartbeat/SSL or connection failure) |
response_ms | float|null | Response time in ms (null for heartbeat/SSL or timeout) |
is_up | bool | Whether the check passed |
regions_checked | int|null | Number of regions that ran this check |
regions_up | int|null | Number of regions where the check passed |
response_ms_by_region | object|null | Response time per region (e.g. {"us-east1": 120.5}) |
Permanently deletes a monitor and all associated check history. Works with all monitor types. This action is irreversible.
Response (200 OK):
Incidents are automatically created when a monitor goes down and automatically resolved when it recovers. They cannot be manually created, modified, or deleted via the API. These endpoints provide read-only access to your incident history.
Returns incidents across all monitors belonging to the authenticated user, newest first. Filter by status, monitor, monitor type, and time window.
| Query Param | Type | Default | Description |
|---|---|---|---|
status | string | โ | Filter by status: "open" or "resolved". Omit for all. |
monitor_id | string | โ | Filter to a specific monitor's incidents. |
monitor_type | string | โ | Filter by monitor type: "http", "json_api", "heartbeat", or "ssl". |
hours | int | 720 | Time window in hours (1โ8760). Default returns last 30 days. |
limit | int | 50 | Max results (1โ500). |
Response (200 OK):
| Field | Type | Description |
|---|---|---|
id | string | Unique incident ID |
monitor_id | string | ID of the monitor that triggered this incident |
monitor_name | string | Monitor name at the time the incident was created |
monitor_url | string | Monitor URL at the time the incident was created |
status | string | "open" (monitor is currently down) or "resolved" (monitor recovered) |
status_code | int|null | HTTP status code that caused the failure (null for timeouts, heartbeat misses, or SSL issues) |
response_ms | float|null | Response time when the incident started (null for timeouts or non-HTTP monitors) |
started_at | datetime | When the monitor first went down |
resolved_at | datetime|null | When the monitor recovered (null if still open) |
duration_seconds | int|null | Total downtime in seconds (null if still open) |
failure_error_message | string|null | Error description from the failed check |
failure_response_headers | object|null | Response headers from the failed check |
failure_response_body | string|null | Response body from the failed check (truncated to 2048 chars) |
regions_checked | int|null | Number of regions that checked during the incident |
regions_up | int|null | Number of regions reporting UP during the incident |
region_results | array|null | Per-region results: [{region, is_up, status_code, response_ms}] |
Returns full details for a single incident. The incident must belong to one of your monitors.
Response (200 OK):
See List Incidents for the complete field reference.
When a monitor's status changes, StatusRooster POSTs a JSON payload to your configured webhook_url . Your endpoint should return a 2xx status within 10 seconds.
Headers sent with every webhook:
Payload shape:
| Field | Type | Description |
|---|---|---|
event | string | "monitor.down", "monitor.up", or "test" |
monitor_name | string | Monitor display name |
monitor_url | string | Monitored URL |
status | string | "up", "down", or "test" |
status_code | int|null | HTTP status code (null for timeouts, heartbeat misses, SSL issues, or test events) |
response_ms | float|null | Response time in ms (null for timeouts or non-HTTP monitors) |
timestamp | string | ISO 8601 UTC timestamp |
Example receiver:
๐ก Use the Test Alert button on your monitor's settings page to send a test webhook with "event": "test" and verify your endpoint is working.
Embed live SVG badges in your README, docs, or website. No authentication required โ badges are public for monitors with public: true. Cached for 5 minutes. Works with all monitor types.
Shields.io-style SVG showing uptime percentage. Color-coded: green (โฅ99.5%), yellow-green (โฅ99%), yellow (โฅ95%), red (<95%).
Shows current status: up (green), down (red), warn (amber, SSL only), or pending (gray).
Shows most recent response time. Best suited for HTTP and JSON/API monitors. Color-coded: green (<500ms), yellow-green (<1.5s), yellow (<3s), red (โฅ3s).
All features are available on every plan. The only difference is the number of monitors. Exceeding the monitor limit returns 403 Forbidden.
| Limit | Free | Pro ($9/mo) |
|---|---|---|
| Monitors | 10 | 200 |
| Check interval | 60โ300s | 60โ300s |
| Email / Slack / SMS / Webhooks | โ | โ |
| Status pages | 10 | 10 |
| Custom branding | โ | โ |
| Maintenance windows | โ | โ |
| Custom headers / Basic Auth | โ | โ |
| Multi-region checks | 4 regions | 4 regions |
| Data retention | 90 days | 90 days |
No strict rate limits are enforced today. Please keep polling under 60 requests per minute โ once per minute is sufficient for dashboard-style polling. Abusive usage may be throttled or blocked without notice.
The heartbeat ping endpoint (/api/ping/{id}) is excluded from this โ ping as frequently as your cron job runs.
Numeric fields with documented ranges (e.g. check_interval, timeout, heartbeat_interval, heartbeat_grace_period, ssl_expiry_threshold_days) return a 422 error if the value is outside the valid range. For example, timeout: 120 returns {"error": "timeout must be between 1 and 60 seconds"}. check_interval below your plan minimum returns a 403 error. Query parameters like limit and hours on GET endpoints are silently clamped to their valid bounds.