API & MCP
API Reference
Query the live status of 2,000+ services over a read-only REST API. Bearer-authenticated JSON, available on the Hobby plan and up.
The Statusfield REST API (v2) gives you read-only, programmatic access to the same 2,000+ vendor status catalog that powers your dashboard and alerts. Every endpoint returns JSON, is authenticated with a Bearer token, and is served from the base URL https://statusfield.com.
Use it to check whether a service is degraded, list the monitors in your workspace, or pull a live snapshot of everything currently down.
Paid Plan Required
The API is available on the Hobby plan and up. It is not available on the
Free plan — Free-plan keys return 403 plan_restriction. Upgrade your
plan to get started.
Authentication
All endpoints require an API key passed as a Bearer token:
Authorization: Bearer sf_<64-hex-chars>
Create a Key
Go to Settings → Integrations → API Keys and create a new key. The key is shown only once at creation time, so copy it somewhere safe. You can revoke a key from the same screen at any time.
Make Your First Call
Pass the key in the Authorization header on every request:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/services?search=github&limit=5"Keys are scoped to the workspace that created them. Rate limits, quotas, and available features all follow that workspace's plan.
Rate Limits & Quota
Limits are enforced per workspace per minute, with a per-second burst ceiling. The X-RateLimit-Limit and X-RateLimit-Remaining headers are returned on every response. When you exceed a limit you get 429 rate_limited along with a Retry-After (seconds) header.
| Plan | Requests / minute | Burst (requests / second) | Requests / month |
|---|---|---|---|
| Free | — (no API access) | — | — |
| Hobby | 10 | 2 | 100,000 |
| Pro | 30 | 5 | 500,000 |
| Team | 100 | 10 | 2,000,000 |
The monthly quota is enforced per workspace and tracked in the database, so it survives restarts and is accurate across instances. For plans with a finite cap, responses include X-Quota-Limit, X-Quota-Remaining, and X-Quota-Reset (ISO timestamp of the next UTC-month reset) headers. Exceeding the cap returns 429 quota_exceeded. The monthly counter resets at the start of each UTC month.
Check the Headers
Read X-RateLimit-Remaining to pace short bursts and X-Quota-Remaining to
track your monthly budget. On a 429, honor Retry-After before retrying.
Error Shape
All errors follow the same JSON shape:
{ "error": "<code>", "message": "<human-readable description>" }| HTTP Status | error code | Meaning |
|---|---|---|
| 400 | bad_request | Missing or invalid parameter (e.g. slug) |
| 401 | unauthorized | Missing Authorization header or invalid key format |
| 401 | invalid_key | API key not found |
| 403 | banned | Account suspended or inactive |
| 403 | expired | Temporary access expired |
| 403 | plan_restriction | Feature not available on current plan |
| 404 | not_found | Resource does not exist |
| 405 | method_not_allowed | Wrong HTTP method |
| 429 | rate_limited | Rate limit exceeded; see Retry-After |
| 429 | quota_exceeded | Monthly request quota exceeded |
List Services
GET /api/v2/services
List the Statusfield service catalog with optional filtering and cursor-based pagination.
Query parameters:
| Parameter | Type | Default | Max | Description |
|---|---|---|---|---|
category | string | — | — | Filter by category code (e.g. cloud_computing) |
search | string | — | — | Full-text search on service name |
cursor | string | — | — | Opaque cursor from a previous response |
limit | number | 50 | 100 | Number of results per page |
Pass pagination.nextCursor from a response as the cursor on your next request to page through results. Keep going while pagination.hasMore is true.
Response 200:
{
"data": [
{
"name": "GitHub",
"slug": "github",
"categoryCode": "developer_tools",
"category": "Developer Tools",
"iconUrl": "https://statusfield.com/logos/github.png",
"lastCheckedAt": "2026-06-04T12:00:00.000Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6IjEyMyJ9",
"hasMore": true
}
}Example:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/services?search=github&limit=5"Get a Service
GET /api/v2/services/{slug}
Get the current status of a single service and all its components.
Path parameter: slug — the service's URL slug (e.g. github).
Response 200:
{
"data": {
"name": "GitHub",
"slug": "github",
"categoryCode": "developer_tools",
"category": "Developer Tools",
"iconUrl": "https://statusfield.com/logos/github.png",
"lastCheckedAt": "2026-06-04T12:00:00.000Z",
"statusCode": "OPERATIONAL",
"status": "Operational",
"components": [
{
"name": "GitHub Actions",
"statusCode": "DEGRADED_PERFORMANCE",
"status": "Degraded Performance",
"updatedAt": "2026-06-04T11:45:00.000Z"
}
]
}
}Returns 400 bad_request if the slug is missing or invalid, and 404 not_found if the service does not exist.
Example:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/services/github"List Monitors
GET /api/v2/monitors
List all monitors belonging to the authenticated workspace.
Response 200:
{
"data": [
{
"id": "mon_abc123",
"createdAt": "2026-01-15T09:00:00.000Z",
"isCustom": false,
"type": "catalog",
"expiresAt": null,
"service": {
"name": "GitHub",
"slug": "github",
"categoryCode": "developer_tools",
"category": "Developer Tools",
"iconUrl": "https://statusfield.com/logos/github.png",
"lastCheckedAt": "2026-06-04T12:00:00.000Z"
},
"component": {
"name": "GitHub Actions",
"statusCode": "OPERATIONAL",
"status": "Operational",
"updatedAt": "2026-06-04T11:45:00.000Z"
}
}
]
}Each monitor carries a type describing its kind and an isCustom flag:
type | isCustom | Meaning |
|---|---|---|
catalog | false | A monitor on a Statusfield catalog (3rd-party) service |
http | true | Your custom URL / server-response (uptime) monitor |
ssl | true | Your custom SSL-certificate-expiry monitor |
domain | true | Your custom domain-registration-expiry monitor |
custom | true | A custom monitor with no more specific kind |
expiresAt is the upcoming expiry date (ISO 8601) for ssl / domain monitors, and null for all other types.
Query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
filter | string | — | outages returns only monitors whose component is currently in a non-operational state |
Example:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/monitors"
# Only my monitors that are currently down:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/monitors?filter=outages"List Outages
GET /api/v2/outages
List every catalog service currently experiencing an outage or degradation — across all of Statusfield, not just your monitors.
Query parameters:
| Parameter | Type | Default | Max | Description |
|---|---|---|---|---|
limit | number | 100 | 200 | Number of outages to return |
Response 200:
{
"data": [
{
"name": "GitHub",
"slug": "github",
"categoryCode": "developer_tools",
"category": "Developer Tools",
"iconUrl": "https://statusfield.com/logos/github.png",
"lastCheckedAt": "2026-06-04T12:00:00.000Z",
"statusCode": "MAJOR_OUTAGE",
"status": "Major Outage",
"updatedAt": "2026-06-04T11:45:00.000Z"
}
]
}A non-operational service is anything not in OPERATIONAL, RE_ROUTED, or PARTIALLY_RE_ROUTED. Custom (workspace-private) monitors are never included. The list is a bounded snapshot — there is no pagination.
Example:
curl -H "Authorization: Bearer sf_your_key" \
"https://statusfield.com/api/v2/outages"Using the Same Key from AI Tools
Your sf_ key also works with the Statusfield MCP server, so AI tools like Claude can query live status directly. See the MCP Server guide to connect it.
For the current per-plan request and quota limits, see Pricing.