API Documentation

Embed status badges and query your status page programmatically. No API key required — all endpoints are public and read-only.

Badge API

Returns an SVG status badge in shields.io style. Use it in READMEs, documentation, or anywhere that renders images.

GET/api/badge/{slug}

Path parameters

slugstringrequired

Your status page slug (e.g. my-app)

Query parameters

stylestring

Badge style. flat (default, rounded) or flat-square.

servicestring

Filter to a specific service by name. Case-insensitive. Returns that service's individual status instead of the overall page status.

labelstring

Override the badge label text. Defaults to page name or service name.

Examples

Overall page status

bashcurl https://statusowl.pro/api/badge/my-app

Specific service, square style

bashcurl "https://statusowl.pro/api/badge/my-app?service=API&style=flat-square"

Custom label

bashcurl "https://statusowl.pro/api/badge/my-app?label=Uptime"

Response

Returns image/svg+xml. Status values: operational, degraded, outage, not found.

Status API

Returns JSON with your page's current status, all services, and active incidents. CORS-enabled — call it from the browser.

GET/api/status/{slug}

Path parameters

slugstringrequired

Your status page slug

Example

bashcurl https://statusowl.pro/api/status/my-app

Response (200 OK)

json{
  "page": {
    "name": "My App",
    "slug": "my-app",
    "url": "https://statusowl.pro/my-app"
  },
  "status": {
    "overall": "operational",
    "services": [
      {
        "name": "API",
        "status": "operational",
        "description": "Core API endpoints"
      },
      {
        "name": "Dashboard",
        "status": "degraded",
        "description": "Web dashboard"
      }
    ],
    "active_incidents": [
      {
        "title": "Dashboard loading slowly",
        "status": "investigating",
        "created_at": "2026-04-03T10:30:00Z"
      }
    ]
  }
}

Error response (404)

json{ "error": "Page not found" }

Response fields

page.namestring

Display name of the status page

page.slugstring

URL slug

page.urlstring

Full URL to the public status page

status.overallstring

Overall status: operational, degraded, outage, none, or unknown

status.services[]array

Each service with name, status, and description

status.active_incidents[]array

Currently unresolved incidents with title, status, and created_at timestamp

Embedding examples

Markdown (GitHub README)

markdown[![Status](https://statusowl.pro/api/badge/my-app)](https://statusowl.pro/my-app)

HTML

html<a href="https://statusowl.pro/my-app">
  <img src="https://statusowl.pro/api/badge/my-app" alt="Status" />
</a>

JavaScript (fetch status data)

javascriptconst res = await fetch("https://statusowl.pro/api/status/my-app");
const data = await res.json();

if (data.status.overall !== "operational") {
  console.warn("Service degraded:", data.status.overall);
}

Python (check status in CI)

pythonimport requests

r = requests.get("https://statusowl.pro/api/status/my-app")
status = r.json()["status"]["overall"]

if status != "operational":
    print(f"Warning: upstream is {status}")
    exit(1)

Caching & rate limits

All API responses include Cache-Control: public, max-age=60. Badges and status data refresh every 60 seconds.

There are no rate limits. The API is backed by edge caching. If you're polling, once per minute is plenty.

CORS headers (Access-Control-Allow-Origin: *) are set on the JSON API, so you can call it directly from browser JavaScript.

Ready to set up your status page?

Free tier: 1 page, 5 services. All API endpoints included.

Create your status page