Skip to content

Status Page

Real-time status of our services

API reference

Download OpenAPI

Every public endpoint: what it takes, what it returns, and how to call it

Contents

Overview

Generated from the OpenAPI document this deployment serves, so it can't disagree with how the API behaves. Endpoint and field descriptions are in English.

Base URL
https://status-page.configura.com
Version
v1 · OpenAPI 3.1
OpenAPI document
/schemas/api/v1/openapi.jsonFor Postman, Insomnia or a generated client.

The public, read-mostly API behind the status page: its status, uptime, incidents, metrics and reports as JSON, the subscription endpoints the subscribe page uses, and the feeds and badge.

No authentication. Without a session you get exactly the public page; a signed-in session (the page's Azure AD sign-in) also sees the items its role may see. Responses are JSON with UTC RFC 3339 timestamps, cached for a short while (the Cache-Control is public for a visitor, private for a signed-in session, with Vary: Cookie).

Errors are JSON {"error": …, "code": …}: error is an English sentence, code (when present) a stable identifier to branch on; a body that doesn't match its schema also lists details with each offending field. Subscribing is rate-limited per address (10 a minute).

The contract is stable within v1: fields are only ever added. A rename or removal would come as v2, alongside.

Status

The page's current state: overall, per service and per component, with the 90-day grids.

get/api/v1/summary.json

The page's status in one call

Everything the public index shows: the overall status, every service with its components and their current status, whether monitoring is running (monitoring: delayed when the checks have stopped, with the time of their last heartbeat), active incidents with their full update timelines, and the maintenance running now and coming up in the next 14 days. A component whose checks have stopped reporting reads no_data, never its last result.

Cached 30 s

Responses

200The page's current state.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • sitestringrequired

    Operator-configured site name shown at the top of the public page.

  • overallstatusrequired

    Worst-case status across the whole page: the worst of every component outside an active maintenance window and every open incident's severity floor. While a window is active this is at least 'maintenance', which ranks below 'degraded': the components under the window read as maintenance whatever their monitors say, and anything worse elsewhere wins.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key. It says when this response was made, not when anything was last measured: that is monitoring.last_check_at.

  • monitoringobjectrequired

    Whether the statuses on this page are still being measured (additive within v1). The checks run in a worker process whose own clock is its heartbeat; when that stops, or the probe host has lost the network, the statuses above are the last ones known and state says delayed. Components and monitors that have not reported for three check intervals (at least 3 minutes) already read no_data.

  • servicesservice (summary)[]required

    Top-level groups shown on the public page. Ordered by display_order ascending, then name.

  • active_incidentsincident[]required

    Non-scheduled, non-resolved incidents. Always an array; [] when none are active.

  • scheduled_maintenanceincident[]required

    Maintenance windows currently active (now is between started_at and resolved_at). Upcoming-but-not-yet-active windows are in upcoming_maintenance. Always an array; [] when none are active.

  • upcoming_maintenanceincident[]required

    Scheduled maintenance windows starting within the next 14 days (added when the public page moved to rendering from this API; additive within v1). Always an array; [] when none are announced.

  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/summary.json"
Response 200live from this deployment
{  "version": "v1",  "site": "Status Page",  "overall": "operational",  "updated_at": "2026-10-08T11:23:08.144977135Z",  "monitoring": {    "state": "ok",    "last_check_at": "2026-10-08T11:22:58.388934Z"  },  "services": [    {      "id": "e94ef776-65af-4053-8636-0e05f6f788d4",      "slug": "myconfigura",      "name": "MyConfigura",      "status": "operational",      "visibility": "public",      "components": [        {          "id": "3943ef82-0856-49fc-b0fe-ce88cae2742b",          "slug": "website",          "name": "Website",          "status": "operational",          "visibility": "public"        }      ]    }  ],  "active_incidents": [],  "scheduled_maintenance": [],  "upcoming_maintenance": []}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/summary.json

get/api/v1/services/{slug}

One service with its grids and monitors

One service with per-component 90-day daily and 7-day hourly grids, and the public state of each monitor: its type, its target (only when the operator shows it; null otherwise), 24-hour uptime and most recent check (a failed check carries a stable error_code to branch on). Everything the service page shows.

Cached 30 s

Parameters

  • slugpathstringrequired

    The service's slug (from the summary). The .json suffix is optional: /api/v1/services/customer-api.json works too.

Responses

200The service.application/json

  • visibilitystring

    Who may see this service: public, signed_in (people signed in with the page's Azure AD) or admins. A visitor, and any client without a session, only ever receives public items, so this is always "public" for them; signed-in viewers get the items their role may see, marked here.

    One of: publicsigned_inadmins

    Example: "public"

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • idstring (uuid)required

    Service identifier.

  • slugstringrequired

    URL-safe identifier of the service.

  • namestringrequired

    Display name of the service.

  • descriptionstringrequired

    Operator-written description; empty string when unset.

  • statusstringrequired

    Worst-case status across the service's components.

    One of: operationaldegradedpartial_outagemajor_outagemaintenanceno_data

  • componentscomponent (service-detail)[]required

    The service's components with their grids and monitors. Always an array; [] when the service has no components.

  • 404Nothing with that id, or it is hidden from this viewer.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/services/myconfigura"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:10.093774973Z",  "id": "e94ef776-65af-4053-8636-0e05f6f788d4",  "slug": "myconfigura",  "name": "MyConfigura",  "description": "",  "status": "operational",  "visibility": "public",  "components": [    {      "id": "3943ef82-0856-49fc-b0fe-ce88cae2742b",      "slug": "website",      "name": "Website",      "description": "",      "status": "operational",      "visibility": "public",      "days": [        {          "date": "2026-07-11",          "status": "no_data",          "uptime_pct": null,          "total": 0,          "down": 0        }        … 89 more      ],      "hours": [        {          "hour": "2026-10-01T12:00:00Z",          "status": "no_data",          "uptime_pct": null,          "total": 0,          "down": 0        }        … 167 more      ],      "monitors": [        {          "id": "51c9826a-5213-416b-a3e5-7d15e1d41ceb",          "name": "Website",          "type": "http",          "target": null,          "uptime_24h_pct": 100,          "last": {            "status": "up",            "checked_at": "2026-10-08T11:22:33.701539Z",            "latency_ms": 64,            "error": null,            "error_code": null,            "error_arg": null,            "error_step": null          },          "visibility": "public",          "current_status": "operational"        }      ]    }  ]}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/services/myconfigura

get/api/v1/uptime.json

90-day uptime for every component

The 90-day daily uptime grid and 90-day figures (uptime, average response time, incidents) for every component, keyed by component id. A day without checks is no_data with uptime_pct null, never assumed green.

Cached 60 s

Responses

200Grids and figures per component.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • componentsmap of componentUptimerequired

    Per-component uptime, keyed by component id.

  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/uptime.json"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:08.148460914Z",  "components": {    "3943ef82-0856-49fc-b0fe-ce88cae2742b": {      "uptime_90d_pct": 100,      "avg_latency_ms_90d": 71.59649122807018,      "incidents_90d": 0,      "days": [        {          "date": "2026-07-11",          "status": "no_data",          "uptime_pct": null,          "total": 0,          "down": 0        }        … 89 more      ]    }  }}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/uptime.json

Incidents

Incident and maintenance history, and single incidents.

get/api/v1/incidents.json

Incident history, newest first

Non-scheduled incidents, active and resolved, each with its full update timeline. Two modes: a window of days (the default), or the whole archive page by page with limit and before.

Cached 60 s

Parameters

  • daysqueryinteger

    Window mode: incidents that started within the last this-many days, clamped to 1-90. Default 90. Echoed in the response.

  • limitqueryinteger

    Archive mode: page size, clamped to 1-100 (default 25). Using limit or before switches to archive mode.

  • beforequerystring

    Archive mode: the opaque cursor from the previous page's next_before.

  • componentquerystring (uuid)

    Only incidents attached to this component id.

  • includequerystring

    maintenance also returns maintenance windows that have started, marked is_scheduled: true.

    One of: maintenance

Responses

200A page of incidents.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • daysinteger

    The window actually applied, in days (the days query parameter clamped to 1..90; default 90). Present on every windowed request, i.e. whenever the request used neither limit nor before. Omitted on paginated-archive responses, where no time window applies.

  • componentstring (uuid)

    Echo of the component query parameter when the history was filtered to one component; omitted otherwise.

  • incidentsincident[]required

    Incidents newest first, with full update timelines. Always an array; [] when the window or page is quiet.

  • has_moreboolean

    Paginated-archive responses only: whether older incidents exist beyond this page. Omitted on windowed responses.

  • next_beforestring

    Paginated-archive responses with has_more=true only: opaque cursor to pass as ?before= for the next (older) page. Treat as a black box: the encoding may change within v1.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/incidents.json"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:10.092641431Z",  "days": 90,  "incidents": []}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/incidents.json

get/api/v1/incidents/{id}

One incident, by id

One incident or maintenance window with its full update timeline: the permalink's data. The .json suffix is optional.

Cached 60 s

Parameters

  • idpathstring (uuid)required

    The incident's id.

Responses

200The incident.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • incidentincidentrequired

    One incident or maintenance window: identity, lifecycle state, severity, timing, affected components, and its update timeline.

  • 404Nothing with that id, or it is hidden from this viewer.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/incidents/{id}"
Response 200example
{  "version": "v1",  "updated_at": "2026-09-28T12:00:00Z",  "incident": "string"}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/incidents/

Metrics

Bucketed monitor metrics per component: response time, its phases, flow steps, uptime and incidents.

get/api/v1/components/{id}/metrics.json

A component's monitor metrics

Bucketed series for one component and each of its monitors: uptime, incidents, response time and, per type, its phases (HTTP), days to expiry (certificates, domains), the heartbeat interval (push) or each step's time (flows). Every series has one entry per bucket; null means no data in that bucket. The .json suffix is optional.

Cached 60 s

Parameters

  • idpathstring (uuid)required

    The component's id (from the summary).

  • windowquerystring

    The time span: day (96 × 15 minutes), week (84 × 2 hours, the default) or month (90 × 8 hours).

    One of: dayweekmonth

Responses

200The component's series.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • component_idstring (uuid)required

    The component these metrics belong to (ids come from /api/v1/summary.json).

  • windowstringrequired

    The window that was applied: 'day' (15-minute buckets), 'week' (2-hour buckets) or 'month' (8-hour buckets). Defaults to week when the query parameter is absent.

    One of: dayweekmonth

  • bucket_secondsintegerrequired

    Width of each bucket in seconds: 900 for day, 7200 for week, 28800 for month.

  • bucketsstring (date-time)[]required

    Epoch-aligned bucket start times (RFC 3339, UTC), oldest first, ending with the bucket containing now. Every series in this response has exactly this length.

  • uptime_pctnumber[]required

    Per-bucket uptime percentage aggregated across every monitor of the component; no_data samples are excluded from the denominator. Null when the bucket has no samples, never an assumed 100.

  • incidentsinteger[]required

    Per-bucket count of real (non-scheduled) incidents attached to this component that started inside the bucket.

  • monitorsmonitorMetrics[]required

    Per-monitor series. Kept per monitor on purpose: averaging one monitor's TLS handshake with another's TCP connect would be dishonest. Each monitor carries only the metrics its type produces.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 404Nothing with that id, or it is hidden from this viewer.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/components/3943ef82-0856-49fc-b0fe-ce88cae2742b/metrics.json"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:10.12306836Z",  "component_id": "3943ef82-0856-49fc-b0fe-ce88cae2742b",  "window": "week",  "bucket_seconds": 7200,  "buckets": [    "2026-10-01T12:00:00Z",    "2026-10-01T14:00:00Z",    "2026-10-01T16:00:00Z"    … 81 more  ],  "uptime_pct": [    null,    null,    null    … 81 more  ],  "incidents": [    0,    0,    0    … 81 more  ],  "monitors": [    {      "id": "51c9826a-5213-416b-a3e5-7d15e1d41ceb",      "name": "Website",      "type": "http",      "metrics": {        "connect_ms": [          null,          null,          null          … 81 more        ],        "dns_ms": [          null,          null,          null          … 81 more        ],        "incidents": [          0,          0,          0          … 81 more        ],        "redirect_ms": [          null,          null,          null          … 81 more        ],        "tls_ms": [          null,          null,          null          … 81 more        ],        "total_ms": [          null,          null,          null          … 81 more        ],        "transfer_ms": [          null,          null,          null          … 81 more        ],        "ttfb_ms": [          null,          null,          null          … 81 more        ],        "uptime_pct": [          null,          null,          null          … 81 more        ]      }    }  ]}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/components/3943ef82-0856-49fc-b0fe-ce88cae2742b/metrics.json

Reports

Uptime reports for a month, quarter or year.

get/api/v1/report.json

Every service's uptime for a period

The uptime report for the whole page: each service's uptime, downtime, incident count and SLA verdict for the period, the page's uptime, and every incident and maintenance window overlapping it.

Cached 60 s

Parameters

  • periodquerystring

    A calendar month (2026-08), quarter (2026-Q3) or year (2026), in UTC. Omitted: the last full month. A period that hasn't started is a 400.

Responses

200The report. Cached 60 seconds while the period runs, 5 minutes once it's over.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • periodobjectrequired

    The reported period.

  • first_data_atstring (date-time) | nullrequired

    The first check of any service ever; null when nothing has been measured.

  • uptime_pctnumber | nullrequired

    Whole-page uptime: service uptimes weighted by their measured minutes (services without data left out). Null when no service has data.

  • downtime_minutesinteger | nullrequired

    Whole-page downtime equivalent: (100 − uptime_pct)% of the longest measured time of any service, in minutes. Null with uptime_pct.

  • servicesservice (report)[]required

    One row per service, in display order.

  • incident_statsobjectrequired

    Summary of the incidents (not maintenance) that overlap the period.

  • incidentsspan[]required

    Incidents overlapping the period, newest first, page-wide ones (no component) included.

  • maintenancespan[]required

    Maintenance windows overlapping the period, newest first. Their time is left out of uptime.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/report.json"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:10.093132033Z",  "period": {    "key": "2026-09",    "kind": "month",    "from": "2026-09-01T00:00:00Z",    "to": "2026-10-01T00:00:00Z",    "partial": false,    "measured_to": "2026-10-01T00:00:00Z",    "previous": "2026-08",    "next": "2026-10"  },  "first_data_at": "2026-10-08T10:26:28.511297Z",  "uptime_pct": null,  "downtime_minutes": null,  "services": [    {      "id": "e94ef776-65af-4053-8636-0e05f6f788d4",      "slug": "myconfigura",      "name": "MyConfigura",      "sla_target_pct": 99.9,      "uptime_pct": null,      "downtime_minutes": null,      "measured_minutes": 0,      "incident_count": 0,      "verdict": null    }  ],  "incident_stats": {    "count": 0,    "by_severity": {      "critical": 0,      "major": 0,      "minor": 0,      "none": 0    },    "total_minutes": 0,    "mean_minutes": null  },  "incidents": [],  "maintenance": []}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/report.json

get/api/v1/services/{ref}/report.json

One service's uptime for a period

One service's report: its uptime and each component's, measured and maintenance minutes, the SLA verdict, and the incidents and maintenance overlapping the period.

Cached 60 s

Parameters

  • refpathstringrequired

    The service's id (from the summary); its slug works too.

  • periodquerystring

    A calendar month (2026-08), quarter (2026-Q3) or year (2026), in UTC. Omitted: the last full month. A period that hasn't started is a 400.

Responses

200The report. Cached 60 seconds while the period runs, 5 minutes once it's over.application/json

  • version"v1"required

    API contract version. Always 'v1' until a breaking change introduces v2 alongside.

  • updated_atstring (date-time)required

    Server time at render. Use as a cache key.

  • serviceobjectrequired

    The service the report is for.

  • periodobjectrequired

    The reported period.

  • first_data_atstring (date-time) | nullrequired

    The service's first check ever, across its components; null when it has never been measured. Periods ending before it have no data.

  • sla_target_pctnumber | nullrequired

    The service's uptime target in percent, set by the operator; null when it has none (and then every verdict is null).

  • uptime_pctnumber | nullrequired

    Service uptime: component uptimes weighted by their measured minutes (components with no data are left out). Null when no component has data.

  • downtime_minutesinteger | nullrequired

    Service downtime equivalent: (100 − uptime_pct)% of the longest measured time of its components, in minutes. Null with uptime_pct.

  • verdictstring | nullrequired

    Against sla_target_pct: met / missed for a finished period, on_track / at_risk for a running one; exactly on target is met. Null without a target or without data.

    One of: metmissedon_trackat_risknull

  • componentscomponent (service-report)[]required

    One row per component, in display order.

  • incident_statsobjectrequired

    Summary of the incidents (not maintenance) that overlap the period.

  • incidentsspan[]required

    Incidents overlapping the period, newest first.

  • maintenancespan[]required

    Maintenance windows overlapping the period, newest first. Listed here so nothing is hidden; their time is left out of uptime.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 404Nothing with that id, or it is hidden from this viewer.
  • 500The server couldn't read what the answer needs (it is logged). The whole answer fails rather than coming back with parts missing; retry later. The status page itself shows its last copy with a stale banner meanwhile.
Request
curl "https://status-page.configura.com/api/v1/services/e94ef776-65af-4053-8636-0e05f6f788d4/report.json"
Response 200live from this deployment
{  "version": "v1",  "updated_at": "2026-10-08T11:23:10.092922637Z",  "service": {    "id": "e94ef776-65af-4053-8636-0e05f6f788d4",    "slug": "myconfigura",    "name": "MyConfigura"  },  "period": {    "key": "2026-09",    "kind": "month",    "from": "2026-09-01T00:00:00Z",    "to": "2026-10-01T00:00:00Z",    "partial": false,    "measured_to": "2026-10-01T00:00:00Z",    "previous": "2026-08",    "next": "2026-10"  },  "first_data_at": "2026-10-08T10:26:28.511297Z",  "sla_target_pct": 99.9,  "uptime_pct": null,  "downtime_minutes": null,  "verdict": null,  "components": [    {      "id": "3943ef82-0856-49fc-b0fe-ce88cae2742b",      "slug": "website",      "name": "Website",      "uptime_pct": null,      "downtime_minutes": null,      "measured_minutes": 0,      "maintenance_minutes": 0,      "incident_count": 0,      "verdict": null    }  ],  "incident_stats": {    "count": 0,    "by_severity": {      "critical": 0,      "major": 0,      "minor": 0,      "none": 0    },    "total_minutes": 0,    "mean_minutes": null  },  "incidents": [],  "maintenance": []}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/services/e94ef776-65af-4053-8636-0e05f6f788d4/report.json

Subscriptions

Subscribing, confirming and managing notifications: what the /subscribe page does. These change data, so the reference never sends them for you.

post/api/v1/subscriptions

Subscribe destinations

Creates one or more destinations (email, webhook, Slack, Teams) for an owner email. A new owner gets a manage key at once, which works once they click the emailed link; an existing owner needs its manage key, a management session, or to be signed in as that email. Rate-limited per address.

Request bodyapplication/json

Request body for the public POST /api/v1/subscriptions endpoint: one or more destinations (email, webhook, Slack, Teams) for one owner email, each with its own components and preferences (each destination can be changed later). Send either destinations (several at once) or the single kind + endpoint. Every destination belongs to the owner email; a new owner email gets a manage key in the response, which works once the email is confirmed by the emailed link. When signed in with the page's Azure AD, the account's email is the owner and nothing waits. The owner is emailed a summary of what was set up every time.

  • kindstring

    How notifications are delivered: 'email' sends mail, 'webhook' POSTs a JSON payload, 'slack' posts a message to a Slack incoming webhook, 'teams' posts an Adaptive Card to a Microsoft Teams Workflows webhook.

    One of: emailwebhookslackteams

    Example: "email"

  • endpointstring

    Where notifications go: an email address for kind=email; for the URL kinds an https:// URL (plain http is accepted only in the local development environment): your own receiver for webhook, a https://hooks.slack.com/… incoming-webhook URL for slack, or a Teams Workflows URL on *.logic.azure.com, *.webhook.office.com, *.powerautomate.com or *.api.powerplatform.com for teams. Anything else is rejected with 400 and a machine-readable code (endpoint_invalid, endpoint_scheme, endpoint_host_slack, endpoint_host_teams, endpoint_email_invalid).

    Example: "oncall@example.com"

  • destinationsobject[]

    Several destinations at once, e.g. an email plus two Slack channels plus Teams. The same type may repeat. Each carries its own component_ids, min_severity and include_maintenance; one it omits falls back to the top-level value. Each is validated like `kind` + `endpoint`; one bad destination (endpoint or component) rejects the whole request (400 with its `index`), so nothing is created half-way. At most 20.

    Example: [{"kind":"email","endpoint":"oncall@example.com","component_ids":[],"min_severity":"none","include_maintenance":true},{"kind":"slack","endpoint":"https://hooks.slack.com/services/T0/B0/x","min_severity":"major","include_maintenance":false}]

  • component_idsstring (uuid)[]

    The default components for destinations that don't set their own component_ids (and for the single kind + endpoint form): only notify about incidents affecting these components. Omit or empty for everything on the page. Component ids come from the public summary API.

  • owner_emailstringrequired

    Your email: the ID your subscriptions belong to, and where the confirmation link and any new manage key link are sent. Used for nothing else. When you are signed in, your Azure AD email is used instead, unless this browser has opened this email's subscriptions with its manage key.

    Example: "alice@example.com"

  • manage_keystring

    The manage key you got when you first subscribed with this owner email (six groups of four characters, like 7K2M-9QXD-…). Required to add a subscription to an owner email that already has one, unless you are signed in as that email. Lost it? POST /api/v1/subscriptions/forgot-key.

    Example: "7K2M-9QXD-4HNP-B6TR-2WZC-8FJV"

  • min_severitystring

    The default least severe incident sent, for destinations that don't set their own: none (every incident, the default), minor, major or critical. Maintenance notices are governed by include_maintenance instead.

    One of: noneminormajorcritical

    Example: "major"

  • include_maintenanceboolean

    The default for destinations that don't set their own: whether they get scheduled-maintenance notices. Default true.

    Example: false

Responses

202Created; see status for what still waits for a confirmation.application/json

  • statusstringrequired

    pending_owner_confirmation (a new owner email: click the emailed link), pending_confirmation (an email destination waits for its own link) or subscribed.

    One of: subscribedpending_confirmationpending_owner_confirmation

  • destinationsobject[]required

    Each destination created, in request order.

  • manage_keystring

    The owner's manage key, shown once when one is issued (a new owner, or one without a key). Never mailed; store it.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 403The email already has subscriptions and no valid key came with it (code owner_key_required).
  • 429Too many attempts from this address (code rate_limited); retry after the Retry-After seconds.
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions" \  -H "Content-Type: application/json" \  -d '{"owner_email":"alice@example.com","destinations":[{"kind":"webhook","endpoint":"https://example.com/hook"}],"min_severity":"major"}'
Response 202example
{  "status": "subscribed",  "destinations": [    {      "kind": "email",      "endpoint": "string",      "status": "subscribed"    }  ],  "manage_key": "string"}

post/api/v1/subscriptions/confirm

Confirm an email destination

Confirms an email destination to an address other than the owner's, with the two values from its emailed link.

Request bodyapplication/json

The link's two values.

  • tokenstringrequired

    The token from the link.

  • confirmstringrequired

    The confirm value from the link.

Responses

200Confirmed (status confirmed).application/json

  • statusstringrequired

    What happened.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 404Nothing with that id, or it is hidden from this viewer.
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/confirm" \  -H "Content-Type: application/json" \  -d '{"token":"<token from the link>","confirm":"<confirm from the link>"}'
Response 200example
{  "status": "string"}

post/api/v1/subscriptions/unsubscribe

Unsubscribe one destination

Removes the one destination whose unsubscribe token this is: the link in every message, no key needed.

Request bodyapplication/json

The message's unsubscribe token.

  • tokenstringrequired

    The unsubscribe token from a message.

Responses

200Removed (status unsubscribed).application/json

  • statusstringrequired

    What happened.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 404Nothing with that id, or it is hidden from this viewer.
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/unsubscribe" \  -H "Content-Type: application/json" \  -d '{"token":"<token from the message>"}'
Response 200example
{  "status": "string"}

post/api/v1/subscriptions/owner/confirm

Confirm the owner email

Confirms the owner email with the values from its emailed link: its destinations start, its manage key starts working, and a management session opens.

Request bodyapplication/json

Request body for POST /api/v1/subscriptions/owner/confirm: the two values from the emailed confirmation link. Confirming activates the owner's waiting subscriptions and, the first time, returns the manage key, shown once.

  • ownerstring (uuid)required

    The owner id from the link (owner=…).

    Example: "9d2f4c1a-6b3e-4f7a-8c9d-0e1f2a3b4c5d"

  • cstringrequired

    The signature from the link (c=…).

    Example: "4f9a0c2e7b1d3a5c6e8f0a1b2c3d4e5f"

Responses

200status confirmed or already_confirmed, with email; manage_key when one is issued here.application/json

  • statusstringrequired

    confirmed or already_confirmed.

    One of: confirmedalready_confirmed

  • emailstringrequired

    The owner email.

  • manage_keystring

    A new manage key, only for owners from before keys were issued at subscribe.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/owner/confirm" \  -c cookies.txt \  -H "Content-Type: application/json" \  -d '{"owner":"<owner id from the link>","c":"<c from the link>"}'
Response 200example
{  "status": "confirmed",  "email": "string",  "manage_key": "string"}

post/api/v1/subscriptions/manage

Open a management session

Opens a 30-minute management session for the owner with this email and manage key (the session cookie). A wrong key and an unknown email answer alike. Rate-limited per address and per email.

Request bodyapplication/json

Request body for POST /api/v1/subscriptions/manage: the owner email and its manage key open a 30-minute management session (the same cookie as the page). A wrong key and an unknown email get the same answer. Signed-in owners need no key.

  • emailstringrequired

    The owner email your subscriptions belong to.

    Example: "alice@example.com"

  • keystringrequired

    Your manage key (six groups of four characters). Case, dashes and spaces don't matter.

    Example: "7K2M-9QXD-4HNP-B6TR-2WZC-8FJV"

Responses

200Opened (status ok).application/json

  • statusstringrequired

    What happened.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 403invalid_key (wrong key or unknown email) or owner_unverified (confirm the email first).
  • 429Too many attempts (code rate_limited).
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/manage" \  -c cookies.txt \  -H "Content-Type: application/json" \  -d '{"email":"alice@example.com","key":"7K2M-9QXD-4HNP-B6TR-2WZC-8FJV"}'
Response 200example
{  "status": "string"}

delete/api/v1/subscriptions/manage

End the management session

Ends the management session. A signed-in session stays signed in.

Responses

204Ended.

Request
curl -X DELETE "https://status-page.configura.com/api/v1/subscriptions/manage"

get/api/v1/subscriptions/mine

The destinations you may manage

The owner's destinations. Needs a management session (the statuspage_session cookie that confirming the owner email, POST /api/v1/subscriptions/manage or POST /api/v1/subscriptions/new-key opens for 30 minutes) or a signed-in session whose email owns the subscriptions. Without one it answers {"open": false}, never an error.

Needs the management session

Responses

200The managed destinations, or open false.application/json

  • openbooleanrequired

    False without a management session or a signed-in owner; nothing else is returned then.

  • emailstring

    The owner email being managed.

  • signed_inboolean

    True when the owner comes from the Azure AD sign-in rather than a manage-key session.

  • key_issued_atstring (date-time) | null

    When the current manage key was issued.

  • verifiedboolean

    Whether the owner email is confirmed; nothing is sent before.

  • subscriptionsobject[]

    The owner's destinations.

Request
curl "https://status-page.configura.com/api/v1/subscriptions/mine" \  -b cookies.txt
Response 200live from this deployment
{  "open": false}
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/api/v1/subscriptions/mine

put/api/v1/subscriptions/{id}

Change a destination

Changes one destination's components, minimum severity, maintenance notices or paused state; omitted fields stay. Components the viewer can't see are kept as they are. Needs a management session (the statuspage_session cookie that confirming the owner email, POST /api/v1/subscriptions/manage or POST /api/v1/subscriptions/new-key opens for 30 minutes) or a signed-in session whose email owns the subscriptions.

Needs the management session

Parameters

  • idpathstring (uuid)required

    The destination's id (from subscriptions/mine).

Request bodyapplication/json

Request body for PUT /api/v1/subscriptions/{id} in a management session (or signed in): change one destination. Every field is optional: an omitted field is left as it is. Components you can't see at your current level are kept.

  • component_idsstring (uuid)[]

    Only notify about incidents affecting these components; an empty list means everything on the page. Omit to keep the current choice.

    Example: ["3f1c2d9e-8b7a-4c6d-9e0f-1a2b3c4d5e6f"]

  • min_severitystring

    The least severe incident this destination is sent: none (every incident), minor, major or critical.

    One of: noneminormajorcritical

    Example: "major"

  • include_maintenanceboolean

    Whether this destination gets scheduled-maintenance notices.

    Example: false

  • pausedboolean

    Pause this destination: nothing is sent while paused, and its settings are kept.

    Example: true

Responses

204Changed.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 401No management session and no signed-in owner (code manage_required).
  • 404Nothing with that id, or it is hidden from this viewer.
Request
curl -X PUT "https://status-page.configura.com/api/v1/subscriptions/{id}" \  -b cookies.txt \  -H "Content-Type: application/json" \  -d '{"paused":true}'

delete/api/v1/subscriptions/{id}

Delete a destination

Deletes one destination. Needs a management session (the statuspage_session cookie that confirming the owner email, POST /api/v1/subscriptions/manage or POST /api/v1/subscriptions/new-key opens for 30 minutes) or a signed-in session whose email owns the subscriptions.

Needs the management session

Parameters

  • idpathstring (uuid)required

    The destination's id (from subscriptions/mine).

Responses

204Deleted.

  • 401No management session and no signed-in owner (code manage_required).
  • 404Nothing with that id, or it is hidden from this viewer.
Request
curl -X DELETE "https://status-page.configura.com/api/v1/subscriptions/{id}" \  -b cookies.txt

post/api/v1/subscriptions/{id}/test

Send a test notification

Sends one clearly labelled test notification to a confirmed destination of a confirmed owner, at most once a minute. Needs a management session (the statuspage_session cookie that confirming the owner email, POST /api/v1/subscriptions/manage or POST /api/v1/subscriptions/new-key opens for 30 minutes) or a signed-in session whose email owns the subscriptions.

Needs the management session

Parameters

  • idpathstring (uuid)required

    The destination's id (from subscriptions/mine).

Request bodyapplication/json

Request body for POST /api/v1/subscriptions/{id}/test in a management session (or signed in): sends one clearly labelled test notification to that destination so you can see it arrive. At most one per destination per minute; the destination must be confirmed. Send an empty object.

Responses

202Queued (status queued).application/json

  • statusstringrequired

    What happened.

  • 401No management session and no signed-in owner (code manage_required).
  • 404Nothing with that id, or it is hidden from this viewer.
  • 409Not confirmed yet (code not_confirmed).
  • 429One test a minute (code rate_limited).
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/{id}/test" \  -b cookies.txt \  -H "Content-Type: application/json" \  -d '{}'
Response 202example
{  "status": "string"}

post/api/v1/subscriptions/forgot-key

Mail a link to a new manage key

Mails the owner a one-time link, valid for an hour, that issues a new manage key. Always answers 202, whether or not the email has subscriptions.

Request bodyapplication/json

Request body for POST /api/v1/subscriptions/forgot-key: emails a one-time link, valid for an hour, that issues a new manage key and voids the old one. The answer is the same whether or not the address has subscriptions.

  • emailstringrequired

    The owner email your subscriptions belong to.

    Example: "alice@example.com"

Responses

202status sent_if_known.application/json

  • statusstringrequired

    What happened.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/forgot-key" \  -H "Content-Type: application/json" \  -d '{"email":"alice@example.com"}'
Response 202example
{  "status": "string"}

post/api/v1/subscriptions/new-key

Issue a new manage key

Issues a new manage key (the old one stops working) from the forgot-key link's values, or for the owner already managing (an empty body with a management session or signed in). Opens a management session.

Request bodyapplication/json

Request body for POST /api/v1/subscriptions/new-key: the three values from a 'Forgot key' link. Returns a new manage key (shown once) and voids the old one. In a management session, or signed in as the owner, send an empty object instead.

  • ownerstring (uuid)

    The owner id from the link (owner=…).

    Example: "9d2f4c1a-6b3e-4f7a-8c9d-0e1f2a3b4c5d"

  • einteger

    The link's expiry from the link (e=…), Unix seconds.

    Example: 1790000000

  • cstring

    The signature from the link (c=…).

    Example: "4f9a0c2e7b1d3a5c6e8f0a1b2c3d4e5f"

Responses

200The new key, shown once.application/json

  • manage_keystringrequired

    The new manage key.

  • emailstringrequired

    The owner email.

  • 400The request is malformed: a bad parameter, or a body that doesn't match its schema.
  • 401No management session and no signed-in owner (code manage_required).
Request
curl -X POST "https://status-page.configura.com/api/v1/subscriptions/new-key" \  -c cookies.txt \  -H "Content-Type: application/json" \  -d '{"owner":"<owner id from the link>","e":1790000000,"c":"<c from the link>"}'
Response 200example
{  "manage_key": "string",  "email": "string"}

Feeds and badge

The Atom feed, the maintenance calendar and the status badge.

get/feed.atom

Atom feed of incident updates

Every incident and maintenance update as an Atom 1.0 feed, newest first, for feed readers and chat integrations.

Cached 60 s

Responses

200The feed.application/atom+xml

  • 500The server couldn't read what the answer needs: a plain-text 500 (a feed reader, calendar or image tag has no use for a JSON body). Retry later.
Request
curl "https://status-page.configura.com/feed.atom"
Response 200live from this deployment
<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">  <title>Status Page</title>  <id>https://status-page.configura.com/</id>  <updated>2026-10-08T11:23:10Z</updated>  <link rel="self" type="application/atom+xml" href="https://status-page.configura.com/feed.atom"></link>  <link rel="alternate" type="text/html" href="https://status-page.configura.com/"></link></feed>
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/feed.atom

get/maintenance.ics

Maintenance calendar (iCalendar)

Upcoming and recent maintenance windows as an iCalendar feed to subscribe to from a calendar app.

Cached 300 s

Responses

200The calendar.text/calendar

  • 500The server couldn't read what the answer needs: a plain-text 500 (a feed reader, calendar or image tag has no use for a JSON body). Retry later.
Request
curl "https://status-page.configura.com/maintenance.ics"
Response 200live from this deployment
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//status-page//maintenance//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Status Page maintenance
END:VCALENDAR
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/maintenance.ics

get/badge.svg

Status badge (SVG)

A small SVG badge with the page's status, or one service's with service. For READMEs and dashboards.

Cached 30 s

Parameters

  • servicequerystring

    A service slug for that service's badge; omitted, the whole page.

Responses

200The badge.image/svg+xml

  • 500The server couldn't read what the answer needs: a plain-text 500 (a feed reader, calendar or image tag has no use for a JSON body). Retry later.
Request
curl "https://status-page.configura.com/badge.svg"
Response 200live from this deployment
<svg xmlns="http://www.w3.org/2000/svg" width="190" height="20" role="img" aria-label="Status Page: operational">  <linearGradient id="b" x2="0" y2="100%">    <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>    <stop offset="1" stop-opacity=".1"/>  </linearGradient>  <mask id="m"><rect width="190" height="20" rx="3" fill="#fff"/></mask>  <g mask="url(#m)">    <rect width="95" height="20" fill="#555"/>    <rect x="95" width="95" height="20" fill="#1D9E75"/>    <rect width="190" height="20" fill="url(#b)"/>  </g>  <g fill="#fff" text-anchor="middle" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif" font-size="11">    <text x="47" y="14">Status Page</text>    <text x="142" y="14">operational</text>  </g></svg>
Try it

Sends this GET from your browser. The reference only ever sends GET requests, which read data and never change it.

get/badge.svg

Models

The types the endpoints share, each described once.

component (service-detail)

One component of this service, with its 90-day daily grid, 7-day hourly grid, and monitors.

component (service-report)

One component's figures for the period.

component (summary)

One monitored component within a service.

componentUptime

One component's 90-day uptime: summary statistics plus the day-by-day grid.

day-cell

One day in a component's uptime grid. no_data samples are excluded from both numerator and denominator: a day of unknowns renders gray, never green or red. Samples inside one of the component's maintenance windows are excluded too: planned work never counts as downtime.

Error

An error response.

hourCell

One hour's aggregated samples for the 7-day hourly grid.

incident

One incident or maintenance window: identity, lifecycle state, severity, timing, affected components, and its update timeline.

incident_state

Position in the 5-state incident lifecycle.

investigatingidentifiedmonitoringresolvedpostmortem

incident_update

One timestamped entry in an incident's update timeline.

monitor

One probe behind this component: what it checks and its most recent result.

monitorMetrics

One monitor's identity and its bucket-aligned metric series.

MySubscriptions

The destinations the management session (or the signed-in owner) may manage.

Outcome

A one-word outcome.

service (report)

One service's figures for the period: the same numbers as its own report.

service (summary)

A top-level service group: its worst-of status plus the components inside it.

severity

Operator-set incident severity. Independent of state.

noneminormajorcritical

span

One incident or maintenance window that overlaps the period.

status

Component / service / page status. Severity ordering (worst wins): no_data < operational < maintenance < degraded < partial_outage < major_outage.

operationaldegradedpartial_outagemajor_outagemaintenanceno_data

SubscribeResult

The outcome of a subscribe.