API & MCP
Your dashboards, their services and your URL monitors, as JSON for scripts, CI and wallboards, and over MCP for AI assistants. The catalog of status pages answers without a key; everything about your account needs one.
Getting a key
API keys come with Pro. Create one in Settings → API & MCP: give it a name, choose Read or Read & write, the dashboards it may see, and when it expires. The key is shown once; Stackpulse keeps only a fingerprint of it. Send it in the Authorization header of every request, never in the address:
Authorization: Bearer sp_live_… A key sees only its dashboards and the URL monitors on them, never your billing, alert channels or account. A Read & write key can also add and remove services, and check, pause and resume URL monitors; nothing else. When Pro ends, keys are kept and work again after an upgrade.
Requests
Every endpoint is under https://stackpulse.app/api/v1 and answers JSON. Times are ISO 8601 in UTC. Services use the words online, issue, major_outage, critical, maintenance and unknown; URL monitors up, slow, down, paused and checking. Every item also has a color (green, yellow, orange, red, blue, grey), so one filter covers both.
curl -H "Authorization: Bearer $STACKPULSE_KEY" \
https://stackpulse.app/api/v1/dashboards/k3v9x2m1q8w7e4r {
"id": "k3v9x2m1q8w7e4r",
"name": "Production",
"summary": "Cloudflare reports a major outage. The other 11 are running fine. …",
"worst": "orange",
"counts": { "green": 11, "yellow": 0, "orange": 1, "red": 0, "blue": 0, "grey": 0 },
"items": [
{
"kind": "service",
"id": "rg0ljsyle18kq60",
"slug": "cloudflare",
"name": "Cloudflare",
"status": "major_outage",
"color": "orange",
"text": "Cloudflare One Clients are incorrectly challenged on some sites",
"since": "2026-10-06T09:07:30.679Z",
"url": "https://stackpulse.app/services/cloudflare",
"statusPage": "https://www.cloudflarestatus.com/"
},
{
"kind": "url",
"id": "q7m2x9k4w1p8z3c",
"name": "Lumen API",
"display": "api.lumenlabs.dev/health",
"status": "up",
"color": "green",
"text": "200 OK",
"since": "2026-10-06T12:58:03.000Z",
"responseMs": 184
}
]
} Endpoints
GET /me Any key
The key’s account, its plan, and what the key may do. A cheap way to check a key works.
GET /dashboards Any key
The dashboards the key can see, with how many services and URL monitors each has and its worst status now.
GET /dashboards/{id} Any key
A dashboard now: its summary, counts by status, and every service and URL monitor with its status, text and since when. A URL monitor that’s down lists what started around then: a clue, never a cause.
GET /dashboards/{id}/incidents Any key
Incidents in a window: the ones that started in it or the hour before, and the ones already going on. As far back as the plan’s history goes (90 days on Pro).
from: The window’s start, ISO 8601to: The window’s end, ISO 8601; now when left outdays: Without from: how many days back from to, 7 by default
GET /dashboards/{id}/reliability Any key
The Reliability page’s figures: the least reliable first, uptime of tracked time, incidents, recovery, and what breaks together.
days: 7, 30 (the default) or 90
POST /dashboards/{id}/services Read & write key
Adds services by slug, within the plan’s limit. Answers with what was added, already there or not found.
{ "services": ["github", "vercel"] }DELETE /dashboards/{id}/services/{slug} Read & write key
Takes a service off a dashboard.
GET /monitors Any key
The account’s URL monitors (those on the key’s dashboards).
GET /monitors/{id} Any key
One URL monitor: its status, response times over 30 days, certificate and latest checks.
POST /monitors/{id}/check Read & write key
Checks a URL monitor now, as Check now does in the app, and waits up to 20 seconds for what it got: { checked, check, monitor }. 20 a minute.
POST /monitors/{id}/pause Read & write key
Pauses a URL monitor, e.g. during a deploy: an open incident ends, and no alerts go out while it’s paused.
POST /monitors/{id}/resume Read & write key
Resumes a URL monitor: it’s checked at once and starts fresh.
GET /services No key
Searches the catalog by name: the best 20, with their status now.
q: A name, e.g. github
GET /services/{slug} No key
One service: its status, components, 90 days and recent incidents (the same as /services/{slug}.json).
GET /outages No key
Services reporting a problem now, the newest first. Well-known services unless ?all=1.
all: 1 for every service, not only well-known ones
The same as OpenAPI: /api/v1/openapi.json.
A deploy window
Wait for the vendors a release goes through, pause the API's monitor while it deploys, and always resume it. Name the vendors: a long regional outage somewhere else on the dashboard shouldn't hold every deploy.
# .github/workflows/deploy.yml
# STACKPULSE_KEY from the repository's secrets, DASHBOARD and MONITOR from its variables
- name: Vendors we deploy through are up
run: |
curl -sf -H "Authorization: Bearer $STACKPULSE_KEY" https://stackpulse.app/api/v1/dashboards/$DASHBOARD \
| jq -e '[.items[] | select(.slug == "github" or .slug == "vercel")
| select(.color == "orange" or .color == "red")] | length == 0'
- name: Pause the API's monitor
run: curl -sf -X POST -H "Authorization: Bearer $STACKPULSE_KEY" https://stackpulse.app/api/v1/monitors/$MONITOR/pause
- name: Deploy
run: ./deploy.sh
- name: Resume the API's monitor
if: always()
run: curl -sf -X POST -H "Authorization: Bearer $STACKPULSE_KEY" https://stackpulse.app/api/v1/monitors/$MONITOR/resume AI assistants (MCP)
Stackpulse is also an MCP server, so Claude, ChatGPT, Cursor, VS Code and other assistants
can answer “is it us or them?” from your dashboards. Its address is https://stackpulse.app/mcp (Streamable HTTP). In Claude and ChatGPT, add it as a custom connector; in Claude Code:
claude mcp add --transport http stackpulse https://stackpulse.app/mcp Anyone can search the catalog and list outages. The first question about your dashboards asks you to sign in to Stackpulse, and the first change asks again before it’s made. Every account can connect an assistant to read, Free included; changes come with Pro. Clients that don’t sign in (Cursor, VS Code) send an API key instead: Settings → API & MCP has their setup. Dashboards and URL monitors can be named by name or id. The tools:
search_services Anyone
Finds services in the catalog of 8,900+ status pages by name, with their status now. Use it to find a service’s slug.
get_service Anyone
One service’s status from its official status page: what’s wrong, its components, 90 days of history and recent incidents.
list_outages Anyone
Services reporting a problem right now, the newest first. Well-known services only, unless all is true.
list_dashboards Signed in, or any key
The account’s dashboards (the ones this connection can see), with how many services and URL monitors each has and its worst status now.
get_stack_status Signed in, or any key
What’s going on now on a dashboard: a summary, then every service and URL monitor with a problem. A URL monitor that’s down lists what started around then. Without a dashboard, every dashboard.
get_incident_history Signed in, or any key
Incidents on a dashboard in a window: the ones that started in it (with what else started at the same time) and the ones already going on. As far back as the plan’s history goes.
get_monitor Signed in, or any key
One of the account’s URL monitors: its status, the last 30 days’ checks and response times, its certificate and its latest checks.
get_reliability Signed in, or any key
How reliable a dashboard’s services and URL monitors were over 7, 30 or 90 days: the least reliable first, with uptime, incidents and recovery, and what tends to break together.
add_services Allowed to change, or a Read & write key
Adds services to a dashboard by slug (search_services finds them), within the plan’s limit.
remove_services Allowed to change, or a Read & write key
Takes services off a dashboard. Their history stays; adding one back shows it again.
check_monitor Allowed to change, or a Read & write key
Checks one of the account’s URL monitors now, as Check now does in the app, and says what it got.
pause_monitor Allowed to change, or a Read & write key
Pauses a URL monitor, e.g. during a deploy: an open incident ends, and no alerts go out until it’s resumed.
resume_monitor Allowed to change, or a Read & write key
Resumes a paused URL monitor: it’s checked at once and starts fresh.
When a URL monitor is down, the tools list what else on the dashboard started having problems around then: a clue, never a cause.
Signing in, for client developers
OAuth 2.1 with PKCE (S256), as the MCP specification describes. A request to an account tool without a token gets 401 with WWW-Authenticate pointing at /.well-known/oauth-protected-resource/mcp, whose authorization server is https://stackpulse.app (/.well-known/oauth-authorization-server). Clients name themselves with a client ID metadata document: the client_id is its https address, and it lists where people may be sent back to. There’s no registration endpoint. Scopes are read and write; a read token asking for a change gets 403 insufficient_scope. Access tokens last an hour and work only at /mcp; refresh tokens rotate on every use, and a connection unused for 90 days is signed out.
Errors and limits
An error answers with { "error": { "code": "…", "message": "…" } }. Statuses change at most once a minute, so each key gets 60 requests a minute; past that the answer is 429 with Retry-After. To hear of changes as they happen, add a webhook in Notifications instead of polling.
400 bad_request Something in the request is missing or wrong.
400 key_in_url A key was sent in the address. Revoke it: it may be in a log now.
401 unauthorized No key, or one that doesn’t exist or was revoked.
401 expired The key has expired.
401 wrong_audience An assistant’s sign-in was sent here. It works only at the MCP server; use an API key.
403 plan_required The account’s plan doesn’t include API keys (Pro ended). The key works again after an upgrade.
403 read_only A Read key tried to change something.
403 plan_limit The change would go past the plan, e.g. more than 50 services.
404 not_found Nothing with that id, or not one the key can see.
409 not_checked A check of a URL monitor that isn’t being checked: paused, on no dashboard or past the plan.
429 rate_limited More than 60 requests a minute. Retry-After says when to try again.