Introduction
In 2026, transparency about your service status is key to maintaining customer and user trust. StatusPage, an Atlassian service, lets you create public status pages like those of GitHub or Stripe, showing real-time component states (operational, degraded, outage). This intermediate tutorial guides you step by step to set up a professional page: creating components, managing incidents via API, sending metrics, handling subscribers, and monitoring integrations.
Why is it essential? A StatusPage can reduce support tickets by 40-60% (per Atlassian), improve SEO with fresh metrics, and integrate natively with Datadog, Pingdom, or UptimeRobot. We blend web interface and API automations for a hybrid approach. At the end, your page will be production-ready with copy-paste curl scripts for CI/CD. Estimated time: 30 minutes for a basic setup, expandable to advanced workflows.
Prerequisites
- Free account on statuspage.io (Free plan is enough to start).
- Basic knowledge of REST APIs and curl (or Postman for testing).
- External monitoring tool (UptimeRobot free tier recommended).
- Text editor for bash/JSON scripts.
- Admin access to a domain for custom URL (optional).
Step 1: Create Your StatusPage
Log in to statuspage.io and click New Status Page. Choose a name (e.g., "MyService Status"), subdomain (e.g., myservice.statuspage.io), and language. Make the page public right away.
In Dashboard > API, grab your API token (OAuth format). Copy it securely (don't commit to Git). Test it with curl -H "Authorization: OAuth YOUR_TOKEN" https://api.statuspage.io/v1/pages/YOUR_PAGE_ID to validate. This key provides read/write access to components, incidents, and metrics. Think of it like a Stripe API key—protect it like a root password.
List Existing Components
#!/bin/bash
# Replace with your token and page ID (found in dashboard URL: statuspage.io/{page_id})
TOKEN="YourOAuthTokenHere"
PAGE_ID="YourPageID"
curl -s -H "Authorization: OAuth $TOKEN" \
https://api.statuspage.io/v1/pages/$PAGE_ID/components.json \
| jq '.components[] | {name: .name, id: .id, status: .status}'
# Run with: chmod +x list-components.sh && ./list-components.sh
# Requires jq for pretty-printing (brew install jq or apt install jq)This bash script lists all components on your page via the StatusPage API. It uses curl with OAuth auth and jq to format the JSON response. Replace TOKEN and PAGE_ID; it's the first API test to validate your access. Pitfall: without jq, output is raw; always check API quotas (500 req/min).
Step 2: Add a Component
Components represent your services (e.g., API, DB, Frontend). In the UI, go to Components > New Component: name it "API Backend", description "User request handling", group "Backend". Default status: operational. Enable backups and third-party metrics for external metrics.
Create a New Component via API
#!/bin/bash
TOKEN="YourOAuthTokenHere"
PAGE_ID="YourPageID"
COMPONENT_NAME="API Backend"
DESCRIPTION="User request handling"
GROUP_ID="" # Leave empty or use an existing group ID
curl -X POST -s -H "Authorization: OAuth $TOKEN" \
-H "Content-Type: application/json" \
https://api.statuspage.io/v1/pages/$PAGE_ID/components.json \
-d '{"component":{"name":"'${COMPONENT_NAME}'","description":"'${DESCRIPTION}'","group_id":"'${GROUP_ID}'","status":"operational"}}' \
| jq '.'
# Check in dashboard or rerun list-components.shThis script creates a component programmatically, ideal for IaC or CI/CD. It POSTs JSON with name, description, and initial status. Use variables for reusability; test with list-components.sh afterward. Pitfall: double quotes in bash JSON—use single quotes to avoid escaping.
Step 3: Manage Incidents
Incidents notify about degradations or outages. In the UI: Incidents > New Incident, title "API Degradation", impact on component, update with resolution. For automation, use the API.
Publish an Incident via API
#!/bin/bash
TOKEN="YourOAuthTokenHere"
PAGE_ID="YourPageID"
COMPONENT_ID="CreatedComponentID" # From list-components.sh
curl -X POST -s -H "Authorization: OAuth $TOKEN" \
-H "Content-Type: application/json" \
https://api.statuspage.io/v1/pages/$PAGE_ID/incidents.json \
-d '{"incident":{"name":"API Performance Degradation","status":"investigating","components":[{"id":"'${COMPONENT_ID}'","status":"partial_outage"}],"body":"Investigation underway, impacting 20% of requests."}}' \
| jq '.incident | {id: .id, name: .name, status: .status}'
# Resolve later: PATCH /incidents/{incident_id}.json with status: "resolved"Creates an incident impacting a specific component, with investigating status and partial_outage. Perfect for monitoring alerts (PagerDuty trigger). Note the components array for multi-selection. Pitfall: strict status values (operational/degraded/major_outage); always update to resolved.
Step 4: Configure Metrics
Metrics display charts (uptime, latency). UI: Metrics > New Metric, source Graph (New Relic) or Back-end (custom API). For custom, use endpoint /pages/{id}/metrics/{metric_id}/data-points.json.
JSON Payload for Custom Metric
{
"data": {
"timestamp": "2026-01-01T12:00:00+00:00",
"value": 99.5,
"values": {
"success_rate": 99.5,
"latency_p95": 250
}
}
}JSON payload to post a metric data point (uptime % or latency ms). Send via curl POST to /pages/{page_id}/metrics/{metric_id}/data-points.json. ISO8601 timestamp required; values for multi-metrics. Pitfall: UTC timezone or graph breaks.
Send a Metric via Curl
#!/bin/bash
TOKEN="YourOAuthTokenHere"
PAGE_ID="YourPageID"
METRIC_ID="YourMetricID" # Create in UI first
curl -X POST -s -H "Authorization: OAuth $TOKEN" \
-H "Content-Type: application/json" \
https://api.statuspage.io/v1/pages/$PAGE_ID/metrics/$METRIC_ID/data-points.json \
-d @metric-data.json \
| jq '.'
# Automate in cron or GitHub Actions every 5minPOSTs the metric-data.json to the API to update the live graph. Create the metric in UI first (Back-end type). Ideal for cronjob monitoring. Pitfall: rate limit 100/min; batch for high frequency.
Step 5: Subscribers and Notifications
Subscribers: UI > Subscribers > New Subscriber, email/Slack/RSS, routing rules (e.g., critical only). API for bulk.
Add a Subscriber via API
#!/bin/bash
TOKEN="YourOAuthTokenHere"
PAGE_ID="YourPageID"
curl -X POST -s -H "Authorization: OAuth $TOKEN" \
-H "Content-Type: application/json" \
https://api.statuspage.io/v1/pages/$PAGE_ID/subscribers.json \
-d '{"subscriber":{"name":"Dev Team","email":"dev@mycompany.com","policy":{"send_reports":"daily","send_outages":"always","send_maintenance":"always"}}} ' \
| jq '.subscriber | {id: .id, email: .email}'
# Routing: add "components": ["id1","id2"] for filteringCreates an email subscriber with notification policy (daily reports, always outages). Extend to Slack webhook via UI. Pitfall: exact policy keys; test with an incident to validate.
Best Practices
- Automate everything: Integrate API with PagerDuty/New Relic for auto-incidents; cron for metrics.
- Subscriber routing: Segment by component (e.g., sales@ for frontend only) to cut noise.
- Custom domain/Branding: Add CNAME to yourdomain.com/status (Pro plan), custom CSS to match brand.
- Metrics backups: Multi-sources (UptimeRobot + internal probe) for resilience.
- Security: Rotate token quarterly, use RBAC for multi-user teams (Enterprise plan).
Common Errors to Avoid
- Invalid token: Check OAuth prefix; regenerate on 401 Unauthorized.
- Status mismatch: Components and incidents must align (partial_outage on component if investigating).
- Metrics not graphing: Timestamps future/past >7 days ignored; always use UTC.
- No notifications: Verify subscriber policy and Slack webhooks (test via UI).
Next Steps
- Official docs: StatusPage API.
- Integrate Terraform: StatusPage provider for IaC.
- Self-hosted alternatives: Upptime or Cachet.
- Check out our DevOps training at Learni for advanced monitoring (Prometheus, Grafana).