Skip to content

Get the platform's operational health

The platform.system.get operation: GET /api/v1/platform/system in the REST API and the platform_system_get tool in the MCP server.

GET/api/v1/platform/system

The System page (spec §39.1) in one read, with a status per area (ok, warning, critical) and overall:

  • Job queue (§30.1): jobs by status, how many are due and how long the oldest has waited (warning at 5 minutes), running jobs whose lease lapsed, and dead jobs (dead letters) by type with the newest 25 (critical while any exist; retry them as docs/runbooks/jobs.md describes).
  • Outbox: undispatched rows and the oldest one's age (warning at 5 minutes).
  • Webhooks: deliveries over the last 24 hours by status, the failure rate in parts per million of finished deliveries (warning at 5 %), and the endpoints failing most.
  • Processors (§15): connections by status across organizations and every degraded or disconnected one (warning). Labels and statuses only: never a key.
  • FX (§8.3): the newest ECB publication day loaded (stale after 4 days, missing without any).

Operational facts only: no job payloads, event bodies or customer data.

At a glance

  • REST: GET /api/v1/platform/system
  • MCP tool: platform_system_get
  • Operation ID: platform.system.get
  • Scope: Platform
  • Permission: platform:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Authentication: API key with the platform:read scope
  • Since: M12

Request

Query parameters

This operation takes no query parameters.

Response

200 OK with a JSON object:

FieldTypeDescription
object"platform_system"
atdate-time
statusone of ok, warning, critical
jobsobject
jobs.statusone of ok, warning, critical
jobs.countsobject
jobs.dueQueuedinteger
jobs.lagSecondsinteger or nullHow long the oldest due job has waited.
jobs.lapsedRunninginteger
jobs.deadByTypearray of object
jobs.deadByType[].typestring
jobs.deadByType[].countinteger
jobs.deadarray of object
jobs.dead[].idjob_… ID
jobs.dead[].typestring
jobs.dead[].attemptsinteger
jobs.dead[].maxAttemptsinteger
jobs.dead[].lastErrorstring or null
jobs.dead[].finishedAtdate-time or null
jobs.dead[].createdAtdate-time
outboxobject
outbox.statusone of ok, warning, critical
outbox.pendinginteger
outbox.lagSecondsinteger or nullHow long the oldest undispatched row has waited.
webhooksobject
webhooks.statusone of ok, warning, critical
webhooks.sincedate-time
webhooks.totalinteger
webhooks.byStatusobject
webhooks.failurePpminteger or null
webhooks.failingEndpointsarray of object
webhooks.failingEndpoints[].orgobject or null
webhooks.failingEndpoints[].orgIdorg_… ID
webhooks.failingEndpoints[].brandIdbrd_… ID
webhooks.failingEndpoints[].endpointIdwe_… ID
webhooks.failingEndpoints[].livemodeboolean
webhooks.failingEndpoints[].failedinteger
webhooks.failingEndpoints[].totalinteger
processorsobject
processors.statusone of ok, warning, critical
processors.countsobject
processors.unhealthyarray of object
processors.unhealthy[].idpcon_… ID
processors.unhealthy[].orgobject or null
processors.unhealthy[].orgIdorg_… ID
processors.unhealthy[].entityIdent_… ID
processors.unhealthy[].livemodeboolean
processors.unhealthy[].processorstring
processors.unhealthy[].labelstring
processors.unhealthy[].statusstring
processors.unhealthy[].statusReasonstring or null
processors.unhealthy[].lastCheckedAtdate-time or null
fxobject
fx.statusone of ok, stale, missing
fx.latestDatestring or null
fx.ageDaysinteger or null
fx.fetchedAtdate-time or null

Examples

One dead job and a degraded connection

HTTP
GET /api/v1/platform/system
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "platform_system",
  "at": "2026-11-03T09:00:00.000Z",
  "status": "critical",
  "jobs": {
    "status": "critical",
    "counts": {
      "queued": 3,
      "running": 1,
      "done": 18220,
      "dead": 1
    },
    "dueQueued": 1,
    "lagSeconds": 12,
    "lapsedRunning": 0,
    "deadByType": [
      {
        "type": "send_email",
        "count": 1
      }
    ],
    "dead": [
      {
        "id": "job_01m5wvkry2exrtkrtdj4j17k3w",
        "type": "send_email",
        "attempts": 8,
        "maxAttempts": 8,
        "lastError": "Resend answered 422: invalid recipient",
        "finishedAt": "2026-11-03T08:40:12.000Z",
        "createdAt": "2026-11-03T06:10:00.000Z"
      }
    ]
  },
  "outbox": {
    "status": "ok",
    "pending": 0,
    "lagSeconds": null
  },
  "webhooks": {
    "status": "ok",
    "since": "2026-11-02T09:00:00.000Z",
    "total": 940,
    "byStatus": {
      "succeeded": 921,
      "failed": 7,
      "pending": 12
    },
    "failurePpm": 7543,
    "failingEndpoints": [
      {
        "org": {
          "id": "org_01m5wvkry1e6w94sjxgme33fs5",
          "slug": "acme",
          "name": "Acme"
        },
        "orgId": "org_01m5wvkry1e6w94sjxgme33fs5",
        "brandId": "brd_01m5wvkry1e6w94sjxgme33fsh",
        "endpointId": "we_01m5wvkry2exrtkrtdj4j17k3z",
        "livemode": true,
        "failed": 7,
        "total": 63
      }
    ]
  },
  "processors": {
    "status": "warning",
    "counts": {
      "active": 41,
      "degraded": 1,
      "disconnected": 0
    },
    "unhealthy": [
      {
        "id": "pcon_01m5wvkry2exrtkrtdj4j17k3y",
        "org": {
          "id": "org_01m5wvkry1e6w94sjxgme33fs5",
          "slug": "acme",
          "name": "Acme"
        },
        "orgId": "org_01m5wvkry1e6w94sjxgme33fs5",
        "entityId": "ent_01m5wvkry1e6w94sjxgme33fsf",
        "livemode": true,
        "processor": "stripe",
        "label": "Stripe (live)",
        "status": "degraded",
        "statusReason": "The restricted key lost the Refunds write permission.",
        "lastCheckedAt": "2026-11-03T08:00:00.000Z"
      }
    ]
  },
  "fx": {
    "status": "ok",
    "latestDate": "2026-11-02",
    "ageDays": 1,
    "fetchedAt": "2026-11-02T15:31:07.000Z"
  }
}

Errors

CodeHTTP statusWhenWhat to do
permission_denied403You aren't platform staff with read access to the platform console.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: validation_failed, api_version_unsupported, authentication_required, api_key_invalid, resource_not_found, dry_run_not_supported, rate_limited, internal_error.