API Reference

StatusAPI provides a set of public, read-only JSON endpoints that expose real-time and historical uptime data for all monitored services. Data is refreshed automatically every 5 minutes via GitHub Actions and served as static files from GitHub Pages.

Base URL
https://notdeathm.is-a.dev/statusapi

All endpoints return application/json and support HTTPS. No authentication is required. Data is cached by GitHub Pages CDN.

Authentication

All endpoints are completely public and require no API key or authentication token. Simply make a GET request to any endpoint.

🔓
Public API
No API key required. All endpoints are freely accessible over HTTPS.

Rate Limits

Since all data is served as static JSON files via GitHub Pages CDN, there are no custom rate limits enforced by this API. However, please be mindful of GitHub's standard limits and avoid hammering the endpoints unnecessarily.

ParameterValueNotes
Data refresh rateEvery 5 minutesVia GitHub Actions cron job
Recommended poll interval≥ 60 secondsData won't normally change more often than every 5 min
ProtocolHTTPS onlyTLS 1.2+ enforced by GitHub Pages
Cache-ControlGitHub CDNAdd ?t=timestamp to bust cache

Endpoints

All endpoints are read-only GET requests. Responses are UTF-8 encoded JSON.

GET/status.jsonTry it →

Current Status

Returns the real-time status of all monitored services including response times, HTTP status codes, and overall system health.

Response
JSON
{
  "success": true,
  "timestamp": "2026-10-06T12:00:00.000Z",
  "version": "4.0",
  "totalServices": 2,
  "allOperational": true,
  "anyDown": false,
  "anyDegraded": false,
  "summary": {
    "countsByStatus": { "up": 2, "degraded": 0, "down": 0 },
    "averageResponseTime": 145,
    "lastChecked": "2026-10-06T12:00:00.000Z"
  },
  "services": [
    {
      "service": {
        "id": "notdeath-website",
        "name": "NotDeath Portfolio",
        "url": "https://notdeathm.is-a.dev",
        "type": "http"
      },
      "currentStatus": {
        "status": "up",
        "statusCode": 200,
        "responseTime": 142,
        "lastChecked": "2026-10-06T12:00:00.000Z",
        "error": null
      },
      "uptime30d": 99.98
    }
  ]
}
Response Fields
FieldTypeDescription
successbooleanWhether the check completed successfully
timestampstring (ISO 8601)When this data was generated
versionstringAPI version string
totalServicesnumberTotal number of monitored services
allOperationalbooleanTrue if all services are up or degraded
anyDownbooleanTrue if at least one service is down
anyDegradedbooleanTrue if at least one service is slow
summary.countsByStatusobjectCount of services in each status state
summary.averageResponseTimenumber (ms)Average response time across all services
services[].currentStatus.statusenum"up" | "down" | "degraded"
services[].currentStatus.statusCodenumber | nullHTTP status code from last check
services[].currentStatus.responseTimenumber (ms)Response time in milliseconds
services[].currentStatus.errorstring | nullError message if the check failed
services[].uptime30dnumber (%)30-day uptime percentage (0–100)
GET/history.jsonTry it →

30-Day History

Returns 30 days of daily aggregated history per service. Each day entry includes status, average response time, uptime percentage, and incident count.

Response
JSON
{
  "success": true,
  "timestamp": "2026-10-06T12:00:00.000Z",
  "services": [
    {
      "serviceId": "notdeath-website",
      "serviceName": "NotDeath Portfolio",
      "overallUptime30d": 99.98,
      "history": [
        {
          "date": "2026-10-05",
          "status": "up",
          "responseTime": 142,
          "avgResponseTime": 138,
          "uptime": 100,
          "upCount": 288,
          "totalCount": 288,
          "incidents": 0
        }
      ]
    }
  ]
}
Response Fields
FieldTypeDescription
services[].serviceIdstringUnique identifier for the service
services[].overallUptime30dnumber (%)30-day uptime percentage
history[].datestring (YYYY-MM-DD)The date of this history entry
history[].statusenumWorst status observed during the day: "up" | "down" | "degraded"
history[].avgResponseTimenumber (ms)Rolling average response time for the day
history[].uptimenumber (%)Uptime percentage for that day (0–100)
history[].upCountnumberNumber of successful checks that day
history[].totalCountnumberTotal number of checks performed that day
history[].incidentsnumberNumber of outage events recorded that day
GET/incidents.jsonTry it →

Incidents

Returns all open and resolved incidents. Open incidents are actively ongoing. Closed incidents include resolution time and total duration.

Response
JSON
{
  "success": true,
  "timestamp": "2026-10-06T12:00:00.000Z",
  "totalIncidents": 2,
  "openIncidents": [],
  "closedIncidents": [
    {
      "id": "notdeath-website-1719000000000",
      "serviceId": "notdeath-website",
      "serviceName": "NotDeath Portfolio",
      "status": "down",
      "statusCode": 503,
      "startTime": "2026-10-05T12:00:00.000Z",
      "resolvedTime": "2026-10-05T12:45:00.000Z",
      "durationMs": 2700000,
      "resolvedStatus": "up",
      "error": null
    }
  ]
}
Response Fields
FieldTypeDescription
openIncidentsarrayCurrently active incidents (service is still down)
closedIncidentsarrayResolved incidents (up to 90 most recent)
incidents[].idstringUnique incident identifier
incidents[].serviceIdstringID of the affected service
incidents[].statusenumStatus that triggered the incident
incidents[].statusCodenumber | nullHTTP status code at time of failure
incidents[].startTimestring (ISO 8601)When the outage was first detected
incidents[].resolvedTimestring | undefinedWhen the service recovered
incidents[].durationMsnumber | undefinedTotal outage duration in milliseconds
incidents[].errorstring | nullRaw error message from the probe
GET/api/v1/summary.jsonTry it →

Summary (v1)

Lightweight versioned endpoint returning a compact health summary. Ideal for integrations, badges, and monitoring hooks.

Response
JSON
{
  "success": true,
  "timestamp": "2026-10-06T12:00:00.000Z",
  "version": "4.0",
  "status": "operational",
  "summary": {
    "countsByStatus": { "up": 2, "degraded": 0, "down": 0 },
    "averageResponseTime": 145,
    "servicesHealthy": 2,
    "totalServices": 2,
    "uptimePercentage": 100
  }
}
Response Fields
FieldTypeDescription
statusenumOverall system status: "operational" | "degraded" | "outage"
summary.uptimePercentagenumber (%)% of services currently "up" (not degraded)
summary.servicesHealthynumberCount of services that are up or degraded
summary.countsByStatusobjectCount of services by each status value
GET/api/v1/status.jsonTry it →

Full Status (v1)

Same schema as the root status endpoint under a stable, versioned path for long-lived integrations.

Response
JSON
// Same schema as /status.json
// See "Current Status" above for the full response shape.
GET/api/v1/openapi.jsonTry it →

OpenAPI 3.1 Specification

Machine-readable API definition for documentation generators, clients, and API testing tools.

Response
JSON
{
  "openapi": "3.1.0",
  "info": { "title": "StatusAPI", "version": "4.0.0" },
  "servers": [{ "url": "https://notdeathm.is-a.dev/statusapi" }],
  "paths": { "...": "..." }
}

Examples

Ready-to-use code examples for common integrations.

cURL
Get current status
BASH
curl -s "https://notdeathm.is-a.dev/statusapi/status.json" | jq '.services[] | {name: .service.name, status: .currentStatus.status, responseTime: .currentStatus.responseTime}'
Check if any service is down
BASH
curl -s "https://notdeathm.is-a.dev/statusapi/api/v1/summary.json" | jq '.status'
Get 30d uptime for all services
BASH
curl -s "https://notdeathm.is-a.dev/statusapi/history.json" | jq '.services[] | {name: .serviceName, uptime: .overallUptime30d}'
List open incidents
BASH
curl -s "https://notdeathm.is-a.dev/statusapi/incidents.json" | jq '.openIncidents'
JavaScript / TypeScript
JavaScript
// Fetch overall system status
const res = await fetch("https://notdeathm.is-a.dev/statusapi/api/v1/summary.json");
const data = await res.json();

if (data.status === "operational") {
  console.log("✅ All systems operational");
} else if (data.status === "degraded") {
  console.log("⚠️  Partial degradation");
} else {
  console.log("🚨 Service outage detected");
}

// Get individual service response times
const status = await fetch("https://notdeathm.is-a.dev/statusapi/status.json").then(r => r.json());
status.services.forEach(({ service, currentStatus }) => {
  console.log(`${service.name}: ${currentStatus.responseTime}ms (${currentStatus.status})`);
});

Status Values

Services and incidents use a fixed set of status strings.

ValueMeaningTrigger condition
upOperationalHTTP 200 in under 2,000ms
degradedDegraded performanceHTTP 200 but response ≥ 2,000ms
downOutageNon-2xx status, timeout, or connection error (confirmed by retry)
maintenanceMaintenance windowManually set in maintenance.json