API v1

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.

REST API
<100ms avg response
</>99.99% uptime

Getting Started

Base URL, authentication, and rate limits. Everything you need to make your first API call.

Base URL

https://api.statusshield.app/v1

All API endpoints are relative to this base URL. HTTPS is required for all requests.

Rate Limits

60 req/min
Free
300 req/min
Starter
1,000 req/min
Pro

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:

bash
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

  1. 1Log in to your StatusShield dashboard
  2. 2Navigate to Settings > API Keys
  3. 3Click "Generate New Key"
  4. 4Copy and store the key securely - it won't be shown again

Key Format

API keys are prefixed for easy identification:

ss_live_Production key
ss_test_Test/sandbox key

Using Your Key

Include your API key in the Authorization header of every request:

bash
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 key
403Key does not have access to the requested resource
429Rate limit exceeded

Monitors API

Create, manage, and query your uptime monitors. Supports HTTP and HTTPS checks.

GET/monitors

List 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"
POST/monitors

Create 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
  }'
GET/monitors/:id

Get 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"
DELETE/monitors/:id

Permanently 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"
PATCH/monitors/:id/pause

Pause 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"
PATCH/monitors/:id/resume

Resume 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.

GET/incidents

List 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"
POST/incidents

Create 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"]
  }'
PATCH/incidents/:id

Update 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

investigating
Looking into it
identified
Root cause found
monitoring
Fix deployed
resolved
All clear

Status Pages API

Create and manage public status pages. Brand them with your logo, colors, and custom domain.

GET/status-pages

List all status pages in your account.

curl https://api.statusshield.app/v1/status-pages \
  -H "Authorization: Bearer ss_live_your_api_key"
POST/status-pages

Create 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
  }'
GET/status/:slug

Get 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/acme

Webhooks

Receive real-time notifications when monitors go down, recover, or when incidents are created.

Webhooks are coming soon. The documentation below previews the planned API.

Setting Up Webhooks

  1. 1Go to Dashboard > Alerts > Webhooks
  2. 2Click "Add Webhook Endpoint"
  3. 3Enter your endpoint URL (must be HTTPS)
  4. 4Select which events to subscribe to
  5. 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 recovers
monitor.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 updated
incident.resolvedFired when an incident is marked as resolved

Example Payload: monitor.down

json
{
  "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

json
{
  "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

json
{
  "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:

python
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 and Slack integrations are coming soon. Email alerts are available now on all plans.
Coming soon

Telegram

Get instant alerts via Telegram bot

  1. 1Open Telegram and search for @StatusShieldBot
  2. 2Send /start to the bot to get your unique chat_id
  3. 3Go to Dashboard > Alerts > Telegram
  4. 4Paste your chat_id and click "Verify & Connect"
  5. 5Choose which events trigger Telegram alerts
bash
# 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"] }'
Coming soon

Slack

Send alerts to any Slack channel

  1. 1Create an Incoming Webhook in your Slack workspace (api.slack.com/messaging/webhooks)
  2. 2Copy the webhook URL (https://hooks.slack.com/services/...)
  3. 3Go to Dashboard > Alerts > Slack
  4. 4Paste the webhook URL and select your alert preferences
bash
# 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:

bash
# 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:

yaml
# .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

bash
# 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

python
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

javascript
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.