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>
1

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.

2

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.

PlanRequests / minuteBurst (requests / second)Requests / month
Free— (no API access)
Hobby102100,000
Pro305500,000
Team100102,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 Statuserror codeMeaning
400bad_requestMissing or invalid parameter (e.g. slug)
401unauthorizedMissing Authorization header or invalid key format
401invalid_keyAPI key not found
403bannedAccount suspended or inactive
403expiredTemporary access expired
403plan_restrictionFeature not available on current plan
404not_foundResource does not exist
405method_not_allowedWrong HTTP method
429rate_limitedRate limit exceeded; see Retry-After
429quota_exceededMonthly request quota exceeded

List Services

GET /api/v2/services

List the Statusfield service catalog with optional filtering and cursor-based pagination.

Query parameters:

ParameterTypeDefaultMaxDescription
categorystringFilter by category code (e.g. cloud_computing)
searchstringFull-text search on service name
cursorstringOpaque cursor from a previous response
limitnumber50100Number 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:

typeisCustomMeaning
catalogfalseA monitor on a Statusfield catalog (3rd-party) service
httptrueYour custom URL / server-response (uptime) monitor
ssltrueYour custom SSL-certificate-expiry monitor
domaintrueYour custom domain-registration-expiry monitor
customtrueA 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:

ParameterTypeDefaultDescription
filterstringoutages 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:

ParameterTypeDefaultMaxDescription
limitnumber100200Number 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.