StatusShield API Docs
Everything you need to integrate StatusShield into your stack. Manage monitors, incidents, and status pages programmatically. Built for developers who automate everything.
Getting Started
Base URL, authentication, and rate limits. Everything you need to make your first API call.
Base URL
https://api.statusshield.app/v1All API endpoints are relative to this base URL. HTTPS is required for all requests.
Rate Limits
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Exceeding the limit returns 429 Too Many Requests.
Quick Start
Make your first API call in under 30 seconds:
curl -s https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" | jq .Authentication
All API requests require a Bearer token. Generate your API key from the dashboard.
Getting Your API Key
- 1Log in to your StatusShield dashboard
- 2Navigate to Settings > API Keys
- 3Click "Generate New Key"
- 4Copy and store the key securely - it won't be shown again
Key Format
API keys are prefixed for easy identification:
ss_live_Production keyss_test_Test/sandbox keyUsing Your Key
Include your API key in the Authorization header of every request:
curl https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_abc123def456ghi789"Security: Never expose your API key in client-side code, public repositories, or browser requests. Always use it from your backend or CI/CD environment.
Authentication Errors
401Missing or invalid API key403Key does not have access to the requested resource429Rate limit exceededMonitors API
Create, manage, and query your uptime monitors. Supports HTTP and HTTPS checks.
/monitorsList all monitors in your account. Returns an array of monitor objects sorted by creation date.
curl https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_your_api_key"/monitorsCreate a new uptime monitor. The monitor will start checking immediately after creation.
curl -X POST https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Production API",
"url": "https://api.example.com/health",
"type": "https",
"interval": 60,
"regions": ["us-east", "eu-west"],
"expected_status": 200
}'/monitors/:idGet detailed information about a specific monitor, including recent check results and response time history.
curl https://api.statusshield.app/v1/monitors/mon_abc123 \
-H "Authorization: Bearer ss_live_your_api_key"/monitors/:idPermanently delete a monitor. This action cannot be undone. All associated history and check data will be removed.
curl -X DELETE https://api.statusshield.app/v1/monitors/mon_abc123 \
-H "Authorization: Bearer ss_live_your_api_key"/monitors/:id/pausePause a monitor. The monitor will stop checking until resumed. No alerts will fire while paused.
curl -X PATCH https://api.statusshield.app/v1/monitors/mon_abc123/pause \
-H "Authorization: Bearer ss_live_your_api_key"/monitors/:id/resumeResume a paused monitor. The monitor will begin checking again immediately.
curl -X PATCH https://api.statusshield.app/v1/monitors/mon_abc123/resume \
-H "Authorization: Bearer ss_live_your_api_key"Incidents API
Create and manage incidents. Automatically detected outages also appear here.
/incidentsList all incidents. Supports filtering by status (investigating, identified, monitoring, resolved).
curl "https://api.statusshield.app/v1/incidents?status=investigating" \
-H "Authorization: Bearer ss_live_your_api_key"/incidentsCreate a manual incident. Affected monitors will show as degraded on your status page.
curl -X POST https://api.statusshield.app/v1/incidents \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Scheduled Database Maintenance",
"status": "investigating",
"impact": "minor",
"message": "Performing scheduled database maintenance.",
"affected_monitors": ["mon_abc123"]
}'/incidents/:idUpdate an incident's status. Adds an entry to the incident timeline and notifies subscribers.
curl -X PATCH https://api.statusshield.app/v1/incidents/inc_002 \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"status": "resolved",
"message": "Database maintenance complete. All systems operational."
}'Incident Status Values
investigatingidentifiedmonitoringresolvedStatus Pages API
Create and manage public status pages. Brand them with your logo, colors, and custom domain.
/status-pagesList all status pages in your account.
curl https://api.statusshield.app/v1/status-pages \
-H "Authorization: Bearer ss_live_your_api_key"/status-pagesCreate a new public status page. Optionally attach monitors and configure branding.
curl -X POST https://api.statusshield.app/v1/status-pages \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Status",
"slug": "acme",
"monitors": ["mon_abc123", "mon_def456"],
"is_public": true
}'/status/:slugGet public status data for a status page. No authentication required. Use this to build custom status displays or integrate into your own site.
# No authentication required - public endpoint
curl https://api.statusshield.app/v1/status/acmeWebhooks
Receive real-time notifications when monitors go down, recover, or when incidents are created.
Setting Up Webhooks
- 1Go to Dashboard > Alerts > Webhooks
- 2Click "Add Webhook Endpoint"
- 3Enter your endpoint URL (must be HTTPS)
- 4Select which events to subscribe to
- 5Copy your signing secret for verification
Webhook Events
monitor.downFired when a monitor goes down (after confirmation checks)monitor.upFired when a previously down monitor recoversmonitor.ssl_expiringFired when SSL certificate is nearing expiry (30, 14, 7 days)incident.createdFired when a new incident is created (auto or manual)incident.updatedFired when an incident status is updatedincident.resolvedFired when an incident is marked as resolvedExample Payload: monitor.down
{
"event": "monitor.down",
"timestamp": "2026-03-16T09:15:00Z",
"data": {
"monitor": {
"id": "mon_abc123",
"name": "Production API",
"url": "https://api.example.com/health"
},
"check": {
"status_code": 503,
"response_ms": 30000,
"error": "Service Unavailable",
"region": "us-east"
},
"downtime": {
"started_at": "2026-03-16T09:15:00Z",
"confirmed_at": "2026-03-16T09:16:00Z",
"confirmation_checks": 3
}
}
}Example Payload: monitor.up
{
"event": "monitor.up",
"timestamp": "2026-03-16T09:45:00Z",
"data": {
"monitor": {
"id": "mon_abc123",
"name": "Production API",
"url": "https://api.example.com/health"
},
"check": {
"status_code": 200,
"response_ms": 156,
"region": "us-east"
},
"downtime": {
"started_at": "2026-03-16T09:15:00Z",
"ended_at": "2026-03-16T09:45:00Z",
"duration_seconds": 1800
}
}
}Example Payload: incident.created
{
"event": "incident.created",
"timestamp": "2026-03-16T09:15:30Z",
"data": {
"incident": {
"id": "inc_003",
"title": "API Elevated Error Rates",
"status": "investigating",
"impact": "major",
"message": "Automated: Monitor 'Production API' is down.",
"affected_monitors": ["mon_abc123"],
"started_at": "2026-03-16T09:15:30Z"
}
}
}Verifying Webhook Signatures
Every webhook includes a X-StatusShield-Signature header. Verify it using HMAC-SHA256 with your signing secret:
import hmac, hashlib
def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature)Integrations
Connect StatusShield with the tools your team already uses. From chat alerts to CI/CD pipelines.
Telegram
Get instant alerts via Telegram bot
- 1Open Telegram and search for @StatusShieldBot
- 2Send /start to the bot to get your unique chat_id
- 3Go to Dashboard > Alerts > Telegram
- 4Paste your chat_id and click "Verify & Connect"
- 5Choose which events trigger Telegram alerts
# You can also configure Telegram via API
curl -X POST https://api.statusshield.app/v1/alerts/telegram \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "chat_id": "123456789", "events": ["monitor.down", "monitor.up"] }'Slack
Send alerts to any Slack channel
- 1Create an Incoming Webhook in your Slack workspace (api.slack.com/messaging/webhooks)
- 2Copy the webhook URL (https://hooks.slack.com/services/...)
- 3Go to Dashboard > Alerts > Slack
- 4Paste the webhook URL and select your alert preferences
# Configure Slack via API
curl -X POST https://api.statusshield.app/v1/alerts/slack \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"webhook_url": "https://hooks.slack.com/services/T00/B00/xxxx",
"channel": "#ops-alerts",
"events": ["monitor.down", "monitor.up", "incident.created"]
}'Claude Code
Query StatusShield from the Claude Code CLI
Use StatusShield directly from Claude Code to check your monitors, create incidents, or verify deployment health:
# In Claude Code, ask it to check your monitors:
# "Check if my production API is healthy"
# Claude Code can run this for you:
curl -s https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer $STATUSSHIELD_API_KEY" | jq '.data[] | {name, status, uptime_7d}'
# Or create an incident after a failed deployment:
curl -X POST https://api.statusshield.app/v1/incidents \
-H "Authorization: Bearer $STATUSSHIELD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Deployment rollback - v2.3.1",
"status": "investigating",
"impact": "minor",
"message": "Rolling back due to elevated error rates."
}'Tip: Set STATUSSHIELD_API_KEY as an environment variable so Claude Code can access it without exposing the key in your prompts.
GitHub Actions
Monitor health checks in your CI/CD pipeline
Add a post-deployment health check to your GitHub Actions workflow:
# .github/workflows/deploy.yml
name: Deploy & Verify
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to production
run: ./deploy.sh
- name: Wait for deployment
run: sleep 30
- name: Check StatusShield monitors
env:
SS_API_KEY: ${{ secrets.STATUSSHIELD_API_KEY }}
run: |
STATUS=$(curl -sf \
-H "Authorization: Bearer $SS_API_KEY" \
https://api.statusshield.app/v1/monitors/mon_abc123 \
| jq -r '.data.status')
if [ "$STATUS" != "up" ]; then
echo "Monitor is $STATUS - deployment may have issues"
exit 1
fi
echo "Monitor is UP - deployment verified"
- name: Create incident on failure
if: failure()
env:
SS_API_KEY: ${{ secrets.STATUSSHIELD_API_KEY }}
run: |
curl -X POST \
-H "Authorization: Bearer $SS_API_KEY" \
-H "Content-Type: application/json" \
https://api.statusshield.app/v1/incidents \
-d '{
"title": "Deployment issue - COMMIT_SHA",
"status": "investigating",
"impact": "major",
"message": "Automated: Post-deploy health check failed."
}'curl
All examples in curl for universal compatibility
# List all monitors
curl -s https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_your_api_key" | jq .
# Create a monitor
curl -X POST https://api.statusshield.app/v1/monitors \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"name":"My API","url":"https://api.example.com","type":"https","interval":60}'
# Get public status (no auth)
curl -s https://api.statusshield.app/v1/status/acme | jq .
# Create an incident
curl -X POST https://api.statusshield.app/v1/incidents \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"title":"API Issue","status":"investigating","impact":"major","message":"Looking into it."}'
# Resolve an incident
curl -X PATCH https://api.statusshield.app/v1/incidents/inc_001 \
-H "Authorization: Bearer ss_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"status":"resolved","message":"All clear."}'
# Pause a monitor
curl -X PATCH https://api.statusshield.app/v1/monitors/mon_abc123/pause \
-H "Authorization: Bearer ss_live_your_api_key"
# Resume a monitor
curl -X PATCH https://api.statusshield.app/v1/monitors/mon_abc123/resume \
-H "Authorization: Bearer ss_live_your_api_key"Python
Using the requests library
import requests
API_KEY = "ss_live_your_api_key"
BASE = "https://api.statusshield.app/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
# List all monitors
monitors = requests.get(f"{BASE}/monitors", headers=headers).json()
for m in monitors["data"]:
print(f"{m['name']}: {m['status']} ({m['uptime_7d']}% uptime)")
# Create a new monitor
new_monitor = requests.post(f"{BASE}/monitors", headers=headers, json={
"name": "Checkout Service",
"url": "https://checkout.example.com/health",
"type": "https",
"interval": 60,
"regions": ["us-east", "eu-west"],
}).json()
print(f"Created monitor: {new_monitor['data']['id']}")
# Create an incident
incident = requests.post(f"{BASE}/incidents", headers=headers, json={
"title": "Payment Gateway Degraded",
"status": "investigating",
"impact": "major",
"message": "Stripe webhook delivery is delayed.",
"affected_monitors": ["mon_abc123"],
}).json()
print(f"Incident: {incident['data']['id']}")
# Resolve the incident
requests.patch(f"{BASE}/incidents/{incident['data']['id']}", headers=headers, json={
"status": "resolved",
"message": "Stripe confirmed resolution. All payments processing normally.",
})
# Get public status (no auth needed)
status = requests.get(f"{BASE}/status/acme").json()
print(f"Overall: {status['data']['overall_status']}")JavaScript / TypeScript
Using the Fetch API
const API_KEY = "ss_live_your_api_key";
const BASE = "https://api.statusshield.app/v1";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
// List all monitors
const monitors = await fetch(`${BASE}/monitors`, { headers }).then(r => r.json());
monitors.data.forEach(m => {
console.log(`${m.name}: ${m.status} (${m.uptime_7d}% uptime)`);
});
// Create a new monitor
const newMonitor = await fetch(`${BASE}/monitors`, {
method: "POST",
headers,
body: JSON.stringify({
name: "Checkout Service",
url: "https://checkout.example.com/health",
type: "https",
interval: 60,
regions: ["us-east", "eu-west"],
}),
}).then(r => r.json());
console.log(`Created: ${newMonitor.data.id}`);
// Create an incident
const incident = await fetch(`${BASE}/incidents`, {
method: "POST",
headers,
body: JSON.stringify({
title: "CDN Cache Purge Issue",
status: "investigating",
impact: "minor",
message: "Cache invalidation is taking longer than expected.",
affected_monitors: ["mon_def456"],
}),
}).then(r => r.json());
// Update incident to resolved
await fetch(`${BASE}/incidents/${incident.data.id}`, {
method: "PATCH",
headers,
body: JSON.stringify({
status: "resolved",
message: "CDN cache purge completed successfully.",
}),
});
// Get public status page data (no auth required)
const status = await fetch(`${BASE}/status/acme`).then(r => r.json());
console.log(`Status: ${status.data.overall_status}`);Ready to build?
Sign up for free, grab your API key, and start monitoring in under a minute. No credit card required.