What changed in the API, and when.
Every change to the public contract of https://app.upfour.io/v1
since 2026-05-05, one line per operation and date. The lines are generated from the history of
the OpenAPI file, so they cannot drift from what the
reference pages show. Also available as JSON.
What the labels mean
| breaking | Code written against the old contract can stop working. |
| added | Something new that nothing existing depends on. |
| changed | Behavior or contract changed in a way that is unlikely to break a client. |
| deprecated | Still works, marked for removal. |
| documented | The reference now describes something that already worked. Not counted as a change. |
What counts as breaking
A change is labeled breaking when a request that was valid before can fail or mean something else, or a response loses something a client could rely on:
- An operation is removed.
-
The required scope changes to a different one or a higher level (
report.readtoreport.write). Keys that do not hold the new scope are refused. Moving to a lower level of the same scope is labeled changed. - A request gains a required field, query parameter or body.
- A request field or parameter is removed, renamed, made required, changes type or stops accepting a value.
- A response field is removed, changes type or is no longer always present.
- The success status of an operation changes.
These are not breaking: new operations, new optional parameters and request fields, new response fields, new accepted values, and new error statuses. Clients should ignore response fields they do not know and treat the values of a response enum as an open set.
Versioning
The contract states one policy. The right column is what the API does today, checked against the code by this site's tests.
| Topic | The contract says | The API does today |
|---|---|---|
| URL version | The version is /v1. Additive changes land there. | Every operation is served under /v1. There is no other version. |
| Breaking changes | A breaking change needs /v2 and 12 months of parallel support. |
There is no /v2. 5 entries below
are labeled breaking, the latest on 2026-10-30; all of them were made inside /v1.
|
| Deprecation | Deprecations are announced with Deprecation and Sunset headers. | The API sends neither header. No operation is marked deprecated. A deprecation would show up here as a deprecated entry. |
X-API-Version | The header pins compatible behavior; keys remember a default version. |
The header is accepted, and a request that carries it is treated like an API-key request (cursor
pagination, { "data": … } envelope). Its value is not read. Each key stores an
api_version, which GET /me reports; no behavior varies with it.
|
History
65 entries on 23 dates, newest first.
2026-10-30
- breaking
GET /meResponse fieldkey_versionremoved. - breaking
Response field
sandbox_parent_idremoved.3 operations
- added
GET /monitors/{monitorID}/domain-expiryAdded. Requires themonitor.readscope. - added
New optional request field
notify. - added
Now accepts an optional request body.
- changed
- changed
Response field
notification_deliveries[].reason_codeno longer returnssandbox.11 operations
-
GET /incidents/{incidentID} -
POST /incidents -
POST /incidents/{incidentID}/acknowledge -
POST /incidents/{incidentID}/comments -
POST /incidents/{incidentID}/escalate -
POST /incidents/{incidentID}/reopen -
POST /incidents/{incidentID}/resolve -
POST /incidents/{incidentID}/updates -
PUT /incidents/{incidentID}/acknowledge -
PUT /incidents/{incidentID}/reopen -
PUT /incidents/{incidentID}/resolve
-
- documented
Request and response fields are now documented for 6 operations. This describes behavior that already existed and is not counted as a change.
Areas: Incidents
2026-10-27
- added
POST /webhook-subscriptions/{subscriptionID}/rotate-secretAdded (beta). Requires thewebhook.writescope. - documented
Request and response fields are now documented for 230 operations. This describes behavior that already existed and is not counted as a change.
Areas: Health advisor, Client templates, Clients (agency mode), Alert plans (escalation policies), Scheduled job groups, Scheduled jobs (heartbeats), Incidents, Invites, Token introspection, Resource metadata, Monitor groups, Monitors, Alert channels, On-call rotations, Organization, Reports, Playbooks (runbooks), Severities, Severity groups, SLA policies, Status page design templates, Status page update templates, Status pages, Teams, Webhook subscriptions
2026-10-26
- documented
Request and response fields are now documented for 5 operations. This describes behavior that already existed and is not counted as a change.
Areas: Incidents, Status page design templates, Status pages
2026-10-22
- added
GET /status-pages/{pageID}/mail-previewAdded. Requires thestatus_page.readscope.
2026-10-18
- added
POST /monitors/export-detailsAdded. Requires themonitor.readscope.
2026-10-16
- added
GET /incidents/{incidentID}/domain-caseAdded. Requires theincident.readscope.
2026-10-14
- added
GET /status-page-design-templatesAdded. Requires thestatus_page.readscope. - added
POST /status-page-design-templatesAdded. Requires thestatus_page.writescope. - added
GET /status-page-design-templates/{templateID}Added. Requires thestatus_page.readscope. - added
PUT /status-page-design-templates/{templateID}Added. Requires thestatus_page.writescope. - added
DELETE /status-page-design-templates/{templateID}Added. Requires thestatus_page.writescope. - added
GET /status-page-design-templates/{templateID}/assets/{kind}Added. Requires thestatus_page.readscope.
2026-09-22
- added
POST /clients/logo-importAdded. Requires theclient.writescope.
2026-09-21
- added
GET /escalation-policies/{policyID}/test-runs/latestAdded. Requires theescalation_policy.readscope. - added
GET /escalation-policies/{policyID}/test-runs/{runID}Added. Requires theescalation_policy.readscope. - added
POST /status-pages/{pageID}/subscribers/resend-pendingAdded. Requires thestatus_page.subscriber.writescope.
2026-09-19
- added
POST /status-pages/feed-previewAdded. Requires thestatus_page.writescope. - added
PUT /status-pages/{pageID}/assets/{kind}Added. Requires thestatus_page.writescope. - added
DELETE /status-pages/{pageID}/assets/{kind}Added. Requires thestatus_page.writescope. - added
POST /status-pages/{pageID}/duplicateAdded. Requires thestatus_page.writescope. - added
GET /status-pages/{pageID}/subscribers/countAdded. Requires thestatus_page.readscope. - added
GET /status-pages/{pageID}/updates/{updateID}/deliveriesAdded. Requires thestatus_page.readscope.
2026-09-18
- added
GET /status-page-templatesAdded. Requires thestatus_page.readscope. - added
POST /status-page-templatesAdded. Requires thestatus_page.writescope. - added
PUT /status-page-templates/{templateID}Added. Requires thestatus_page.writescope. - added
DELETE /status-page-templates/{templateID}Added. Requires thestatus_page.writescope. - added
GET /status-pages/{pageID}/updates/{updateID}Added. Requires thestatus_page.readscope. - added
PUT /status-pages/{pageID}/updates/{updateID}Added. Requires thestatus_page.writescope. - added
POST /status-pages/{pageID}/updates/{updateID}/entriesAdded. Requires thestatus_page.writescope. - added
PUT /status-pages/{pageID}/updates/{updateID}/entries/{entryID}Added. Requires thestatus_page.writescope. - added
DELETE /status-pages/{pageID}/updates/{updateID}/entries/{entryID}Added. Requires thestatus_page.writescope.
2026-09-08
- added
GET /monitors/batch/historyAdded. Requires themonitor.writescope. - added
POST /monitors/bulkAdded. Requires themonitor.writescope. - added
GET /monitors/summaryAdded. Requires themonitor.readscope. - added
GET /organization/report-brandingAdded. Requires theorganization.readscope. - added
PUT /organization/report-brandingAdded. Requires theorganization.writescope. - added
POST /reports/schedules/previewAdded. Requires thereport.readscope.
2026-09-06
- added
GET /status-pages/platformAdded. Requires thestatus_page.readscope.
2026-09-02
- breaking
Required scope changed. Keys that do not hold the new scope are refused.
7 operations
-
DELETE /reports/schedules/{scheduleID}report.readtoreport.write -
DELETE /reports/share-links/{linkID}report.readtoreport.write -
GET /status-pages/{pageID}/subscribersstatus_page.subscriber.writetostatus_page.read -
POST /reports/schedulesreport.readtoreport.write -
POST /reports/schedules/{scheduleID}/run-nowreport.readtoreport.write -
POST /reports/{runID}/sharereport.readtoreport.write -
PUT /reports/schedules/{scheduleID}report.readtoreport.write
-
- breaking
Removed from the public API reference.
3 operations
-
GET /incidents/{incidentID}/escalations/{step}/acknowledge -
GET /reports/verify/{hash} -
GET /share/reports/{token}
-
- changed
Required scope relaxed.
50 operations
-
GET /clientsclient.writetoclient.read -
GET /clients/{clientID}client.writetoclient.read -
GET /clients/{clientID}/portal-settingsclient.writetoclient.read -
GET /clients/{clientID}/share-linksclient.writetoclient.read -
GET /escalation-policiesescalation_policy.writetoescalation_policy.read -
GET /escalation-policies/{policyID}escalation_policy.writetoescalation_policy.read -
GET /heartbeat-groupsheartbeat.writetoheartbeat.read -
GET /heartbeat-groups/{groupID}heartbeat.writetoheartbeat.read -
GET /heartbeatsheartbeat.writetoheartbeat.read -
GET /heartbeats/{heartbeatID}heartbeat.writetoheartbeat.read -
GET /incidentsincident.writetoincident.read -
GET /incidents/{incidentID}/attachmentsincident.writetoincident.read -
GET /incidents/{incidentID}/attachments/{attachmentID}incident.writetoincident.read -
GET /incidents/{incidentID}/commentsincident.writetoincident.read -
GET /invitesmember.writetomember.read -
GET /metadatametadata.writetometadata.read -
GET /monitor-groupsmonitor.writetomonitor.read -
GET /monitor-groups/{groupID}monitor.deletetomonitor.read -
GET /monitorsmonitor.writetomonitor.read -
GET /monitors/{monitorID}monitor.deletetomonitor.read -
GET /notification_channelsnotification_channel.writetonotification_channel.read -
GET /notification_channels/{channelID}notification_channel.writetonotification_channel.read -
GET /oncall-schedulesoncall.writetooncall.read -
GET /oncall-schedules/{scheduleID}oncall.writetooncall.read -
GET /oncall-schedules/{scheduleID}/overridesoncall.writetooncall.read -
GET /organizationorganization.writetoorganization.read -
GET /organization/members/email/{email}member.writetomember.read -
GET /organization/securityorganization.writetoorganization.read -
GET /runbooksrunbook.writetorunbook.read -
GET /runbooks/{runbookID}runbook.writetorunbook.read -
GET /status-pagesstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}status_page.writetostatus_page.read -
GET /status-pages/{pageID}/accessstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/reportsstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/sectionsstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/sections/{sectionID}/resourcesstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/structurestatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/translationsstatus_page.writetostatus_page.read -
GET /status-pages/{pageID}/updatesstatus_page.writetostatus_page.read -
GET /teamsteam.writetoteam.read -
GET /teams/{teamID}team.writetoteam.read -
GET /teams/{teamID}/clientsteam.writetoteam.read -
GET /teams/{teamID}/membersmember.writetomember.read -
GET /teams/{teamID}/members/email/{email}member.writetomember.read -
GET /webhook-subscriptionswebhook.writetowebhook.read -
PATCH /monitors/{monitorID}monitor.deletetomonitor.write -
POST /monitors/{monitorID}/notification_channels/{channelID}monitor.deletetomonitor.write -
PUT /monitor-groups/{groupID}monitor.deletetomonitor.write -
PUT /monitors/{monitorID}monitor.deletetomonitor.write -
PUT /monitors/{monitorID}/escalation-policymonitor.deletetomonitor.write
-
- documented
The required scope is now declared for 13 operations. This describes behavior that already existed and is not counted as a change.
Areas: Health advisor, Client templates, SLA policies
2026-08-27
- added
2026-08-26
- added
GET /incidents/{incidentID}/escalations/{step}/acknowledgeAdded (runtime).
2026-07-25
- added
Added 19 operations.
Areas: Health advisor, Incidents, Monitors, Organization, Status pages
19 operations
-
DELETE /status-pages/{pageID}/access-token -
DELETE /status-pages/{pageID}/custom-domain -
GET /advisor -
GET /incidents/{incidentID}/ai -
GET /incidents/{incidentID}/group -
GET /monitors/{monitorID}/certificates -
GET /organization/ai-usage -
GET /status-pages/{pageID}/access -
GET /status-pages/{pageID}/domain -
GET /status-pages/{pageID}/domain/events -
POST /advisor/apply -
POST /incidents/{incidentID}/ai/postmortem -
POST /incidents/{incidentID}/ai/summary -
POST /status-pages/{pageID}/access-token -
POST /status-pages/{pageID}/custom-domain/recheck -
PUT /incidents/{incidentID}/ai/{kind}/rating -
PUT /organization/ai-quota -
PUT /status-pages/{pageID}/access -
PUT /status-pages/{pageID}/custom-domain
-
2026-07-21
- added
GET /clients/{clientID}/portal-settingsAdded. Requires theclient.writescope. - added
PUT /clients/{clientID}/portal-settingsAdded. Requires theclient.writescope.
2026-06-01
- added
GET /incidents/{incidentID}/attachments/{attachmentID}Added. Requires theincident.writescope.
2026-05-12
- added
Added 21 operations.
Areas: Reports, share, SLA policies
21 operations
-
DELETE /reports/schedules/{scheduleID} -
DELETE /reports/share-links/{linkID} -
DELETE /sla-policies/{policyID} -
GET /reports/downtime-ledger -
GET /reports/incidents -
GET /reports/response-time -
GET /reports/runs -
GET /reports/schedules -
GET /reports/schedules/{scheduleID} -
GET /reports/share-links -
GET /reports/sla -
GET /reports/verify/{hash} -
GET /share/reports/{token} -
GET /sla-policies -
GET /sla-policies/{policyID} -
POST /reports/schedules -
POST /reports/schedules/{scheduleID}/run-now -
POST /reports/{runID}/share -
POST /sla-policies -
PUT /reports/schedules/{scheduleID} -
PUT /sla-policies/{policyID}
-
2026-05-11
- added
POST /heartbeat-groups/assignAdded. Requires theheartbeat.writescope. - added
GET /incidents/{incidentID}/runbook-progressAdded. Requires theincident.readscope. - added
PUT /incidents/{incidentID}/runbook-steps/{stepID}/completionAdded. Requires theincident.writescope. - added
POST /monitor-groups/assignAdded. Requires themonitor.writescope.
2026-05-07
- breaking
Removed from the public API reference.
5 operations
-
DELETE /user/api-keys/{keyID} -
GET /user/api-keys -
POST /login -
POST /register -
POST /user/api-keys
-
- added
Added 171 operations.
Areas: Client templates, Clients (agency mode), Alert plans (escalation policies), Scheduled job groups, Scheduled jobs (heartbeats), Incidents, Invites, Token introspection, Resource metadata, Monitor groups, Monitors, On-call rotations, Organization, Reports, Playbooks (runbooks), Severities, Severity groups, Status pages, Teams, Webhook subscriptions
171 operations
-
DELETE /client-templates/{templateID} -
DELETE /clients/{clientID}/share-links/{linkID} -
DELETE /escalation-policies/{policyID} -
DELETE /heartbeat-groups/{groupID} -
DELETE /heartbeats/{heartbeatID} -
DELETE /incidents/{incidentID}/attachments/{attachmentID} -
DELETE /incidents/{incidentID}/comments/{commentID} -
DELETE /invites/{inviteID} -
DELETE /monitor-groups/{groupID} -
DELETE /monitors/{monitorID}/escalation-policy -
DELETE /monitors/{monitorID}/notification_channels/{channelID} -
DELETE /oncall-schedules/{scheduleID} -
DELETE /oncall-schedules/{scheduleID}/overrides/{overrideID} -
DELETE /organization -
DELETE /organization/members/email/{email} -
DELETE /organization/members/{memberID} -
DELETE /runbooks/{runbookID} -
DELETE /status-pages/{pageID} -
DELETE /status-pages/{pageID}/sections/{sectionID} -
DELETE /status-pages/{pageID}/sections/{sectionID}/resources/{resourceID} -
DELETE /status-pages/{pageID}/subscribers/{subscriberID} -
DELETE /status-pages/{pageID}/translations/{translationID} -
DELETE /status-pages/{pageID}/updates/{updateID} -
DELETE /teams/{teamID} -
DELETE /teams/{teamID}/clients/{clientID} -
DELETE /teams/{teamID}/members/email/{email} -
DELETE /teams/{teamID}/members/{memberID} -
DELETE /webhook-subscriptions/{subscriptionID} -
GET /client-templates -
GET /client-templates/{templateID} -
GET /clients -
GET /clients/{clientID} -
GET /clients/{clientID}/share-links -
GET /clients/{clientID}/teams -
GET /escalation-policies -
GET /escalation-policies/{policyID} -
GET /heartbeat-groups -
GET /heartbeat-groups/{groupID} -
GET /heartbeats -
GET /heartbeats/{heartbeatID} -
GET /heartbeats/{heartbeatID}/availability -
GET /heartbeats/{heartbeatID}/pings -
GET /incidents -
GET /incidents/{incidentID} -
GET /incidents/{incidentID}/attachments -
GET /incidents/{incidentID}/comments -
GET /incidents/{incidentID}/timeline -
GET /invites -
GET /me -
GET /metadata -
GET /monitor-groups -
GET /monitor-groups/{groupID} -
GET /monitors/{monitorID}/availability -
GET /monitors/{monitorID}/incidents -
GET /monitors/{monitorID}/notification_channels -
GET /monitors/{monitorID}/regions -
GET /monitors/{monitorID}/response_times -
GET /monitors/{monitorID}/results -
GET /oncall-schedules -
GET /oncall-schedules/current -
GET /oncall-schedules/{scheduleID} -
GET /oncall-schedules/{scheduleID}/coverage -
GET /oncall-schedules/{scheduleID}/events -
GET /oncall-schedules/{scheduleID}/overrides -
GET /oncall-schedules/{scheduleID}/rotations -
GET /organization -
GET /organization/audit-logs -
GET /organization/members -
GET /organization/members/email/{email} -
GET /organization/security -
GET /organization/sso -
GET /reports/agency-ribbon -
GET /reports/monitor-ribbon -
GET /runbooks -
GET /runbooks/{runbookID} -
GET /runbooks/{runbookID}/step-completions -
GET /severities -
GET /severity-groups -
GET /status-pages -
GET /status-pages/{pageID} -
GET /status-pages/{pageID}/report-updates -
GET /status-pages/{pageID}/reports -
GET /status-pages/{pageID}/sections -
GET /status-pages/{pageID}/sections/{sectionID}/resources -
GET /status-pages/{pageID}/structure -
GET /status-pages/{pageID}/subscribers -
GET /status-pages/{pageID}/translations -
GET /status-pages/{pageID}/updates -
GET /teams -
GET /teams/{teamID} -
GET /teams/{teamID}/clients -
GET /teams/{teamID}/members -
GET /teams/{teamID}/members/email/{email} -
GET /webhook-subscriptions -
GET /webhook-subscriptions/{subscriptionID}/deliveries -
PATCH /heartbeats/{heartbeatID} -
PATCH /monitors/{monitorID} -
POST /client-templates -
POST /clients -
POST /clients/{clientID}/archive -
POST /clients/{clientID}/share-links -
POST /clients/{clientID}/unarchive -
POST /escalation-policies -
POST /escalation-policies/{policyID}/test -
POST /heartbeat-groups -
POST /heartbeats -
POST /heartbeats/{heartbeatID}/pause -
POST /heartbeats/{heartbeatID}/resume -
POST /incidents -
POST /incidents/{incidentID}/acknowledge -
POST /incidents/{incidentID}/attachments -
POST /incidents/{incidentID}/comments -
POST /incidents/{incidentID}/escalate -
POST /incidents/{incidentID}/reopen -
POST /incidents/{incidentID}/resolve -
POST /incidents/{incidentID}/updates -
POST /invites -
POST /invites/{inviteID}/resend -
POST /monitor-groups -
POST /monitors/{monitorID}/check -
POST /monitors/{monitorID}/notification_channels/{channelID} -
POST /monitors/{monitorID}/pause -
POST /monitors/{monitorID}/resume -
POST /monitors/{monitorID}/test-alert -
POST /oncall-schedules -
POST /oncall-schedules/{scheduleID}/overrides -
POST /organization -
POST /runbooks -
POST /status-pages -
POST /status-pages/{pageID}/reports -
POST /status-pages/{pageID}/sections -
POST /status-pages/{pageID}/sections/{sectionID}/resources -
POST /status-pages/{pageID}/subscribers -
POST /status-pages/{pageID}/subscribers/upload -
POST /status-pages/{pageID}/subscribers/{subscriberID}/resend -
POST /status-pages/{pageID}/translations -
POST /status-pages/{pageID}/updates -
POST /teams -
POST /teams/{teamID}/clients -
POST /teams/{teamID}/members -
POST /webhook-subscriptions -
POST /webhook-subscriptions/{subscriptionID}/redeliver/{deliveryID} -
POST /webhook-subscriptions/{subscriptionID}/test -
PUT /client-templates/{templateID} -
PUT /clients/{clientID} -
PUT /escalation-policies/{policyID} -
PUT /heartbeat-groups/{groupID} -
PUT /heartbeats/{heartbeatID} -
PUT /heartbeats/{heartbeatID}/pause -
PUT /heartbeats/{heartbeatID}/resume -
PUT /incidents/{incidentID}/acknowledge -
PUT /incidents/{incidentID}/reopen -
PUT /incidents/{incidentID}/resolve -
PUT /metadata -
PUT /monitor-groups/{groupID} -
PUT /monitors/{monitorID}/escalation-policy -
PUT /oncall-schedules/{scheduleID} -
PUT /organization -
PUT /organization/members/{memberID}/role -
PUT /organization/security -
PUT /organization/sso/{provider} -
PUT /runbooks/{runbookID} -
PUT /runbooks/{runbookID}/steps/{stepID}/completion -
PUT /status-pages/{pageID} -
PUT /status-pages/{pageID}/sections/{sectionID} -
PUT /status-pages/{pageID}/sections/{sectionID}/resources/{resourceID} -
PUT /status-pages/{pageID}/structure -
PUT /status-pages/{pageID}/translations/{translationID} -
PUT /teams/{teamID} -
PUT /teams/{teamID}/members/{memberID}/role -
PUT /webhook-subscriptions/{subscriptionID}
-
- documented
Required scope and stability are now declared for 17 operations. This describes behavior that already existed and is not counted as a change.
Areas: Monitors, Alert channels, Reports
2026-05-05
- added
First version of the API reference, with 22 operations.
How this log is made
A script reads every version of the OpenAPI file, groups the versions by the date they were committed and compares the end of each date with the end of the one before. A route that disappears and returns on the same date leaves no entry. Operator routes are not part of the public API and are not listed.
The reference was a route inventory until 2026-10-27: it listed operations, scopes and stability, but most request and response bodies were open objects and success statuses were estimates. For the time before that date the log reports added and removed operations, scopes and stability only. On 2026-10-27 the fields of the operations were documented; that is one documented entry, not a change. From the day after, parameters, status codes and fields are compared too.
Was this page helpful?