diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 146f30f..08dac2a 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -38,6 +38,10 @@ "name": "API Keys", "description": "Organization API key management" }, + { + "name": "Artifacts", + "description": "Run evidence file content" + }, { "name": "Audit Log", "description": "Organization audit trail" @@ -50,6 +54,10 @@ "name": "Dashboard", "description": "Overview dashboard aggregates" }, + { + "name": "Definitions", + "description": "Code-monitor definition catalog and revisions" + }, { "name": "Deploy Lock", "description": "Mutex for CLI deploy operations" @@ -102,6 +110,22 @@ "name": "Monitor Auth", "description": "Manage authentication configuration for a monitor" }, + { + "name": "Monitor definitions", + "description": "Publish, rollback, and revision history for code monitors" + }, + { + "name": "Monitor Runs", + "description": "Per-monitor code run history and run-now" + }, + { + "name": "Monitor secret requests", + "description": "Secret keys a monitor requires and how they are fulfilled" + }, + { + "name": "Monitor session", + "description": "Cached sign-in session for a monitor" + }, { "name": "Monitors", "description": "Monitor CRUD and lifecycle management" @@ -126,6 +150,14 @@ "name": "Resource Groups", "description": "Resource group CRUD and member management" }, + { + "name": "Revisions", + "description": "Definition revision packages" + }, + { + "name": "Runs", + "description": "Code-monitor run list, snapshot, cases, events, and cancel" + }, { "name": "Secrets", "description": "Organization environment secret management" @@ -166,7 +198,7 @@ "Alert Channels" ], "summary": "List active alert channels for the authenticated org", - "description": "Supports filtering by `type` (channel integration), `managedBy` (creating surface), and `search` (case-insensitive contains on name). Unrecognised query parameters are silently ignored — pin to the documented set above.", + "description": "Supports filtering by `type` (channel integration), `managedBy` (creating surface), and `search` (case-insensitive contains on name). Unrecognised query parameters are silently ignored \u2014 pin to the documented set above.", "operationId": "list_14", "parameters": [ { @@ -248,7 +280,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -258,7 +290,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -268,7 +300,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -278,7 +310,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -288,7 +320,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -298,7 +330,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -308,7 +340,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -318,7 +350,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -357,7 +389,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -367,7 +399,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -377,7 +409,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -387,7 +419,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -397,7 +429,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -407,7 +439,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -417,7 +449,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -427,7 +459,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -439,37 +471,36 @@ } } }, - "/api/v1/alert-channels/{id}": { - "get": { + "/api/v1/alert-channels/test": { + "post": { "tags": [ "Alert Channels" ], - "summary": "Get a single alert channel by id", - "operationId": "get_8", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Test alert channel connectivity using raw config (no saved channel required)", + "operationId": "testConfig", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestAlertChannelRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -479,7 +510,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -489,7 +520,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -499,7 +530,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -509,7 +540,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -519,7 +550,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -529,7 +560,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -539,7 +570,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -549,13 +580,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/alert-channels/{id}": { + "get": { "tags": [ "Alert Channels" ], - "summary": "Update an alert channel's name and re-encrypt config", - "operationId": "update_14", + "summary": "Get a single alert channel by id", + "operationId": "get_8", "parameters": [ { "name": "id", @@ -567,16 +600,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertChannelRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -589,7 +612,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -599,7 +622,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -609,7 +632,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -619,7 +642,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -629,7 +652,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -639,7 +662,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -649,7 +672,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -659,7 +682,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -670,12 +693,12 @@ } } }, - "delete": { + "put": { "tags": [ "Alert Channels" ], - "summary": "Soft-delete an alert channel and return affected policy summary", - "operationId": "delete_10", + "summary": "Update an alert channel's name and re-encrypt config", + "operationId": "update_14", "parameters": [ { "name": "id", @@ -687,19 +710,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertChannelRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/DeleteChannelResult" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -709,7 +742,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -719,7 +752,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -729,7 +762,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -739,7 +772,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -749,7 +782,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -759,7 +792,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -769,7 +802,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -779,15 +812,13 @@ } } } - } - }, - "/api/v1/alert-channels/{id}/deliveries": { - "get": { + }, + "delete": { "tags": [ "Alert Channels" ], - "summary": "List delivery history for an alert channel", - "operationId": "listDeliveries_1", + "summary": "Soft-delete an alert channel and return affected policy summary", + "operationId": "delete_10", "parameters": [ { "name": "id", @@ -805,13 +836,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" + "$ref": "#/components/schemas/DeleteChannelResult" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -821,7 +852,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -831,7 +862,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -841,7 +872,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -851,7 +882,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -861,7 +892,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -871,7 +902,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -881,7 +912,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -893,13 +924,13 @@ } } }, - "/api/v1/alert-channels/{id}/enabled": { - "patch": { + "/api/v1/alert-channels/{id}/deliveries": { + "get": { "tags": [ "Alert Channels" ], - "summary": "Enable or disable an alert channel without re-uploading config", - "operationId": "setEnabled", + "summary": "List delivery history for an alert channel", + "operationId": "listDeliveries_1", "parameters": [ { "name": "id", @@ -911,29 +942,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetEnabledRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -943,7 +964,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -953,7 +974,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -963,7 +984,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -973,7 +994,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -983,7 +1004,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -993,7 +1014,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1003,7 +1024,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1015,13 +1036,13 @@ } } }, - "/api/v1/alert-channels/{id}/test": { - "post": { + "/api/v1/alert-channels/{id}/enabled": { + "patch": { "tags": [ "Alert Channels" ], - "summary": "Test a saved alert channel's connectivity", - "operationId": "test_2", + "summary": "Enable or disable an alert channel without re-uploading config", + "operationId": "setEnabled", "parameters": [ { "name": "id", @@ -1033,19 +1054,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetEnabledRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1055,7 +1086,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1065,7 +1096,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1075,7 +1106,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1085,7 +1116,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1095,7 +1126,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1105,7 +1136,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1115,7 +1146,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1127,23 +1158,24 @@ } } }, - "/api/v1/alert-channels/test": { + "/api/v1/alert-channels/{id}/test": { "post": { "tags": [ "Alert Channels" ], - "summary": "Test alert channel connectivity using raw config (no saved channel required)", - "operationId": "testConfig", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestAlertChannelRequest" - } + "summary": "Test a saved alert channel's connectivity", + "operationId": "test_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", @@ -1156,7 +1188,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1166,7 +1198,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1176,7 +1208,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1186,7 +1218,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1196,7 +1228,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1206,7 +1238,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1216,7 +1248,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1226,7 +1258,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1269,7 +1301,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1279,7 +1311,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1289,7 +1321,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1299,7 +1331,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1309,7 +1341,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1319,7 +1351,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1329,7 +1361,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1339,7 +1371,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1382,7 +1414,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1392,7 +1424,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1402,7 +1434,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1412,7 +1444,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1422,7 +1454,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1432,7 +1464,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1442,7 +1474,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1452,7 +1484,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1483,7 +1515,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1493,7 +1525,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1503,7 +1535,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1513,7 +1545,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1523,7 +1555,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1533,7 +1565,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1543,7 +1575,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1553,7 +1585,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1592,7 +1624,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1602,7 +1634,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1612,7 +1644,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1622,7 +1654,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1632,7 +1664,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1642,7 +1674,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1652,7 +1684,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1662,7 +1694,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1697,7 +1729,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1707,7 +1739,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1717,7 +1749,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1727,7 +1759,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1737,7 +1769,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1747,7 +1779,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1757,7 +1789,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1767,7 +1799,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1817,7 +1849,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1827,7 +1859,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1837,7 +1869,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1847,7 +1879,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1857,7 +1889,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1867,7 +1899,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1877,7 +1909,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1887,7 +1919,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -1929,7 +1961,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -1939,7 +1971,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -1949,7 +1981,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1959,7 +1991,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1969,7 +2001,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1979,7 +2011,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -1989,7 +2021,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -1999,7 +2031,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2041,7 +2073,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2051,7 +2083,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2061,7 +2093,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2071,7 +2103,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2081,7 +2113,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2091,7 +2123,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2101,7 +2133,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2111,7 +2143,116 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/artifacts/{id}/content": { + "get": { + "tags": [ + "Artifacts" + ], + "summary": "Redirect to signed artifact download", + "description": "Returns 302 Location with a signed GET URL. 410 after the 14-day file clock.", + "operationId": "getArtifactContent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "302": { + "description": "Signed download Location" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Artifact bytes expired" + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2129,7 +2270,7 @@ "Audit Log" ], "summary": "List audit events for the current organization", - "operationId": "list_20", + "operationId": "list_22", "parameters": [ { "name": "action", @@ -2207,7 +2348,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2217,7 +2358,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2227,7 +2368,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2237,7 +2378,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2247,7 +2388,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2257,7 +2398,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2267,7 +2408,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2277,7 +2418,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2309,7 +2450,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2319,7 +2460,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2329,7 +2470,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2339,7 +2480,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2349,7 +2490,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2359,7 +2500,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2369,7 +2510,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2379,7 +2520,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2422,7 +2563,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2432,7 +2573,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2442,7 +2583,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2452,7 +2593,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2462,7 +2603,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2472,7 +2613,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2482,7 +2623,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2492,7 +2633,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2524,7 +2665,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2534,7 +2675,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2544,7 +2685,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2554,7 +2695,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2564,7 +2705,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2574,7 +2715,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2584,7 +2725,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2594,7 +2735,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2606,27 +2747,26 @@ } } }, - "/api/v1/deploy/lock": { + "/api/v1/definitions": { "get": { "tags": [ - "Deploy Lock" + "Definitions" ], - "summary": "Get current deploy lock", - "description": "Returns the active deploy lock for the current workspace, if any.", - "operationId": "current", + "summary": "List definitions", + "operationId": "list_21", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/TableValueResultDefinitionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2636,7 +2776,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2646,7 +2786,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2656,7 +2796,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2666,7 +2806,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2676,7 +2816,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2686,7 +2826,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2696,7 +2836,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2706,37 +2846,39 @@ } } } - }, - "post": { + } + }, + "/api/v1/definitions/{id}": { + "get": { "tags": [ - "Deploy Lock" + "Definitions" ], - "summary": "Acquire deploy lock", - "description": "Acquires an exclusive deploy lock for the current workspace. Returns 409 Conflict if the workspace is already locked by another session.", - "operationId": "acquire", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AcquireDeployLockRequest" - } + "summary": "Get definition with Heads", + "operationId": "get_13", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2746,7 +2888,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2756,7 +2898,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2766,7 +2908,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2776,7 +2918,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2786,7 +2928,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2796,7 +2938,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2806,7 +2948,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2818,17 +2960,16 @@ } } }, - "/api/v1/deploy/lock/{lockId}": { - "delete": { + "/api/v1/definitions/{id}/revisions": { + "get": { "tags": [ - "Deploy Lock" + "Definitions" ], - "summary": "Release deploy lock", - "description": "Releases a deploy lock by ID. Only the lock holder should call this.", - "operationId": "release", + "summary": "List all revisions for a definition", + "operationId": "listRevisions_1", "parameters": [ { - "name": "lockId", + "name": "id", "in": "path", "required": true, "schema": { @@ -2838,11 +2979,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRevisionDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2852,7 +3000,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2862,7 +3010,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2872,7 +3020,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2882,7 +3030,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2892,7 +3040,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2902,7 +3050,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -2912,7 +3060,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -2924,20 +3072,27 @@ } } }, - "/api/v1/deploy/lock/force": { - "delete": { + "/api/v1/deploy/lock": { + "get": { "tags": [ "Deploy Lock" ], - "summary": "Force-release deploy lock", - "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", - "operationId": "forceRelease", + "summary": "Get current deploy lock", + "description": "Returns the active deploy lock for the current workspace, if any.", + "operationId": "current", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -2947,7 +3102,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2957,7 +3112,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -2967,7 +3122,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -2977,7 +3132,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -2987,7 +3142,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -2997,7 +3152,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3007,7 +3162,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3017,28 +3172,37 @@ } } } - } - }, - "/api/v1/environments": { - "get": { + }, + "post": { "tags": [ - "Environments" + "Deploy Lock" ], - "summary": "List environments", - "operationId": "list_12", + "summary": "Acquire deploy lock", + "description": "Acquires an exclusive deploy lock for the current workspace. Returns 409 Conflict if the workspace is already locked by another session.", + "operationId": "acquire", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AcquireDeployLockRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3048,7 +3212,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3058,7 +3222,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3068,7 +3232,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3078,7 +3242,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3088,7 +3252,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3098,7 +3262,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3108,7 +3272,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3118,36 +3282,128 @@ } } } - }, - "post": { + } + }, + "/api/v1/deploy/lock/force": { + "delete": { "tags": [ - "Environments" + "Deploy Lock" ], - "summary": "Create environment", - "operationId": "create_13", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEnvironmentRequest" + "summary": "Force-release deploy lock", + "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", + "operationId": "forceRelease", + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/deploy/lock/{lockId}": { + "delete": { + "tags": [ + "Deploy Lock" + ], + "summary": "Release deploy lock", + "description": "Releases a deploy lock by ID. Only the lock holder should call this.", + "operationId": "release", + "parameters": [ + { + "name": "lockId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3157,7 +3413,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3167,7 +3423,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3177,7 +3433,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3187,7 +3443,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3197,7 +3453,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3207,7 +3463,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3217,7 +3473,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3229,36 +3485,26 @@ } } }, - "/api/v1/environments/{slug}": { + "/api/v1/environments": { "get": { "tags": [ "Environments" ], - "summary": "Get environment by slug", - "operationId": "get_7", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "List environments", + "operationId": "list_12", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3268,7 +3514,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3278,7 +3524,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3288,7 +3534,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3298,7 +3544,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3308,7 +3554,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3318,7 +3564,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3328,7 +3574,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3339,35 +3585,25 @@ } } }, - "put": { + "post": { "tags": [ "Environments" ], - "summary": "Update environment", - "operationId": "update_13", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], + "summary": "Create environment", + "operationId": "create_13", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateEnvironmentRequest" + "$ref": "#/components/schemas/CreateEnvironmentRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { @@ -3377,7 +3613,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3387,7 +3623,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3397,7 +3633,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3407,7 +3643,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3417,7 +3653,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3427,7 +3663,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3437,7 +3673,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3447,7 +3683,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3457,13 +3693,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/environments/{slug}": { + "get": { "tags": [ "Environments" ], - "summary": "Delete environment", - "operationId": "delete_9", + "summary": "Get environment by slug", + "operationId": "get_7", "parameters": [ { "name": "slug", @@ -3475,11 +3713,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3489,7 +3734,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3499,7 +3744,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3509,7 +3754,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3519,7 +3764,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3529,7 +3774,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3539,7 +3784,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3549,7 +3794,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3559,40 +3804,46 @@ } } } - } - }, - "/api/v1/forensics/incidents/{id}/timeline": { - "get": { + }, + "put": { "tags": [ - "Forensics" + "Environments" ], - "summary": "Full forensic timeline for an incident", - "description": "Returns every state-machine transition for this incident plus the rule evaluations that caused each transition, plus the policy snapshot that triggered confirmation. Correlate evaluations to transitions via evaluation.triggeringTransitionId == transition.id.", - "operationId": "getTimeline", + "summary": "Update environment", + "operationId": "update_13", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEnvironmentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3602,7 +3853,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3612,7 +3863,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3622,7 +3873,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3632,7 +3883,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3642,7 +3893,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3652,7 +3903,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3662,7 +3913,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3672,74 +3923,126 @@ } } } - } - }, - "/api/v1/forensics/monitors/{id}/rule-evaluations": { - "get": { + }, + "delete": { "tags": [ - "Forensics" + "Environments" ], - "summary": "Paged list of rule evaluations for a monitor", - "description": "Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations. Time window defaults to the last 7 days when from/to are omitted; windows wider than 30 days are clamped.", - "operationId": "listMonitorRuleEvaluations", + "summary": "Delete environment", + "operationId": "delete_9", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } + } + ], + "responses": { + "204": { + "description": "No Content" }, - { - "name": "ruleType", - "in": "query", - "required": false, - "schema": { - "type": "string" + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "region", - "in": "query", - "required": false, - "schema": { - "type": "string" + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "onlyMatched", - "in": "query", - "required": false, - "schema": { - "type": "boolean" + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/forensics/incidents/{id}/timeline": { + "get": { + "tags": [ + "Forensics" + ], + "summary": "Full forensic timeline for an incident", + "description": "Returns every state-machine transition for this incident plus the rule evaluations that caused each transition, plus the policy snapshot that triggered confirmation. Correlate evaluations to transitions via evaluation.triggeringTransitionId == transition.id.", + "operationId": "getTimeline", + "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -3749,13 +4052,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3765,7 +4068,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3775,7 +4078,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3785,7 +4088,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3795,7 +4098,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3805,7 +4108,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3815,7 +4118,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3825,7 +4128,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3837,14 +4140,14 @@ } } }, - "/api/v1/forensics/monitors/{id}/transitions": { + "/api/v1/forensics/monitors/{id}/rule-evaluations": { "get": { "tags": [ "Forensics" ], - "summary": "Paged list of state transitions for a monitor", - "description": "Time window defaults to the last 30 days when from/to are omitted; windows wider than 90 days are clamped.", - "operationId": "listMonitorTransitions", + "summary": "Paged list of rule evaluations for a monitor", + "description": "Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations. Time window defaults to the last 7 days when from/to are omitted; windows wider than 30 days are clamped.", + "operationId": "listMonitorRuleEvaluations", "parameters": [ { "name": "id", @@ -3855,6 +4158,30 @@ "format": "uuid" } }, + { + "name": "ruleType", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "region", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "onlyMatched", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + }, { "name": "from", "in": "query", @@ -3888,13 +4215,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" + "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -3904,7 +4231,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3914,7 +4241,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -3924,7 +4251,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -3934,7 +4261,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3944,7 +4271,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -3954,7 +4281,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -3964,7 +4291,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -3976,21 +4303,48 @@ } } }, - "/api/v1/forensics/policy-snapshots/{hashHex}": { + "/api/v1/forensics/monitors/{id}/transitions": { "get": { "tags": [ "Forensics" ], - "summary": "Fetch a policy snapshot by its content hash", - "description": "Hash is SHA-256 over canonical policy JSON, hex-encoded. Access is gated: caller's org must have evaluated against this hash at least once.", - "operationId": "getPolicySnapshot", + "summary": "Paged list of state transitions for a monitor", + "description": "Time window defaults to the last 30 days when from/to are omitted; windows wider than 90 days are clamped.", + "operationId": "listMonitorTransitions", "parameters": [ { - "name": "hashHex", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "from", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -4000,13 +4354,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" + "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4016,7 +4370,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4026,7 +4380,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4036,7 +4390,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4046,7 +4400,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4056,7 +4410,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4066,7 +4420,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4076,7 +4430,119 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/forensics/policy-snapshots/{hashHex}": { + "get": { + "tags": [ + "Forensics" + ], + "summary": "Fetch a policy snapshot by its content hash", + "description": "Hash is SHA-256 over canonical policy JSON, hex-encoded. Access is gated: caller's org must have evaluated against this hash at least once.", + "operationId": "getPolicySnapshot", + "parameters": [ + { + "name": "hashHex", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4119,7 +4585,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4129,7 +4595,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4139,7 +4605,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4149,7 +4615,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4159,7 +4625,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4169,7 +4635,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4179,7 +4645,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4189,7 +4655,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4232,7 +4698,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4242,7 +4708,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4252,7 +4718,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4262,7 +4728,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4272,7 +4738,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4282,7 +4748,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4292,7 +4758,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4302,7 +4768,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4362,7 +4828,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4372,7 +4838,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4382,7 +4848,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4392,7 +4858,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4402,7 +4868,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4412,7 +4878,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4422,7 +4888,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4432,7 +4898,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4473,7 +4939,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4483,7 +4949,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4493,7 +4959,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4503,7 +4969,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4513,7 +4979,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4523,7 +4989,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4533,7 +4999,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4543,7 +5009,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4582,7 +5048,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4592,7 +5058,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4602,7 +5068,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4612,7 +5078,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4622,7 +5088,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4632,7 +5098,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4642,7 +5108,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4652,7 +5118,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4695,7 +5161,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4705,7 +5171,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4715,7 +5181,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4725,7 +5191,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4735,7 +5201,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4745,7 +5211,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4755,7 +5221,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4765,7 +5231,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4815,7 +5281,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4825,7 +5291,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4835,7 +5301,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4845,7 +5311,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4855,7 +5321,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4865,7 +5331,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4875,7 +5341,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4885,7 +5351,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -4928,7 +5394,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -4938,7 +5404,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4948,7 +5414,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -4958,7 +5424,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -4968,7 +5434,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -4978,7 +5444,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -4988,7 +5454,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -4998,7 +5464,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5059,7 +5525,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5069,7 +5535,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5079,7 +5545,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5089,7 +5555,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5099,7 +5565,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5109,7 +5575,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5119,7 +5585,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5129,7 +5595,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5147,7 +5613,7 @@ "Incidents" ], "summary": "List related incidents sharing the same origin", - "description": "Returns same-origin recurrence (monitor, service, or resource group) within the window, excluding the current incident. total is the full count for “Nth outage this month” copy.", + "description": "Returns same-origin recurrence (monitor, service, or resource group) within the window, excluding the current incident. total is the full count for \u201cNth outage this month\u201d copy.", "operationId": "listRelated", "parameters": [ { @@ -5192,7 +5658,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5202,7 +5668,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5212,7 +5678,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5222,7 +5688,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5232,7 +5698,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5242,7 +5708,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5252,7 +5718,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5262,7 +5728,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5313,7 +5779,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5323,7 +5789,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5333,7 +5799,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5343,7 +5809,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5353,7 +5819,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5363,7 +5829,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5373,7 +5839,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5383,7 +5849,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5426,7 +5892,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5436,7 +5902,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5446,7 +5912,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5456,7 +5922,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5466,7 +5932,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5476,7 +5942,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5486,7 +5952,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5496,7 +5962,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5548,7 +6014,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5558,7 +6024,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5568,7 +6034,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5578,7 +6044,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5588,7 +6054,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5598,7 +6064,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5608,7 +6074,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5618,7 +6084,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5637,7 +6103,7 @@ ], "summary": "List all supported integration types", "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", - "operationId": "list_19", + "operationId": "list_20", "responses": { "200": { "description": "OK", @@ -5650,7 +6116,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5660,7 +6126,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5670,7 +6136,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5680,7 +6146,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5690,7 +6156,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5700,7 +6166,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5710,7 +6176,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5720,7 +6186,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5752,7 +6218,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5762,7 +6228,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5772,7 +6238,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5782,7 +6248,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5792,7 +6258,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5802,7 +6268,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5812,7 +6278,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5822,7 +6288,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5853,7 +6319,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5863,7 +6329,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5873,7 +6339,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5883,7 +6349,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -5893,7 +6359,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5903,7 +6369,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -5913,7 +6379,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -5923,7 +6389,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -5962,7 +6428,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -5972,7 +6438,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5982,7 +6448,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -5992,7 +6458,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6002,7 +6468,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6012,7 +6478,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6022,7 +6488,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6032,7 +6498,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6074,7 +6540,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6084,7 +6550,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6094,7 +6560,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6104,7 +6570,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6114,7 +6580,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6124,7 +6590,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6134,7 +6600,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6144,7 +6610,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6179,7 +6645,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6189,7 +6655,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6199,7 +6665,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6209,7 +6675,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6219,7 +6685,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6229,7 +6695,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6239,7 +6705,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6249,7 +6715,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6302,7 +6768,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6312,7 +6778,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6322,7 +6788,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6332,7 +6798,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6342,7 +6808,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6352,7 +6818,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6362,7 +6828,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6372,7 +6838,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6412,7 +6878,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6422,7 +6888,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6432,7 +6898,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6442,7 +6908,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6452,7 +6918,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6462,7 +6928,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6472,7 +6938,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6482,7 +6948,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6524,7 +6990,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6534,7 +7000,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6544,7 +7010,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6554,7 +7020,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6564,7 +7030,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6574,7 +7040,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6584,7 +7050,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6594,7 +7060,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6644,7 +7110,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6654,7 +7120,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6664,7 +7130,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6674,7 +7140,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6684,7 +7150,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6694,7 +7160,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6704,7 +7170,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6714,7 +7180,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6747,7 +7213,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6757,7 +7223,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6767,7 +7233,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6777,7 +7243,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6787,7 +7253,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6797,7 +7263,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6807,7 +7273,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6817,7 +7283,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6835,7 +7301,7 @@ "Members" ], "summary": "List organization members", - "operationId": "list_18", + "operationId": "list_19", "parameters": [ { "name": "pageable", @@ -6858,7 +7324,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6868,7 +7334,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6878,7 +7344,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6888,7 +7354,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6898,7 +7364,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -6908,7 +7374,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -6918,7 +7384,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -6928,7 +7394,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -6963,7 +7429,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -6973,7 +7439,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -6983,7 +7449,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6993,7 +7459,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7003,7 +7469,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7013,7 +7479,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7023,7 +7489,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7033,7 +7499,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7078,7 +7544,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7088,7 +7554,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7098,7 +7564,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7108,7 +7574,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7118,7 +7584,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7128,7 +7594,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7138,7 +7604,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7148,7 +7614,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7193,7 +7659,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7203,7 +7669,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7213,7 +7679,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7223,7 +7689,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7233,7 +7699,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7243,7 +7709,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7253,7 +7719,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7263,7 +7729,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7281,7 +7747,7 @@ "Monitors" ], "summary": "List monitors for the authenticated org", - "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", + "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) \u2014 pin to the documented set above.", "operationId": "list_8", "parameters": [ { @@ -7395,7 +7861,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7405,7 +7871,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7415,7 +7881,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7425,7 +7891,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7435,7 +7901,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7445,7 +7911,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7455,7 +7921,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7465,7 +7931,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7504,7 +7970,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7514,7 +7980,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7524,7 +7990,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7534,7 +8000,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7544,7 +8010,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7554,7 +8020,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7564,7 +8030,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7574,7 +8040,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7586,37 +8052,37 @@ } } }, - "/api/v1/monitors/{id}": { - "get": { + "/api/v1/monitors/bulk": { + "post": { "tags": [ "Monitors" ], - "summary": "Get a single monitor by id", - "operationId": "get_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", + "operationId": "bulkAction", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkMonitorActionRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7626,7 +8092,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7636,7 +8102,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7646,7 +8112,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7656,7 +8122,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7666,7 +8132,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7676,7 +8142,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7686,7 +8152,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7696,29 +8162,132 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/package-uploads": { + "post": { "tags": [ "Monitors" ], - "summary": "Update a monitor", - "operationId": "update_11", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Mint a signed package upload URL", + "operationId": "createPackageUpload", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePackageUploadRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponsePackageUploadDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } } + } + } + }, + "/api/v1/monitors/test": { + "post": { + "tags": [ + "Monitors" ], + "summary": "Ad-hoc monitor test", + "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", + "operationId": "testAdHoc", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" + "$ref": "#/components/schemas/MonitorTestRequest" } } }, @@ -7730,13 +8299,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7746,7 +8315,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7756,7 +8325,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7766,7 +8335,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7776,7 +8345,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7786,7 +8355,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7796,7 +8365,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7806,7 +8375,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7816,13 +8385,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}": { + "get": { "tags": [ "Monitors" ], - "summary": "Soft-delete a monitor", - "operationId": "delete_7", + "summary": "Get a single monitor by id", + "operationId": "get_6", "parameters": [ { "name": "id", @@ -7835,11 +8406,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7849,7 +8427,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7859,7 +8437,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7869,7 +8447,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7879,7 +8457,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -7889,7 +8467,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -7899,7 +8477,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -7909,7 +8487,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -7919,15 +8497,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/pause": { - "post": { + }, + "put": { "tags": [ "Monitors" ], - "summary": "Pause a monitor (set enabled=false)", - "operationId": "pause", + "summary": "Update a monitor", + "operationId": "update_11", "parameters": [ { "name": "id", @@ -7939,6 +8515,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -7951,7 +8537,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -7961,7 +8547,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7971,7 +8557,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -7981,7 +8567,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -7991,7 +8577,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8001,7 +8587,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8011,7 +8597,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8021,7 +8607,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8031,16 +8617,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/results": { - "get": { + }, + "delete": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "List raw check results", - "description": "Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.", - "operationId": "getResults", + "summary": "Soft-delete a monitor", + "operationId": "delete_7", "parameters": [ { "name": "id", @@ -8050,90 +8633,145 @@ "type": "string", "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, - { - "name": "from", - "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "to", - "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response for pagination", - "required": false, - "schema": { - "type": "string" + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "limit", - "in": "query", - "description": "Maximum results per page (1–200)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "name": "region", - "in": "query", - "description": "Filter by region (e.g. us-east)", - "required": false, - "schema": { - "type": "string" + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/mute": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", + "parameters": [ { - "name": "passed", - "in": "query", - "description": "Filter by pass/fail status", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { - "description": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid query parameters", + "description": "Bad request \u2014 the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8143,27 +8781,27 @@ } }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "404": { - "description": "Monitor not found", + "description": "Not found \u2014 the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8173,7 +8811,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8183,7 +8821,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8193,7 +8831,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8205,14 +8843,13 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { - "get": { + "/api/v1/monitors/{id}/pause": { + "post": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", + "summary": "Pause a monitor", + "operationId": "pause", "parameters": [ { "name": "id", @@ -8222,46 +8859,40 @@ "type": "string", "format": "uuid" } - }, - { - "name": "chartWindow", - "in": "query", - "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { - "description": "Results summary", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid chartWindow parameter", + "description": "Bad request \u2014 the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8271,27 +8902,27 @@ } }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "404": { - "description": "Monitor not found", + "description": "Not found \u2014 the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8301,7 +8932,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8311,7 +8942,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8321,7 +8952,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8333,13 +8964,14 @@ } } }, - "/api/v1/monitors/{id}/resume": { + "/api/v1/monitors/{id}/publish": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Resume a monitor (set enabled=true)", - "operationId": "resume", + "summary": "Publish a revision as Head for this monitor's environment", + "description": "Retargets the shared Head for (definition, environment). Does not clone package bytes.", + "operationId": "publish", "parameters": [ { "name": "id", @@ -8351,19 +8983,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -8373,7 +9015,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8383,7 +9025,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -8393,7 +9035,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -8403,7 +9045,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8413,7 +9055,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8423,7 +9065,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8433,7 +9075,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8445,14 +9087,13 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { + "/api/v1/monitors/{id}/quarantine": { "post": { "tags": [ "Monitors" ], - "summary": "Rotate the ping token for a heartbeat monitor", - "description": "Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.", - "operationId": "rotateToken", + "summary": "Quarantine a monitor", + "operationId": "quarantine", "parameters": [ { "name": "id", @@ -8464,6 +9105,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuarantineMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -8476,7 +9127,7 @@ } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -8486,7 +9137,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8496,7 +9147,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -8506,7 +9157,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -8516,7 +9167,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8526,7 +9177,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8536,7 +9187,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8546,7 +9197,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8558,14 +9209,13 @@ } } }, - "/api/v1/monitors/{id}/status-pages": { - "get": { + "/api/v1/monitors/{id}/release-quarantine": { + "post": { "tags": [ "Monitors" ], - "summary": "List status pages that contain this monitor as a component", - "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", - "operationId": "listStatusPagesForMonitor", + "summary": "Release quarantine", + "operationId": "releaseQuarantine", "parameters": [ { "name": "id", @@ -8583,13 +9233,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -8599,7 +9249,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8609,7 +9259,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -8619,7 +9269,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -8629,7 +9279,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8639,7 +9289,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8649,7 +9299,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8659,7 +9309,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8671,13 +9321,14 @@ } } }, - "/api/v1/monitors/{id}/tags": { + "/api/v1/monitors/{id}/results": { "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "List raw check results", + "description": "Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination \u2014 pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.", + "operationId": "getResults", "parameters": [ { "name": "id", @@ -8687,31 +9338,90 @@ "type": "string", "format": "uuid" } + }, + { + "name": "from", + "in": "query", + "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1\u2013200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } } ], "responses": { "200": { - "description": "OK", + "description": "Paginated check results", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid query parameters", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8721,27 +9431,27 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Monitor does not belong to the caller's org", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8751,7 +9461,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8761,7 +9471,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8771,7 +9481,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8781,13 +9491,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/results/summary": { + "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "summary": "Get results summary", + "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", + "operationId": "getSummary", "parameters": [ { "name": "id", @@ -8797,41 +9510,46 @@ "type": "string", "format": "uuid" } + }, + { + "name": "chartWindow", + "in": "query", + "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "OK", + "description": "Results summary", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/ResultSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8841,27 +9559,27 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Monitor does not belong to the caller's org", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8871,7 +9589,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8881,7 +9599,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -8891,7 +9609,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -8901,13 +9619,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/resume": { + "post": { "tags": [ "Monitors" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "summary": "Resume a paused monitor", + "operationId": "resume", "parameters": [ { "name": "id", @@ -8919,22 +9639,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -8944,7 +9661,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8954,7 +9671,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -8964,7 +9681,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -8974,7 +9691,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -8984,7 +9701,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -8994,7 +9711,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9004,7 +9721,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9016,14 +9733,14 @@ } } }, - "/api/v1/monitors/{id}/test": { - "post": { + "/api/v1/monitors/{id}/revisions": { + "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Test an existing monitor", - "description": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", - "operationId": "testExisting", + "summary": "List revisions published in this monitor's environment", + "description": "Omits drafts never published here. Page size default 25.", + "operationId": "listRevisions", "parameters": [ { "name": "id", @@ -9033,6 +9750,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -9041,13 +9766,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultRevisionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9057,7 +9782,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9067,7 +9792,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9077,7 +9802,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9087,7 +9812,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9097,7 +9822,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9107,7 +9832,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9117,7 +9842,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9129,14 +9854,14 @@ } } }, - "/api/v1/monitors/{id}/test-notifications": { + "/api/v1/monitors/{id}/revisions/{revisionId}/test": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Send test notifications through the monitor's alert channels", - "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", - "operationId": "testNotifications", + "summary": "Run remote validation against a revision without moving Head", + "description": "Creates a Run with source=remote_validation. Does not signal.", + "operationId": "testRevision", "parameters": [ { "name": "id", @@ -9146,31 +9871,30 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9180,7 +9904,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9190,7 +9914,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9200,7 +9924,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9210,7 +9934,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9220,7 +9944,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9230,7 +9954,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9240,7 +9964,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9252,14 +9976,14 @@ } } }, - "/api/v1/monitors/{id}/uptime": { - "get": { + "/api/v1/monitors/{id}/rollback": { + "post": { "tags": [ - "Check Results" + "Monitor definitions" ], - "summary": "Get uptime statistics", - "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows.", - "operationId": "getUptime", + "summary": "Roll back Head to a prior revision", + "description": "Same Head UPDATE as publish; stores reason on the Head.", + "operationId": "rollback", "parameters": [ { "name": "id", @@ -9269,46 +9993,41 @@ "type": "string", "format": "uuid" } - }, - { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RollbackRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "Uptime statistics", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } }, "400": { - "description": "Invalid window parameter", + "description": "Bad request \u2014 the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9318,27 +10037,27 @@ } }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "404": { - "description": "Monitor not found", + "description": "Not found \u2014 the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9348,7 +10067,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9358,7 +10077,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9368,7 +10087,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9380,14 +10099,13 @@ } } }, - "/api/v1/monitors/{id}/versions": { + "/api/v1/monitors/{id}/rollback-preview": { "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "List version history for a monitor", - "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", - "operationId": "listVersions", + "summary": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", "parameters": [ { "name": "id", @@ -9399,11 +10117,12 @@ } }, { - "name": "pageable", + "name": "revisionId", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -9413,13 +10132,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9429,7 +10148,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9439,7 +10158,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9449,7 +10168,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9459,7 +10178,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9469,7 +10188,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9479,7 +10198,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9489,7 +10208,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9501,14 +10220,14 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { - "get": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ "Monitors" ], - "summary": "Get a specific version snapshot for a monitor", - "description": "Returns the full monitor config snapshot captured at the given version number.", - "operationId": "getVersion", + "summary": "Rotate the ping token for a heartbeat monitor", + "description": "Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.", + "operationId": "rotateToken", "parameters": [ { "name": "id", @@ -9518,15 +10237,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -9535,13 +10245,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9551,7 +10261,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9561,7 +10271,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9571,7 +10281,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9581,7 +10291,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9591,7 +10301,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9601,7 +10311,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9611,7 +10321,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9623,47 +10333,46 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/{id}/runs": { + "get": { "tags": [ - "Monitor Alert Channels" + "Monitor Runs" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "List runs for a code monitor", + "description": "Cursor page. Default limit 25.", + "operationId": "listMonitorRuns", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorRunListParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/CursorPageRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9673,7 +10382,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9683,7 +10392,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9693,7 +10402,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9703,7 +10412,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9713,7 +10422,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9723,7 +10432,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9733,7 +10442,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9743,18 +10452,17 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions": { + }, "post": { "tags": [ - "Monitor Assertions" + "Monitor Runs" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "Run now", + "description": "Persists a run in queued phase. 409 if no Head or any secret key is missing.", + "operationId": "runNow", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -9763,29 +10471,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9795,7 +10493,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9805,7 +10503,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9815,7 +10513,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9825,7 +10523,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9835,7 +10533,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9845,7 +10543,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9855,7 +10553,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9867,25 +10565,16 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + "/api/v1/monitors/{id}/secret-requests": { + "get": { "tags": [ - "Monitor Assertions" + "Monitor secret requests" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "summary": "List secret requests for a monitor", + "operationId": "list_18", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -9894,29 +10583,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -9926,7 +10605,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -9936,7 +10615,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9946,7 +10625,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9956,7 +10635,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9966,7 +10645,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -9976,7 +10655,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -9986,7 +10665,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -9996,25 +10675,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/secret-requests/rescan": { + "post": { "tags": [ - "Monitor Assertions" + "Monitor secret requests" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Rescan secret requests from the active package", + "operationId": "rescan", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -10024,11 +10696,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10038,7 +10717,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10048,7 +10727,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10058,7 +10737,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10068,7 +10747,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10078,7 +10757,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10088,7 +10767,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10098,7 +10777,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10110,29 +10789,37 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { + "/api/v1/monitors/{id}/secret-requests/{key}": { "put": { "tags": [ - "Monitor Auth" + "Monitor secret requests" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "Attach or clear a remapped secret for a key", + "operationId": "remap", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + "$ref": "#/components/schemas/RemapSecretRequest" } } }, @@ -10144,13 +10831,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10160,7 +10847,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10170,7 +10857,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10180,7 +10867,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10190,7 +10877,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10200,7 +10887,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10210,7 +10897,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10220,7 +10907,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10230,16 +10917,18 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/session": { + "get": { "tags": [ - "Monitor Auth" + "Monitor session" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Get the monitor session", + "operationId": "getSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -10248,29 +10937,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10280,7 +10959,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10290,7 +10969,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10300,7 +10979,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10310,7 +10989,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10320,7 +10999,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10330,7 +11009,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10340,7 +11019,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10351,15 +11030,15 @@ } } }, - "delete": { + "put": { "tags": [ - "Monitor Auth" + "Monitor session" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", + "summary": "Create or update the monitor session", + "operationId": "putSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -10368,12 +11047,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10383,7 +11079,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10393,7 +11089,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10403,7 +11099,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10413,7 +11109,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10423,7 +11119,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10433,7 +11129,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10443,7 +11139,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10455,19 +11151,17 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { - "get": { + "/api/v1/monitors/{id}/session/renew": { + "post": { "tags": [ - "Incident Policies" + "Monitor session" ], - "summary": "Get incident policy for a monitor", - "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", - "operationId": "get_5", + "summary": "Renew the monitor session", + "operationId": "renewSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -10476,18 +11170,18 @@ } ], "responses": { - "200": { - "description": "Policy found", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10497,7 +11191,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10507,7 +11201,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10517,17 +11211,17 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found \u2014 the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10537,7 +11231,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10547,7 +11241,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10557,7 +11251,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10567,19 +11261,19 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/session/revoke": { + "post": { "tags": [ - "Incident Policies" + "Monitor session" ], - "summary": "Update incident policy for a monitor", - "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", - "operationId": "update_8", + "summary": "Revoke the monitor session", + "operationId": "revokeSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -10587,39 +11281,29 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } }, "400": { - "description": "Validation error in JSONB shape", + "description": "Bad request \u2014 the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10629,7 +11313,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10639,17 +11323,17 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found \u2014 the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10659,7 +11343,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10669,7 +11353,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10679,7 +11363,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10691,37 +11375,38 @@ } } }, - "/api/v1/monitors/bulk": { - "post": { + "/api/v1/monitors/{id}/status-pages": { + "get": { "tags": [ "Monitors" ], - "summary": "Bulk action on monitors", - "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", - "operationId": "bulkAction", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" - } + "summary": "List status pages that contain this monitor as a component", + "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", + "operationId": "listStatusPagesForMonitor", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10731,7 +11416,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10741,7 +11426,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10751,7 +11436,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10761,7 +11446,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10771,7 +11456,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10781,7 +11466,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10791,7 +11476,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10803,37 +11488,37 @@ } } }, - "/api/v1/monitors/test": { - "post": { + "/api/v1/monitors/{id}/tags": { + "get": { "tags": [ "Monitors" ], - "summary": "Ad-hoc monitor test", - "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", - "operationId": "testAdHoc", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" - } + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10843,7 +11528,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10853,7 +11538,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10863,7 +11548,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10873,7 +11558,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10883,7 +11568,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -10893,7 +11578,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -10903,7 +11588,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -10913,21 +11598,17 @@ } } } - } - }, - "/api/v1/notification-dispatches": { - "get": { + }, + "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "List all dispatches for an incident", - "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", - "operationId": "listByIncident", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { - "name": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { "type": "string", @@ -10935,19 +11616,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddMonitorTagsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -10957,7 +11648,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -10967,7 +11658,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10977,7 +11668,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10987,7 +11678,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -10997,7 +11688,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11007,7 +11698,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11017,7 +11708,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11027,16 +11718,13 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}": { - "get": { + }, + "delete": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "Get a single dispatch with full escalation and delivery history", - "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", - "operationId": "getById_3", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { "name": "id", @@ -11048,19 +11736,22 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11070,7 +11761,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11080,7 +11771,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11090,7 +11781,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11100,7 +11791,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11110,7 +11801,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11120,7 +11811,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11130,7 +11821,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11142,14 +11833,14 @@ } } }, - "/api/v1/notification-dispatches/{id}/acknowledge": { + "/api/v1/monitors/{id}/test": { "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "Acknowledge a notification dispatch", - "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", - "operationId": "acknowledge", + "summary": "Test an existing monitor", + "description": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", + "operationId": "testExisting", "parameters": [ { "name": "id", @@ -11167,13 +11858,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11183,7 +11874,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11193,7 +11884,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11203,7 +11894,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11213,7 +11904,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11223,7 +11914,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11233,7 +11924,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11243,7 +11934,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11255,14 +11946,14 @@ } } }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { + "/api/v1/monitors/{id}/test-notifications": { "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "Unacknowledge a notification dispatch", - "description": "Reverses a mistaken acknowledgment without reopening the incident. Allowed only from ACKNOWLEDGED. Clears ack fields, stays on the current escalation step, restores nextEscalationAt, and resumes escalation (ESCALATING if more steps remain, else DELIVERED). MEMBER+.", - "operationId": "unacknowledge", + "summary": "Send test notifications through the monitor's alert channels", + "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", + "operationId": "testNotifications", "parameters": [ { "name": "id", @@ -11274,19 +11965,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11296,7 +11997,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11306,7 +12007,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11316,7 +12017,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11326,7 +12027,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11336,7 +12037,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11346,7 +12047,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11356,7 +12057,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11368,26 +12069,37 @@ } } }, - "/api/v1/notification-policies": { - "get": { + "/api/v1/monitors/{id}/unmute": { + "post": { "tags": [ - "Notification Policies" + "Monitors" + ], + "summary": "Clear mute overlay", + "operationId": "unmute", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11397,7 +12109,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11407,7 +12119,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11417,7 +12129,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11427,7 +12139,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11437,7 +12149,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11447,7 +12159,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11457,7 +12169,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11467,46 +12179,65 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/uptime": { + "get": { "tags": [ - "Notification Policies" + "Check Results" ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" - } + "summary": "Get uptime statistics", + "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows.", + "operationId": "getUptime", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "window", + "in": "query", + "description": "Time window for uptime calculation", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/UptimeDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid window parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11516,27 +12247,27 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Monitor does not belong to the caller's org", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11546,7 +12277,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11556,7 +12287,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11566,7 +12297,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11578,13 +12309,14 @@ } } }, - "/api/v1/notification-policies/{id}": { + "/api/v1/monitors/{id}/versions": { "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "List version history for a monitor", + "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", + "operationId": "listVersions", "parameters": [ { "name": "id", @@ -11594,6 +12326,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -11602,13 +12342,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11618,7 +12358,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11628,7 +12368,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11638,7 +12378,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11648,7 +12388,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11658,7 +12398,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11668,7 +12408,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11678,7 +12418,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11688,13 +12428,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/versions/{version}": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "summary": "Get a specific version snapshot for a monitor", + "description": "Returns the full monitor config snapshot captured at the given version number.", + "operationId": "getVersion", "parameters": [ { "name": "id", @@ -11704,31 +12447,30 @@ "type": "string", "format": "uuid" } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11738,7 +12480,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11748,7 +12490,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11758,7 +12500,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11768,7 +12510,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11778,7 +12520,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11788,7 +12530,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11798,7 +12540,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11808,16 +12550,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{monitorId}/alert-channels": { + "put": { "tags": [ - "Notification Policies" + "Monitor Alert Channels" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -11826,12 +12570,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetAlertChannelsRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseListUUID" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11841,7 +12602,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11851,7 +12612,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11861,7 +12622,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11871,7 +12632,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -11881,7 +12642,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -11891,7 +12652,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -11901,7 +12662,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -11913,77 +12674,47 @@ } } }, - "/api/v1/notification-policies/{id}/dispatches": { - "get": { + "/api/v1/monitors/{monitorId}/assertions": { + "post": { "tags": [ - "Notification Policies" + "Monitor Assertions" ], - "summary": "List dispatches (firing history) for a notification policy", - "description": "Additive optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50, and may include nextCursor. Response remains TableValueResult — no CursorPage swap.", - "operationId": "listDispatches", + "summary": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "since", - "in": "query", - "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "until", - "in": "query", - "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous nextCursor", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size 1–100 when windowing/paginating (default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -11993,7 +12724,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12003,7 +12734,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12013,7 +12744,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12023,7 +12754,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12033,7 +12764,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12043,7 +12774,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12053,7 +12784,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12065,16 +12796,25 @@ } } }, - "/api/v1/notification-policies/{id}/test": { - "post": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Notification Policies" + "Monitor Assertions" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Update an assertion on a monitor", + "operationId": "update_10", "parameters": [ { - "name": "id", + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", "in": "path", "required": true, "schema": { @@ -12087,10 +12827,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" + "$ref": "#/components/schemas/UpdateAssertionRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -12098,13 +12839,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12114,7 +12855,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12124,7 +12865,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12134,7 +12875,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12144,7 +12885,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12154,7 +12895,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12164,7 +12905,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12174,7 +12915,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12184,59 +12925,39 @@ } } } - } - }, - "/api/v1/notifications": { - "get": { + }, + "delete": { "tags": [ - "Notifications" + "Monitor Assertions" ], - "summary": "List notifications for the current user", - "operationId": "list_17", + "summary": "Remove an assertion from a monitor", + "operationId": "remove_1", "parameters": [ { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, + "name": "monitorId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "type": "string", + "format": "uuid" } }, { - "name": "size", - "in": "query", - "required": false, + "name": "assertionId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12246,7 +12967,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12256,7 +12977,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12266,7 +12987,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12276,7 +12997,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12286,7 +13007,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12296,7 +13017,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12306,7 +13027,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12318,30 +13039,47 @@ } } }, - "/api/v1/notifications/{id}/read": { + "/api/v1/monitors/{monitorId}/auth": { "put": { "tags": [ - "Notifications" + "Monitor Auth" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12351,7 +13089,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12361,7 +13099,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12371,7 +13109,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12381,7 +13119,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12391,7 +13129,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12401,7 +13139,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12411,7 +13149,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12421,21 +13159,47 @@ } } } - } - }, - "/api/v1/notifications/read-all": { - "put": { + }, + "post": { "tags": [ - "Notifications" + "Monitor Auth" ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", + "summary": "Set authentication config for a monitor", + "operationId": "set", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12445,7 +13209,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12455,7 +13219,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12465,7 +13229,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12475,7 +13239,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12485,7 +13249,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12495,7 +13259,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12505,7 +13269,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12515,28 +13279,30 @@ } } } - } - }, - "/api/v1/notifications/unread-count": { - "get": { + }, + "delete": { "tags": [ - "Notifications" + "Monitor Auth" ], - "summary": "Get unread notification count", - "operationId": "unreadCount", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" - } - } + "summary": "Remove authentication config from a monitor", + "operationId": "remove", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12546,7 +13312,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12556,7 +13322,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12566,7 +13332,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12576,7 +13342,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12586,7 +13352,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12596,7 +13362,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12606,7 +13372,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12618,26 +13384,39 @@ } } }, - "/api/v1/org": { + "/api/v1/monitors/{monitorId}/policy": { "get": { "tags": [ - "Organizations" + "Incident Policies" + ], + "summary": "Get incident policy for a monitor", + "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", + "operationId": "get_5", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Get the current organization", - "operationId": "get_4", "responses": { "200": { - "description": "OK", + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12647,7 +13426,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12657,7 +13436,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12667,17 +13446,17 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor or policy not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12687,7 +13466,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12697,7 +13476,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12707,7 +13486,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12720,15 +13499,28 @@ }, "put": { "tags": [ - "Organizations" + "Incident Policies" + ], + "summary": "Update incident policy for a monitor", + "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", + "operationId": "update_8", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Update the current organization", - "operationId": "update_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" } } }, @@ -12736,27 +13528,27 @@ }, "responses": { "200": { - "description": "OK", + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Validation error in JSONB shape", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12766,7 +13558,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12776,17 +13568,17 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor or policy not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12796,7 +13588,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -12806,7 +13598,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -12816,7 +13608,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -12828,135 +13620,39 @@ } } }, - "/api/v1/resource-groups": { + "/api/v1/notification-dispatches": { "get": { "tags": [ - "Resource Groups" + "Notification Dispatches" ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + "summary": "List all dispatches for an incident", + "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", + "operationId": "listByIncident", + "parameters": [ + { + "name": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - } - }, - "post": { - "tags": [ - "Resource Groups" ], - "summary": "Create a new resource group", - "operationId": "create_7", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -12966,7 +13662,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12976,7 +13672,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12986,7 +13682,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12996,7 +13692,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13006,7 +13702,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13016,7 +13712,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13026,7 +13722,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13038,14 +13734,14 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/notification-dispatches/{id}": { "get": { "tags": [ - "Resource Groups" + "Notification Dispatches" ], - "summary": "Get a resource group by id with member statuses and inherited settings", - "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", - "operationId": "get_3", + "summary": "Get a single dispatch with full escalation and delivery history", + "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", + "operationId": "getById_3", "parameters": [ { "name": "id", @@ -13055,15 +13751,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "includeMetrics", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { @@ -13072,13 +13759,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13088,7 +13775,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13098,7 +13785,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13108,7 +13795,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13118,7 +13805,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13128,7 +13815,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13138,7 +13825,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13148,7 +13835,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13158,13 +13845,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Resource Groups" + "Notification Dispatches" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "summary": "Acknowledge a notification dispatch", + "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", + "operationId": "acknowledge", "parameters": [ { "name": "id", @@ -13176,29 +13866,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13208,7 +13888,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13218,7 +13898,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13228,7 +13908,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13238,7 +13918,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13248,7 +13928,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13258,7 +13938,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13268,7 +13948,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13278,13 +13958,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Resource Groups" + "Notification Dispatches" ], - "summary": "Delete a resource group (cascades to member rows)", - "operationId": "delete_5", + "summary": "Unacknowledge a notification dispatch", + "description": "Reverses a mistaken acknowledgment without reopening the incident. Allowed only from ACKNOWLEDGED. Clears ack fields, stays on the current escalation step, restores nextEscalationAt, and resumes escalation (ESCALATING if more steps remain, else DELIVERED). MEMBER+.", + "operationId": "unacknowledge", "parameters": [ { "name": "id", @@ -13297,11 +13980,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13311,7 +14001,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13321,7 +14011,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13331,7 +14021,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13341,7 +14031,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13351,7 +14041,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13361,7 +14051,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13371,7 +14061,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13383,38 +14073,26 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/notification-policies": { "get": { "tags": [ - "Resource Groups" - ], - "summary": "Get the detailed health breakdown for a resource group", - "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", - "operationId": "getHealth", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notification Policies" ], + "summary": "List all notification policies for the authenticated org", + "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13424,7 +14102,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13434,7 +14112,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13444,7 +14122,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13454,7 +14132,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13464,7 +14142,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13474,7 +14152,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13484,7 +14162,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13494,40 +14172,36 @@ } } } - } - }, - "/api/v1/resource-groups/{id}/matched-policies": { - "get": { + }, + "post": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "List notification policies that match this resource group", - "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", - "operationId": "listMatchedPolicies", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_8", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13537,7 +14211,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13547,7 +14221,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13557,7 +14231,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13567,7 +14241,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13577,7 +14251,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13587,7 +14261,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13597,7 +14271,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13609,13 +14283,13 @@ } } }, - "/api/v1/resource-groups/{id}/members": { - "post": { + "/api/v1/notification-policies/{id}": { + "get": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Get a notification policy by ID", + "operationId": "getById_1", "parameters": [ { "name": "id", @@ -13627,29 +14301,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13659,7 +14323,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13669,7 +14333,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13679,7 +14343,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13689,7 +14353,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13699,7 +14363,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13709,7 +14373,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13719,7 +14383,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13729,15 +14393,13 @@ } } } - } - }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + }, + "put": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { "name": "id", @@ -13747,23 +14409,31 @@ "type": "string", "format": "uuid" } - }, - { - "name": "memberId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13773,7 +14443,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13783,7 +14453,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13793,7 +14463,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13803,7 +14473,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13813,7 +14483,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13823,7 +14493,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13833,7 +14503,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13843,28 +14513,30 @@ } } } - } - }, - "/api/v1/secrets": { - "get": { + }, + "delete": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "List secrets", - "operationId": "list_5", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" - } - } + "summary": "Delete a notification policy", + "operationId": "delete_6", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13874,7 +14546,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13884,7 +14556,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13894,7 +14566,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13904,7 +14576,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -13914,7 +14586,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -13924,7 +14596,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -13934,7 +14606,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -13944,36 +14616,79 @@ } } } - }, - "post": { + } + }, + "/api/v1/notification-policies/{id}/dispatches": { + "get": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } + "summary": "List dispatches (firing history) for a notification policy", + "description": "Optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50. Response is CursorPage (hasMore + nextCursor), the same wrapper used by other append-only history endpoints.", + "operationId": "listDispatches", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "since", + "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now\u221230d when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "until", + "in": "query", + "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous nextCursor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size 1\u2013100 when windowing/paginating (default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -13983,7 +14698,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13993,7 +14708,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14003,7 +14718,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14013,7 +14728,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14023,7 +14738,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14033,7 +14748,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14043,7 +14758,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14055,20 +14770,21 @@ } } }, - "/api/v1/secrets/{key}": { - "put": { + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Update secret", - "operationId": "update_4", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -14076,11 +14792,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + "$ref": "#/components/schemas/TestNotificationPolicyRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -14088,13 +14803,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14104,7 +14819,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14114,7 +14829,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14124,7 +14839,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14134,7 +14849,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14144,7 +14859,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14154,7 +14869,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14164,7 +14879,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14174,29 +14889,59 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notifications": { + "get": { "tags": [ - "Secrets" + "Notifications" ], - "summary": "Delete secret", - "operationId": "delete_4", + "summary": "List notifications for the current user", + "operationId": "list_17", "parameters": [ { - "name": "key", - "in": "path", - "required": true, + "name": "unreadOnly", + "in": "query", + "required": false, "schema": { - "type": "string" + "type": "boolean", + "default": false + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14206,7 +14951,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14216,7 +14961,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14226,7 +14971,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14236,7 +14981,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14246,7 +14991,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14256,7 +15001,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14266,7 +15011,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14278,26 +15023,19 @@ } } }, - "/api/v1/service-subscriptions": { - "get": { + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Service Subscriptions" + "Notifications" ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_16", + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14307,7 +15045,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14317,7 +15055,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14327,7 +15065,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14337,7 +15075,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14347,7 +15085,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14357,7 +15095,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14367,7 +15105,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14379,37 +15117,26 @@ } } }, - "/api/v1/service-subscriptions/{id}": { + "/api/v1/notifications/unread-count": { "get": { "tags": [ - "Service Subscriptions" - ], - "summary": "Get a subscription by its ID", - "operationId": "get_11", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14419,7 +15146,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14429,7 +15156,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14439,7 +15166,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14449,7 +15176,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14459,7 +15186,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14469,7 +15196,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14479,7 +15206,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14489,22 +15216,23 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Service Subscriptions" + "Notifications" ], - "summary": "Remove a subscription by its ID", - "description": "Removes a specific subscription (whole-service or component-level). No-op if not found.", - "operationId": "unsubscribe_1", + "summary": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int64" } } ], @@ -14513,7 +15241,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14523,7 +15251,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14533,7 +15261,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14543,7 +15271,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14553,7 +15281,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14563,7 +15291,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14573,7 +15301,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14583,7 +15311,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14595,48 +15323,26 @@ } } }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { + "/api/v1/org": { + "get": { "tags": [ - "Service Subscriptions" - ], - "summary": "Update alert sensitivity for a subscription", - "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", - "operationId": "updateAlertSensitivity", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Organizations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" - } - } - }, - "required": true - }, + "summary": "Get the current organization", + "operationId": "get_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14646,7 +15352,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14656,7 +15362,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14666,7 +15372,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14676,7 +15382,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14686,7 +15392,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14696,7 +15402,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14706,7 +15412,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14716,48 +15422,36 @@ } } } - } - }, - "/api/v1/service-subscriptions/{slug}": { - "post": { + }, + "put": { "tags": [ - "Service Subscriptions" - ], - "summary": "Subscribe to a service or a component of a service", - "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", - "operationId": "subscribe_1", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Organizations" ], + "summary": "Update the current organization", + "operationId": "update_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" + "$ref": "#/components/schemas/UpdateOrgDetailsRequest" } } - } + }, + "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14767,7 +15461,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14777,7 +15471,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14787,7 +15481,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14797,7 +15491,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14807,7 +15501,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14817,7 +15511,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -14827,7 +15521,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -14839,102 +15533,26 @@ } } }, - "/api/v1/services": { + "/api/v1/resource-groups": { "get": { "tags": [ - "Status Data" - ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", - "parameters": [ - { - "name": "category", - "in": "query", - "description": "Filter by category (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by current overall_status (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "published", - "in": "query", - "description": "Filter by published status for pSEO pages", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "slaPublished", - "in": "query", - "description": "Filter by SLA page publication status", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on service name or slug", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 20)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 - } - } + "Resource Groups" ], + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_6", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -14944,7 +15562,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14954,7 +15572,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -14964,7 +15582,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -14974,7 +15592,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -14984,7 +15602,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -14994,7 +15612,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15004,7 +15622,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15014,59 +15632,36 @@ } } } - } - }, - "/api/v1/services/{slugOrId}": { - "get": { + }, + "post": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", - "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", - "operationId": "getService", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "summary", - "in": "query", - "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", - "required": false, - "schema": { - "type": "boolean", - "default": false + "summary": "Create a new resource group", + "operationId": "create_7", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateResourceGroupRequest" + } } }, - { - "name": "publishedOnly", - "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15076,7 +15671,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15086,7 +15681,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15096,7 +15691,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15106,7 +15701,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15116,7 +15711,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15126,7 +15721,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15136,7 +15731,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15148,60 +15743,31 @@ } } }, - "/api/v1/services/{slugOrId}/components": { + "/api/v1/resource-groups/{id}": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", - "operationId": "getComponents", + "summary": "Get a resource group by id with member statuses and inherited settings", + "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", + "operationId": "get_3", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "groupId", - "in": "query", - "description": "Restrict result to direct children of this group component id", - "required": false, "schema": { "type": "string", "format": "uuid" } }, { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on component name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "Zero-based page index", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "size", + "name": "includeMetrics", "in": "query", - "description": "Page size (default 25, max 100)", "required": false, "schema": { - "type": "integer", - "format": "int32" + "type": "boolean", + "default": false } } ], @@ -15211,13 +15777,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15227,7 +15793,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15237,7 +15803,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15247,7 +15813,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15257,7 +15823,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15267,7 +15833,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15277,7 +15843,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15287,7 +15853,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15297,83 +15863,47 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { - "get": { + }, + "put": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get daily uptime data for a component", - "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", - "operationId": "getComponentUptime", + "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "componentId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15383,7 +15913,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15393,7 +15923,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15403,7 +15933,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15413,7 +15943,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15423,7 +15953,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15433,7 +15963,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15443,7 +15973,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15453,74 +15983,30 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components/uptime": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Batch daily uptime data for all leaf components", - "description": "Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. Supports either a preset ``period`` or an explicit ``from``/``to`` window (ISO yyyy-MM-dd, max 730 days). The explicit window wins when both are supplied — this is what powers the sliding 90-day navigator on the public uptime history page.", - "operationId": "getBatchComponentUptime", + "summary": "Delete a resource group (cascades to member rows)", + "operationId": "delete_5", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, "schema": { "type": "string", - "format": "date" + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15530,7 +16016,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15540,7 +16026,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15550,7 +16036,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15560,7 +16046,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15570,7 +16056,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15580,7 +16066,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15590,7 +16076,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15602,31 +16088,22 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { + "/api/v1/resource-groups/{id}/health": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", - "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", - "operationId": "getServiceDayDetail", + "summary": "Get the detailed health breakdown for a resource group", + "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", + "operationId": "getHealth", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "date", + "name": "id", "in": "path", - "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } } ], @@ -15636,13 +16113,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15652,7 +16129,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15662,7 +16139,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15672,7 +16149,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15682,7 +16159,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15692,7 +16169,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15702,7 +16179,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15712,7 +16189,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15724,67 +16201,160 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "summary": "List notification policies that match this resource group", + "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", + "operationId": "listMatchedPolicies", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + } + } } }, - { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/resource-groups/{id}/members": { + "post": { + "tags": [ + "Resource Groups" + ], + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", + "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15794,7 +16364,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15804,7 +16374,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15814,7 +16384,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15824,7 +16394,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15834,7 +16404,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15844,7 +16414,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15854,7 +16424,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15866,24 +16436,25 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "incidentId", + "name": "memberId", "in": "path", "required": true, "schema": { @@ -15893,18 +16464,11 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -15914,7 +16478,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15924,7 +16488,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -15934,7 +16498,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15944,7 +16508,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15954,7 +16518,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -15964,7 +16528,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -15974,7 +16538,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -15986,21 +16550,21 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/revisions/{id}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Lightweight live-status snapshot for polling", - "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", - "operationId": "getServiceLiveStatus", + "summary": "Get revision package", + "operationId": "get_12", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -16010,13 +16574,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16026,7 +16590,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16036,7 +16600,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16046,7 +16610,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16056,7 +16620,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16066,7 +16630,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16076,7 +16640,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16086,7 +16650,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16098,48 +16662,31 @@ } } }, - "/api/v1/services/{slugOrId}/maintenances": { + "/api/v1/revisions/{id}/bundle": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "Redirect to signed package download", + "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", + "operationId": "bundle", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" - } - } - } + "description": "OK" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16149,7 +16696,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16159,7 +16706,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16169,7 +16716,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16179,7 +16726,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16189,7 +16736,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16199,7 +16746,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16209,7 +16756,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16221,40 +16768,30 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/revisions/{id}/diff/{other}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, + "name": "other", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "string", + "format": "uuid" } } ], @@ -16264,13 +16801,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16280,7 +16817,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16290,7 +16827,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16300,7 +16837,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16310,7 +16847,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16320,7 +16857,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16330,7 +16867,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16340,7 +16877,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16352,34 +16889,21 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { + "/api/v1/runs": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "summary": "List code runs", + "description": "Org index. Default from=now-30m. Page size 50.", + "operationId": "listRuns", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "window", + "name": "params", "in": "query", - "description": "Time window", - "required": false, + "required": true, "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "$ref": "#/components/schemas/RunListParams" } } ], @@ -16389,13 +16913,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/TableValueResultRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16405,7 +16929,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16415,7 +16939,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16425,7 +16949,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16435,7 +16959,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16445,7 +16969,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16455,7 +16979,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16465,7 +16989,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16477,84 +17001,21 @@ } } }, - "/api/v1/services/{slugOrId}/status-events": { + "/api/v1/runs/{id}": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List curated vendor status events for a service", - "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", - "operationId": "listStatusEvents", + "summary": "Get a run", + "operationId": "getRun", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "types", - "in": "query", - "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit lower bound (ISO 8601); overrides period", - "required": false, "schema": { "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit upper bound (ISO 8601); default now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "format": "uuid" } } ], @@ -16564,13 +17025,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageStatusEventDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16580,7 +17041,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16590,7 +17051,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16600,7 +17061,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16610,7 +17071,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16620,7 +17081,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16630,7 +17091,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16640,7 +17101,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16652,53 +17113,22 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] - } - }, - { - "name": "granularity", - "in": "query", - "description": "Bucket granularity", - "required": false, - "schema": { - "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "format": "uuid" } } ], @@ -16708,13 +17138,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16724,7 +17154,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16734,7 +17164,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16744,7 +17174,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16754,7 +17184,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16764,7 +17194,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16774,7 +17204,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16784,7 +17214,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16793,61 +17223,25 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] + } } }, - "/api/v1/services/incidents": { - "get": { + "/api/v1/runs/{id}/cancel": { + "post": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", "parameters": [ { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] - } - }, - { - "name": "category", - "in": "query", - "description": "Filter by service category", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -16857,13 +17251,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16873,7 +17267,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16883,7 +17277,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -16893,7 +17287,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -16903,7 +17297,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -16913,7 +17307,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -16923,7 +17317,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -16933,7 +17327,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -16945,23 +17339,31 @@ } } }, - "/api/v1/services/summary": { + "/api/v1/runs/{id}/captures/{artifactId}/compare": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Global status summary across all services", - "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", - "operationId": "getGlobalStatusSummary", + "summary": "Compare a screenshot to the last pass of this step", + "description": "Captures viewer baseline: last pass of this step in this region, any revision.", + "operationId": "compareRunCapture", "parameters": [ { - "name": "publishedOnly", - "in": "query", - "description": "Aggregate only published services (curated public pSEO set); default false", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" + } + }, + { + "name": "artifactId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -16971,13 +17373,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -16987,7 +17389,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16997,7 +17399,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17007,7 +17409,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17017,7 +17419,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17027,7 +17429,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17037,7 +17439,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17047,7 +17449,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17059,26 +17461,45 @@ } } }, - "/api/v1/status-pages": { + "/api/v1/runs/{id}/cases": { "get": { "tags": [ - "Status Pages" + "Runs" + ], + "summary": "List run cases with nested steps", + "operationId": "listRunCases", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunCaseListParams" + } + } ], - "summary": "List status pages for the workspace", - "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17088,7 +17509,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17098,7 +17519,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17108,7 +17529,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17118,7 +17539,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17128,7 +17549,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17138,7 +17559,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17148,7 +17569,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17158,36 +17579,53 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/console": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Create a status page", - "operationId": "create_5", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - } + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunConsoleParams" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17197,7 +17635,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17207,7 +17645,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17217,7 +17655,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17227,7 +17665,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17237,7 +17675,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17247,7 +17685,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17257,7 +17695,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17269,13 +17707,14 @@ } } }, - "/api/v1/status-pages/{id}": { + "/api/v1/runs/{id}/diff": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get a status page", - "operationId": "get_2", + "summary": "Diff this run against a prior pass", + "description": "Default baseline is the last pass of the same revision in this region. Pass baselineRunId to pick another finished run of the same monitor.", + "operationId": "getRunDiff", "parameters": [ { "name": "id", @@ -17285,6 +17724,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "baselineRunId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -17293,13 +17741,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17309,7 +17757,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17319,7 +17767,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17329,7 +17777,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17339,7 +17787,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17349,7 +17797,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17359,7 +17807,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17369,7 +17817,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17379,13 +17827,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}/events": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "parameters": [ { "name": "id", @@ -17395,31 +17845,37 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" - } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunEventParams" } }, - "required": true - }, + { + "name": "Last-Event-ID", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { - "description": "OK", + "description": "Server-sent persist control events", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/RunEventDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17429,7 +17885,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17439,7 +17895,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17449,7 +17905,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17459,7 +17915,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17469,7 +17925,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17479,7 +17935,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17489,7 +17945,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17499,13 +17955,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/export": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "summary": "Export run snapshot and available artifacts", + "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", + "operationId": "exportRun", "parameters": [ { "name": "id", @@ -17518,11 +17977,14 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "Zip of snapshot.json and available artifacts", + "content": { + "application/zip": {} + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17532,7 +17994,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17542,7 +18004,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17552,7 +18014,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17562,7 +18024,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17572,7 +18034,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17582,7 +18044,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17592,7 +18054,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17604,13 +18066,14 @@ } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/runs/{id}/network": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List all components", - "operationId": "listComponents", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "parameters": [ { "name": "id", @@ -17620,6 +18083,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunNetworkParams" + } } ], "responses": { @@ -17628,13 +18099,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/RunNetworkDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17644,7 +18115,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17654,7 +18125,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17664,7 +18135,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17674,7 +18145,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17684,7 +18155,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17694,7 +18165,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17704,7 +18175,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17714,13 +18185,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/network/{rowId}": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { "name": "id", @@ -17730,31 +18204,29 @@ "type": "string", "format": "uuid" } + }, + { + "name": "rowId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17764,7 +18236,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17774,7 +18246,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17784,7 +18256,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17794,7 +18266,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17804,7 +18276,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17814,7 +18286,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17824,7 +18296,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17836,13 +18308,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + "/api/v1/runs/{id}/runner-log": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a component", - "operationId": "updateComponent", + "summary": "Snapshot in-flight runner log", + "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail \u2014 poll this endpoint or use GET /runner-log/live (SSE). After finish, the cold file is the runner_log artifact (GET /artifacts/{id}/content). Empty while no lines have been pushed.", + "operationId": "getRunRunnerLog", "parameters": [ { "name": "id", @@ -17852,40 +18325,21 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "text/plain": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "type": "string" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -17895,7 +18349,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17905,7 +18359,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -17915,7 +18369,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -17925,7 +18379,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -17935,7 +18389,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -17945,7 +18399,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -17955,7 +18409,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -17965,13 +18419,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/runner-log/live": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "summary": "Live tail runner log", + "description": "SSE live tail of in-flight Loki lines. Same ACL as the snapshot (runs.get). Each event data is JSON {ts,line} (ts is Loki nanoseconds, line is one log line). Loki stays internal. Closes on client disconnect, idle/run-finished, or the same SSE timeout as GET /events. Cold file after finish is the runner_log artifact.", + "operationId": "streamRunRunnerLog", "parameters": [ { "name": "id", @@ -17981,23 +18438,21 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "Server-sent runner-log lines", + "content": { + "text/event-stream": { + "schema": { + "$ref": "#/components/schemas/RunnerLogLiveEvent" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18007,7 +18462,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18017,7 +18472,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18027,7 +18482,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18037,7 +18492,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18047,7 +18502,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18057,7 +18512,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18067,7 +18522,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18079,57 +18534,26 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + "/api/v1/secrets": { "get": { "tags": [ - "Status Pages" - ], - "summary": "Get measured (check-based) component uptime history", - "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", - "operationId": "componentMeasuredUptime", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 90 - } - } + "Secrets" ], + "summary": "List organization secrets", + "operationId": "list_5", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18139,7 +18563,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18149,7 +18573,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18159,7 +18583,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18169,7 +18593,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18179,7 +18603,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18189,7 +18613,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18199,7 +18623,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18209,59 +18633,36 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}/override": { - "put": { + }, + "post": { "tags": [ - "Status Pages" - ], - "summary": "Set a timed human status override on a component", - "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", - "operationId": "setComponentOverride", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Secrets" ], + "summary": "Create secret", + "operationId": "create_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" + "$ref": "#/components/schemas/CreateSecretRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18271,7 +18672,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18281,7 +18682,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18291,7 +18692,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18301,7 +18702,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18311,7 +18712,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18321,7 +18722,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18331,7 +18732,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18341,46 +18742,48 @@ } } } - }, - "delete": { + } + }, + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Clear a timed human status override on a component", - "operationId": "clearComponentOverride", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18390,7 +18793,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18400,7 +18803,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18410,7 +18813,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18420,7 +18823,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18430,7 +18833,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18440,7 +18843,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18450,7 +18853,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18460,59 +18863,29 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { - "get": { + }, + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Get component uptime history from published incident windows", - "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", - "operationId": "componentUptime_1", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 90 + "type": "string" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18522,7 +18895,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18532,7 +18905,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18542,7 +18915,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18552,7 +18925,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18562,7 +18935,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18572,7 +18945,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18582,7 +18955,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18594,40 +18967,36 @@ } } }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + "/api/v1/secrets/{key}/audit": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", + "summary": "Last update metadata for a secret", + "operationId": "audit", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18637,7 +19006,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18647,7 +19016,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18657,7 +19026,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18667,7 +19036,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18677,7 +19046,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18687,7 +19056,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18697,7 +19066,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18709,16 +19078,24 @@ } } }, - "/api/v1/status-pages/{id}/domains": { - "get": { + "/api/v1/secrets/{key}/environments/{environmentId}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Write a secret value for one environment", + "operationId": "writeEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -18727,19 +19104,22 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18749,7 +19129,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18759,7 +19139,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18769,7 +19149,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18779,7 +19159,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18789,7 +19169,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18799,7 +19179,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18809,7 +19189,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18819,47 +19199,38 @@ } } } - }, - "post": { + } + }, + "/api/v1/secrets/{key}/usage": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "Secret usage across monitors", + "operationId": "usage", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18869,7 +19240,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18879,7 +19250,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18889,7 +19260,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18899,7 +19270,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18909,7 +19280,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -18919,7 +19290,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -18929,7 +19300,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -18941,39 +19312,26 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/service-subscriptions": { + "get": { "tags": [ - "Status Pages" - ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Service Subscriptions" ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_16", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -18983,7 +19341,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18993,7 +19351,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19003,7 +19361,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19013,7 +19371,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19023,7 +19381,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19033,7 +19391,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19043,7 +19401,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19055,13 +19413,13 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { - "post": { + "/api/v1/service-subscriptions/{id}": { + "get": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", + "summary": "Get a subscription by its ID", + "operationId": "get_11", "parameters": [ { "name": "id", @@ -19071,15 +19429,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -19088,13 +19437,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19104,7 +19453,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19114,7 +19463,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19124,7 +19473,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19134,7 +19483,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19144,7 +19493,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19154,7 +19503,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19164,7 +19513,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19174,15 +19523,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { + }, + "delete": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", + "summary": "Remove a subscription by its ID", + "description": "Removes a specific subscription (whole-service or component-level). No-op if not found.", + "operationId": "unsubscribe_1", "parameters": [ { "name": "id", @@ -19192,30 +19540,14 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19225,7 +19557,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19235,7 +19567,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19245,7 +19577,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19255,7 +19587,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19265,7 +19597,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19275,7 +19607,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19285,7 +19617,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19297,13 +19629,14 @@ } } }, - "/api/v1/status-pages/{id}/groups": { - "get": { + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "List component groups with nested components", - "operationId": "listGroups", + "summary": "Update alert sensitivity for a subscription", + "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently \u2014 visible on the dashboard but no alert channels fire; default for new subscriptions).", + "operationId": "updateAlertSensitivity", "parameters": [ { "name": "id", @@ -19315,19 +19648,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19337,7 +19680,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19347,7 +19690,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19357,7 +19700,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19367,7 +19710,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19377,7 +19720,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19387,7 +19730,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19397,7 +19740,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19407,21 +19750,23 @@ } } } - }, + } + }, + "/api/v1/service-subscriptions/{slug}": { "post": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "Subscribe to a service or a component of a service", + "description": "Idempotent \u2014 returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking \u2014 the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", + "operationId": "subscribe_1", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -19429,11 +19774,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + "$ref": "#/components/schemas/ServiceSubscribeRequest" } } - }, - "required": true + } }, "responses": { "201": { @@ -19441,13 +19785,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19457,7 +19801,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19467,7 +19811,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19477,7 +19821,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19487,7 +19831,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19497,7 +19841,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19507,7 +19851,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19517,7 +19861,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19529,56 +19873,102 @@ } } }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + "/api/v1/services": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a component group", - "operationId": "updateGroup", + "summary": "List all enabled services (cursor-paginated)", + "operationId": "listServices", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "category", + "in": "query", + "description": "Filter by category (exact match)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "groupId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter by current overall_status (exact match)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" - } + }, + { + "name": "published", + "in": "query", + "description": "Filter by published status for pSEO pages", + "required": false, + "schema": { + "type": "boolean" } }, - "required": true - }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on service name or slug", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1\u2013100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19588,7 +19978,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19598,7 +19988,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19608,7 +19998,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19618,7 +20008,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19628,7 +20018,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19638,7 +20028,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19648,7 +20038,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19658,39 +20048,71 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "groupId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "category", + "in": "query", + "description": "Filter by service category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19700,7 +20122,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19710,7 +20132,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19720,7 +20142,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19730,7 +20152,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19740,7 +20162,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19750,7 +20172,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19760,7 +20182,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19772,46 +20194,23 @@ } } }, - "/api/v1/status-pages/{id}/incidents": { + "/api/v1/services/summary": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List incidents for this status page (paginated)", - "operationId": "listIncidents", + "summary": "Global status summary across all services", + "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", + "operationId": "getGlobalStatusSummary", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "status", + "name": "publishedOnly", "in": "query", + "description": "Aggregate only published services (curated public pSEO set); default false", "required": false, "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "boolean", + "default": false } } ], @@ -19821,13 +20220,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19837,7 +20236,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19847,7 +20246,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19857,7 +20256,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19867,7 +20266,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19877,7 +20276,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -19887,7 +20286,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19897,7 +20296,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -19907,47 +20306,59 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", + "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", + "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", + "operationId": "getService", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" - } + }, + { + "name": "summary", + "in": "query", + "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", + "required": false, + "schema": { + "type": "boolean", + "default": false } }, - "required": true - }, + { + "name": "publishedOnly", + "in": "query", + "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -19957,7 +20368,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19967,7 +20378,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19977,7 +20388,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19987,7 +20398,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19997,7 +20408,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20007,7 +20418,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20017,7 +20428,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20029,31 +20440,61 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "/api/v1/services/{slugOrId}/components": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "summary": "List active components for a service with current status and inline uptime", + "description": "When ``groupId`` is supplied, only direct children of that group are returned \u2014 used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", + "operationId": "getComponents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", - "in": "path", - "required": true, + "name": "groupId", + "in": "query", + "description": "Restrict result to direct children of this group component id", + "required": false, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "in": "query", + "description": "Page size (default 25, max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { @@ -20062,13 +20503,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20078,7 +20519,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20088,7 +20529,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20098,7 +20539,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20108,7 +20549,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20118,7 +20559,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20128,7 +20569,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20138,7 +20579,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20148,56 +20589,74 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "summary": "Batch daily uptime data for all leaf components", + "description": "Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. Supports either a preset ``period`` or an explicit ``from``/``to`` window (ISO yyyy-MM-dd, max 730 days). The explicit window wins when both are supplied \u2014 this is what powers the sliding 90-day navigator on the public uptime history page.", + "operationId": "getBatchComponentUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] } }, { - "name": "incidentId", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20207,7 +20666,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20217,7 +20676,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20227,7 +20686,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20237,7 +20696,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20247,7 +20706,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20257,7 +20716,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20267,7 +20726,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20277,39 +20736,83 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Get daily uptime data for a component", + "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", + "operationId": "getComponentUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] + } + }, + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20319,7 +20822,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20329,7 +20832,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20339,7 +20842,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20349,7 +20852,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20359,7 +20862,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20369,7 +20872,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20379,7 +20882,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20391,39 +20894,47 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + "/api/v1/services/{slugOrId}/days/{date}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", - "operationId": "dismissIncident", + "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", + "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip \u2014 components, sums, and overlapping incidents (with affected component names) are returned in one response.", + "operationId": "getServiceDayDetail", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "date", "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "uuid" + "format": "date" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20433,7 +20944,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20443,7 +20954,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20453,7 +20964,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20463,7 +20974,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20473,7 +20984,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20483,7 +20994,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20493,7 +21004,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20505,55 +21016,67 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/services/{slugOrId}/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "incidentId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20563,7 +21086,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20573,7 +21096,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20583,7 +21106,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20593,7 +21116,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20603,7 +21126,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20613,7 +21136,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20623,7 +21146,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20635,21 +21158,20 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { @@ -20662,29 +21184,19 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20694,7 +21206,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20704,7 +21216,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20714,7 +21226,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20724,7 +21236,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20734,7 +21246,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20744,7 +21256,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20754,7 +21266,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20766,65 +21278,37 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { - "patch": { + "/api/v1/services/{slugOrId}/live-status": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Edit an existing incident timeline update body", - "operationId": "patchIncidentUpdate", + "summary": "Lightweight live-status snapshot for polling", + "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", + "operationId": "getServiceLiveStatus", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "updateId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20834,7 +21318,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20844,7 +21328,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20854,7 +21338,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20864,7 +21348,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20874,7 +21358,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20884,7 +21368,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -20894,7 +21378,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -20906,40 +21390,48 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/services/{slugOrId}/maintenances": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -20949,7 +21441,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20959,7 +21451,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -20969,7 +21461,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -20979,7 +21471,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -20989,7 +21481,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -20999,7 +21491,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21009,7 +21501,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21021,46 +21513,40 @@ } } }, - "/api/v1/status-pages/{id}/maintenance": { + "/api/v1/services/{slugOrId}/poll-results": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List maintenance windows for this status page (paginated)", - "operationId": "listMaintenance", + "summary": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "status", + "name": "cursor", "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", "required": false, "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } + "type": "string" } }, { - "name": "pageable", + "name": "limit", "in": "query", - "required": true, + "description": "Page size (1\u2013100, default 50)", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -21070,13 +21556,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21086,7 +21572,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21096,7 +21582,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21106,7 +21592,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21116,7 +21602,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21126,7 +21612,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21136,7 +21622,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21146,7 +21632,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21156,47 +21642,52 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/poll-summary": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Schedule a maintenance window", - "operationId": "createMaintenance", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "window", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d" + ] } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21206,7 +21697,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21216,7 +21707,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21226,7 +21717,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21236,7 +21727,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21246,7 +21737,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21256,7 +21747,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21266,7 +21757,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21278,30 +21769,84 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "/api/v1/services/{slugOrId}/status-events": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a maintenance window with timeline", - "operationId": "getMaintenance", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "types", + "in": "query", + "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d" + ] } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Explicit lower bound (ISO 8601); overrides period", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit upper bound (ISO 8601); default now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1\u2013100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -21311,13 +21856,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21327,7 +21872,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21337,7 +21882,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21347,7 +21892,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21357,7 +21902,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21367,7 +21912,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21377,7 +21922,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21387,7 +21932,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21397,56 +21942,177 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a maintenance window", - "operationId": "updateMaintenance", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "granularity", + "in": "query", + "description": "Bucket granularity", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "hourly", + "daily", + "monthly" + ] } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + } } } }, - "required": true + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } }, + "security": [ + { + "BearerAuth": [] + } + ] + } + }, + "/api/v1/status-pages": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List status pages for the workspace", + "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21456,7 +22122,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21466,7 +22132,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21476,7 +22142,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21486,7 +22152,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21496,7 +22162,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21506,7 +22172,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21516,7 +22182,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21527,38 +22193,35 @@ } } }, - "delete": { + "post": { "tags": [ "Status Pages" ], - "summary": "Cancel a maintenance window", - "operationId": "deleteMaintenance", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a status page", + "operationId": "create_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageRequest" + } } }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21568,7 +22231,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21578,7 +22241,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21588,7 +22251,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21598,7 +22261,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21608,7 +22271,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21618,7 +22281,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21628,7 +22291,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21640,13 +22303,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { - "post": { + "/api/v1/status-pages/{id}": { + "get": { "tags": [ "Status Pages" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", @@ -21656,23 +22319,21 @@ "type": "string", "format": "uuid" } - }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21682,7 +22343,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21692,7 +22353,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21702,7 +22363,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21712,7 +22373,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21722,7 +22383,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21732,7 +22393,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21742,7 +22403,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21752,15 +22413,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { - "post": { + }, + "put": { "tags": [ "Status Pages" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { "name": "id", @@ -21770,25 +22429,17 @@ "type": "string", "format": "uuid" } - }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + "$ref": "#/components/schemas/UpdateStatusPageRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -21796,13 +22447,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21812,7 +22463,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21822,7 +22473,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21832,7 +22483,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21842,7 +22493,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21852,7 +22503,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21862,7 +22513,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -21872,7 +22523,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -21882,15 +22533,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Post a maintenance window timeline update", - "operationId": "postMaintenanceUpdate", + "summary": "Delete a status page", + "operationId": "delete_3", "parameters": [ { "name": "id", @@ -21900,40 +22549,14 @@ "type": "string", "format": "uuid" } - }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -21943,7 +22566,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21953,7 +22576,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -21963,7 +22586,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -21973,7 +22596,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -21983,7 +22606,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -21993,7 +22616,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22003,7 +22626,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22015,13 +22638,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + "/api/v1/status-pages/{id}/components": { + "get": { "tags": [ "Status Pages" ], - "summary": "Edit an existing maintenance timeline update body", - "operationId": "patchMaintenanceUpdate", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { "name": "id", @@ -22031,18 +22654,110 @@ "type": "string", "format": "uuid" } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + } + } + } }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Add a component to the status page", + "operationId": "createComponent", + "parameters": [ { - "name": "updateId", + "name": "id", "in": "path", "required": true, "schema": { @@ -22055,25 +22770,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22083,7 +22798,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22093,7 +22808,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22103,7 +22818,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22113,7 +22828,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22123,7 +22838,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22133,7 +22848,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22143,7 +22858,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22155,14 +22870,13 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { - "get": { + "/api/v1/status-pages/{id}/components/reorder": { + "put": { "tags": [ "Status Pages" ], - "summary": "List notification delivery receipts", - "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", - "operationId": "listNotificationDeliveries", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { "name": "id", @@ -22172,44 +22886,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "eventType", - "in": "query", - "required": false, - "schema": { - "type": "string", - "enum": [ - "SUBSCRIPTION_CONFIRMATION", - "INCIDENT_CREATED", - "INCIDENT_UPDATED", - "INCIDENT_RESOLVED" - ] - } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderComponentsRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22219,7 +22913,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22229,7 +22923,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22239,7 +22933,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22249,7 +22943,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22259,7 +22953,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22269,7 +22963,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22279,7 +22973,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22291,13 +22985,13 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { - "get": { + "/api/v1/status-pages/{id}/components/{componentId}": { + "put": { "tags": [ "Status Pages" ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { "name": "id", @@ -22309,7 +23003,7 @@ } }, { - "name": "deliveryId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -22318,19 +23012,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22340,7 +23044,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22350,7 +23054,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22360,7 +23064,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22370,7 +23074,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22380,7 +23084,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22390,7 +23094,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22400,7 +23104,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22410,16 +23114,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { - "post": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Retry a failed notification delivery", - "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", - "operationId": "retryNotificationDelivery", + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { "name": "id", @@ -22431,7 +23132,7 @@ } }, { - "name": "deliveryId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -22441,18 +23142,11 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22462,7 +23156,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22472,7 +23166,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22482,7 +23176,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22492,7 +23186,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22502,7 +23196,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22512,7 +23206,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22522,7 +23216,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22534,13 +23228,14 @@ } } }, - "/api/v1/status-pages/{id}/subscribers": { + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { "get": { "tags": [ "Status Pages" ], - "summary": "List subscribers including awaiting confirmation (paginated)", - "operationId": "listSubscribers", + "summary": "Get measured (check-based) component uptime history", + "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET \u2026/uptime incident-window semantics. days default 90, max 365.", + "operationId": "componentMeasuredUptime", "parameters": [ { "name": "id", @@ -22552,11 +23247,22 @@ } }, { - "name": "pageable", - "in": "query", + "name": "componentId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 } } ], @@ -22566,13 +23272,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22582,7 +23288,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22592,7 +23298,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22602,7 +23308,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22612,7 +23318,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22622,7 +23328,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22632,7 +23338,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22642,7 +23348,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22652,13 +23358,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ "Status Pages" ], - "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", - "operationId": "addSubscriber", + "summary": "Set a timed human status override on a component", + "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", + "operationId": "setComponentOverride", "parameters": [ { "name": "id", @@ -22668,31 +23377,40 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22702,7 +23420,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22712,7 +23430,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22722,7 +23440,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22732,7 +23450,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22742,7 +23460,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22752,7 +23470,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22762,7 +23480,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22772,15 +23490,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + }, "delete": { "tags": [ "Status Pages" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { "name": "id", @@ -22792,7 +23508,7 @@ } }, { - "name": "subscriberId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -22802,11 +23518,18 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -22816,7 +23539,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22826,7 +23549,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22836,7 +23559,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22846,7 +23569,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22856,7 +23579,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -22866,7 +23589,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -22876,7 +23599,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -22888,145 +23611,57 @@ } } }, - "/api/v1/tags": { + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "summary": "Get component uptime history from published incident windows", + "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET \u2026/measured-uptime (ASK-SP-2 / CHG-2).", + "operationId": "componentUptime_1", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + "type": "string", + "format": "uuid" } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 } } - } - }, - "post": { - "tags": [ - "Tags" ], - "summary": "Create a new tag", - "operationId": "create_4", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTagRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23036,7 +23671,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23046,7 +23681,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23056,7 +23691,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23066,7 +23701,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23076,7 +23711,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23086,7 +23721,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23096,7 +23731,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23108,13 +23743,13 @@ } } }, - "/api/v1/tags/{id}": { + "/api/v1/status-pages/{id}/domains": { "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Get a tag by ID", - "operationId": "getById", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { "name": "id", @@ -23132,13 +23767,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23148,7 +23783,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23158,7 +23793,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23168,7 +23803,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23178,7 +23813,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23188,7 +23823,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23198,7 +23833,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23208,7 +23843,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23219,12 +23854,12 @@ } } }, - "put": { + "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -23240,25 +23875,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" + "$ref": "#/components/schemas/AddCustomDomainRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23268,7 +23903,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23278,7 +23913,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23288,7 +23923,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23298,7 +23933,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23308,7 +23943,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23318,7 +23953,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23328,7 +23963,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23338,13 +23973,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}": { "delete": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { "name": "id", @@ -23354,6 +23991,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -23361,7 +24007,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23371,7 +24017,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23381,7 +24027,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23391,7 +24037,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23401,7 +24047,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23411,7 +24057,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23421,7 +24067,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23431,7 +24077,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23443,27 +24089,46 @@ } } }, - "/api/v1/vaults/rotate": { + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { "post": { "tags": [ - "Vault" + "Status Pages" + ], + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Rotate DEK", - "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", - "operationId": "rotateDek", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23473,7 +24138,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23483,7 +24148,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23493,7 +24158,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23503,7 +24168,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23513,7 +24178,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23523,7 +24188,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23533,7 +24198,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23545,20 +24210,30 @@ } } }, - "/api/v1/webhooks": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -23568,13 +24243,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23584,7 +24259,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23594,7 +24269,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23604,7 +24279,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23614,7 +24289,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23624,7 +24299,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23634,7 +24309,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23644,7 +24319,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23654,36 +24329,39 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/groups": { + "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" - } + "summary": "List component groups with nested components", + "operationId": "listGroups", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23693,7 +24371,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23703,7 +24381,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23713,7 +24391,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23723,7 +24401,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23733,7 +24411,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23743,7 +24421,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23753,7 +24431,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23763,15 +24441,13 @@ } } } - } - }, - "/api/v1/webhooks/{id}": { - "get": { + }, + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { "name": "id", @@ -23783,19 +24459,29 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23805,7 +24491,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23815,7 +24501,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23825,7 +24511,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23835,7 +24521,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23845,7 +24531,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23855,7 +24541,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23865,7 +24551,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23875,13 +24561,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/groups/{groupId}": { "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { "name": "id", @@ -23891,13 +24579,22 @@ "type": "string", "format": "uuid" } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" } } }, @@ -23909,13 +24606,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -23925,7 +24622,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23935,7 +24632,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -23945,7 +24642,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23955,7 +24652,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -23965,7 +24662,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -23975,7 +24672,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -23985,7 +24682,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -23998,10 +24695,10 @@ }, "delete": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", "parameters": [ { "name": "id", @@ -24011,6 +24708,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -24018,7 +24724,7 @@ "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24028,7 +24734,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24038,7 +24744,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24048,7 +24754,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24058,7 +24764,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24068,7 +24774,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24078,7 +24784,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24088,7 +24794,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24100,13 +24806,13 @@ } } }, - "/api/v1/webhooks/{id}/deliveries": { + "/api/v1/status-pages/{id}/incidents": { "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", "parameters": [ { "name": "id", @@ -24118,13 +24824,28 @@ } }, { - "name": "limit", + "name": "status", "in": "query", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -24134,13 +24855,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24150,7 +24871,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24160,7 +24881,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24170,7 +24891,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24180,7 +24901,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24190,7 +24911,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24200,7 +24921,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24210,7 +24931,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24220,15 +24941,13 @@ } } } - } - }, - "/api/v1/webhooks/{id}/test": { + }, "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Send a test delivery to a webhook endpoint", - "operationId": "test", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { "name": "id", @@ -24244,24 +24963,146 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" } } - } + }, + "required": true }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get incident details with timeline", + "operationId": "getIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24271,7 +25112,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24281,7 +25122,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24291,7 +25132,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24301,7 +25142,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24311,7 +25152,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24321,7 +25162,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24331,7 +25172,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24341,29 +25182,56 @@ } } } - } - }, - "/api/v1/webhooks/events": { - "get": { + }, + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List all available webhook event types", - "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", - "operationId": "listEvents", + "summary": "Update an incident", + "operationId": "updateIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WebhookEventCatalogResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24373,7 +25241,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24383,7 +25251,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24393,7 +25261,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24403,7 +25271,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24413,7 +25281,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24423,7 +25291,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24433,7 +25301,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24443,28 +25311,39 @@ } } } - } - }, - "/api/v1/webhooks/signing-secret": { - "get": { + }, + "delete": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" - } - } + "summary": "Delete an incident", + "operationId": "deleteIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24474,7 +25353,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24484,7 +25363,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24494,7 +25373,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24504,7 +25383,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24514,7 +25393,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24524,7 +25403,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24534,7 +25413,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24546,26 +25425,39 @@ } } }, - "/api/v1/webhooks/signing-secret/rotate": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseString" - } - } + "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", + "operationId": "dismissIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24575,7 +25467,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24585,7 +25477,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24595,7 +25487,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24605,7 +25497,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24615,7 +25507,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24625,7 +25517,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24635,7 +25527,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24647,36 +25539,55 @@ } } }, - "/api/v1/workspaces": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "List workspaces", - "operationId": "list_1", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24686,7 +25597,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24696,7 +25607,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24706,7 +25617,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24716,7 +25627,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24726,7 +25637,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24736,7 +25647,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24746,7 +25657,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24756,18 +25667,40 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { "post": { "tags": [ - "Workspaces" + "Status Pages" + ], + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create workspace", - "operationId": "create_2", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWorkspaceRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } }, @@ -24779,13 +25712,13 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24795,7 +25728,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24805,7 +25738,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24815,7 +25748,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24825,7 +25758,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24835,7 +25768,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24845,7 +25778,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24855,7 +25788,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24867,37 +25800,65 @@ } } }, - "/api/v1/workspaces/{workspaceId}": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Get workspace by ID", - "operationId": "get", + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -24907,7 +25868,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24917,7 +25878,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -24927,7 +25888,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -24937,7 +25898,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -24947,7 +25908,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -24957,7 +25918,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -24967,7 +25928,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -24977,21 +25938,23 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/layout/reorder": { "put": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Update workspace", - "operationId": "update", + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], @@ -24999,25 +25962,18 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRequest" + "$ref": "#/components/schemas/ReorderPageLayoutRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -25027,7 +25983,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -25037,7 +25993,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -25047,7 +26003,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -25057,7 +26013,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -25067,7 +26023,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -25077,7 +26033,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -25087,7 +26043,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -25097,30 +26053,64 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/maintenance": { + "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Delete workspace", - "operationId": "delete", + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Bad request \u2014 the payload failed validation", "content": { "application/json": { "schema": { @@ -25130,7 +26120,7 @@ } }, "401": { - "description": "Unauthorized — missing or invalid credentials", + "description": "Unauthorized \u2014 missing or invalid credentials", "content": { "application/json": { "schema": { @@ -25140,7 +26130,7 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Forbidden \u2014 the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -25150,7 +26140,7 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Not found \u2014 the requested resource does not exist", "content": { "application/json": { "schema": { @@ -25160,7 +26150,7 @@ } }, "409": { - "description": "Conflict — the request collides with current resource state", + "description": "Conflict \u2014 the request collides with current resource state", "content": { "application/json": { "schema": { @@ -25170,7 +26160,7 @@ } }, "500": { - "description": "Internal server error — see the message field for details", + "description": "Internal server error \u2014 see the message field for details", "content": { "application/json": { "schema": { @@ -25180,7 +26170,7 @@ } }, "502": { - "description": "Bad gateway — an upstream provider returned an error", + "description": "Bad gateway \u2014 an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -25190,7 +26180,7 @@ } }, "503": { - "description": "Service unavailable — try again shortly", + "description": "Service unavailable \u2014 try again shortly", "content": { "application/json": { "schema": { @@ -25200,9367 +26190,15676 @@ } } } - } - } - }, - "components": { - "schemas": { - "AcknowledgeAllIncidentsResponse": { - "required": [ - "acknowledged", - "skipped" + }, + "post": { + "tags": [ + "Status Pages" ], - "type": "object", - "properties": { - "acknowledged": { - "type": "array", - "description": "Dispatches successfully acknowledged in this request", - "items": { - "$ref": "#/components/schemas/NotificationDispatchDto" - } - }, - "skipped": { - "type": "array", - "description": "Dispatches skipped (already acked or not in an acknowledgeable state)", - "items": { - "$ref": "#/components/schemas/SkippedDispatch" + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, - "description": "Result of acknowledging all acknowledgeable dispatches for an incident" - }, - "AcquireDeployLockRequest": { - "required": [ - "lockedBy" ], - "type": "object", - "properties": { - "lockedBy": { - "minLength": 1, - "type": "string", - "description": "Identity of the lock requester (e.g. hostname, CI job ID)" + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + } + } }, - "ttlMinutes": { - "type": "integer", - "description": "Lock TTL in minutes (default: 30, max: 60)", - "format": "int32", - "nullable": true, - "example": 30 - } + "required": true }, - "description": "Request to acquire a deploy lock for the current workspace" - }, - "AddCustomDomainRequest": { - "required": [ - "hostname" - ], - "type": "object", - "properties": { - "hostname": { - "maxLength": 255, - "minLength": 0, - "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$", - "type": "string", - "description": "Custom hostname, e.g. status.acme.com" - } - } - }, - "AddIncidentUpdateRequest": { - "type": "object", - "properties": { - "body": { - "type": "string", - "description": "Update message or post-mortem notes", - "nullable": true + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, - "newStatus": { - "type": "string", - "description": "Updated incident status; null to keep current status", - "nullable": true, - "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" - ] + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to notify subscribers of this update" + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } - }, - "required": [ - "notifySubscribers" - ] - }, - "AddMonitorTagsRequest": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "IDs of existing org tags to attach", - "nullable": true, - "items": { + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a maintenance window with timeline", + "operationId": "getMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { "type": "string", - "description": "IDs of existing org tags to attach", "format": "uuid" } }, - "newTags": { - "type": "array", - "description": "New tags to create (if not already present) and attach", - "nullable": true, - "items": { - "$ref": "#/components/schemas/NewTagRequest" + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, - "description": "Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both." - }, - "AddResourceGroupMemberRequest": { - "required": [ - "memberId", - "memberType" ], - "type": "object", - "properties": { - "memberType": { - "minLength": 1, - "pattern": "monitor|service", - "type": "string", - "description": "Type of member: 'monitor' or 'service'" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, - "memberId": { - "type": "string", - "description": "ID of the monitor or service to add", - "format": "uuid" - } - }, - "description": "Request body for adding a member to a resource group" - }, - "AdminAddSubscriberRequest": { - "type": "object", - "properties": { - "email": { - "maxLength": 320, - "minLength": 0, - "type": "string", - "description": "Email for EMAIL channel; legacy clients may send only this", - "format": "email", - "nullable": true + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "channel": { - "type": "string", - "description": "Delivery channel (default: EMAIL)", - "nullable": true, - "enum": [ - "EMAIL", - "SMS", - "WEBHOOK" - ] + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "destination": { - "maxLength": 2048, - "minLength": 0, - "type": "string", - "description": "Channel destination (email, phone, or webhook URL)", - "nullable": true + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "componentIds": { - "type": "array", - "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", - "nullable": true, - "items": { - "type": "string", - "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", - "format": "uuid" + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - "requireConfirmation": { - "type": "boolean", - "description": "When true (EMAIL only), create unconfirmed and send opt-in; null/false confirms immediately", - "nullable": true + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, - "AffectedComponent": { - "required": [ - "componentId", - "status" + "put": { + "tags": [ + "Status Pages" ], - "type": "object", - "properties": { - "componentId": { - "type": "string", - "description": "Status page component ID", - "format": "uuid" + "summary": "Update a maintenance window", + "operationId": "updateMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } }, - "status": { - "type": "string", - "description": "Component status during this incident", - "enum": [ - "OPERATIONAL", - "DEGRADED_PERFORMANCE", - "PARTIAL_OUTAGE", - "MAJOR_OUTAGE", - "UNDER_MAINTENANCE" - ] + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true }, - "description": "Updated affected components; null preserves current" - }, - "AlertChannelDisplayConfig": { - "type": "object", - "properties": { - "recipients": { - "type": "array", - "description": "Email recipients list (email channels)", - "nullable": true, - "items": { - "type": "string", - "description": "Email recipients list (email channels)" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } } }, - "region": { - "type": "string", - "description": "OpsGenie API region: us or eu", - "nullable": true + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "severityOverride": { - "type": "string", - "description": "PagerDuty severity override (critical, error, warning, info)", - "nullable": true + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - "mentionRoleId": { - "type": "string", + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Cancel a maintenance window", + "operationId": "deleteMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Dismiss a draft maintenance window", + "operationId": "dismissMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Post a maintenance window timeline update", + "operationId": "postMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { + "tags": [ + "Status Pages" + ], + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventType", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "SUBSCRIPTION_CONFIRMATION", + "INCIDENT_CREATED", + "INCIDENT_UPDATED", + "INCIDENT_RESOLVED" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a notification delivery receipt", + "operationId": "getNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Retry a failed notification delivery", + "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", + "operationId": "retryNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List subscribers including awaiting confirmation (paginated)", + "operationId": "listSubscribers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", + "operationId": "addSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminAddSubscriberRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Remove a subscriber", + "operationId": "removeSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subscriberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/tags": { + "get": { + "tags": [ + "Tags" + ], + "summary": "List tags for the authenticated organization", + "operationId": "list_3", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTagDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Tags" + ], + "summary": "Create a new tag", + "operationId": "create_4", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/tags/{id}": { + "get": { + "tags": [ + "Tags" + ], + "summary": "Get a tag by ID", + "operationId": "getById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Tags" + ], + "summary": "Update a tag's name and/or color", + "operationId": "update_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Tags" + ], + "summary": "Delete a tag (cascades to all monitor associations)", + "operationId": "delete_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/vaults/rotate": { + "post": { + "tags": [ + "Vault" + ], + "summary": "Rotate DEK", + "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", + "operationId": "rotateDek", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List webhook endpoints for the authenticated org", + "operationId": "list_2", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Register a new webhook endpoint", + "operationId": "create_3", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/events": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List all available webhook event types", + "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", + "operationId": "listEvents", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WebhookEventCatalogResponse" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/signing-secret": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get signing secret metadata for the authenticated org", + "operationId": "getSigningSecretInfo", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/signing-secret/rotate": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Generate or rotate the organization webhook signing secret", + "operationId": "rotateSigningSecret", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseString" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get a single webhook endpoint", + "operationId": "get_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Webhooks" + ], + "summary": "Update a webhook endpoint", + "operationId": "update_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhooks" + ], + "summary": "Delete a webhook endpoint", + "operationId": "delete_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}/deliveries": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List recent deliveries for a webhook endpoint", + "operationId": "listDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}/test": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Send a test delivery to a webhook endpoint", + "operationId": "test", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestWebhookEndpointRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "List workspaces", + "operationId": "list_1", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Workspaces" + ], + "summary": "Create workspace", + "operationId": "create_2", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkspaceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/workspaces/{workspaceId}": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Get workspace by ID", + "operationId": "get", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Workspaces" + ], + "summary": "Update workspace", + "operationId": "update", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkspaceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Workspaces" + ], + "summary": "Delete workspace", + "operationId": "delete", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request \u2014 the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized \u2014 missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden \u2014 the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found \u2014 the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict \u2014 the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error \u2014 see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway \u2014 an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable \u2014 try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AcknowledgeAllIncidentsResponse": { + "required": [ + "acknowledged", + "skipped" + ], + "type": "object", + "properties": { + "acknowledged": { + "type": "array", + "description": "Dispatches successfully acknowledged in this request", + "items": { + "$ref": "#/components/schemas/NotificationDispatchDto" + } + }, + "skipped": { + "type": "array", + "description": "Dispatches skipped (already acked or not in an acknowledgeable state)", + "items": { + "$ref": "#/components/schemas/SkippedDispatch" + } + } + }, + "description": "Result of acknowledging all acknowledgeable dispatches for an incident" + }, + "AcquireDeployLockRequest": { + "required": [ + "lockedBy" + ], + "type": "object", + "properties": { + "lockedBy": { + "minLength": 1, + "type": "string", + "description": "Identity of the lock requester (e.g. hostname, CI job ID)" + }, + "ttlMinutes": { + "type": "integer", + "description": "Lock TTL in minutes (default: 30, max: 60)", + "format": "int32", + "nullable": true, + "example": 30 + } + }, + "description": "Request to acquire a deploy lock for the current workspace" + }, + "AddCustomDomainRequest": { + "required": [ + "hostname" + ], + "type": "object", + "properties": { + "hostname": { + "maxLength": 255, + "minLength": 0, + "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$", + "type": "string", + "description": "Custom hostname, e.g. status.acme.com" + } + } + }, + "AddIncidentUpdateRequest": { + "type": "object", + "properties": { + "body": { + "type": "string", + "description": "Update message or post-mortem notes", + "nullable": true + }, + "newStatus": { + "type": "string", + "description": "Updated incident status; null to keep current status", + "nullable": true, + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to notify subscribers of this update" + } + }, + "required": [ + "notifySubscribers" + ] + }, + "AddMonitorTagsRequest": { + "type": "object", + "properties": { + "tagIds": { + "type": "array", + "description": "IDs of existing org tags to attach", + "nullable": true, + "items": { + "type": "string", + "description": "IDs of existing org tags to attach", + "format": "uuid" + } + }, + "newTags": { + "type": "array", + "description": "New tags to create (if not already present) and attach", + "nullable": true, + "items": { + "$ref": "#/components/schemas/NewTagRequest" + } + } + }, + "description": "Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both." + }, + "AddResourceGroupMemberRequest": { + "required": [ + "memberId", + "memberType" + ], + "type": "object", + "properties": { + "memberType": { + "minLength": 1, + "pattern": "monitor|service", + "type": "string", + "description": "Type of member: 'monitor' or 'service'" + }, + "memberId": { + "type": "string", + "description": "ID of the monitor or service to add", + "format": "uuid" + } + }, + "description": "Request body for adding a member to a resource group" + }, + "AdminAddSubscriberRequest": { + "type": "object", + "properties": { + "email": { + "maxLength": 320, + "minLength": 0, + "type": "string", + "description": "Email for EMAIL channel; legacy clients may send only this", + "format": "email", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Delivery channel (default: EMAIL)", + "nullable": true, + "enum": [ + "EMAIL", + "SMS", + "WEBHOOK" + ] + }, + "destination": { + "maxLength": 2048, + "minLength": 0, + "type": "string", + "description": "Channel destination (email, phone, or webhook URL)", + "nullable": true + }, + "componentIds": { + "type": "array", + "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", + "nullable": true, + "items": { + "type": "string", + "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", + "format": "uuid" + } + }, + "requireConfirmation": { + "type": "boolean", + "description": "When true (EMAIL only), create unconfirmed and send opt-in; null/false confirms immediately", + "nullable": true + } + } + }, + "AffectedComponent": { + "required": [ + "componentId", + "status" + ], + "type": "object", + "properties": { + "componentId": { + "type": "string", + "description": "Status page component ID", + "format": "uuid" + }, + "status": { + "type": "string", + "description": "Component status during this incident", + "enum": [ + "OPERATIONAL", + "DEGRADED_PERFORMANCE", + "PARTIAL_OUTAGE", + "MAJOR_OUTAGE", + "UNDER_MAINTENANCE" + ] + } + }, + "description": "Updated affected components; null preserves current" + }, + "AlertChannelDisplayConfig": { + "type": "object", + "properties": { + "recipients": { + "type": "array", + "description": "Email recipients list (email channels)", + "nullable": true, + "items": { + "type": "string", + "description": "Email recipients list (email channels)" + } + }, + "region": { + "type": "string", + "description": "OpsGenie API region: us or eu", + "nullable": true + }, + "severityOverride": { + "type": "string", + "description": "PagerDuty severity override (critical, error, warning, info)", + "nullable": true + }, + "mentionRoleId": { + "type": "string", "description": "Discord role ID to mention in notifications", "nullable": true }, - "customHeaders": { - "type": "object", - "additionalProperties": { + "customHeaders": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Custom HTTP headers for webhook requests", + "nullable": true + }, + "description": "Custom HTTP headers for webhook requests", + "nullable": true + }, + "chatId": { + "type": "string", + "description": "Telegram chat ID", + "nullable": true + }, + "priority": { + "type": "string", + "description": "Pushover notification priority override", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Mattermost channel override", + "nullable": true + }, + "routingKey": { + "type": "string", + "description": "Splunk On-Call routing key", + "nullable": true + }, + "deviceIden": { + "type": "string", + "description": "Pushbullet target device identifier", + "nullable": true + }, + "teamId": { + "type": "string", + "description": "Linear team ID for issue creation", + "nullable": true + }, + "visibility": { + "type": "string", + "description": "incident.io incident visibility", + "nullable": true + }, + "severity": { + "type": "string", + "description": "Rootly incident severity slug", + "nullable": true + }, + "site": { + "type": "string", + "description": "Datadog site region", + "nullable": true + }, + "projectKey": { + "type": "string", + "description": "Jira project key", + "nullable": true + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format (SMS / phone-call channels)", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of the org verified_phone_number row bound to this channel", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients" + } + }, + "voiceLanguage": { + "type": "string", + "description": "BCP-47 voice language for phone-call TTS (e.g. en-US, de-DE)", + "nullable": true + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for SMS/voice (BCP-47, e.g. en-US, de-DE)", + "nullable": true + } + }, + "description": "Non-sensitive alert channel configuration metadata" + }, + "AlertChannelDto": { + "required": [ + "channelType", + "createdAt", + "enabled", + "id", + "name", + "updatedAt" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique alert channel identifier", + "format": "uuid" + }, + "name": { + "type": "string", + "description": "Human-readable channel name" + }, + "channelType": { + "type": "string", + "description": "Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL)", + "enum": [ + "email", + "webhook", + "slack", + "pagerduty", + "opsgenie", + "teams", + "discord", + "telegram", + "google_chat", + "pushover", + "mattermost", + "splunk_oncall", + "pushbullet", + "linear", + "incident_io", + "rootly", + "zapier", + "datadog", + "jira", + "gitlab", + "sms", + "phone_call" + ] + }, + "displayConfig": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/AlertChannelDisplayConfig" + } + ] + }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled and will receive alerts" + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the channel was created", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the channel was last updated", + "format": "date-time" + }, + "configHash": { + "type": "string", + "description": "SHA-256 hash of the channel config; use for change detection", + "nullable": true + }, + "managedBy": { + "type": "string", + "description": "Source that created/owns this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on channels created before this attribution column existed.", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "lastDeliveryAt": { + "type": "string", + "description": "Timestamp of the most recent delivery attempt", + "format": "date-time", + "nullable": true + }, + "lastDeliveryStatus": { + "type": "string", + "description": "Outcome of the most recent delivery (SUCCESS, FAILED, etc.)", + "nullable": true + } + }, + "description": "Alert channel with non-sensitive configuration metadata" + }, + "AlertDeliveryDto": { + "required": [ + "channel", + "channelId", + "channelType", + "createdAt", + "eventType", + "id", + "incidentId", + "status", + "stepNumber", + "fireCount", + "attemptCount" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "incidentId": { + "type": "string", + "description": "Incident that triggered this delivery", + "format": "uuid" + }, + "dispatchId": { + "type": "string", + "description": "Notification dispatch that created this delivery", + "format": "uuid", + "nullable": true + }, + "channelId": { + "type": "string", + "description": "Alert channel ID", + "format": "uuid" + }, + "channel": { + "type": "string", + "description": "Human-readable channel name" + }, + "channelType": { + "type": "string", + "description": "Alert channel type (e.g. slack, email, webhook)" + }, + "status": { + "type": "string", + "description": "Current delivery status", + "enum": [ + "PENDING", + "DELIVERED", + "RETRY_PENDING", + "FAILED", + "CANCELLED", + "SKIPPED_NO_CREDIT", + "SKIPPED_UNVERIFIED", + "SKIPPED_OPTED_OUT", + "SKIPPED_RATE_LIMITED" + ] + }, + "eventType": { + "type": "string", + "description": "Incident lifecycle event that triggered this delivery", + "enum": [ + "INCIDENT_CREATED", + "INCIDENT_RESOLVED", + "INCIDENT_REOPENED" + ] + }, + "stepNumber": { + "type": "integer", + "description": "1-based escalation step this delivery belongs to", + "format": "int32" + }, + "fireCount": { + "type": "integer", + "description": "Fire sequence within the step: 1 = initial, 2+ = repeat re-fires", + "format": "int32" + }, + "attemptCount": { + "type": "integer", + "description": "Number of delivery attempts made", + "format": "int32" + }, + "lastAttemptAt": { + "type": "string", + "description": "When the last attempt was made", + "format": "date-time", + "nullable": true + }, + "nextRetryAt": { + "type": "string", + "description": "When the next retry is scheduled (null if not retrying)", + "format": "date-time", + "nullable": true + }, + "deliveredAt": { + "type": "string", + "description": "Timestamp when the delivery was confirmed (null if not yet delivered)", + "format": "date-time", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Error message from the last failed attempt", + "nullable": true + }, + "createdAt": { + "type": "string", + "format": "date-time" + } + }, + "description": "Delivery record for a single channel within a notification dispatch" + }, + "ApiKeyAuthConfig": { + "required": [ + "type", + "headerName" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "api_key" + ] + }, + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "HTTP header name that carries the API key" + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the API key value", + "format": "uuid", + "nullable": true + } + } + }, + "ApiKeyCreateResponse": { + "required": [ + "createdAt", + "key", + "name", + "id" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Unique API key identifier", + "format": "int32" + }, + "name": { + "minLength": 1, + "type": "string", + "description": "Human-readable name for this API key" + }, + "key": { + "minLength": 1, + "type": "string", + "description": "Full API key value in dh_live_* format; store this now" + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the key was created", + "format": "date-time" + }, + "expiresAt": { + "type": "string", + "description": "Timestamp when the key expires; null if no expiration", + "format": "date-time", + "nullable": true + } + }, + "description": "Created API key with the full key value \u2014 store it now, it won't be shown again" + }, + "ApiKeyDto": { + "required": [ + "createdAt", + "key", + "name", + "updatedAt", + "id" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Unique API key identifier", + "format": "int32" + }, + "name": { + "minLength": 1, + "type": "string", + "description": "Human-readable name for this API key" + }, + "key": { + "minLength": 1, + "type": "string", + "description": "Full API key value in dh_live_* format" + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the key was created", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the key was last updated", + "format": "date-time" + }, + "lastUsedAt": { + "type": "string", + "description": "Timestamp of the most recent API call; null if never used", + "format": "date-time", + "nullable": true + }, + "revokedAt": { + "type": "string", + "description": "Timestamp when the key was revoked; null if active", + "format": "date-time", + "nullable": true + }, + "expiresAt": { + "type": "string", + "description": "Timestamp when the key expires; null if no expiration", + "format": "date-time", + "nullable": true + } + }, + "description": "API key for programmatic access to the DevHelm API" + }, + "ArtifactTraceMeta": { + "type": "object", + "properties": { + "actionCount": { + "type": "integer", + "description": "Action count in the trace", + "format": "int32", + "nullable": true + }, + "snapshotCount": { + "type": "integer", + "description": "Snapshot count in the trace", + "format": "int32", + "nullable": true + }, + "nearbyActions": { + "type": "array", + "description": "Actions around the failure, teardown labelled", + "nullable": true, + "items": { + "$ref": "#/components/schemas/TraceNearbyAction" + } + }, + "entryPoints": { + "type": "array", + "description": "Four doorways into the downloaded file", + "nullable": true, + "items": { + "$ref": "#/components/schemas/TraceEntryPoint" + } + } + }, + "description": "Packed trace doorway; do not unpack the zip" + }, + "ArtifactViewport": { + "required": [ + "dpr", + "height", + "width" + ], + "type": "object", + "properties": { + "width": { + "type": "integer", + "description": "Viewport width in CSS pixels", + "format": "int32" + }, + "height": { + "type": "integer", + "description": "Viewport height in CSS pixels", + "format": "int32" + }, + "dpr": { + "type": "integer", + "description": "Device pixel ratio at capture", + "format": "int32" + } + }, + "description": "Screenshot viewport" + }, + "AssertionResultDto": { + "required": [ + "severity", + "type", + "passed" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Assertion type", + "example": "status_code" + }, + "passed": { + "type": "boolean", + "description": "Whether the assertion passed" + }, + "severity": { + "type": "string", + "description": "Assertion severity", + "enum": [ + "fail", + "warn" + ] + }, + "message": { + "type": "string", + "description": "Human-readable result message", + "nullable": true + }, + "expected": { + "type": "string", + "description": "Expected value", + "nullable": true, + "example": "200" + }, + "actual": { + "type": "string", + "description": "Actual value observed", + "nullable": true, + "example": "503" + } + }, + "description": "Result of evaluating a single assertion against a check result" + }, + "AssertionTestResultDto": { + "required": [ + "assertionType", + "message", + "severity", + "passed" + ], + "type": "object", + "properties": { + "assertionType": { + "type": "string", + "description": "Assertion type evaluated", + "enum": [ + "status_code", + "response_time", + "body_contains", + "json_path", + "header_value", + "regex_body", + "dns_resolves", + "dns_response_time", + "dns_expected_ips", + "dns_expected_cname", + "dns_record_contains", + "dns_record_equals", + "dns_txt_contains", + "dns_min_answers", + "dns_max_answers", + "dns_response_time_warn", + "dns_ttl_low", + "dns_ttl_high", + "mcp_connects", + "mcp_response_time", + "mcp_has_capability", + "mcp_tool_available", + "mcp_min_tools", + "mcp_protocol_version", + "mcp_response_time_warn", + "mcp_tool_count_changed", + "ssl_expiry", + "response_size", + "redirect_count", + "redirect_target", + "response_time_warn", + "tcp_connects", + "tcp_response_time", + "tcp_response_time_warn", + "icmp_reachable", + "icmp_response_time", + "icmp_response_time_warn", + "icmp_packet_loss", + "heartbeat_received", + "heartbeat_max_interval", + "heartbeat_interval_drift", + "heartbeat_payload_contains" + ] + }, + "passed": { + "type": "boolean", + "description": "Whether the assertion passed" + }, + "severity": { + "type": "string", + "description": "Assertion severity: FAIL or WARN", + "enum": [ + "fail", + "warn" + ] + }, + "message": { + "type": "string", + "description": "Human-readable result description" + }, + "expected": { + "type": "string", + "description": "Expected value", + "nullable": true + }, + "actual": { + "type": "string", + "description": "Actual value observed during the test", + "nullable": true + } + } + }, + "AuditEventDto": { + "required": [ + "action", + "createdAt", + "id" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Unique audit event identifier", + "format": "int64" + }, + "actorId": { + "type": "integer", + "description": "User ID who performed the action; null for system actions", + "format": "int32", + "nullable": true + }, + "actorEmail": { + "type": "string", + "description": "Email of the actor; null for system actions", + "nullable": true + }, + "action": { + "type": "string", + "description": "Audit action type (e.g. monitor.created, api_key.revoked)" + }, + "resourceType": { + "type": "string", + "description": "Type of resource affected (e.g. monitor, api_key)", + "nullable": true + }, + "resourceId": { + "type": "string", + "description": "ID of the affected resource", + "nullable": true + }, + "resourceName": { + "type": "string", + "description": "Human-readable name of the affected resource", + "nullable": true + }, + "metadata": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/AuditMetadata" + } + ] + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the action was performed", + "format": "date-time" + } + } + }, + "AuditMetadata": { + "description": "Typed metadata payload attached to an audit event; null for actions that carry no extra context.", + "nullable": true, + "discriminator": { + "propertyName": "kind", + "mapping": { + "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/MemberRoleChangedMetadata" + } + ] + }, + "AuthMeResponse": { + "required": [ + "key", + "organization", + "plan", + "rateLimits" + ], + "type": "object", + "properties": { + "key": { + "$ref": "#/components/schemas/KeyInfo" + }, + "organization": { + "$ref": "#/components/schemas/OrgInfo" + }, + "plan": { + "$ref": "#/components/schemas/PlanInfo" + }, + "rateLimits": { + "$ref": "#/components/schemas/RateLimitInfo" + } + }, + "description": "Identity, organization, plan, and rate-limit info for the authenticated API key" + }, + "BasicAuthConfig": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding Basic auth username and password", + "format": "uuid", + "nullable": true + } + }, + "required": [ + "type" + ] + }, + "BatchComponentUptimeDto": { + "required": [ + "components" + ], + "type": "object", + "properties": { + "components": { + "type": "object", + "additionalProperties": { + "type": "array", + "description": "Map of component ID \u2192 list of per-day uptime entries (oldest \u2192 newest)", + "items": { + "$ref": "#/components/schemas/ComponentUptimeDayDto" + } + }, + "description": "Map of component ID \u2192 list of per-day uptime entries (oldest \u2192 newest)" + } + }, + "description": "Batch daily uptime per component, keyed by component ID" + }, + "BearerAuthConfig": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "bearer" + ] + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding the bearer token value", + "format": "uuid", + "nullable": true + } + }, + "required": [ + "type" + ] + }, + "BodyContainsAssertion": { + "required": [ + "type", + "substring" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "body_contains" + ] + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in the response body" + } + } + }, + "BulkMonitorActionRequest": { + "required": [ + "action", + "monitorIds" + ], + "type": "object", + "properties": { + "monitorIds": { + "maxItems": 200, + "minItems": 0, + "type": "array", + "description": "IDs of monitors to act on (max 200)", + "items": { + "type": "string", + "description": "IDs of monitors to act on (max 200)", + "format": "uuid" + } + }, + "action": { + "type": "string", + "description": "Action to apply to every monitor in the bulk request", + "enum": [ + "PAUSE", + "RESUME", + "DELETE", + "ADD_TAG", + "REMOVE_TAG" + ] + }, + "tagIds": { + "type": "array", + "description": "Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)", + "nullable": true, + "items": { + "type": "string", + "description": "Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)", + "format": "uuid" + } + }, + "newTags": { + "type": "array", + "description": "New tags to create and attach (only for ADD_TAG)", + "nullable": true, + "items": { + "$ref": "#/components/schemas/NewTagRequest" + } + } + }, + "description": "Request body for performing a bulk action on multiple monitors" + }, + "BulkMonitorActionResult": { + "required": [ + "failed", + "succeeded" + ], + "type": "object", + "properties": { + "succeeded": { + "type": "array", + "description": "IDs of monitors on which the action succeeded", + "items": { + "type": "string", + "description": "IDs of monitors on which the action succeeded", + "format": "uuid" + } + }, + "failed": { + "type": "array", + "description": "Monitors on which the action failed, with the reason for each failure", + "items": { + "$ref": "#/components/schemas/FailureDetail" + } + } + }, + "description": "Result of a bulk monitor action, including partial-success details" + }, + "CapturePolicy": { + "type": "object", + "properties": { + "screenshots": { + "type": "string", + "description": "When to capture screenshots", + "nullable": true, + "enum": [ + "always", + "on_failure", + "off" + ] + }, + "trace": { + "type": "string", + "description": "When to capture a Playwright trace", + "nullable": true, + "enum": [ + "always", + "on_failure", + "off" + ] + }, + "video": { + "type": "string", + "description": "When to capture video", + "nullable": true, + "enum": [ + "always", + "on_failure", + "off" + ] + } + }, + "description": "When to capture screenshots, traces, and video during a code run" + }, + "CategoryDto": { + "required": [ + "category", + "serviceCount" + ], + "type": "object", + "properties": { + "category": { + "type": "string", + "description": "Category name (e.g. CI/CD, Cloud, Payments)" + }, + "serviceCount": { + "type": "integer", + "description": "Number of services in this category", + "format": "int64" + } + }, + "description": "Service category with its count of catalog entries" + }, + "ChangeRoleRequest": { + "required": [ + "orgRole" + ], + "type": "object", + "properties": { + "orgRole": { + "type": "string", + "description": "New role to assign", + "enum": [ + "OWNER", + "ADMIN", + "MEMBER" + ] + } + }, + "description": "Update an organization member's role" + }, + "ChangeStatusRequest": { + "required": [ + "status" + ], + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "New membership status (ACTIVE or SUSPENDED)", + "enum": [ + "INVITED", + "ACTIVE", + "SUSPENDED", + "LEFT", + "REMOVED", + "DECLINED" + ] + } + }, + "description": "Update an organization member's status" + }, + "ChartBucketDto": { + "required": [ + "bucket" + ], + "type": "object", + "properties": { + "bucket": { + "type": "string", + "description": "Start of the time bucket (ISO 8601)", + "format": "date-time", + "example": "2026-03-12T10:00:00Z" + }, + "uptimePercent": { + "type": "number", + "description": "Uptime percentage for this bucket; null when no data", + "format": "double", + "nullable": true, + "example": 100 + }, + "avgLatencyMs": { + "type": "number", + "description": "Weighted average latency in milliseconds for this bucket", + "format": "double", + "nullable": true, + "example": 120.3 + }, + "p95LatencyMs": { + "type": "number", + "description": "95th percentile latency in milliseconds (max across regions)", + "format": "double", + "nullable": true, + "example": 250 + }, + "p99LatencyMs": { + "type": "number", + "description": "99th percentile latency in milliseconds (max across regions)", + "format": "double", + "nullable": true, + "example": 480 + } + }, + "description": "Aggregated metrics for a time bucket" + }, + "CheckResultDetailsDto": { + "type": "object", + "properties": { + "statusCode": { + "type": "integer", + "description": "HTTP status code of the response", + "format": "int32", + "nullable": true, + "example": 200 + }, + "responseHeaders": { + "type": "object", + "additionalProperties": { + "type": "array", + "description": "HTTP response headers", + "nullable": true, + "items": { + "type": "string", + "description": "HTTP response headers", + "nullable": true + } + }, + "description": "HTTP response headers", + "nullable": true + }, + "responseBodySnapshot": { + "type": "string", + "description": "Raw response body snapshot (may be HTML, XML, JSON, or plain text)", + "nullable": true + }, + "assertionResults": { + "type": "array", + "description": "Individual assertion evaluation results", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AssertionResultDto" + } + }, + "tlsInfo": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/TlsInfoDto" + } + ] + }, + "redirectCount": { + "type": "integer", + "description": "Number of HTTP redirects followed", + "format": "int32", + "nullable": true, + "example": 2 + }, + "redirectTarget": { + "type": "string", + "description": "Final URL after redirects", + "nullable": true + }, + "responseSizeBytes": { + "type": "integer", + "description": "Response body size in bytes", + "format": "int32", + "nullable": true, + "example": 4096 + }, + "checkDetails": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CheckTypeDetailsDto" + } + ] + } + }, + "description": "Type-specific details captured during a check execution" + }, + "CheckResultDto": { + "required": [ + "id", + "region", + "timestamp", + "passed" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the check result", + "format": "uuid" + }, + "timestamp": { + "type": "string", + "description": "Timestamp when the check was executed (ISO 8601)", + "format": "date-time" + }, + "region": { + "type": "string", + "description": "Region where the check was executed", + "example": "us-east" + }, + "responseTimeMs": { + "type": "integer", + "description": "Response time in milliseconds", + "format": "int32", + "nullable": true, + "example": 123 + }, + "passed": { + "type": "boolean", + "description": "Whether the check passed", + "example": true + }, + "failureReason": { + "type": "string", + "description": "Reason for failure when passed=false", + "nullable": true + }, + "severityHint": { + "type": "string", + "description": "Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing", + "nullable": true + }, + "details": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CheckResultDetailsDto" + } + ] + }, + "checkId": { + "type": "string", + "description": "Unique execution trace ID for cross-service correlation", + "format": "uuid", + "nullable": true + } + }, + "description": "A single check result from a monitor run" + }, + "CheckTraceDto": { + "required": [ + "checkId", + "evaluations", + "transitions" + ], + "type": "object", + "properties": { + "checkId": { + "type": "string", + "description": "The check execution ID this trace is keyed by", + "format": "uuid" + }, + "evaluations": { + "type": "array", + "description": "All rule evaluations that ran for this check", + "items": { + "$ref": "#/components/schemas/RuleEvaluationDto" + } + }, + "transitions": { + "type": "array", + "description": "State-machine transitions this check caused (may be empty if nothing fired)", + "items": { + "$ref": "#/components/schemas/IncidentStateTransitionDto" + } + }, + "policySnapshot": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/PolicySnapshotDto" + } + ] + } + } + }, + "CheckTypeDetailsDto": { + "description": "Check-type-specific details \u2014 polymorphic by check_type discriminator", + "discriminator": { + "propertyName": "check_type", + "mapping": { + "http": "#/components/schemas/Http", + "tcp": "#/components/schemas/Tcp", + "icmp": "#/components/schemas/Icmp", + "dns": "#/components/schemas/Dns", + "mcp_server": "#/components/schemas/McpServer", + "code": "#/components/schemas/Code" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/Http" + }, + { + "$ref": "#/components/schemas/Tcp" + }, + { + "$ref": "#/components/schemas/Icmp" + }, + { + "$ref": "#/components/schemas/Dns" + }, + { + "$ref": "#/components/schemas/McpServer" + }, + { + "$ref": "#/components/schemas/Code" + } + ] + }, + "Code": { + "type": "object", + "description": "Code check (browser / multi-step API) specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "code" + ] + }, + "exitCode": { + "type": "integer", + "description": "Container exit code (0 = pass)", + "format": "int32" + }, + "stdoutSnippet": { + "type": "string", + "description": "Truncated stdout from the container", + "nullable": true + }, + "stderrSnippet": { + "type": "string", + "description": "Truncated stderr from the container", + "nullable": true + }, + "steps": { + "type": "array", + "description": "Named steps extracted from Playwright test output", + "nullable": true, + "items": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeCheckStep" + } + ] + } + }, + "failureKind": { + "type": "string", + "description": "Failure classification: timeout, assertion, or error", + "nullable": true + }, + "timedOut": { + "type": "boolean", + "description": "Whether the run hit a step/total/run-budget timeout", + "nullable": true + } + }, + "required": [ + "check_type", + "exitCode" + ] + }, + "CodeCheckStep": { + "required": [ + "name", + "status" + ], + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Step name from test.step() or test() call" + }, + "status": { + "type": "string", + "description": "Step outcome: passed, failed, skipped, or timedOut" + }, + "durationMs": { + "type": "integer", + "description": "Step duration in milliseconds", + "format": "int32", + "nullable": true + }, + "error": { + "type": "string", + "description": "Error message if the step failed", + "nullable": true + } + }, + "description": "A single named step within a code check execution" + }, + "ComponentImpact": { + "required": [ + "componentId", + "componentName", + "uptimePercentage", + "partialOutageSeconds", + "majorOutageSeconds" + ], + "type": "object", + "properties": { + "componentId": { + "type": "string", + "description": "Status page component UUID", + "format": "uuid" + }, + "componentName": { + "type": "string", + "description": "Component display name" + }, + "groupName": { + "type": "string", + "description": "Parent group display name when the component belongs to a group", + "nullable": true + }, + "uptimePercentage": { + "type": "number", + "description": "Computed uptime % for this component on this day", + "format": "double" + }, + "partialOutageSeconds": { + "type": "integer", + "description": "Seconds of partial outage observed on this day", + "format": "int32" + }, + "majorOutageSeconds": { + "type": "integer", + "description": "Seconds of major outage observed on this day", + "format": "int32" + } + }, + "description": "One component's uptime contribution for the day" + }, + "ComponentPosition": { + "required": [ + "componentId", + "displayOrder" + ], + "type": "object", + "properties": { + "componentId": { + "type": "string", + "description": "Component ID", + "format": "uuid" + }, + "displayOrder": { + "type": "integer", + "description": "New display order (0-based)", + "format": "int32" + }, + "groupId": { + "type": "string", + "description": "Target group ID, null for ungrouped", + "format": "uuid", + "nullable": true + } + }, + "description": "A single component position" + }, + "ComponentSample": { + "required": [ + "componentId", + "newStatus" + ], + "type": "object", + "properties": { + "componentId": { + "type": "string", + "description": "Component ID", + "format": "uuid" + }, + "componentName": { + "type": "string", + "description": "Component display name", + "nullable": true + }, + "oldStatus": { + "type": "string", + "description": "Previous status before the flip", + "nullable": true + }, + "newStatus": { + "type": "string", + "description": "New status after the flip" + } + }, + "description": "One component sample inside a transition rollup" + }, + "ComponentsSummaryDto": { + "required": [ + "groupComponentCounts", + "includedCount", + "totalCount" + ], + "type": "object", + "properties": { + "totalCount": { + "type": "integer", + "description": "Total active components for this service across all groups", + "format": "int32" + }, + "includedCount": { + "type": "integer", + "description": "Number of components actually returned in the inline ``components`` list", + "format": "int32" + }, + "groupComponentCounts": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Per-group active leaf count, keyed by group component id (UUID stringified). Empty when the service has no groups; lets the UI render \"show all N\" affordances without a second round trip", + "format": "int32" + }, + "description": "Per-group active leaf count, keyed by group component id (UUID stringified). Empty when the service has no groups; lets the UI render \"show all N\" affordances without a second round trip" + } + } + }, + "ComponentStatusDto": { + "required": [ + "id", + "name", + "status" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Component UUID" + }, + "name": { + "type": "string", + "description": "Human-readable component name" + }, + "status": { + "type": "string", + "description": "Current component status, e.g. operational, degraded_performance" + } + }, + "description": "Current status of each active component" + }, + "ComponentTransitionEventDto": { + "required": [ + "componentSample", + "newStatus", + "componentCount" + ], + "type": "object", + "properties": { + "newStatus": { + "type": "string", + "description": "New status that defines this rollup bucket" + }, + "componentCount": { + "type": "integer", + "description": "Total components in the 5-minute rollup bucket", + "format": "int32" + }, + "componentSample": { + "type": "array", + "description": "Up to 5 sample components from the bucket", + "items": { + "$ref": "#/components/schemas/ComponentSample" + } + } + }, + "description": "Rolled-up component status transitions for a status-events rail row" + }, + "ComponentUptimeDayDto": { + "required": [ + "date", + "partialOutageSeconds", + "majorOutageSeconds", + "degradedSeconds", + "uptimePercentage" + ], + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "Start-of-day timestamp for this bucket (UTC midnight, ISO 8601)", + "format": "date-time" + }, + "partialOutageSeconds": { + "type": "integer", + "description": "Seconds of partial outage observed on this day", + "format": "int32" + }, + "majorOutageSeconds": { + "type": "integer", + "description": "Seconds of major outage observed on this day", + "format": "int32" + }, + "degradedSeconds": { + "type": "integer", + "description": "Seconds the component spent in degraded performance on this day", + "format": "int32" + }, + "uptimePercentage": { + "type": "number", + "description": "Computed uptime percentage using the weighted formula (degraded does not lower it)", + "format": "double" + }, + "incidents": { + "type": "array", + "description": "Incidents that overlapped this day, in display order", + "nullable": true, + "items": { + "$ref": "#/components/schemas/IncidentRef" + } + } + }, + "description": "Daily uptime data for a component" + }, + "ComponentUptimeSummaryDto": { + "required": [ + "source" + ], + "type": "object", + "properties": { + "day": { + "type": "number", + "description": "Uptime percentage over the last 24 hours", + "format": "double", + "nullable": true, + "example": 99.95 + }, + "week": { + "type": "number", + "description": "Uptime percentage over the last 7 days", + "format": "double", + "nullable": true, + "example": 99.98 + }, + "month": { + "type": "number", + "description": "Uptime percentage over the last 30 days", + "format": "double", + "nullable": true, + "example": 99.92 + }, + "source": { + "type": "string", + "description": "Data source: vendor_reported or incident_derived", + "example": "vendor_reported" + } + }, + "description": "Inline uptime percentages for 24h, 7d, 30d" + }, + "ConfirmationPolicy": { + "required": [ + "type", + "minRegionsFailing", + "maxWaitSeconds" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "How incident confirmation is coordinated across regions", + "enum": [ + "multi_region" + ] + }, + "minRegionsFailing": { + "type": "integer", + "description": "Minimum failing regions required to confirm an incident", + "format": "int32" + }, + "maxWaitSeconds": { + "type": "integer", + "description": "Maximum seconds to wait for enough regions to fail after first trigger", + "format": "int32" + } + }, + "description": "Multi-region confirmation settings" + }, + "ConsoleGroupDto": { + "required": [ + "level", + "sourceUrl", + "text", + "count" + ], + "type": "object", + "properties": { + "level": { + "minLength": 1, + "type": "string", + "description": "UI bucket: error, warning, or info" + }, + "text": { + "minLength": 1, + "type": "string", + "description": "Repeated message text" + }, + "count": { + "type": "integer", + "description": "How many times this message occurred", + "format": "int32" + }, + "sourceUrl": { + "minLength": 1, + "type": "string", + "description": "Source URL of the first occurrence" + }, + "stepIdFirst": { + "type": "string", + "description": "First step that logged this message", + "nullable": true + }, + "stepIdLast": { + "type": "string", + "description": "Last step that logged this message", + "nullable": true + } + }, + "description": "Grouped console messages" + }, + "ConsoleLineDto": { + "required": [ + "id", + "level", + "sourceUrl", + "text", + "ts", + "lineNumber", + "columnNumber" + ], + "type": "object", + "properties": { + "id": { + "minLength": 1, + "type": "string", + "description": "Stable line id from capture" + }, + "stepId": { + "type": "string", + "description": "Step this line belonged to", + "nullable": true + }, + "level": { + "minLength": 1, + "type": "string", + "description": "UI bucket: error, warning, or info" + }, + "text": { + "minLength": 1, + "type": "string", + "description": "Console message text" + }, + "sourceUrl": { + "minLength": 1, + "type": "string", + "description": "Script URL that logged this line" + }, + "lineNumber": { + "type": "integer", + "description": "Source line number", + "format": "int32" + }, + "columnNumber": { + "type": "integer", + "description": "Source column number", + "format": "int32" + }, + "ts": { + "minLength": 1, + "type": "string", + "description": "When the line was captured" + } + }, + "description": "One console line" + }, + "CreateAlertChannelRequest": { + "required": [ + "config", + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Human-readable name for this alert channel" + }, + "config": { + "oneOf": [ + { + "$ref": "#/components/schemas/DatadogChannelConfig" + }, + { + "$ref": "#/components/schemas/DiscordChannelConfig" + }, + { + "$ref": "#/components/schemas/EmailChannelConfig" + }, + { + "$ref": "#/components/schemas/GitLabChannelConfig" + }, + { + "$ref": "#/components/schemas/GoogleChatChannelConfig" + }, + { + "$ref": "#/components/schemas/IncidentIoChannelConfig" + }, + { + "$ref": "#/components/schemas/JiraChannelConfig" + }, + { + "$ref": "#/components/schemas/LinearChannelConfig" + }, + { + "$ref": "#/components/schemas/MattermostChannelConfig" + }, + { + "$ref": "#/components/schemas/OpsGenieChannelConfig" + }, + { + "$ref": "#/components/schemas/PagerDutyChannelConfig" + }, + { + "$ref": "#/components/schemas/PhoneCallChannelConfig" + }, + { + "$ref": "#/components/schemas/PushbulletChannelConfig" + }, + { + "$ref": "#/components/schemas/PushoverChannelConfig" + }, + { + "$ref": "#/components/schemas/RootlyChannelConfig" + }, + { + "$ref": "#/components/schemas/SlackChannelConfig" + }, + { + "$ref": "#/components/schemas/SmsChannelConfig" + }, + { + "$ref": "#/components/schemas/SplunkOnCallChannelConfig" + }, + { + "$ref": "#/components/schemas/TeamsChannelConfig" + }, + { + "$ref": "#/components/schemas/TelegramChannelConfig" + }, + { + "$ref": "#/components/schemas/WebhookChannelConfig" + }, + { + "$ref": "#/components/schemas/ZapierChannelConfig" + } + ] + }, + "managedBy": { + "type": "string", + "description": "Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + } + }, + "CreateApiKeyRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 200, + "minLength": 0, + "type": "string", + "description": "Human-readable name to identify this API key" + }, + "expiresAt": { + "type": "string", + "description": "Optional expiration timestamp in ISO 8601 format", + "format": "date-time", + "nullable": true + } + } + }, + "CreateAssertionRequest": { + "required": [ + "config" + ], + "type": "object", + "properties": { + "config": { + "oneOf": [ + { + "$ref": "#/components/schemas/BodyContainsAssertion" + }, + { + "$ref": "#/components/schemas/DnsExpectedCnameAssertion" + }, + { + "$ref": "#/components/schemas/DnsExpectedIpsAssertion" + }, + { + "$ref": "#/components/schemas/DnsMaxAnswersAssertion" + }, + { + "$ref": "#/components/schemas/DnsMinAnswersAssertion" + }, + { + "$ref": "#/components/schemas/DnsRecordContainsAssertion" + }, + { + "$ref": "#/components/schemas/DnsRecordEqualsAssertion" + }, + { + "$ref": "#/components/schemas/DnsResolvesAssertion" + }, + { + "$ref": "#/components/schemas/DnsResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/DnsResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/DnsTtlHighAssertion" + }, + { + "$ref": "#/components/schemas/DnsTtlLowAssertion" + }, + { + "$ref": "#/components/schemas/DnsTxtContainsAssertion" + }, + { + "$ref": "#/components/schemas/HeaderValueAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatIntervalDriftAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatMaxIntervalAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatPayloadContainsAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatReceivedAssertion" + }, + { + "$ref": "#/components/schemas/IcmpPacketLossAssertion" + }, + { + "$ref": "#/components/schemas/IcmpReachableAssertion" + }, + { + "$ref": "#/components/schemas/IcmpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/IcmpResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/JsonPathAssertion" + }, + { + "$ref": "#/components/schemas/McpConnectsAssertion" + }, + { + "$ref": "#/components/schemas/McpHasCapabilityAssertion" + }, + { + "$ref": "#/components/schemas/McpMinToolsAssertion" + }, + { + "$ref": "#/components/schemas/McpProtocolVersionAssertion" + }, + { + "$ref": "#/components/schemas/McpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/McpResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/McpToolAvailableAssertion" + }, + { + "$ref": "#/components/schemas/McpToolCountChangedAssertion" + }, + { + "$ref": "#/components/schemas/RedirectCountAssertion" + }, + { + "$ref": "#/components/schemas/RedirectTargetAssertion" + }, + { + "$ref": "#/components/schemas/RegexBodyAssertion" + }, + { + "$ref": "#/components/schemas/ResponseSizeAssertion" + }, + { + "$ref": "#/components/schemas/ResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/ResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/SslExpiryAssertion" + }, + { + "$ref": "#/components/schemas/StatusCodeAssertion" + }, + { + "$ref": "#/components/schemas/TcpConnectsAssertion" + }, + { + "$ref": "#/components/schemas/TcpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/TcpResponseTimeWarnAssertion" + } + ] + }, + "severity": { + "type": "string", + "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL)", + "nullable": true, + "enum": [ + "fail", + "warn" + ] + } + }, + "description": "Replace all assertions. Null preserves current" + }, + "CreateEnvironmentRequest": { + "required": [ + "name", + "slug" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "Human-readable environment name" + }, + "slug": { + "maxLength": 100, + "minLength": 0, + "pattern": "^[a-z0-9][a-z0-9_-]*$", + "type": "string", + "description": "URL-safe identifier (lowercase alphanumeric, hyphens, underscores)" + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Initial key-value variable pairs for this environment", + "nullable": true + }, + "description": "Initial key-value variable pairs for this environment", + "nullable": true + }, + "isDefault": { + "type": "boolean", + "description": "Whether this is the default environment for new monitors (default: false)", + "nullable": true + } + } + }, + "CreateInviteRequest": { + "required": [ + "email", + "roleOffered" + ], + "type": "object", + "properties": { + "email": { + "minLength": 1, + "type": "string", + "description": "Email address to invite", + "format": "email" + }, + "roleOffered": { + "type": "string", + "description": "Role to assign on acceptance", + "enum": [ + "OWNER", + "ADMIN", + "MEMBER" + ] + } + }, + "description": "Invite a new member to the organization by email" + }, + "CreateMaintenanceWindowRequest": { + "required": [ + "endsAt", + "startsAt" + ], + "type": "object", + "properties": { + "monitorId": { + "type": "string", + "description": "Monitor to attach this maintenance window to; null for org-wide", + "format": "uuid", + "nullable": true + }, + "startsAt": { + "type": "string", + "description": "Scheduled start of the maintenance window (ISO 8601)", + "format": "date-time" + }, + "endsAt": { + "type": "string", + "description": "Scheduled end of the maintenance window (ISO 8601)", + "format": "date-time" + }, + "repeatRule": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)", + "nullable": true + }, + "reason": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Human-readable reason for the maintenance (max 500 chars)", + "nullable": true + }, + "suppressAlerts": { + "type": "boolean", + "description": "Whether to suppress alerts during this window (default: true)", + "nullable": true + } + } + }, + "CreateManualIncidentRequest": { + "required": [ + "severity", + "title" + ], + "type": "object", + "properties": { + "title": { + "minLength": 1, + "type": "string", + "description": "Short summary of the incident" + }, + "severity": { + "type": "string", + "description": "Incident severity: DOWN, DEGRADED, or MAINTENANCE", + "enum": [ + "DOWN", + "DEGRADED", + "MAINTENANCE" + ] + }, + "monitorId": { + "type": "string", + "description": "Monitor to associate with this incident", + "format": "uuid", + "nullable": true + }, + "body": { + "type": "string", + "description": "Detailed description or context for the incident", + "nullable": true + }, + "serviceId": { + "type": "string", + "description": "Vendor service to link; optional for Dependencies create CTA", + "format": "uuid", + "nullable": true + }, + "serviceIncidentId": { + "type": "string", + "description": "Vendor incident to link; idempotent if an active org incident already links it", + "format": "uuid", + "nullable": true + } + } + }, + "CreateMonitorRequest": { + "required": [ + "name", + "type" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Human-readable name for this monitor" + }, + "type": { + "type": "string", + "description": "Monitor protocol type", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + }, + "config": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/DnsMonitorConfig" + }, + { + "$ref": "#/components/schemas/HeartbeatMonitorConfig" + }, + { + "$ref": "#/components/schemas/HttpMonitorConfig" + }, + { + "$ref": "#/components/schemas/IcmpMonitorConfig" + }, + { + "$ref": "#/components/schemas/McpServerMonitorConfig" + }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, + { + "$ref": "#/components/schemas/TcpMonitorConfig" + } + ] + }, + "frequencySeconds": { + "maximum": 86400, + "minimum": 10, + "type": "integer", + "description": "Check frequency in seconds (10\u201386400). Null defaults to the plan minimum", + "format": "int32", + "nullable": true + }, + "enabled": { + "type": "boolean", + "description": "Whether the monitor is active (default: true)", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Probe regions to run checks from. Allowed values are deployment-dependent. Production: us-east, us-west, eu-west, ap-south", + "nullable": true, + "items": { + "type": "string", + "description": "Probe regions to run checks from. Allowed values are deployment-dependent. Production: us-east, us-west, eu-west, ap-south" + } + }, + "managedBy": { + "type": "string", + "description": "Source that created this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "environmentId": { + "type": "string", + "description": "Environment to associate with this monitor. Required for browser and multi-step monitors", + "format": "uuid", + "nullable": true + }, + "assertions": { + "type": "array", + "description": "Assertions to evaluate against each check result", + "nullable": true, + "items": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + }, + "auth": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + } + ] + }, + "incidentPolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + ] + }, + "alertChannelIds": { + "type": "array", + "description": "Alert channels to notify when this monitor triggers", + "nullable": true, + "items": { + "type": "string", + "description": "Alert channels to notify when this monitor triggers", + "format": "uuid" + } + }, + "tags": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/AddMonitorTagsRequest" + } + ] + }, + "capturePolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CapturePolicy" + } + ] + }, + "fastRetryMaxAttempts": { + "maximum": 10, + "minimum": 0, + "type": "integer", + "description": "Fast-retry attempts after failure. Null or 0 disables", + "format": "int32", + "nullable": true + }, + "definitionId": { + "type": "string", + "description": "Existing definition to reuse for a sibling monitor", + "format": "uuid", + "nullable": true + }, + "package": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorPackageSpec" + } + ] + } + } + }, + "CreateNotificationPolicyRequest": { + "required": [ + "escalation", + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Human-readable name for this policy" + }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional note; omit or null when unused", + "nullable": true + }, + "matchRules": { + "type": "array", + "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MatchRule" + } + }, + "escalation": { + "$ref": "#/components/schemas/EscalationChain" + }, + "enabled": { + "type": "boolean", + "description": "Whether this policy is enabled (default true)", + "nullable": true, + "default": true + }, + "priority": { + "type": "integer", + "description": "Evaluation priority; higher value = evaluated first (default 0)", + "format": "int32", + "nullable": true, + "default": 0 + } + }, + "description": "Request body for creating a notification policy" + }, + "CreatePackageUploadRequest": { + "required": [ + "digest" + ], + "type": "object", + "properties": { + "digest": { + "maxLength": 64, + "minLength": 64, + "type": "string", + "description": "SHA-256 hex digest of the package zip to upload (64 chars)" + } + } + }, + "CreateResourceGroupRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Human-readable name for this group" + }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional description (max 500)", + "nullable": true + }, + "alertPolicyId": { + "type": "string", + "description": "Optional notification policy to apply for this group", + "format": "uuid", + "nullable": true + }, + "defaultFrequency": { + "maximum": 86400, + "minimum": 30, + "type": "integer", + "description": "Default check frequency in seconds applied to members (30\u201386400)", + "format": "int32", + "nullable": true + }, + "defaultRegions": { + "type": "array", + "description": "Default regions applied to member monitors", + "nullable": true, + "items": { "type": "string", - "description": "Custom HTTP headers for webhook requests", - "nullable": true - }, - "description": "Custom HTTP headers for webhook requests", + "description": "Default regions applied to member monitors" + } + }, + "defaultRetryStrategy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RetryStrategy" + } + ] + }, + "defaultAlertChannels": { + "type": "array", + "description": "Default alert channel IDs applied to member monitors", + "nullable": true, + "items": { + "type": "string", + "description": "Default alert channel IDs applied to member monitors", + "format": "uuid" + } + }, + "defaultEnvironmentId": { + "type": "string", + "description": "Default environment ID applied to member monitors", + "format": "uuid", "nullable": true }, - "chatId": { + "healthThresholdType": { + "type": "string", + "description": "Health threshold type: COUNT or PERCENTAGE", + "nullable": true, + "enum": [ + "COUNT", + "PERCENTAGE" + ] + }, + "healthThresholdValue": { + "maximum": 100, + "exclusiveMaximum": false, + "minimum": 0, + "exclusiveMinimum": false, + "type": "number", + "description": "Health threshold value: count (0+) or percentage (0\u2013100)", + "nullable": true + }, + "suppressMemberAlerts": { + "type": "boolean", + "description": "Suppress member-level alert notifications when group manages alerting", + "nullable": true + }, + "confirmationDelaySeconds": { + "maximum": 600, + "minimum": 0, + "type": "integer", + "description": "Confirmation delay in seconds before group incident creation (0\u2013600)", + "format": "int32", + "nullable": true + }, + "recoveryCooldownMinutes": { + "maximum": 60, + "minimum": 0, + "type": "integer", + "description": "Recovery cooldown in minutes after group incident resolves (0\u201360)", + "format": "int32", + "nullable": true + }, + "managedBy": { + "type": "string", + "description": "Source creating this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + "description": "Request body for creating a resource group" + }, + "CreateSecretRequest": { + "required": [ + "key", + "value" + ], + "type": "object", + "properties": { + "key": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Unique secret key within the workspace (max 255 chars)" + }, + "value": { + "maxLength": 32768, + "minLength": 0, + "type": "string", + "description": "Secret value, stored encrypted (max 32KB)" + } + } + }, + "CreateStatusPageComponentGroupRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Group display name" + }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional group description", + "nullable": true + }, + "displayOrder": { + "type": "integer", + "description": "Position in the group list", + "format": "int32", + "nullable": true + }, + "defaultOpen": { + "type": "boolean", + "description": "Initial expand/collapse state when a visitor first loads the page; renderer may auto-expand on active incidents (default: true)", + "nullable": true + } + } + }, + "CreateStatusPageComponentRequest": { + "required": [ + "name", + "type" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Component display name" + }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional description shown on expand", + "nullable": true + }, + "type": { + "type": "string", + "description": "Component type: MONITOR, GROUP, STATIC, or DEPENDENCY", + "enum": [ + "MONITOR", + "GROUP", + "STATIC", + "DEPENDENCY" + ] + }, + "monitorId": { + "type": "string", + "description": "Monitor ID (required when type=MONITOR)", + "format": "uuid", + "nullable": true + }, + "resourceGroupId": { + "type": "string", + "description": "Resource group ID (required when type=GROUP)", + "format": "uuid", + "nullable": true + }, + "serviceSubscriptionId": { + "type": "string", + "description": "Service subscription (Dependency) ID \u2014 required when type=DEPENDENCY. Bind an existing org subscription; catalog picks must create the subscription first, then pass its id", + "format": "uuid", + "nullable": true + }, + "groupId": { + "type": "string", + "description": "Component group ID for visual grouping", + "format": "uuid", + "nullable": true + }, + "showUptime": { + "type": "boolean", + "description": "Whether to show the uptime bar (default: true; false for DEPENDENCY)", + "nullable": true + }, + "displayOrder": { + "type": "integer", + "description": "Position in the component list", + "format": "int32", + "nullable": true + }, + "excludeFromOverall": { + "type": "boolean", + "description": "Exclude from overall status calculation (default: false; true for DEPENDENCY)", + "nullable": true + }, + "startDate": { + "type": "string", + "description": "Date from which to start showing uptime; defaults to component creation. Set earlier to backdate (e.g. launch day); clamped at the monitor's createdAt for MONITOR-type components", + "format": "date", + "nullable": true + } + } + }, + "CreateStatusPageIncidentRequest": { + "required": [ + "body", + "impact", + "title" + ], + "type": "object", + "properties": { + "title": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Customer-facing incident title" + }, + "status": { + "type": "string", + "description": "Initial status (default: INVESTIGATING)", + "nullable": true, + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "impact": { + "type": "string", + "description": "Impact level: NONE, MINOR, MAJOR, or CRITICAL", + "enum": [ + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" + ] + }, + "body": { + "minLength": 1, + "type": "string", + "description": "Initial update body in markdown" + }, + "affectedComponents": { + "type": "array", + "description": "Component IDs affected by this incident", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AffectedComponent" + } + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to email confirmed subscribers about this incident (default: true)", + "nullable": true + }, + "monitoringIncidentId": { + "type": "string", + "description": "Monitoring incident ID to link this status page incident to; null for standalone", + "format": "uuid", + "nullable": true + } + } + }, + "CreateStatusPageIncidentUpdateRequest": { + "required": [ + "body", + "status" + ], + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Incident status at this point in the timeline", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "body": { + "minLength": 1, + "type": "string", + "description": "Update body in markdown" + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to email confirmed subscribers about this update (default: true)", + "nullable": true + }, + "affectedComponents": { + "type": "array", + "description": "Updated affected components; null preserves current", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AffectedComponent" + } + } + } + }, + "CreateStatusPageMaintenanceRequest": { + "required": [ + "body", + "impact", + "scheduledFor", + "title" + ], + "type": "object", + "properties": { + "title": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Customer-facing maintenance title" + }, + "status": { + "type": "string", + "description": "Initial status (default: INVESTIGATING)", + "nullable": true, + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "impact": { + "type": "string", + "description": "Impact level: NONE, MINOR, MAJOR, or CRITICAL", + "enum": [ + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" + ] + }, + "body": { + "minLength": 1, + "type": "string", + "description": "Initial update body in markdown" + }, + "affectedComponents": { + "type": "array", + "description": "Component IDs affected by this window", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AffectedComponent" + } + }, + "scheduledFor": { + "type": "string", + "description": "Maintenance start time", + "format": "date-time" + }, + "scheduledUntil": { + "type": "string", + "description": "Maintenance end time", + "format": "date-time", + "nullable": true + }, + "autoResolve": { + "type": "boolean", + "description": "Auto-resolve at scheduledUntil (default: false)", + "nullable": true + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to email confirmed subscribers about this window (default: true)", + "nullable": true + } + } + }, + "CreateStatusPageRequest": { + "required": [ + "name", + "slug" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Human-readable name for this status page" + }, + "slug": { + "maxLength": 63, + "minLength": 3, + "pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$", + "type": "string", + "description": "URL slug (lowercase, hyphens, globally unique)" + }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional description shown below the page header", + "nullable": true + }, + "branding": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/StatusPageBranding" + } + ] + }, + "visibility": { + "type": "string", + "description": "Page visibility: PUBLIC, PASSWORD, or IP_RESTRICTED (default: PUBLIC)", + "nullable": true, + "enum": [ + "PUBLIC", + "PASSWORD", + "IP_RESTRICTED" + ] + }, + "enabled": { + "type": "boolean", + "description": "Whether the page is enabled (default: true)", + "nullable": true + }, + "incidentMode": { + "type": "string", + "description": "Incident mode: MANUAL, REVIEW, or AUTOMATIC (default: AUTOMATIC)", + "nullable": true, + "enum": [ + "MANUAL", + "REVIEW", + "AUTOMATIC" + ] + }, + "managedBy": { + "type": "string", + "description": "Source creating this page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + } + }, + "CreateTagRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "Tag name, unique within the org" + }, + "color": { + "pattern": "^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", + "type": "string", + "description": "Hex color code (defaults to #6B7280 if omitted)", + "nullable": true + } + }, + "description": "Request body for creating a tag" + }, + "CreateWebhookEndpointRequest": { + "required": [ + "subscribedEvents", + "url" + ], + "type": "object", + "properties": { + "url": { + "maxLength": 2048, + "minLength": 0, "type": "string", - "description": "Telegram chat ID", - "nullable": true + "description": "HTTPS endpoint that receives webhook event payloads" }, - "priority": { + "description": { + "maxLength": 255, + "minLength": 0, "type": "string", - "description": "Pushover notification priority override", + "description": "Optional human-readable description", "nullable": true }, - "channel": { + "subscribedEvents": { + "minItems": 1, + "type": "array", + "description": "Event types to deliver", + "items": { + "minLength": 1, + "type": "string", + "enum": [ + "monitor.created", + "monitor.updated", + "monitor.deleted", + "incident.created", + "incident.resolved", + "incident.reopened", + "service.status_changed", + "service.component_changed", + "service.incident_created", + "service.incident_updated", + "service.incident_resolved" + ] + } + } + } + }, + "CreateWorkspaceRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "minLength": 1, "type": "string", - "description": "Mattermost channel override", - "nullable": true - }, - "routingKey": { + "description": "Workspace name" + } + }, + "description": "Create a new workspace within the organization" + }, + "CreditPolicy": { + "type": "object", + "properties": { + "summary": { "type": "string", - "description": "Splunk On-Call routing key", + "description": "Brief summary of credit policy", "nullable": true }, - "deviceIden": { - "type": "string", - "description": "Pushbullet target device identifier", + "maxCreditPercent": { + "type": "integer", + "description": "Max credit as percent of monthly fee", + "format": "int32", "nullable": true }, - "teamId": { - "type": "string", - "description": "Linear team ID for issue creation", + "claimWindowDays": { + "type": "integer", + "description": "Days to submit a credit claim after eligibility", + "format": "int32", "nullable": true }, - "visibility": { - "type": "string", - "description": "incident.io incident visibility", + "creditApplicationDays": { + "type": "integer", + "description": "Days for credit to be applied after approval", + "format": "int32", "nullable": true }, - "severity": { + "tiers": { + "type": "array", + "description": "Credit tiers by uptime threshold", + "nullable": true, + "items": { + "$ref": "#/components/schemas/CreditTier" + } + } + }, + "description": "Service credit policy for SLA violations" + }, + "CreditTier": { + "required": [ + "uptimeRange" + ], + "type": "object", + "properties": { + "uptimeRange": { "type": "string", - "description": "Rootly incident severity slug", - "nullable": true + "description": "Uptime range, e.g. '99.1% \u2013 99.98%'" }, - "site": { - "type": "string", - "description": "Datadog site region", + "creditPercent": { + "type": "integer", + "description": "Credit percent of monthly fee", + "format": "int32", "nullable": true }, - "projectKey": { + "formula": { "type": "string", - "description": "Jira project key", + "description": "Credit formula when percent is not a fixed number", "nullable": true }, - "phoneNumber": { + "notes": { "type": "string", - "description": "Recipient phone number in E.164 format (SMS / phone-call channels)", + "description": "Additional notes on this credit tier", "nullable": true + } + }, + "description": "Credit tiers by uptime threshold" + }, + "CursorPageCheckResultDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/CheckResultDto" + } }, - "verifiedPhoneNumberId": { - "type": "integer", - "description": "Id of the org verified_phone_number row bound to this channel", - "format": "int64", + "nextCursor": { + "type": "string", + "description": "Opaque cursor for the next page; null when there are no more results", "nullable": true }, - "phoneNumbers": { + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageIncidentActivityEventDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { "type": "array", - "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients", - "nullable": true, + "description": "Items on this page", "items": { - "type": "string", - "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients" + "$ref": "#/components/schemas/IncidentActivityEventDto" } }, - "voiceLanguage": { + "nextCursor": { "type": "string", - "description": "BCP-47 voice language for phone-call TTS (e.g. en-US, de-DE)", + "description": "Opaque cursor for the next page; null when there are no more results", "nullable": true }, - "preferredLanguage": { + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageNotificationDispatchDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/NotificationDispatchDto" + } + }, + "nextCursor": { "type": "string", - "description": "Preferred language for SMS/voice (BCP-47, e.g. en-US, de-DE)", + "description": "Opaque cursor for the next page; null when there are no more results", "nullable": true + }, + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" } }, - "description": "Non-sensitive alert channel configuration metadata" + "description": "Cursor-paginated response for time-series and append-only data" }, - "AlertChannelDto": { + "CursorPageRunDto": { "required": [ - "channelType", - "createdAt", - "enabled", - "id", - "name", - "updatedAt" + "data", + "hasMore" ], "type": "object", "properties": { - "id": { - "type": "string", - "description": "Unique alert channel identifier", - "format": "uuid" + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/RunDto" + } }, - "name": { + "nextCursor": { "type": "string", - "description": "Human-readable channel name" + "description": "Opaque cursor for the next page; null when there are no more results", + "nullable": true }, - "channelType": { - "type": "string", - "description": "Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL)", - "enum": [ - "email", - "webhook", - "slack", - "pagerduty", - "opsgenie", - "teams", - "discord", - "telegram", - "google_chat", - "pushover", - "mattermost", - "splunk_oncall", - "pushbullet", - "linear", - "incident_io", - "rootly", - "zapier", - "datadog", - "jira", - "gitlab", - "sms", - "phone_call" - ] + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageServiceCatalogDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/ServiceCatalogDto" + } }, - "displayConfig": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/AlertChannelDisplayConfig" - } - ] + "nextCursor": { + "type": "string", + "description": "Opaque cursor for the next page; null when there are no more results", + "nullable": true }, - "enabled": { + "hasMore": { "type": "boolean", - "description": "Whether this channel is enabled and will receive alerts" + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageServicePollResultDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/ServicePollResultDto" + } }, - "createdAt": { + "nextCursor": { "type": "string", - "description": "Timestamp when the channel was created", - "format": "date-time" + "description": "Opaque cursor for the next page; null when there are no more results", + "nullable": true }, - "updatedAt": { - "type": "string", - "description": "Timestamp when the channel was last updated", - "format": "date-time" + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageStatusEventDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/StatusEventDto" + } }, - "configHash": { + "nextCursor": { "type": "string", - "description": "SHA-256 hash of the channel config; use for change detection", + "description": "Opaque cursor for the next page; null when there are no more results", "nullable": true }, - "managedBy": { + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, + "DashboardOverviewDto": { + "required": [ + "incidents", + "monitors" + ], + "type": "object", + "properties": { + "monitors": { + "$ref": "#/components/schemas/MonitorsSummaryDto" + }, + "incidents": { + "$ref": "#/components/schemas/IncidentsSummaryDto" + } + }, + "description": "Combined dashboard overview for monitors and incidents" + }, + "DatadogChannelConfig": { + "required": [ + "channelType", + "apiKey" + ], + "type": "object", + "properties": { + "channelType": { "type": "string", - "description": "Source that created/owns this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on channels created before this attribution column existed.", - "nullable": true, "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" + "datadog" ] }, - "lastDeliveryAt": { + "apiKey": { + "minLength": 1, "type": "string", - "description": "Timestamp of the most recent delivery attempt", - "format": "date-time", + "description": "Datadog API key" + }, + "site": { + "type": "string", + "description": "Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)", "nullable": true }, - "lastDeliveryStatus": { + "tags": { "type": "string", - "description": "Outcome of the most recent delivery (SUCCESS, FAILED, etc.)", + "description": "Comma-separated tags to attach to events", "nullable": true } - }, - "description": "Alert channel with non-sensitive configuration metadata" + } }, - "AlertDeliveryDto": { + "DayIncident": { "required": [ - "channel", - "channelId", - "channelType", - "createdAt", - "eventType", + "affectedComponentIds", + "affectedComponentNames", "id", - "incidentId", + "impact", "status", - "stepNumber", - "fireCount", - "attemptCount" + "title", + "scheduled" ], "type": "object", "properties": { "id": { "type": "string", + "description": "Status page incident UUID", "format": "uuid" }, - "incidentId": { + "title": { "type": "string", - "description": "Incident that triggered this delivery", - "format": "uuid" + "description": "Incident title" }, - "dispatchId": { + "status": { "type": "string", - "description": "Notification dispatch that created this delivery", - "format": "uuid", - "nullable": true + "description": "Lifecycle status (investigating, identified, monitoring, resolved, \u2026)", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] }, - "channelId": { + "impact": { "type": "string", - "description": "Alert channel ID", - "format": "uuid" + "description": "Severity bucket (none, minor, major, critical)", + "enum": [ + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" + ] }, - "channel": { - "type": "string", - "description": "Human-readable channel name" + "scheduled": { + "type": "boolean", + "description": "True for a maintenance window; false for an incident" }, - "channelType": { + "startedAt": { "type": "string", - "description": "Alert channel type (e.g. slack, email, webhook)" + "description": "Incident start timestamp", + "format": "date-time", + "nullable": true }, - "status": { + "resolvedAt": { "type": "string", - "description": "Current delivery status", - "enum": [ - "PENDING", - "DELIVERED", - "RETRY_PENDING", - "FAILED", - "CANCELLED", - "SKIPPED_NO_CREDIT", - "SKIPPED_UNVERIFIED", - "SKIPPED_OPTED_OUT", - "SKIPPED_RATE_LIMITED" - ] + "description": "Incident resolved timestamp; null while still active", + "format": "date-time", + "nullable": true }, - "eventType": { - "type": "string", - "description": "Incident lifecycle event that triggered this delivery", - "enum": [ - "INCIDENT_CREATED", - "INCIDENT_RESOLVED", - "INCIDENT_REOPENED" - ] + "affectedComponentNames": { + "type": "array", + "description": "Display names of components affected by this incident (deduplicated)", + "items": { + "type": "string", + "description": "Display names of components affected by this incident (deduplicated)" + } }, - "stepNumber": { - "type": "integer", - "description": "1-based escalation step this delivery belongs to", - "format": "int32" + "affectedComponentIds": { + "type": "array", + "description": "UUIDs of components this incident affected", + "items": { + "type": "string", + "description": "UUIDs of components this incident affected", + "format": "uuid" + } + } + }, + "description": "Incident that overlapped the day" + }, + "DefinitionDetailDto": { + "required": [ + "definition", + "heads" + ], + "type": "object", + "properties": { + "definition": { + "$ref": "#/components/schemas/DefinitionDto" }, - "fireCount": { - "type": "integer", - "description": "Fire sequence within the step: 1 = initial, 2+ = repeat re-fires", - "format": "int32" + "heads": { + "type": "array", + "description": "Active Heads per environment", + "items": { + "$ref": "#/components/schemas/DefinitionHeadDto" + } + } + }, + "description": "Definition with Heads for each environment" + }, + "DefinitionDto": { + "required": [ + "createdAt", + "id", + "name", + "slug", + "updatedAt", + "organizationId" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Definition identifier", + "format": "uuid" }, - "attemptCount": { + "organizationId": { "type": "integer", - "description": "Number of delivery attempts made", + "description": "Organization this definition belongs to", "format": "int32" }, - "lastAttemptAt": { - "type": "string", - "description": "When the last attempt was made", - "format": "date-time", - "nullable": true - }, - "nextRetryAt": { + "name": { + "minLength": 1, "type": "string", - "description": "When the next retry is scheduled (null if not retrying)", - "format": "date-time", - "nullable": true + "description": "Human-readable name" }, - "deliveredAt": { + "slug": { + "minLength": 1, "type": "string", - "description": "Timestamp when the delivery was confirmed (null if not yet delivered)", - "format": "date-time", - "nullable": true + "description": "URL-safe slug unique within the organization" }, - "errorMessage": { + "createdAt": { "type": "string", - "description": "Error message from the last failed attempt", - "nullable": true + "description": "When the definition was created", + "format": "date-time" }, - "createdAt": { + "updatedAt": { "type": "string", + "description": "When the definition was last updated", "format": "date-time" } }, - "description": "Delivery record for a single channel within a notification dispatch" + "description": "Code-monitor definition" }, - "ApiKeyAuthConfig": { + "DefinitionHeadDto": { "required": [ - "type", - "headerName" + "activatedAt", + "definitionId", + "environment", + "revision" ], "type": "object", "properties": { - "type": { + "definitionId": { "type": "string", - "enum": [ - "api_key" - ] + "description": "Definition this Head belongs to", + "format": "uuid" }, - "headerName": { - "minLength": 1, - "pattern": "^[A-Za-z0-9\\-_]+$", + "environment": { + "$ref": "#/components/schemas/EnvironmentDto" + }, + "revision": { + "$ref": "#/components/schemas/RevisionDto" + }, + "activatedAt": { "type": "string", - "description": "HTTP header name that carries the API key" + "description": "When this Head last activated", + "format": "date-time" }, - "vaultSecretId": { + "activatedBy": { "type": "string", - "description": "Vault secret ID for the API key value", - "format": "uuid", + "description": "Who last activated this Head", + "nullable": true + }, + "reason": { + "type": "string", + "description": "Rollback reason when this Head was restored", "nullable": true } - } + }, + "description": "Active Head for a definition in one environment" }, - "ApiKeyCreateResponse": { + "DekRotationResultDto": { "required": [ - "createdAt", - "key", - "name", - "id" + "rotatedAt", + "previousDekVersion", + "newDekVersion", + "secretsReEncrypted", + "channelsReEncrypted" ], "type": "object", "properties": { - "id": { + "previousDekVersion": { "type": "integer", - "description": "Unique API key identifier", + "description": "DEK version before rotation", "format": "int32" }, - "name": { - "minLength": 1, - "type": "string", - "description": "Human-readable name for this API key" + "newDekVersion": { + "type": "integer", + "description": "DEK version after rotation", + "format": "int32" }, - "key": { - "minLength": 1, - "type": "string", - "description": "Full API key value in dh_live_* format; store this now" + "secretsReEncrypted": { + "type": "integer", + "description": "Number of secrets re-encrypted with the new DEK", + "format": "int32" }, - "createdAt": { + "channelsReEncrypted": { + "type": "integer", + "description": "Number of alert channels re-encrypted with the new DEK", + "format": "int32" + }, + "rotatedAt": { "type": "string", - "description": "Timestamp when the key was created", + "description": "Timestamp when the rotation was performed", "format": "date-time" + } + }, + "description": "Result of a data encryption key rotation operation" + }, + "DeleteChannelResult": { + "type": "object", + "properties": { + "affectedPolicies": { + "type": "integer", + "description": "Number of notification policies whose escalation steps were modified", + "format": "int32" }, - "expiresAt": { - "type": "string", - "description": "Timestamp when the key expires; null if no expiration", - "format": "date-time", - "nullable": true + "disabledPolicies": { + "type": "integer", + "description": "Number of notification policies disabled because they had no remaining channels", + "format": "int32" } }, - "description": "Created API key with the full key value — store it now, it won't be shown again" + "description": "Summary of policies affected by channel deletion", + "required": [ + "affectedPolicies", + "disabledPolicies" + ] }, - "ApiKeyDto": { + "DeliveryAttemptDto": { "required": [ - "createdAt", - "key", - "name", - "updatedAt", - "id" + "attemptedAt", + "deliveryId", + "id", + "status", + "attemptNumber" ], "type": "object", "properties": { "id": { + "type": "string", + "format": "uuid" + }, + "deliveryId": { + "type": "string", + "format": "uuid" + }, + "attemptNumber": { "type": "integer", - "description": "Unique API key identifier", + "description": "1-based attempt number", "format": "int32" }, - "name": { - "minLength": 1, + "status": { "type": "string", - "description": "Human-readable name for this API key" + "description": "Outcome: SUCCESS, FAILED, TIMEOUT, ERROR" }, - "key": { - "minLength": 1, - "type": "string", - "description": "Full API key value in dh_live_* format" + "responseStatusCode": { + "type": "integer", + "description": "HTTP response status code from the external service", + "format": "int32", + "nullable": true }, - "createdAt": { + "requestPayload": { "type": "string", - "description": "Timestamp when the key was created", - "format": "date-time" + "description": "JSON payload sent to the external service", + "nullable": true }, - "updatedAt": { + "responseBody": { "type": "string", - "description": "Timestamp when the key was last updated", - "format": "date-time" + "description": "Response body from the external service (truncated)", + "nullable": true }, - "lastUsedAt": { + "errorMessage": { "type": "string", - "description": "Timestamp of the most recent API call; null if never used", - "format": "date-time", + "description": "Error message if the attempt failed", "nullable": true }, - "revokedAt": { - "type": "string", - "description": "Timestamp when the key was revoked; null if active", - "format": "date-time", + "responseTimeMs": { + "type": "integer", + "description": "Round-trip time in milliseconds", + "format": "int32", "nullable": true }, - "expiresAt": { + "externalId": { "type": "string", - "description": "Timestamp when the key expires; null if no expiration", - "format": "date-time", + "description": "External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID)", + "nullable": true + }, + "requestHeaders": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "HTTP request headers sent to the external service", + "nullable": true + }, + "description": "HTTP request headers sent to the external service", "nullable": true + }, + "attemptedAt": { + "type": "string", + "format": "date-time" } }, - "description": "API key for programmatic access to the DevHelm API" + "description": "Single delivery attempt with request/response audit data" }, - "AssertionResultDto": { + "DeployLockDto": { "required": [ - "severity", - "type", - "passed" + "expiresAt", + "id", + "lockedAt", + "lockedBy" ], "type": "object", "properties": { - "type": { - "type": "string", - "description": "Assertion type", - "example": "status_code" - }, - "passed": { - "type": "boolean", - "description": "Whether the assertion passed" - }, - "severity": { + "id": { "type": "string", - "description": "Assertion severity", - "enum": [ - "fail", - "warn" - ] + "description": "Unique lock identifier", + "format": "uuid" }, - "message": { + "lockedBy": { + "minLength": 1, "type": "string", - "description": "Human-readable result message", - "nullable": true + "description": "Identity of the lock holder (e.g. CLI session ID, username)" }, - "expected": { + "lockedAt": { "type": "string", - "description": "Expected value", - "nullable": true, - "example": "200" + "description": "Timestamp when the lock was acquired", + "format": "date-time" }, - "actual": { + "expiresAt": { "type": "string", - "description": "Actual value observed", - "nullable": true, - "example": "503" + "description": "Timestamp when the lock automatically expires", + "format": "date-time" } }, - "description": "Result of evaluating a single assertion against a check result" + "description": "Represents an active deploy lock for a workspace" }, - "AssertionTestResultDto": { + "DiscordChannelConfig": { "required": [ - "assertionType", - "message", - "severity", - "passed" + "channelType", + "webhookUrl" ], "type": "object", "properties": { - "assertionType": { - "type": "string", - "description": "Assertion type evaluated", - "enum": [ - "status_code", - "response_time", - "body_contains", - "json_path", - "header_value", - "regex_body", - "dns_resolves", - "dns_response_time", - "dns_expected_ips", - "dns_expected_cname", - "dns_record_contains", - "dns_record_equals", - "dns_txt_contains", - "dns_min_answers", - "dns_max_answers", - "dns_response_time_warn", - "dns_ttl_low", - "dns_ttl_high", - "mcp_connects", - "mcp_response_time", - "mcp_has_capability", - "mcp_tool_available", - "mcp_min_tools", - "mcp_protocol_version", - "mcp_response_time_warn", - "mcp_tool_count_changed", - "ssl_expiry", - "response_size", - "redirect_count", - "redirect_target", - "response_time_warn", - "tcp_connects", - "tcp_response_time", - "tcp_response_time_warn", - "icmp_reachable", - "icmp_response_time", - "icmp_response_time_warn", - "icmp_packet_loss", - "heartbeat_received", - "heartbeat_max_interval", - "heartbeat_interval_drift", - "heartbeat_payload_contains" - ] - }, - "passed": { - "type": "boolean", - "description": "Whether the assertion passed" - }, - "severity": { + "channelType": { "type": "string", - "description": "Assertion severity: FAIL or WARN", "enum": [ - "fail", - "warn" + "discord" ] }, - "message": { - "type": "string", - "description": "Human-readable result description" - }, - "expected": { + "webhookUrl": { + "minLength": 1, "type": "string", - "description": "Expected value", - "nullable": true + "description": "Discord webhook URL" }, - "actual": { + "mentionRoleId": { "type": "string", - "description": "Actual value observed during the test", + "description": "Optional Discord role ID to mention in notifications", "nullable": true } } }, - "AuditEventDto": { - "required": [ - "action", - "createdAt", - "id" - ], + "Dns": { "type": "object", + "description": "DNS check-type-specific details", "properties": { - "id": { - "type": "integer", - "description": "Unique audit event identifier", - "format": "int64" - }, - "actorId": { - "type": "integer", - "description": "User ID who performed the action; null for system actions", - "format": "int32", - "nullable": true + "check_type": { + "type": "string", + "enum": [ + "dns" + ] }, - "actorEmail": { + "hostname": { "type": "string", - "description": "Email of the actor; null for system actions", + "description": "Target hostname", "nullable": true }, - "action": { - "type": "string", - "description": "Audit action type (e.g. monitor.created, api_key.revoked)" + "requestedTypes": { + "type": "array", + "description": "Requested DNS record types", + "nullable": true, + "items": { + "type": "string", + "description": "Requested DNS record types", + "nullable": true + } }, - "resourceType": { + "usedResolver": { "type": "string", - "description": "Type of resource affected (e.g. monitor, api_key)", + "description": "Resolver used for lookup", "nullable": true }, - "resourceId": { - "type": "string", - "description": "ID of the affected resource", + "records": { + "type": "object", + "additionalProperties": { + "type": "array", + "description": "Resolved DNS records keyed by record type", + "nullable": true, + "items": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Resolved DNS records keyed by record type", + "nullable": true + }, + "description": "Resolved DNS records keyed by record type", + "nullable": true + } + }, + "description": "Resolved DNS records keyed by record type", "nullable": true }, - "resourceName": { + "attempts": { + "type": "array", + "description": "DNS resolution attempts", + "nullable": true, + "items": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "DNS resolution attempts", + "nullable": true + }, + "description": "DNS resolution attempts", + "nullable": true + } + }, + "failureKind": { "type": "string", - "description": "Human-readable name of the affected resource", + "description": "Kind of DNS failure, if any", "nullable": true - }, - "metadata": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/AuditMetadata" - } + } + }, + "required": [ + "check_type" + ] + }, + "DnsExpectedCnameAssertion": { + "required": [ + "type", + "value" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_expected_cname" ] }, - "createdAt": { + "value": { + "minLength": 1, "type": "string", - "description": "Timestamp when the action was performed", - "format": "date-time" + "description": "Expected CNAME target the resolution must include" } } }, - "AuditMetadata": { - "description": "Typed metadata payload attached to an audit event; null for actions that carry no extra context.", - "nullable": true, - "discriminator": { - "propertyName": "kind", - "mapping": { - "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata" - } - }, - "oneOf": [ - { - "$ref": "#/components/schemas/MemberRoleChangedMetadata" + "DnsExpectedIpsAssertion": { + "required": [ + "type", + "ips" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_expected_ips" + ] + }, + "ips": { + "minItems": 1, + "type": "array", + "description": "Allowed IP addresses; at least one resolved address must match", + "items": { + "type": "string", + "description": "Allowed IP addresses; at least one resolved address must match" + } } - ] + } }, - "AuthMeResponse": { + "DnsMaxAnswersAssertion": { "required": [ - "key", - "organization", - "plan", - "rateLimits" + "type", + "recordType", + "max" ], "type": "object", "properties": { - "key": { - "$ref": "#/components/schemas/KeyInfo" - }, - "organization": { - "$ref": "#/components/schemas/OrgInfo" + "type": { + "type": "string", + "enum": [ + "dns_max_answers" + ] }, - "plan": { - "$ref": "#/components/schemas/PlanInfo" + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type whose answer count is checked" }, - "rateLimits": { - "$ref": "#/components/schemas/RateLimitInfo" + "max": { + "type": "integer", + "description": "Maximum number of answers allowed for that record type", + "format": "int32" } - }, - "description": "Identity, organization, plan, and rate-limit info for the authenticated API key" + } }, - "BasicAuthConfig": { + "DnsMinAnswersAssertion": { + "required": [ + "type", + "recordType", + "min" + ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "basic" + "dns_min_answers" ] }, - "vaultSecretId": { + "recordType": { + "minLength": 1, "type": "string", - "description": "Vault secret ID holding Basic auth username and password", - "format": "uuid", - "nullable": true + "description": "DNS record type whose answer count is checked" + }, + "min": { + "type": "integer", + "description": "Minimum number of answers required for that record type", + "format": "int32" } - }, - "required": [ - "type" - ] + } }, - "BatchComponentUptimeDto": { + "DnsMonitorConfig": { "required": [ - "components" + "hostname" ], "type": "object", "properties": { - "components": { - "type": "object", - "additionalProperties": { - "type": "array", - "description": "Map of component ID → list of per-day uptime entries (oldest → newest)", - "items": { - "$ref": "#/components/schemas/ComponentUptimeDayDto" - } - }, - "description": "Map of component ID → list of per-day uptime entries (oldest → newest)" + "hostname": { + "minLength": 1, + "type": "string", + "description": "Domain name to resolve" + }, + "recordTypes": { + "type": "array", + "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", + "nullable": true, + "items": { + "type": "string", + "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", + "nullable": true, + "enum": [ + "A", + "AAAA", + "CNAME", + "MX", + "NS", + "TXT", + "SRV", + "SOA", + "CAA", + "PTR" + ] + } + }, + "nameservers": { + "type": "array", + "description": "Custom nameservers to query (uses system defaults if omitted)", + "nullable": true, + "items": { + "type": "string", + "description": "Custom nameservers to query (uses system defaults if omitted)", + "nullable": true + } + }, + "timeoutMs": { + "type": "integer", + "description": "Per-query timeout in milliseconds", + "format": "int32", + "nullable": true + }, + "totalTimeoutMs": { + "type": "integer", + "description": "Total timeout for all queries in milliseconds", + "format": "int32", + "nullable": true } - }, - "description": "Batch daily uptime per component, keyed by component ID" + } }, - "BearerAuthConfig": { + "DnsRecordContainsAssertion": { + "required": [ + "type", + "recordType", + "substring" + ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "bearer" + "dns_record_contains" ] }, - "vaultSecretId": { + "recordType": { + "minLength": 1, "type": "string", - "description": "Vault secret ID holding the bearer token value", - "format": "uuid", - "nullable": true + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in a matching record value" } - }, - "required": [ - "type" - ] + } }, - "BodyContainsAssertion": { + "DnsRecordEqualsAssertion": { "required": [ "type", - "substring" + "recordType", + "value" ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "body_contains" + "dns_record_equals" ] }, - "substring": { + "recordType": { "minLength": 1, "type": "string", - "description": "Substring that must appear in the response body" + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "value": { + "minLength": 1, + "type": "string", + "description": "Expected DNS record value for an exact match" } } }, - "BulkMonitorActionRequest": { - "required": [ - "action", - "monitorIds" - ], + "DnsResolvesAssertion": { "type": "object", "properties": { - "monitorIds": { - "maxItems": 200, - "minItems": 0, - "type": "array", - "description": "IDs of monitors to act on (max 200)", - "items": { - "type": "string", - "description": "IDs of monitors to act on (max 200)", - "format": "uuid" - } - }, - "action": { + "type": { "type": "string", - "description": "Action to apply to every monitor in the bulk request", "enum": [ - "PAUSE", - "RESUME", - "DELETE", - "ADD_TAG", - "REMOVE_TAG" + "dns_resolves" ] - }, - "tagIds": { - "type": "array", - "description": "Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)", - "nullable": true, - "items": { - "type": "string", - "description": "Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)", - "format": "uuid" - } - }, - "newTags": { - "type": "array", - "description": "New tags to create and attach (only for ADD_TAG)", - "nullable": true, - "items": { - "$ref": "#/components/schemas/NewTagRequest" - } } }, - "description": "Request body for performing a bulk action on multiple monitors" - }, - "BulkMonitorActionResult": { "required": [ - "failed", - "succeeded" - ], + "type" + ] + }, + "DnsResponseTimeAssertion": { "type": "object", "properties": { - "succeeded": { - "type": "array", - "description": "IDs of monitors on which the action succeeded", - "items": { - "type": "string", - "description": "IDs of monitors on which the action succeeded", - "format": "uuid" - } + "type": { + "type": "string", + "enum": [ + "dns_response_time" + ] }, - "failed": { - "type": "array", - "description": "Monitors on which the action failed, with the reason for each failure", - "items": { - "$ref": "#/components/schemas/FailureDetail" - } + "maxMs": { + "type": "integer", + "description": "Maximum allowed DNS resolution time in milliseconds", + "format": "int32" } }, - "description": "Result of a bulk monitor action, including partial-success details" - }, - "CategoryDto": { "required": [ - "category", - "serviceCount" - ], + "type", + "maxMs" + ] + }, + "DnsResponseTimeWarnAssertion": { "type": "object", "properties": { - "category": { + "type": { "type": "string", - "description": "Category name (e.g. CI/CD, Cloud, Payments)" + "enum": [ + "dns_response_time_warn" + ] }, - "serviceCount": { + "warnMs": { "type": "integer", - "description": "Number of services in this category", - "format": "int64" + "description": "DNS resolution time in milliseconds that triggers a warning only", + "format": "int32" } }, - "description": "Service category with its count of catalog entries" - }, - "ChangeRoleRequest": { "required": [ - "orgRole" - ], + "type", + "warnMs" + ] + }, + "DnsTtlHighAssertion": { "type": "object", "properties": { - "orgRole": { + "type": { "type": "string", - "description": "New role to assign", "enum": [ - "OWNER", - "ADMIN", - "MEMBER" + "dns_ttl_high" ] + }, + "maxTtl": { + "type": "integer", + "description": "Maximum TTL in seconds before a high-TTL warning is raised", + "format": "int32" } }, - "description": "Update an organization member's role" + "required": [ + "type", + "maxTtl" + ] }, - "ChangeStatusRequest": { + "DnsTtlLowAssertion": { "required": [ - "status" + "type", + "minTtl" ], "type": "object", "properties": { - "status": { + "type": { "type": "string", - "description": "New membership status (ACTIVE or SUSPENDED)", "enum": [ - "INVITED", - "ACTIVE", - "SUSPENDED", - "LEFT", - "REMOVED", - "DECLINED" + "dns_ttl_low" ] + }, + "minTtl": { + "type": "integer", + "description": "Minimum acceptable TTL in seconds before a warning is raised", + "format": "int32" } - }, - "description": "Update an organization member's status" + } }, - "ChartBucketDto": { + "DnsTxtContainsAssertion": { "required": [ - "bucket" + "type", + "substring" ], "type": "object", "properties": { - "bucket": { + "type": { "type": "string", - "description": "Start of the time bucket (ISO 8601)", - "format": "date-time", - "example": "2026-03-12T10:00:00Z" - }, - "uptimePercent": { - "type": "number", - "description": "Uptime percentage for this bucket; null when no data", - "format": "double", - "nullable": true, - "example": 100 - }, - "avgLatencyMs": { - "type": "number", - "description": "Weighted average latency in milliseconds for this bucket", - "format": "double", - "nullable": true, - "example": 120.3 - }, - "p95LatencyMs": { - "type": "number", - "description": "95th percentile latency in milliseconds (max across regions)", - "format": "double", - "nullable": true, - "example": 250 + "enum": [ + "dns_txt_contains" + ] }, - "p99LatencyMs": { - "type": "number", - "description": "99th percentile latency in milliseconds (max across regions)", - "format": "double", - "nullable": true, - "example": 480 + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in at least one TXT record" } - }, - "description": "Aggregated metrics for a time bucket" + } }, - "CheckResultDetailsDto": { + "EmailChannelConfig": { + "required": [ + "channelType", + "recipients" + ], "type": "object", "properties": { - "statusCode": { - "type": "integer", - "description": "HTTP status code of the response", - "format": "int32", - "nullable": true, - "example": 200 - }, - "responseHeaders": { - "type": "object", - "additionalProperties": { - "type": "array", - "description": "HTTP response headers", - "nullable": true, - "items": { - "type": "string", - "description": "HTTP response headers", - "nullable": true - } - }, - "description": "HTTP response headers", - "nullable": true - }, - "responseBodySnapshot": { + "channelType": { "type": "string", - "description": "Raw response body snapshot (may be HTML, XML, JSON, or plain text)", - "nullable": true + "enum": [ + "email" + ] }, - "assertionResults": { + "recipients": { + "minItems": 1, "type": "array", - "description": "Individual assertion evaluation results", - "nullable": true, + "description": "Email addresses to send notifications to", "items": { - "$ref": "#/components/schemas/AssertionResultDto" + "type": "string", + "description": "Email addresses to send notifications to", + "format": "email" } + } + } + }, + "EntitlementDto": { + "required": [ + "key", + "value", + "defaultValue", + "overridden" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Entitlement key" }, - "tlsInfo": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/TlsInfoDto" - } - ] - }, - "redirectCount": { + "value": { "type": "integer", - "description": "Number of HTTP redirects followed", - "format": "int32", - "nullable": true, - "example": 2 - }, - "redirectTarget": { - "type": "string", - "description": "Final URL after redirects", - "nullable": true + "description": "Effective limit value (overrides applied)", + "format": "int64" }, - "responseSizeBytes": { + "defaultValue": { "type": "integer", - "description": "Response body size in bytes", - "format": "int32", - "nullable": true, - "example": 4096 + "description": "Plan-tier default value before overrides", + "format": "int64" }, - "checkDetails": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/CheckTypeDetailsDto" - } - ] + "overridden": { + "type": "boolean", + "description": "Whether this entitlement has an org-level override" } }, - "description": "Type-specific details captured during a check execution" + "description": "A single resolved entitlement for the organization" }, - "CheckResultDto": { + "EnvironmentDto": { "required": [ + "createdAt", "id", - "region", - "timestamp", - "passed" + "name", + "slug", + "updatedAt", + "variables", + "orgId", + "monitorCount", + "isDefault" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique identifier of the check result", + "description": "Unique environment identifier", "format": "uuid" }, - "timestamp": { - "type": "string", - "description": "Timestamp when the check was executed (ISO 8601)", - "format": "date-time" - }, - "region": { - "type": "string", - "description": "Region where the check was executed", - "example": "us-east" - }, - "responseTimeMs": { + "orgId": { "type": "integer", - "description": "Response time in milliseconds", - "format": "int32", - "nullable": true, - "example": 123 - }, - "passed": { - "type": "boolean", - "description": "Whether the check passed", - "example": true + "description": "Organization this environment belongs to", + "format": "int32" }, - "failureReason": { + "name": { + "minLength": 1, "type": "string", - "description": "Reason for failure when passed=false", - "nullable": true + "description": "Human-readable environment name" }, - "severityHint": { + "slug": { + "minLength": 1, "type": "string", - "description": "Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing", - "nullable": true + "description": "URL-safe identifier" }, - "details": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/CheckResultDetailsDto" - } - ] + "variables": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Key-value variable pairs available for interpolation" + }, + "description": "Key-value variable pairs available for interpolation" + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the environment was created", + "format": "date-time" }, - "checkId": { + "updatedAt": { "type": "string", - "description": "Unique execution trace ID for cross-service correlation", - "format": "uuid", - "nullable": true + "description": "Timestamp when the environment was last updated", + "format": "date-time" + }, + "monitorCount": { + "type": "integer", + "description": "Number of monitors using this environment", + "format": "int32" + }, + "isDefault": { + "type": "boolean", + "description": "Whether this is the default environment for new monitors" } }, - "description": "A single check result from a monitor run" + "description": "Environment with variable substitutions for monitor configs" }, - "CheckTraceDto": { + "ErrorEntry": { "required": [ - "checkId", - "evaluations", - "transitions" + "code", + "message" ], "type": "object", "properties": { - "checkId": { + "code": { + "minLength": 1, "type": "string", - "description": "The check execution ID this trace is keyed by", - "format": "uuid" - }, - "evaluations": { - "type": "array", - "description": "All rule evaluations that ran for this check", - "items": { - "$ref": "#/components/schemas/RuleEvaluationDto" - } - }, - "transitions": { - "type": "array", - "description": "State-machine transitions this check caused (may be empty if nothing fired)", - "items": { - "$ref": "#/components/schemas/IncidentStateTransitionDto" - } + "description": "Stable machine-readable code; see ValidationErrorCode for the registry", + "example": "MONITOR_HEARTBEAT_GRACE_EXCEEDS_INTERVAL" }, - "policySnapshot": { + "field": { + "type": "string", + "description": "JSON-pointer-like path to the offending field, or null for request-wide errors", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PolicySnapshotDto" - } - ] - } - } - }, - "CheckTypeDetailsDto": { - "description": "Check-type-specific details — polymorphic by check_type discriminator", - "discriminator": { - "propertyName": "check_type", - "mapping": { - "http": "#/components/schemas/Http", - "tcp": "#/components/schemas/Tcp", - "icmp": "#/components/schemas/Icmp", - "dns": "#/components/schemas/Dns", - "mcp_server": "#/components/schemas/McpServer", - "code": "#/components/schemas/Code" - } - }, - "oneOf": [ - { - "$ref": "#/components/schemas/Http" - }, - { - "$ref": "#/components/schemas/Tcp" - }, - { - "$ref": "#/components/schemas/Icmp" - }, - { - "$ref": "#/components/schemas/Dns" - }, - { - "$ref": "#/components/schemas/McpServer" + "example": "config.gracePeriod" }, - { - "$ref": "#/components/schemas/Code" + "message": { + "minLength": 1, + "type": "string", + "description": "Human-readable message; safe to surface to end users" } - ] + }, + "description": "One structured validation rejection" }, - "Code": { + "ErrorResponse": { + "required": [ + "code", + "message", + "status", + "timestamp" + ], "type": "object", - "description": "Code check (browser / multi-step API) specific details", "properties": { - "check_type": { - "type": "string", - "enum": [ - "code" - ] - }, - "exitCode": { + "status": { "type": "integer", - "description": "Container exit code (0 = pass)", - "format": "int32" + "description": "HTTP status code (mirrors the response status line)", + "format": "int32", + "example": 404 }, - "stdoutSnippet": { + "code": { "type": "string", - "description": "Truncated stdout from the container", - "nullable": true + "description": "Coarse machine-readable error category (e.g. NOT_FOUND, RATE_LIMITED); stable per status", + "example": "NOT_FOUND" }, - "stderrSnippet": { + "message": { "type": "string", - "description": "Truncated stderr from the container", - "nullable": true + "description": "Human-readable error message; safe to surface to end users", + "example": "Monitor not found" }, - "steps": { + "timestamp": { + "type": "integer", + "description": "Server time when the error was produced (epoch milliseconds)", + "format": "int64", + "example": 1737302400000 + }, + "requestId": { + "type": "string", + "description": "Opaque per-request id; same value as the X-Request-Id response header. Use in support tickets.", + "nullable": true, + "example": "5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a" + }, + "errors": { "type": "array", - "description": "Named steps extracted from Playwright test output", + "description": "Structured per-field rejections; populated for validation errors, null otherwise", "nullable": true, "items": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/CodeCheckStep" + "$ref": "#/components/schemas/ErrorEntry" } ] } - }, - "failureKind": { - "type": "string", - "description": "Failure classification: timeout, assertion, or error", - "nullable": true - }, - "timedOut": { - "type": "boolean", - "description": "Whether the run hit a step/total/run-budget timeout", - "nullable": true } }, - "required": [ - "check_type", - "exitCode" - ] + "description": "Uniform error envelope returned for every non-2xx response", + "example": { + "status": 404, + "code": "NOT_FOUND", + "message": "Monitor not found", + "timestamp": 1737302400000, + "requestId": "5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a" + } }, - "CodeCheckStep": { + "EscalationChain": { "required": [ - "name", - "status" + "steps" ], "type": "object", "properties": { - "name": { - "type": "string", - "description": "Step name from test.step() or test() call" + "steps": { + "minItems": 1, + "type": "array", + "description": "Ordered escalation steps, evaluated in sequence", + "items": { + "$ref": "#/components/schemas/EscalationStep" + } }, - "status": { + "onResolve": { "type": "string", - "description": "Step outcome: passed, failed, skipped, or timedOut" - }, - "durationMs": { - "type": "integer", - "description": "Step duration in milliseconds", - "format": "int32", + "description": "Action when the incident resolves", "nullable": true }, - "error": { + "onReopen": { "type": "string", - "description": "Error message if the step failed", + "description": "Action when a resolved incident reopens", "nullable": true } }, - "description": "A single named step within a code check execution" + "description": "Escalation chain defining which channels to notify; null preserves current" }, - "ComponentImpact": { + "EscalationStep": { "required": [ - "componentId", - "componentName", - "uptimePercentage", - "partialOutageSeconds", - "majorOutageSeconds" + "channelIds", + "delayMinutes" ], "type": "object", "properties": { - "componentId": { - "type": "string", - "description": "Status page component UUID", - "format": "uuid" + "delayMinutes": { + "minimum": 0, + "type": "integer", + "description": "Minutes to wait before executing this step (0 = immediate)", + "format": "int32" }, - "componentName": { - "type": "string", - "description": "Component display name" + "channelIds": { + "minItems": 1, + "type": "array", + "description": "Alert channel IDs to notify in this step", + "items": { + "type": "string", + "description": "Alert channel IDs to notify in this step", + "format": "uuid" + } }, - "groupName": { - "type": "string", - "description": "Parent group display name when the component belongs to a group", + "requireAck": { + "type": "boolean", + "description": "Whether an acknowledgment is required before escalating", "nullable": true }, - "uptimePercentage": { - "type": "number", - "description": "Computed uptime % for this component on this day", - "format": "double" - }, - "partialOutageSeconds": { - "type": "integer", - "description": "Seconds of partial outage observed on this day", - "format": "int32" - }, - "majorOutageSeconds": { + "repeatIntervalSeconds": { + "minimum": 1, "type": "integer", - "description": "Seconds of major outage observed on this day", - "format": "int32" + "description": "Repeat notification interval in seconds until acknowledged", + "format": "int32", + "nullable": true } }, - "description": "One component's uptime contribution for the day" + "description": "Ordered escalation steps, evaluated in sequence" }, - "ComponentPosition": { + "FailureDetail": { "required": [ - "componentId", - "displayOrder" + "monitorId", + "reason" ], "type": "object", "properties": { - "componentId": { + "monitorId": { "type": "string", - "description": "Component ID", + "description": "Monitor ID that failed", "format": "uuid" }, - "displayOrder": { - "type": "integer", - "description": "New display order (0-based)", - "format": "int32" - }, - "groupId": { + "reason": { "type": "string", - "description": "Target group ID, null for ungrouped", - "format": "uuid", - "nullable": true + "description": "Human-readable reason for the failure" } }, - "description": "A single component position" + "description": "Details about a single monitor that failed the bulk action" }, - "ComponentSample": { + "GitLabChannelConfig": { "required": [ - "componentId", - "newStatus" + "channelType", + "endpointUrl", + "authorizationKey" ], "type": "object", "properties": { - "componentId": { - "type": "string", - "description": "Component ID", - "format": "uuid" - }, - "componentName": { + "channelType": { "type": "string", - "description": "Component display name", - "nullable": true + "enum": [ + "gitlab" + ] }, - "oldStatus": { + "endpointUrl": { + "minLength": 1, "type": "string", - "description": "Previous status before the flip", - "nullable": true + "description": "GitLab alert integration endpoint URL" }, - "newStatus": { + "authorizationKey": { + "minLength": 1, "type": "string", - "description": "New status after the flip" + "description": "Authorization key from GitLab alert integration settings" } - }, - "description": "One component sample inside a transition rollup" + } }, - "ComponentsSummaryDto": { + "GlobalStatusSummaryDto": { "required": [ - "groupComponentCounts", - "includedCount", - "totalCount" + "servicesWithIssues", + "totalServices", + "operationalCount", + "degradedCount", + "partialOutageCount", + "majorOutageCount", + "maintenanceCount", + "unknownCount", + "activeIncidentCount" ], "type": "object", "properties": { - "totalCount": { + "totalServices": { "type": "integer", - "description": "Total active components for this service across all groups", + "description": "Total number of services in the catalog", "format": "int32" }, - "includedCount": { + "operationalCount": { "type": "integer", - "description": "Number of components actually returned in the inline ``components`` list", + "description": "Number of services currently fully operational", "format": "int32" }, - "groupComponentCounts": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Per-group active leaf count, keyed by group component id (UUID stringified). Empty when the service has no groups; lets the UI render \"show all N\" affordances without a second round trip", - "format": "int32" - }, - "description": "Per-group active leaf count, keyed by group component id (UUID stringified). Empty when the service has no groups; lets the UI render \"show all N\" affordances without a second round trip" + "degradedCount": { + "type": "integer", + "description": "Number of services with degraded status", + "format": "int32" + }, + "partialOutageCount": { + "type": "integer", + "description": "Number of services with partial outage", + "format": "int32" + }, + "majorOutageCount": { + "type": "integer", + "description": "Number of services with major outage", + "format": "int32" + }, + "maintenanceCount": { + "type": "integer", + "description": "Number of services currently under maintenance", + "format": "int32" + }, + "unknownCount": { + "type": "integer", + "description": "Number of services with unknown or null status", + "format": "int32" + }, + "activeIncidentCount": { + "type": "integer", + "description": "Total number of active incidents across all services", + "format": "int64" + }, + "servicesWithIssues": { + "type": "array", + "description": "Services that are not fully operational", + "items": { + "$ref": "#/components/schemas/ServiceCatalogDto" + } } - } + }, + "description": "Global status summary across all subscribed vendor services" }, - "ComponentStatusDto": { + "GoogleChatChannelConfig": { "required": [ - "id", - "name", - "status" + "channelType", + "webhookUrl" ], "type": "object", "properties": { - "id": { - "type": "string", - "description": "Component UUID" - }, - "name": { + "channelType": { "type": "string", - "description": "Human-readable component name" + "enum": [ + "google_chat" + ] }, - "status": { + "webhookUrl": { + "minLength": 1, "type": "string", - "description": "Current component status, e.g. operational, degraded_performance" + "description": "Google Chat space webhook URL" } - }, - "description": "Current status of each active component" + } }, - "ComponentTransitionEventDto": { + "GroupComponentOrder": { "required": [ - "componentSample", - "newStatus", - "componentCount" + "groupId", + "positions" ], "type": "object", "properties": { - "newStatus": { + "groupId": { "type": "string", - "description": "New status that defines this rollup bucket" - }, - "componentCount": { - "type": "integer", - "description": "Total components in the 5-minute rollup bucket", - "format": "int32" + "description": "Group these components belong to", + "format": "uuid" }, - "componentSample": { + "positions": { + "minItems": 1, "type": "array", - "description": "Up to 5 sample components from the bucket", + "description": "Ordered component IDs with their within-group display order", "items": { - "$ref": "#/components/schemas/ComponentSample" + "$ref": "#/components/schemas/ComponentPosition" } } }, - "description": "Rolled-up component status transitions for a status-events rail row" + "description": "Component ordering within a single group" }, - "ComponentUptimeDayDto": { + "HeaderAuthConfig": { "required": [ - "date", - "partialOutageSeconds", - "majorOutageSeconds", - "degradedSeconds", - "uptimePercentage" + "type", + "headerName" ], "type": "object", "properties": { - "date": { + "type": { "type": "string", - "description": "Start-of-day timestamp for this bucket (UTC midnight, ISO 8601)", - "format": "date-time" + "enum": [ + "header" + ] }, - "partialOutageSeconds": { - "type": "integer", - "description": "Seconds of partial outage observed on this day", - "format": "int32" + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "Custom HTTP header name for the secret value" }, - "majorOutageSeconds": { - "type": "integer", - "description": "Seconds of major outage observed on this day", - "format": "int32" + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the header value", + "format": "uuid", + "nullable": true + } + } + }, + "HeaderValueAssertion": { + "required": [ + "type", + "headerName", + "expected", + "operator" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "header_value" + ] }, - "degradedSeconds": { - "type": "integer", - "description": "Seconds the component spent in degraded performance on this day", - "format": "int32" + "headerName": { + "minLength": 1, + "type": "string", + "description": "HTTP header name to assert on" }, - "uptimePercentage": { - "type": "number", - "description": "Computed uptime percentage using the weighted formula (degraded does not lower it)", - "format": "double" + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected value to compare against" }, - "incidents": { - "type": "array", - "description": "Incidents that overlapped this day, in display order", - "nullable": true, - "items": { - "$ref": "#/components/schemas/IncidentRef" - } + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] } - }, - "description": "Daily uptime data for a component" + } }, - "ComponentUptimeSummaryDto": { + "HeartbeatIntervalDriftAssertion": { "required": [ - "source" + "type", + "maxDeviationPercent" ], "type": "object", "properties": { - "day": { - "type": "number", - "description": "Uptime percentage over the last 24 hours", - "format": "double", - "nullable": true, - "example": 99.95 - }, - "week": { - "type": "number", - "description": "Uptime percentage over the last 7 days", - "format": "double", - "nullable": true, - "example": 99.98 - }, - "month": { - "type": "number", - "description": "Uptime percentage over the last 30 days", - "format": "double", - "nullable": true, - "example": 99.92 - }, - "source": { + "type": { "type": "string", - "description": "Data source: vendor_reported or incident_derived", - "example": "vendor_reported" + "enum": [ + "heartbeat_interval_drift" + ] + }, + "maxDeviationPercent": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Max percent drift from expected ping interval before warning (non-fatal)", + "format": "int32" } - }, - "description": "Inline uptime percentages for 24h, 7d, 30d" + } }, - "ConfirmationPolicy": { + "HeartbeatMaxIntervalAssertion": { "required": [ "type", - "minRegionsFailing", - "maxWaitSeconds" + "maxSeconds" ], "type": "object", "properties": { "type": { "type": "string", - "description": "How incident confirmation is coordinated across regions", "enum": [ - "multi_region" + "heartbeat_max_interval" ] }, - "minRegionsFailing": { + "maxSeconds": { + "minimum": 1, "type": "integer", - "description": "Minimum failing regions required to confirm an incident", + "description": "Maximum allowed gap in seconds between consecutive heartbeat pings", + "format": "int32" + } + } + }, + "HeartbeatMonitorConfig": { + "required": [ + "expectedInterval", + "gracePeriod" + ], + "type": "object", + "properties": { + "expectedInterval": { + "maximum": 86400, + "minimum": 1, + "type": "integer", + "description": "Expected heartbeat interval in seconds", "format": "int32" }, - "maxWaitSeconds": { + "gracePeriod": { + "minimum": 1, "type": "integer", - "description": "Maximum seconds to wait for enough regions to fail after first trigger", + "description": "Grace period in seconds before marking as down", "format": "int32" } - }, - "description": "Multi-region confirmation settings" + } }, - "CreateAlertChannelRequest": { + "HeartbeatPayloadContainsAssertion": { "required": [ - "config", - "name" + "type", + "path", + "value" ], "type": "object", "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + "type": { "type": "string", - "description": "Human-readable name for this alert channel" - }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/DatadogChannelConfig" - }, - { - "$ref": "#/components/schemas/DiscordChannelConfig" - }, - { - "$ref": "#/components/schemas/EmailChannelConfig" - }, - { - "$ref": "#/components/schemas/GitLabChannelConfig" - }, - { - "$ref": "#/components/schemas/GoogleChatChannelConfig" - }, - { - "$ref": "#/components/schemas/IncidentIoChannelConfig" - }, - { - "$ref": "#/components/schemas/JiraChannelConfig" - }, - { - "$ref": "#/components/schemas/LinearChannelConfig" - }, - { - "$ref": "#/components/schemas/MattermostChannelConfig" - }, - { - "$ref": "#/components/schemas/OpsGenieChannelConfig" - }, - { - "$ref": "#/components/schemas/PagerDutyChannelConfig" - }, - { - "$ref": "#/components/schemas/PhoneCallChannelConfig" - }, - { - "$ref": "#/components/schemas/PushbulletChannelConfig" - }, - { - "$ref": "#/components/schemas/PushoverChannelConfig" - }, - { - "$ref": "#/components/schemas/RootlyChannelConfig" - }, - { - "$ref": "#/components/schemas/SlackChannelConfig" - }, - { - "$ref": "#/components/schemas/SmsChannelConfig" - }, - { - "$ref": "#/components/schemas/SplunkOnCallChannelConfig" - }, - { - "$ref": "#/components/schemas/TeamsChannelConfig" - }, - { - "$ref": "#/components/schemas/TelegramChannelConfig" - }, - { - "$ref": "#/components/schemas/WebhookChannelConfig" - }, - { - "$ref": "#/components/schemas/ZapierChannelConfig" - } + "enum": [ + "heartbeat_payload_contains" ] }, - "managedBy": { + "path": { + "minLength": 1, "type": "string", - "description": "Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", - "nullable": true, - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] + "description": "JSONPath expression into the heartbeat ping JSON payload" + }, + "value": { + "type": "string", + "description": "Expected value to compare against at that path" } } }, - "CreateApiKeyRequest": { + "HeartbeatPingResponse": { "required": [ - "name" + "ok" ], "type": "object", "properties": { - "name": { - "maxLength": 200, - "minLength": 0, - "type": "string", - "description": "Human-readable name to identify this API key" - }, - "expiresAt": { - "type": "string", - "description": "Optional expiration timestamp in ISO 8601 format", - "format": "date-time", - "nullable": true + "ok": { + "type": "boolean", + "description": "Always true on a 2xx response", + "example": true } - } + }, + "description": "Acknowledgement that a heartbeat ping was accepted" }, - "CreateAssertionRequest": { + "HeartbeatReceivedAssertion": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "heartbeat_received" + ] + } + }, "required": [ - "config" - ], + "type" + ] + }, + "Http": { "type": "object", + "description": "HTTP check-type-specific details", "properties": { - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/BodyContainsAssertion" - }, - { - "$ref": "#/components/schemas/DnsExpectedCnameAssertion" - }, - { - "$ref": "#/components/schemas/DnsExpectedIpsAssertion" - }, - { - "$ref": "#/components/schemas/DnsMaxAnswersAssertion" - }, - { - "$ref": "#/components/schemas/DnsMinAnswersAssertion" - }, - { - "$ref": "#/components/schemas/DnsRecordContainsAssertion" - }, - { - "$ref": "#/components/schemas/DnsRecordEqualsAssertion" - }, - { - "$ref": "#/components/schemas/DnsResolvesAssertion" - }, - { - "$ref": "#/components/schemas/DnsResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/DnsResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/DnsTtlHighAssertion" - }, - { - "$ref": "#/components/schemas/DnsTtlLowAssertion" - }, - { - "$ref": "#/components/schemas/DnsTxtContainsAssertion" - }, - { - "$ref": "#/components/schemas/HeaderValueAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatIntervalDriftAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatMaxIntervalAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatPayloadContainsAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatReceivedAssertion" - }, - { - "$ref": "#/components/schemas/IcmpPacketLossAssertion" - }, - { - "$ref": "#/components/schemas/IcmpReachableAssertion" - }, - { - "$ref": "#/components/schemas/IcmpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/IcmpResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/JsonPathAssertion" - }, - { - "$ref": "#/components/schemas/McpConnectsAssertion" - }, - { - "$ref": "#/components/schemas/McpHasCapabilityAssertion" - }, - { - "$ref": "#/components/schemas/McpMinToolsAssertion" - }, - { - "$ref": "#/components/schemas/McpProtocolVersionAssertion" - }, - { - "$ref": "#/components/schemas/McpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/McpResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/McpToolAvailableAssertion" - }, - { - "$ref": "#/components/schemas/McpToolCountChangedAssertion" - }, - { - "$ref": "#/components/schemas/RedirectCountAssertion" - }, - { - "$ref": "#/components/schemas/RedirectTargetAssertion" - }, - { - "$ref": "#/components/schemas/RegexBodyAssertion" - }, - { - "$ref": "#/components/schemas/ResponseSizeAssertion" - }, - { - "$ref": "#/components/schemas/ResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/ResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/SslExpiryAssertion" - }, - { - "$ref": "#/components/schemas/StatusCodeAssertion" - }, - { - "$ref": "#/components/schemas/TcpConnectsAssertion" - }, - { - "$ref": "#/components/schemas/TcpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/TcpResponseTimeWarnAssertion" - } + "check_type": { + "type": "string", + "enum": [ + "http" ] }, - "severity": { - "type": "string", - "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL)", + "timing": { "nullable": true, - "enum": [ - "fail", - "warn" + "allOf": [ + { + "$ref": "#/components/schemas/TimingPhasesDto" + } ] + }, + "bodyTruncated": { + "type": "boolean", + "description": "Whether the response body was truncated before storage", + "nullable": true } }, - "description": "Replace all assertions; null preserves current" + "required": [ + "check_type" + ] }, - "CreateEnvironmentRequest": { + "HttpMonitorConfig": { "required": [ - "name", - "slug" + "method", + "url" ], "type": "object", "properties": { - "name": { - "maxLength": 100, - "minLength": 0, + "url": { + "minLength": 1, "type": "string", - "description": "Human-readable environment name" + "description": "Target URL to send requests to" }, - "slug": { - "maxLength": 100, - "minLength": 0, - "pattern": "^[a-z0-9][a-z0-9_-]*$", + "method": { "type": "string", - "description": "URL-safe identifier (lowercase alphanumeric, hyphens, underscores)" + "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD", + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE", + "HEAD" + ] }, - "variables": { + "customHeaders": { "type": "object", "additionalProperties": { "type": "string", - "description": "Initial key-value variable pairs for this environment", + "description": "Additional HTTP headers to include in requests", "nullable": true }, - "description": "Initial key-value variable pairs for this environment", + "description": "Additional HTTP headers to include in requests", "nullable": true }, - "isDefault": { + "requestBody": { + "type": "string", + "description": "Request body content for POST/PUT/PATCH methods", + "nullable": true + }, + "contentType": { + "type": "string", + "description": "Content-Type header value for the request body", + "nullable": true + }, + "verifyTls": { "type": "boolean", - "description": "Whether this is the default environment for new monitors (default: false)", + "description": "Whether to verify TLS certificates (default: true)", "nullable": true } } }, - "CreateInviteRequest": { + "Icmp": { "required": [ - "email", - "roleOffered" + "check_type", + "host" ], "type": "object", + "description": "ICMP (ping) check-type-specific details", "properties": { - "email": { - "minLength": 1, - "type": "string", - "description": "Email address to invite", - "format": "email" - }, - "roleOffered": { + "check_type": { "type": "string", - "description": "Role to assign on acceptance", "enum": [ - "OWNER", - "ADMIN", - "MEMBER" + "icmp" ] - } - }, - "description": "Invite a new member to the organization by email" - }, - "CreateMaintenanceWindowRequest": { - "required": [ - "endsAt", - "startsAt" - ], - "type": "object", - "properties": { - "monitorId": { + }, + "host": { "type": "string", - "description": "Monitor to attach this maintenance window to; null for org-wide", - "format": "uuid", + "description": "Target host", + "example": "1.1.1.1" + }, + "packetsSent": { + "type": "integer", + "description": "Number of ICMP packets sent", + "format": "int32", "nullable": true }, - "startsAt": { - "type": "string", - "description": "Scheduled start of the maintenance window (ISO 8601)", - "format": "date-time" + "packetsReceived": { + "type": "integer", + "description": "Number of ICMP packets received", + "format": "int32", + "nullable": true }, - "endsAt": { - "type": "string", - "description": "Scheduled end of the maintenance window (ISO 8601)", - "format": "date-time" + "packetLoss": { + "type": "number", + "description": "Packet loss percentage", + "format": "double", + "nullable": true, + "example": 0 }, - "repeatRule": { - "maxLength": 100, - "minLength": 0, - "type": "string", - "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)", + "avgRttMs": { + "type": "number", + "description": "Average round-trip time in ms", + "format": "double", "nullable": true }, - "reason": { - "maxLength": 500, - "minLength": 0, - "type": "string", - "description": "Human-readable reason for the maintenance (max 500 chars)", + "minRttMs": { + "type": "number", + "description": "Minimum round-trip time in ms", + "format": "double", + "nullable": true + }, + "maxRttMs": { + "type": "number", + "description": "Maximum round-trip time in ms", + "format": "double", "nullable": true }, - "suppressAlerts": { - "type": "boolean", - "description": "Whether to suppress alerts during this window (default: true)", + "jitterMs": { + "type": "number", + "description": "Jitter in ms", + "format": "double", "nullable": true } } }, - "CreateManualIncidentRequest": { + "IcmpMonitorConfig": { "required": [ - "severity", - "title" + "host" ], "type": "object", "properties": { - "title": { + "host": { "minLength": 1, "type": "string", - "description": "Short summary of the incident" - }, - "severity": { - "type": "string", - "description": "Incident severity: DOWN, DEGRADED, or MAINTENANCE", - "enum": [ - "DOWN", - "DEGRADED", - "MAINTENANCE" - ] - }, - "monitorId": { - "type": "string", - "description": "Monitor to associate with this incident", - "format": "uuid", - "nullable": true - }, - "body": { - "type": "string", - "description": "Detailed description or context for the incident", - "nullable": true + "description": "Target hostname or IP address to ping" }, - "serviceId": { - "type": "string", - "description": "Vendor service to link; optional for Dependencies create CTA", - "format": "uuid", + "packetCount": { + "maximum": 20, + "minimum": 1, + "type": "integer", + "description": "Number of ICMP packets to send", + "format": "int32", "nullable": true }, - "serviceIncidentId": { - "type": "string", - "description": "Vendor incident to link; idempotent if an active org incident already links it", - "format": "uuid", + "timeoutMs": { + "type": "integer", + "description": "Ping timeout in milliseconds", + "format": "int32", "nullable": true } } }, - "CreateMonitorRequest": { + "IcmpPacketLossAssertion": { "required": [ - "config", - "name", - "type" + "type", + "maxPercent" ], "type": "object", "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + "type": { "type": "string", - "description": "Human-readable name for this monitor" + "enum": [ + "icmp_packet_loss" + ] }, + "maxPercent": { + "maximum": 100, + "exclusiveMaximum": false, + "minimum": 0, + "exclusiveMinimum": false, + "type": "number", + "description": "Maximum allowed packet loss percentage before the check fails (0\u2013100)", + "format": "double" + } + } + }, + "IcmpReachableAssertion": { + "type": "object", + "properties": { "type": { "type": "string", - "description": "Monitor protocol type", "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT", - "BROWSER", - "MULTI_STEP_API" + "icmp_reachable" ] - }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/DnsMonitorConfig" - }, - { - "$ref": "#/components/schemas/HeartbeatMonitorConfig" - }, - { - "$ref": "#/components/schemas/HttpMonitorConfig" - }, - { - "$ref": "#/components/schemas/IcmpMonitorConfig" - }, - { - "$ref": "#/components/schemas/McpServerMonitorConfig" - }, - { - "$ref": "#/components/schemas/ScriptMonitorConfig" - }, - { - "$ref": "#/components/schemas/TcpMonitorConfig" - } + } + }, + "required": [ + "type" + ] + }, + "IcmpResponseTimeAssertion": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "icmp_response_time" ] }, - "frequencySeconds": { - "maximum": 86400, - "minimum": 10, + "maxMs": { "type": "integer", - "description": "Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans)", - "format": "int32", - "nullable": true - }, - "enabled": { - "type": "boolean", - "description": "Whether the monitor is active (default: true)", - "nullable": true - }, - "regions": { - "type": "array", - "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south.", - "nullable": true, - "items": { - "type": "string", - "description": "Probe regions to run checks from. Allowed values are deployment-dependent; production: us-east, us-west, eu-west, ap-south." - } - }, - "managedBy": { + "description": "Maximum average ICMP round-trip time in milliseconds", + "format": "int32" + } + }, + "required": [ + "type", + "maxMs" + ] + }, + "IcmpResponseTimeWarnAssertion": { + "type": "object", + "properties": { + "type": { "type": "string", - "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted; set to your surface so audit logs, drift detection, and analytics attribute correctly.", - "nullable": true, "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" + "icmp_response_time_warn" ] }, - "environmentId": { + "warnMs": { + "type": "integer", + "description": "ICMP round-trip time in milliseconds that triggers a warning only", + "format": "int32" + } + }, + "required": [ + "type", + "warnMs" + ] + }, + "IncidentActivityEventDto": { + "required": [ + "at", + "id", + "kind", + "summary" + ], + "type": "object", + "properties": { + "id": { "type": "string", - "description": "Environment to associate with this monitor", - "format": "uuid", - "nullable": true + "description": "Stable event ID (source row ID)", + "format": "uuid" }, - "assertions": { - "type": "array", - "description": "Assertions to evaluate against each check result", - "nullable": true, - "items": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } + "at": { + "type": "string", + "description": "When the event occurred (ISO 8601)", + "format": "date-time" }, - "auth": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" - } + "kind": { + "type": "string", + "description": "Activity event kind in the merged incident activity stream", + "enum": [ + "update", + "dispatch", + "delivery", + "forensic_transition", + "status_page_update" ] }, - "incidentPolicy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" - } - ] + "actor": { + "type": "string", + "description": "Actor label when known (user email, system, etc.)", + "nullable": true }, - "alertChannelIds": { - "type": "array", - "description": "Alert channels to notify when this monitor triggers", - "nullable": true, - "items": { - "type": "string", - "description": "Alert channels to notify when this monitor triggers", - "format": "uuid" - } + "summary": { + "type": "string", + "description": "Human-readable summary of the event" }, - "tags": { + "payload": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/IncidentActivityPayloadDto" } ] } - } + }, + "description": "Merged incident activity event (updates, dispatches, deliveries, forensics, SP updates)" }, - "CreateNotificationPolicyRequest": { - "required": [ - "escalation", - "name" - ], + "IncidentActivityPayloadDto": { "type": "object", "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + "oldStatus": { "type": "string", - "description": "Human-readable name for this policy" + "description": "Previous incident status on an update", + "nullable": true }, - "description": { - "maxLength": 500, - "minLength": 0, + "newStatus": { "type": "string", - "description": "Optional note; omit or null when unused", + "description": "New incident status on an update", "nullable": true }, - "matchRules": { - "type": "array", - "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)", - "nullable": true, - "items": { - "$ref": "#/components/schemas/MatchRule" - } + "body": { + "type": "string", + "description": "Update or status-page note body", + "nullable": true }, - "escalation": { - "$ref": "#/components/schemas/EscalationChain" + "createdBy": { + "type": "string", + "description": "Who created the update (SYSTEM, USER, \u2026)", + "nullable": true }, - "enabled": { - "type": "boolean", - "description": "Whether this policy is enabled (default true)", - "nullable": true, - "default": true + "phase": { + "type": "string", + "description": "Dispatch lifecycle phase (fired, acked)", + "nullable": true }, - "priority": { - "type": "integer", - "description": "Evaluation priority; higher value = evaluated first (default 0)", - "format": "int32", - "nullable": true, - "default": 0 - } - }, - "description": "Request body for creating a notification policy" - }, - "CreateResourceGroupRequest": { - "required": [ - "name" - ], - "type": "object", - "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + "status": { "type": "string", - "description": "Human-readable name for this group" + "description": "Dispatch, delivery, or status-page status", + "nullable": true }, - "description": { - "maxLength": 500, - "minLength": 0, + "policyId": { "type": "string", - "description": "Optional description (max 500)", + "description": "Notification policy id for a dispatch row", "nullable": true }, - "alertPolicyId": { + "policyName": { "type": "string", - "description": "Optional notification policy to apply for this group", - "format": "uuid", + "description": "Notification policy name when resolved", "nullable": true }, - "defaultFrequency": { - "maximum": 86400, - "minimum": 30, + "currentStep": { "type": "integer", - "description": "Default check frequency in seconds applied to members (30–86400)", + "description": "Current escalation step (1-based)", "format": "int32", "nullable": true }, - "defaultRegions": { - "type": "array", - "description": "Default regions applied to member monitors", - "nullable": true, - "items": { - "type": "string", - "description": "Default regions applied to member monitors" - } - }, - "defaultRetryStrategy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/RetryStrategy" - } - ] - }, - "defaultAlertChannels": { - "type": "array", - "description": "Default alert channel IDs applied to member monitors", - "nullable": true, - "items": { - "type": "string", - "description": "Default alert channel IDs applied to member monitors", - "format": "uuid" - } - }, - "defaultEnvironmentId": { + "dispatchId": { "type": "string", - "description": "Default environment ID applied to member monitors", - "format": "uuid", + "description": "Notification dispatch id", "nullable": true }, - "healthThresholdType": { + "acknowledgedBy": { "type": "string", - "description": "Health threshold type: COUNT or PERCENTAGE", - "nullable": true, - "enum": [ - "COUNT", - "PERCENTAGE" - ] + "description": "Who acknowledged the dispatch", + "nullable": true }, - "healthThresholdValue": { - "maximum": 100, - "exclusiveMaximum": false, - "minimum": 0, - "exclusiveMinimum": false, - "type": "number", - "description": "Health threshold value: count (0+) or percentage (0–100)", + "acknowledgedVia": { + "type": "string", + "description": "Ack channel (UI, Slack, \u2026)", "nullable": true }, - "suppressMemberAlerts": { - "type": "boolean", - "description": "Suppress member-level alert notifications when group manages alerting", + "eventType": { + "type": "string", + "description": "Alert delivery event type", "nullable": true }, - "confirmationDelaySeconds": { - "maximum": 600, - "minimum": 0, + "stepNumber": { "type": "integer", - "description": "Confirmation delay in seconds before group incident creation (0–600)", + "description": "Escalation step that sent this delivery", "format": "int32", "nullable": true }, - "recoveryCooldownMinutes": { - "maximum": 60, - "minimum": 0, + "fireCount": { "type": "integer", - "description": "Recovery cooldown in minutes after group incident resolves (0–60)", + "description": "How many times this delivery has fired", "format": "int32", "nullable": true }, - "managedBy": { + "channelId": { "type": "string", - "description": "Source creating this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", - "nullable": true, - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] - } - }, - "description": "Request body for creating a resource group" - }, - "CreateSecretRequest": { - "required": [ - "key", - "value" - ], - "type": "object", - "properties": { - "key": { - "maxLength": 255, - "minLength": 0, + "description": "Alert channel id", + "nullable": true + }, + "channelName": { "type": "string", - "description": "Unique secret key within the workspace (max 255 chars)" + "description": "Alert channel name", + "nullable": true }, - "value": { - "maxLength": 32768, - "minLength": 0, + "channelType": { "type": "string", - "description": "Secret value, stored encrypted (max 32KB)" + "description": "Alert channel type", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Delivery error message when the send failed", + "nullable": true + }, + "fromStatus": { + "type": "string", + "description": "Forensic from-status", + "nullable": true + }, + "toStatus": { + "type": "string", + "description": "Forensic to-status", + "nullable": true + }, + "reason": { + "type": "string", + "description": "Forensic transition reason", + "nullable": true + }, + "affectedRegions": { + "type": "array", + "description": "Regions named on the forensic transition", + "nullable": true, + "items": { + "type": "string", + "description": "Regions named on the forensic transition" + } + }, + "statusPageIncidentId": { + "type": "string", + "description": "Linked status-page incident id", + "nullable": true } - } + }, + "description": "Kind-specific activity fields; omitted keys are absent, not null" }, - "CreateStatusPageComponentGroupRequest": { + "IncidentDetailDto": { "required": [ - "name" + "incident", + "updates" ], "type": "object", "properties": { - "name": { - "maxLength": 255, - "minLength": 0, - "type": "string", - "description": "Group display name" + "incident": { + "$ref": "#/components/schemas/IncidentDto" }, - "description": { - "maxLength": 500, - "minLength": 0, - "type": "string", - "description": "Optional group description", - "nullable": true + "updates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IncidentUpdateDto" + } }, - "displayOrder": { - "type": "integer", - "description": "Position in the group list", - "format": "int32", - "nullable": true + "statusPageIncidents": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/LinkedStatusPageIncidentDto" + } }, - "defaultOpen": { - "type": "boolean", - "description": "Initial expand/collapse state when a visitor first loads the page; renderer may auto-expand on active incidents (default: true)", - "nullable": true + "trigger": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentTriggerDto" + } + ] } } }, - "CreateStatusPageComponentRequest": { + "IncidentDto": { "required": [ - "name", - "type" + "affectedRegions", + "createdAt", + "id", + "severity", + "source", + "status", + "updatedAt", + "organizationId", + "reopenCount", + "statusPageVisible", + "suppressDispatch" ], "type": "object", "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + "id": { "type": "string", - "description": "Component display name" + "description": "Unique incident identifier", + "format": "uuid" }, - "description": { - "maxLength": 500, - "minLength": 0, + "monitorId": { "type": "string", - "description": "Optional description shown on expand", + "description": "Monitor that triggered the incident; null for service or manual incidents", + "format": "uuid", "nullable": true }, - "type": { + "organizationId": { + "type": "integer", + "description": "Organization this incident belongs to", + "format": "int32" + }, + "source": { "type": "string", - "description": "Component type: MONITOR, GROUP, STATIC, or DEPENDENCY", + "description": "Incident origin: MONITOR, SERVICE, or MANUAL", "enum": [ - "MONITOR", - "GROUP", - "STATIC", - "DEPENDENCY" + "AUTOMATIC", + "MANUAL", + "MONITORS", + "STATUS_DATA", + "RESOURCE_GROUP" ] }, - "monitorId": { + "status": { "type": "string", - "description": "Monitor ID (required when type=MONITOR)", - "format": "uuid", - "nullable": true + "description": "Current lifecycle status (OPEN, RESOLVED, etc.)", + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] }, - "resourceGroupId": { + "severity": { "type": "string", - "description": "Resource group ID (required when type=GROUP)", - "format": "uuid", - "nullable": true + "description": "Severity level: DOWN, DEGRADED, or MAINTENANCE", + "enum": [ + "DOWN", + "DEGRADED", + "MAINTENANCE" + ] }, - "serviceSubscriptionId": { + "title": { "type": "string", - "description": "Service subscription (Dependency) ID — required when type=DEPENDENCY. Bind an existing org subscription; catalog picks must create the subscription first, then pass its id", - "format": "uuid", + "description": "Short summary of the incident; null for auto-generated incidents", "nullable": true }, - "groupId": { + "triggeredByRule": { "type": "string", - "description": "Component group ID for visual grouping", - "format": "uuid", + "description": "Human-readable description of the trigger rule that fired", "nullable": true }, - "showUptime": { - "type": "boolean", - "description": "Whether to show the uptime bar (default: true; false for DEPENDENCY)", - "nullable": true + "affectedRegions": { + "type": "array", + "description": "Probe regions that observed the failure", + "items": { + "type": "string", + "description": "Probe regions that observed the failure" + } }, - "displayOrder": { + "reopenCount": { "type": "integer", - "description": "Position in the component list", + "description": "Number of times this incident has been reopened", + "format": "int32" + }, + "createdByUserId": { + "type": "integer", + "description": "User who created the incident (manual incidents only)", "format": "int32", "nullable": true }, - "excludeFromOverall": { + "statusPageVisible": { "type": "boolean", - "description": "Exclude from overall status calculation (default: false; true for DEPENDENCY)", - "nullable": true + "description": "Whether this incident is visible on the status page" }, - "startDate": { - "type": "string", - "description": "Date from which to start showing uptime; defaults to component creation. Set earlier to backdate (e.g. launch day); clamped at the monitor's createdAt for MONITOR-type components", - "format": "date", - "nullable": true - } - } - }, - "CreateStatusPageIncidentRequest": { - "required": [ - "body", - "impact", - "title" - ], - "type": "object", - "properties": { - "title": { - "maxLength": 500, - "minLength": 0, - "type": "string", - "description": "Customer-facing incident title" + "suppressDispatch": { + "type": "boolean", + "description": "When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted" }, - "status": { + "serviceIncidentId": { "type": "string", - "description": "Initial status (default: INVESTIGATING)", - "nullable": true, - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + "description": "Linked vendor service incident ID; null for monitor incidents", + "format": "uuid", + "nullable": true }, - "impact": { + "serviceId": { "type": "string", - "description": "Impact level: NONE, MINOR, MAJOR, or CRITICAL", - "enum": [ - "NONE", - "MINOR", - "MAJOR", - "CRITICAL" - ] + "description": "Linked service catalog ID; null for monitor incidents", + "format": "uuid", + "nullable": true }, - "body": { - "minLength": 1, + "externalRef": { "type": "string", - "description": "Initial update body in markdown" + "description": "External reference ID (e.g. PagerDuty incident ID)", + "nullable": true }, "affectedComponents": { "type": "array", - "description": "Component IDs affected by this incident", + "description": "Service components affected by this incident", "nullable": true, "items": { - "$ref": "#/components/schemas/AffectedComponent" + "type": "string", + "description": "Service components affected by this incident" } }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to email confirmed subscribers about this incident (default: true)", - "nullable": true - }, - "monitoringIncidentId": { + "shortlink": { "type": "string", - "description": "Monitoring incident ID to link this status page incident to; null for standalone", - "format": "uuid", + "description": "Short URL linking to the incident details", "nullable": true - } - } - }, - "CreateStatusPageIncidentUpdateRequest": { - "required": [ - "body", - "status" - ], - "type": "object", - "properties": { - "status": { + }, + "resolutionReason": { "type": "string", - "description": "Incident status at this point in the timeline", + "description": "How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.)", + "nullable": true, "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" + "MANUAL", + "AUTO_RECOVERED", + "AUTO_RESOLVED" ] }, - "body": { - "minLength": 1, + "resolutionNote": { "type": "string", - "description": "Update body in markdown" - }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to email confirmed subscribers about this update (default: true)", + "description": "Body from the most recent resolve update; null when not currently resolved, auto-resolved without a note, or no resolve update body was provided", "nullable": true }, - "affectedComponents": { - "type": "array", - "description": "Updated affected components; null preserves current", - "nullable": true, - "items": { - "$ref": "#/components/schemas/AffectedComponent" - } - } - } - }, - "CreateStatusPageMaintenanceRequest": { - "required": [ - "body", - "impact", - "scheduledFor", - "title" - ], - "type": "object", - "properties": { - "title": { - "maxLength": 500, - "minLength": 0, + "startedAt": { "type": "string", - "description": "Customer-facing maintenance title" + "description": "Timestamp when the incident was detected or created", + "format": "date-time", + "nullable": true }, - "status": { + "confirmedAt": { "type": "string", - "description": "Initial status (default: INVESTIGATING)", - "nullable": true, - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + "description": "Timestamp when the incident was confirmed (multi-region confirmation)", + "format": "date-time", + "nullable": true }, - "impact": { + "resolvedAt": { "type": "string", - "description": "Impact level: NONE, MINOR, MAJOR, or CRITICAL", - "enum": [ - "NONE", - "MINOR", - "MAJOR", - "CRITICAL" - ] + "description": "Timestamp when the incident was resolved", + "format": "date-time", + "nullable": true }, - "body": { - "minLength": 1, + "cooldownUntil": { "type": "string", - "description": "Initial update body in markdown" + "description": "Cooldown window end; new incidents suppressed until this time", + "format": "date-time", + "nullable": true }, - "affectedComponents": { - "type": "array", - "description": "Component IDs affected by this window", - "nullable": true, - "items": { - "$ref": "#/components/schemas/AffectedComponent" - } + "createdAt": { + "type": "string", + "description": "Timestamp when the incident record was created", + "format": "date-time" }, - "scheduledFor": { + "updatedAt": { "type": "string", - "description": "Maintenance start time", + "description": "Timestamp when the incident was last updated", "format": "date-time" }, - "scheduledUntil": { + "monitorName": { "type": "string", - "description": "Maintenance end time", - "format": "date-time", + "description": "Name of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, - "autoResolve": { - "type": "boolean", - "description": "Auto-resolve at scheduledUntil (default: false)", + "serviceName": { + "type": "string", + "description": "Name of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to email confirmed subscribers about this window (default: true)", + "serviceSlug": { + "type": "string", + "description": "Slug of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true - } - } - }, - "CreateStatusPageRequest": { - "required": [ - "name", - "slug" - ], - "type": "object", - "properties": { - "name": { - "maxLength": 255, - "minLength": 0, + }, + "monitorType": { "type": "string", - "description": "Human-readable name for this status page" + "description": "Type of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", + "nullable": true }, - "slug": { - "maxLength": 63, - "minLength": 3, - "pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$", + "resourceGroupId": { "type": "string", - "description": "URL slug (lowercase, hyphens, globally unique)" + "description": "Resource group that owns this incident; null when not group-managed", + "format": "uuid", + "nullable": true }, - "description": { - "maxLength": 500, - "minLength": 0, + "resourceGroupName": { "type": "string", - "description": "Optional description shown below the page header", + "description": "Name of the resource group; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, - "branding": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/StatusPageBranding" - } - ] + "triggeringCheckId": { + "type": "string", + "description": "Scheduler-minted check execution ID whose result confirmed this incident; joins to check_results, rule_evaluations, and incident_state_transitions. Omitted from JSON (undefined to SDKs) when null, treat missing as null.", + "format": "uuid", + "nullable": true }, - "visibility": { + "triggeredByRuleSnapshotHashHex": { "type": "string", - "description": "Page visibility: PUBLIC, PASSWORD, or IP_RESTRICTED (default: PUBLIC)", - "nullable": true, - "enum": [ - "PUBLIC", - "PASSWORD", - "IP_RESTRICTED" - ] + "description": "Hex SHA-256 of the canonical policy snapshot that fired; combined with triggeredByRuleIndex points to the exact TriggerRule. Omitted from JSON when null, treat missing as null.", + "nullable": true }, - "enabled": { - "type": "boolean", - "description": "Whether the page is enabled (default: true)", + "triggeredByRuleIndex": { + "type": "integer", + "description": "Index of the fired rule inside the policy's trigger_rules array. Omitted from JSON when null, treat missing as null.", + "format": "int32", "nullable": true }, - "incidentMode": { + "engineVersion": { "type": "string", - "description": "Incident mode: MANUAL, REVIEW, or AUTOMATIC (default: AUTOMATIC)", - "nullable": true, - "enum": [ - "MANUAL", - "REVIEW", - "AUTOMATIC" - ] + "description": "Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null.", + "nullable": true }, - "managedBy": { + "displayKey": { "type": "string", - "description": "Source creating this page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted.", + "description": "Org-scoped human-readable incident code, e.g. \"ABC-42\". Null on incidents created by pre-INC-keys API pods before the sweep; treat missing as unknown and fall back to the id", + "nullable": true + }, + "alertCollapsedByResourceGroupIds": { + "type": "array", + "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", "nullable": true, - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] + "items": { + "type": "string", + "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", + "format": "uuid" + } + }, + "peakFailingMemberCount": { + "type": "integer", + "description": "Peak non-operational member count while this RESOURCE_GROUP incident was open; null otherwise", + "format": "int32", + "nullable": true + }, + "failingMembersAtPeak": { + "type": "array", + "description": "Frozen failing members at peakFailingMemberCount; null when not a group incident or never snapshotted", + "nullable": true, + "items": { + "$ref": "#/components/schemas/IncidentFailingMemberSnapshotDto" + } } - } + }, + "description": "Incident triggered by a monitor check failure or manual creation" }, - "CreateTagRequest": { + "IncidentEventDto": { "required": [ - "name" + "incidentId", + "title" ], "type": "object", "properties": { - "name": { - "maxLength": 100, - "minLength": 0, + "incidentId": { "type": "string", - "description": "Tag name, unique within the org" + "description": "Vendor catalog incident ID", + "format": "uuid" }, - "color": { - "pattern": "^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", + "externalId": { "type": "string", - "description": "Hex color code (defaults to #6B7280 if omitted)", + "description": "Vendor-supplied external incident ID", "nullable": true - } - }, - "description": "Request body for creating a tag" - }, - "CreateWebhookEndpointRequest": { - "required": [ - "subscribedEvents", - "url" - ], - "type": "object", - "properties": { - "url": { - "maxLength": 2048, - "minLength": 0, + }, + "title": { "type": "string", - "description": "HTTPS endpoint that receives webhook event payloads" + "description": "Incident title from the vendor status page" }, - "description": { - "maxLength": 255, - "minLength": 0, + "impact": { "type": "string", - "description": "Optional human-readable description", + "description": "Vendor impact level (major, minor, none)", "nullable": true }, - "subscribedEvents": { - "minItems": 1, - "type": "array", - "description": "Event types to deliver", - "items": { - "minLength": 1, - "type": "string", - "enum": [ - "monitor.created", - "monitor.updated", - "monitor.deleted", - "incident.created", - "incident.resolved", - "incident.reopened", - "service.status_changed", - "service.component_changed", - "service.incident_created", - "service.incident_updated", - "service.incident_resolved" - ] - } - } - } - }, - "CreateWorkspaceRequest": { - "required": [ - "name" - ], - "type": "object", - "properties": { - "name": { - "minLength": 1, + "status": { "type": "string", - "description": "Workspace name" - } - }, - "description": "Create a new workspace within the organization" - }, - "CreditPolicy": { - "type": "object", - "properties": { - "summary": { + "description": "Vendor lifecycle status (only set on incident.update rows)", + "nullable": true + }, + "body": { + "type": "string", + "description": "Update body text (only set on incident.update rows)", + "nullable": true + }, + "shortlink": { "type": "string", - "description": "Brief summary of credit policy", + "description": "Short public URL for the vendor incident", "nullable": true }, - "maxCreditPercent": { - "type": "integer", - "description": "Max credit as percent of monthly fee", - "format": "int32", + "startedAt": { + "type": "string", + "description": "When the vendor incident started", + "format": "date-time", "nullable": true }, - "claimWindowDays": { - "type": "integer", - "description": "Days to submit a credit claim after eligibility", - "format": "int32", + "resolvedAt": { + "type": "string", + "description": "When the vendor incident resolved", + "format": "date-time", "nullable": true }, - "creditApplicationDays": { + "detectedAt": { + "type": "string", + "description": "When DevHelm first detected the incident", + "format": "date-time", + "nullable": true + }, + "vendorCreatedAt": { + "type": "string", + "description": "Vendor-reported creation timestamp", + "format": "date-time", + "nullable": true + }, + "durationSeconds": { "type": "integer", - "description": "Days for credit to be applied after approval", - "format": "int32", + "description": "Total duration in seconds (set on incident.resolved)", + "format": "int64", "nullable": true }, - "tiers": { + "affectedComponentIds": { "type": "array", - "description": "Credit tiers by uptime threshold", + "description": "Affected component IDs from the vendor incident join", "nullable": true, "items": { - "$ref": "#/components/schemas/CreditTier" + "type": "string", + "description": "Affected component IDs from the vendor incident join", + "format": "uuid" } } }, - "description": "Service credit policy for SLA violations" + "description": "Vendor incident fields for a status-events rail row" }, - "CreditTier": { + "IncidentFailingMemberSnapshotDto": { "required": [ - "uptimeRange" + "memberType", + "name" ], "type": "object", "properties": { - "uptimeRange": { + "memberType": { "type": "string", - "description": "Uptime range, e.g. '99.1% – 99.98%'" + "description": "Member type: monitor or service" }, - "creditPercent": { - "type": "integer", - "description": "Credit percent of monthly fee", - "format": "int32", + "monitorId": { + "type": "string", + "description": "Monitor ID when memberType is monitor", + "format": "uuid", "nullable": true }, - "formula": { + "serviceId": { "type": "string", - "description": "Credit formula when percent is not a fixed number", + "description": "Service ID when memberType is service", + "format": "uuid", "nullable": true }, - "notes": { + "name": { + "minLength": 1, "type": "string", - "description": "Additional notes on this credit tier", + "description": "Frozen display name at snapshot time" + }, + "membershipId": { + "type": "string", + "description": "Membership row ID when available", + "format": "uuid", "nullable": true } }, - "description": "Credit tiers by uptime threshold" + "description": "Frozen failing member identity at peak failing count for a resource-group incident" }, - "CursorPageCheckResultDto": { - "required": [ - "data", - "hasMore" - ], + "IncidentFilterParams": { "type": "object", "properties": { - "data": { - "type": "array", - "description": "Items on this page", - "items": { - "$ref": "#/components/schemas/CheckResultDto" - } + "status": { + "type": "string", + "description": "Filter by incident lifecycle status; null returns every status", + "nullable": true, + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] }, - "nextCursor": { + "severity": { "type": "string", - "description": "Opaque cursor for the next page; null when there are no more results", + "description": "Filter by severity; null returns every severity", + "nullable": true, + "enum": [ + "DOWN", + "DEGRADED", + "MAINTENANCE" + ] + }, + "source": { + "type": "string", + "description": "Filter by where the incident originated (auto, manual, third-party)", + "nullable": true, + "enum": [ + "AUTOMATIC", + "MANUAL", + "MONITORS", + "STATUS_DATA", + "RESOURCE_GROUP" + ] + }, + "monitorId": { + "type": "string", + "description": "Only return incidents tied to this monitor ID", + "format": "uuid", "nullable": true }, - "hasMore": { - "type": "boolean", - "description": "Whether more results exist beyond this page" - } - }, - "description": "Cursor-paginated response for time-series and append-only data" - }, - "CursorPageIncidentActivityEventDto": { - "required": [ - "data", - "hasMore" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "description": "Items on this page", - "items": { - "$ref": "#/components/schemas/IncidentActivityEventDto" - } + "serviceId": { + "type": "string", + "description": "Only return incidents tied to this service ID (third-party services)", + "format": "uuid", + "nullable": true }, - "nextCursor": { + "resourceGroupId": { "type": "string", - "description": "Opaque cursor for the next page; null when there are no more results", + "description": "Only return incidents owned by this resource group (incidents.resource_group_id)", + "format": "uuid", "nullable": true }, - "hasMore": { - "type": "boolean", - "description": "Whether more results exist beyond this page" - } - }, - "description": "Cursor-paginated response for time-series and append-only data" - }, - "CursorPageServiceCatalogDto": { - "required": [ - "data", - "hasMore" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "description": "Items on this page", - "items": { - "$ref": "#/components/schemas/ServiceCatalogDto" - } + "tagId": { + "type": "string", + "description": "Only return incidents whose monitor carries this tag", + "format": "uuid", + "nullable": true }, - "nextCursor": { + "environmentId": { "type": "string", - "description": "Opaque cursor for the next page; null when there are no more results", + "description": "Only return incidents whose monitor lives in this environment", + "format": "uuid", "nullable": true }, - "hasMore": { - "type": "boolean", - "description": "Whether more results exist beyond this page" + "excludeId": { + "type": "string", + "description": "Exclude this incident ID from results (related-incident lists)", + "format": "uuid", + "nullable": true + }, + "startedFrom": { + "type": "string", + "description": "Earliest startedAt to include (inclusive, ISO 8601)", + "format": "date-time", + "nullable": true + }, + "startedTo": { + "type": "string", + "description": "Latest startedAt to include (inclusive, ISO 8601)", + "format": "date-time", + "nullable": true + }, + "page": { + "minimum": 0, + "type": "integer", + "description": "Zero-based page index (default: 0)", + "format": "int32", + "example": 0 + }, + "size": { + "maximum": 200, + "minimum": 1, + "type": "integer", + "description": "Number of incidents per page (1\u2013200, default: 10)", + "format": "int32", + "example": 10 } }, - "description": "Cursor-paginated response for time-series and append-only data" + "required": [ + "page", + "size" + ] }, - "CursorPageServicePollResultDto": { + "IncidentIoChannelConfig": { "required": [ - "data", - "hasMore" + "channelType", + "apiKey" ], "type": "object", "properties": { - "data": { - "type": "array", - "description": "Items on this page", - "items": { - "$ref": "#/components/schemas/ServicePollResultDto" - } + "channelType": { + "type": "string", + "enum": [ + "incident_io" + ] }, - "nextCursor": { + "apiKey": { + "minLength": 1, "type": "string", - "description": "Opaque cursor for the next page; null when there are no more results", + "description": "incident.io API key with 'Create incidents' permission" + }, + "severityId": { + "type": "string", + "description": "Severity ID for created incidents (from List Severities API)", "nullable": true }, - "hasMore": { - "type": "boolean", - "description": "Whether more results exist beyond this page" + "visibility": { + "type": "string", + "description": "Incident visibility: public or private (default: public)", + "nullable": true } - }, - "description": "Cursor-paginated response for time-series and append-only data" + } }, - "CursorPageStatusEventDto": { + "IncidentPolicyDto": { "required": [ - "data", - "hasMore" + "confirmation", + "createdAt", + "id", + "monitorId", + "recovery", + "triggerRules", + "updatedAt" ], "type": "object", "properties": { - "data": { + "id": { + "type": "string", + "description": "Unique incident policy identifier", + "format": "uuid" + }, + "monitorId": { + "type": "string", + "description": "Monitor this policy is attached to", + "format": "uuid" + }, + "triggerRules": { "type": "array", - "description": "Items on this page", + "description": "Array of trigger rules defining when an incident should be raised", "items": { - "$ref": "#/components/schemas/StatusEventDto" + "$ref": "#/components/schemas/TriggerRule" } }, - "nextCursor": { + "confirmation": { + "$ref": "#/components/schemas/ConfirmationPolicy" + }, + "recovery": { + "$ref": "#/components/schemas/RecoveryPolicy" + }, + "createdAt": { "type": "string", - "description": "Opaque cursor for the next page; null when there are no more results", + "description": "Timestamp when the policy was created", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the policy was last updated", + "format": "date-time" + }, + "monitorRegionCount": { + "type": "integer", + "description": "Number of regions configured on the monitor (only set in internal API responses)", + "format": "int32", "nullable": true }, - "hasMore": { - "type": "boolean", - "description": "Whether more results exist beyond this page" + "checkFrequencySeconds": { + "type": "integer", + "description": "Monitor check frequency in seconds (only set in internal API responses)", + "format": "int32", + "nullable": true } }, - "description": "Cursor-paginated response for time-series and append-only data" + "description": "Incident detection, confirmation, and recovery policy for a monitor" }, - "DashboardOverviewDto": { + "IncidentRef": { "required": [ - "incidents", - "monitors" + "id", + "impact", + "title" ], "type": "object", "properties": { - "monitors": { - "$ref": "#/components/schemas/MonitorsSummaryDto" + "id": { + "type": "string", + "description": "Internal incident ID \u2014 UUID for status-page incidents, service incident UUID for catalog", + "format": "uuid" }, - "incidents": { - "$ref": "#/components/schemas/IncidentsSummaryDto" + "title": { + "type": "string", + "description": "Incident title at the time of the overlap" + }, + "impact": { + "type": "string", + "description": "Incident impact level (e.g. minor, major, critical for catalog; NONE/MINOR/MAJOR/CRITICAL for status pages)" } }, - "description": "Combined dashboard overview for monitors and incidents" + "description": "Lightweight reference to an incident overlapping a given uptime day" }, - "DatadogChannelConfig": { - "required": [ - "channelType", - "apiKey" - ], + "IncidentsSummaryDto": { "type": "object", "properties": { - "channelType": { - "type": "string", - "enum": [ - "datadog" - ] - }, - "apiKey": { - "minLength": 1, - "type": "string", - "description": "Datadog API key" + "active": { + "type": "integer", + "format": "int64" }, - "site": { - "type": "string", - "description": "Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)", - "nullable": true + "resolvedToday": { + "type": "integer", + "format": "int64" }, - "tags": { - "type": "string", - "description": "Comma-separated tags to attach to events", + "mttr30d": { + "type": "number", + "format": "double", "nullable": true } - } + }, + "description": "Incident summary counters", + "required": [ + "active", + "resolvedToday" + ] }, - "DayIncident": { + "IncidentStateTransitionDto": { "required": [ - "affectedComponentIds", - "affectedComponentNames", + "affectedRegions", + "checkId", + "details", + "engineVersion", + "fromStatus", "id", - "impact", - "status", - "title", - "scheduled" + "monitorId", + "occurredAt", + "policySnapshotHashHex", + "reason", + "toStatus", + "triggeringEvaluationIds" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Status page incident UUID", + "description": "Forensic row UUID", "format": "uuid" }, - "title": { + "occurredAt": { "type": "string", - "description": "Incident title" + "description": "When the state transition occurred", + "format": "date-time" }, - "status": { + "monitorId": { "type": "string", - "description": "Lifecycle status (investigating, identified, monitoring, resolved, …)", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + "description": "Monitor this transition pertains to", + "format": "uuid" }, - "impact": { + "incidentId": { "type": "string", - "description": "Severity bucket (none, minor, major, critical)", - "enum": [ - "NONE", - "MINOR", - "MAJOR", - "CRITICAL" - ] + "description": "Incident this transition belongs to; null for pre-incident (auto-cleared) transitions", + "format": "uuid", + "nullable": true }, - "scheduled": { - "type": "boolean", - "description": "True for a maintenance window; false for an incident" + "fromStatus": { + "minLength": 1, + "type": "string", + "description": "Previous status (WATCHING | TRIGGERED | CONFIRMED | RESOLVED)" }, - "startedAt": { + "toStatus": { + "minLength": 1, "type": "string", - "description": "Incident start timestamp", - "format": "date-time", - "nullable": true + "description": "New status (WATCHING | TRIGGERED | CONFIRMED | RESOLVED)" }, - "resolvedAt": { + "reason": { + "minLength": 1, "type": "string", - "description": "Incident resolved timestamp; null while still active", - "format": "date-time", - "nullable": true + "description": "Why the transition fired (trigger | confirm | resolve | auto_clear | reopen)" }, - "affectedComponentNames": { + "triggeringEvaluationIds": { "type": "array", - "description": "Display names of components affected by this incident (deduplicated)", + "description": "rule_evaluation ids that caused this transition (may be empty for timeout-driven edges)", "items": { "type": "string", - "description": "Display names of components affected by this incident (deduplicated)" + "description": "rule_evaluation ids that caused this transition (may be empty for timeout-driven edges)", + "format": "uuid" } }, - "affectedComponentIds": { + "affectedRegions": { "type": "array", - "description": "UUIDs of components this incident affected", + "description": "Regions whose evaluations contributed to this transition", "items": { "type": "string", - "description": "UUIDs of components this incident affected", - "format": "uuid" + "description": "Regions whose evaluations contributed to this transition" } - } - }, - "description": "Incident that overlapped the day" - }, - "DekRotationResultDto": { - "required": [ - "rotatedAt", - "previousDekVersion", - "newDekVersion", - "secretsReEncrypted", - "channelsReEncrypted" - ], - "type": "object", - "properties": { - "previousDekVersion": { - "type": "integer", - "description": "DEK version before rotation", - "format": "int32" - }, - "newDekVersion": { - "type": "integer", - "description": "DEK version after rotation", - "format": "int32" }, - "secretsReEncrypted": { - "type": "integer", - "description": "Number of secrets re-encrypted with the new DEK", - "format": "int32" + "policySnapshotHashHex": { + "minLength": 1, + "type": "string", + "description": "Hex-encoded hash of the policy snapshot that governed this transition" }, - "channelsReEncrypted": { - "type": "integer", - "description": "Number of alert channels re-encrypted with the new DEK", - "format": "int32" + "engineVersion": { + "minLength": 1, + "type": "string", + "description": "Detection engine version that emitted this transition" }, - "rotatedAt": { + "checkId": { "type": "string", - "description": "Timestamp when the rotation was performed", - "format": "date-time" + "description": "Scheduler-minted check execution ID (V92) of the triggering result", + "format": "uuid" + }, + "details": { + "$ref": "#/components/schemas/StateTransitionDetails" } }, - "description": "Result of a data encryption key rotation operation" + "description": "State-machine transitions this check caused (may be empty if nothing fired)" }, - "DeleteChannelResult": { + "IncidentTimelineDto": { + "required": [ + "transitions", + "triggeringEvaluations" + ], "type": "object", "properties": { - "affectedPolicies": { - "type": "integer", - "description": "Number of notification policies whose escalation steps were modified", - "format": "int32" + "transitions": { + "type": "array", + "description": "State-machine transitions in chronological order", + "items": { + "$ref": "#/components/schemas/IncidentStateTransitionDto" + } }, - "disabledPolicies": { - "type": "integer", - "description": "Number of notification policies disabled because they had no remaining channels", - "format": "int32" + "triggeringEvaluations": { + "type": "array", + "description": "Rule evaluations that caused any of the transitions above. Correlate via evaluation.triggeringTransitionId == transition.id", + "items": { + "$ref": "#/components/schemas/RuleEvaluationDto" + } + }, + "policySnapshot": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/PolicySnapshotDto" + } + ] } - }, - "description": "Summary of policies affected by channel deletion", - "required": [ - "affectedPolicies", - "disabledPolicies" - ] + } }, - "DeliveryAttemptDto": { + "IncidentTriggerDto": { "required": [ - "attemptedAt", - "deliveryId", - "id", - "status", - "attemptNumber" + "source" ], "type": "object", "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "deliveryId": { - "type": "string", - "format": "uuid" - }, - "attemptNumber": { - "type": "integer", - "description": "1-based attempt number", - "format": "int32" - }, - "status": { + "ruleType": { "type": "string", - "description": "Outcome: SUCCESS, FAILED, TIMEOUT, ERROR" + "description": "Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", + "nullable": true }, - "responseStatusCode": { + "ruleIndex": { "type": "integer", - "description": "HTTP response status code from the external service", + "description": "0-based index into the policy trigger_rules array; null when unknown", "format": "int32", "nullable": true }, - "requestPayload": { - "type": "string", - "description": "JSON payload sent to the external service", - "nullable": true - }, - "responseBody": { - "type": "string", - "description": "Response body from the external service (truncated)", - "nullable": true - }, - "errorMessage": { - "type": "string", - "description": "Error message if the attempt failed", + "count": { + "type": "integer", + "description": "Observed failing_streak or failures_in_window from forensics; null when unavailable", + "format": "int32", "nullable": true }, - "responseTimeMs": { + "threshold": { "type": "integer", - "description": "Round-trip time in milliseconds", + "description": "Rule required count or threshold_ms from forensics; null when unavailable", "format": "int32", "nullable": true }, - "externalId": { + "lastError": { "type": "string", - "description": "External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID)", + "description": "failure_reason from the triggering check result; null when unavailable", "nullable": true }, - "requestHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "HTTP request headers sent to the external service", - "nullable": true - }, - "description": "HTTP request headers sent to the external service", + "firstFailedCheckAt": { + "type": "string", + "description": "Earliest failing check timestamp in the confirm window when computable; null otherwise", + "format": "date-time", "nullable": true }, - "attemptedAt": { + "source": { + "minLength": 1, "type": "string", - "format": "date-time" + "description": "Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", + "enum": [ + "forensics", + "checks", + "none" + ] } }, - "description": "Single delivery attempt with request/response audit data" + "description": "Honest trigger metadata for the incident origin tooltip / TTD strip" }, - "DeployLockDto": { + "IncidentUpdateDto": { "required": [ - "expiresAt", + "createdAt", "id", - "lockedAt", - "lockedBy" + "incidentId", + "notifySubscribers" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique lock identifier", "format": "uuid" }, - "lockedBy": { - "minLength": 1, - "type": "string", - "description": "Identity of the lock holder (e.g. CLI session ID, username)" - }, - "lockedAt": { + "incidentId": { "type": "string", - "description": "Timestamp when the lock was acquired", - "format": "date-time" + "format": "uuid" }, - "expiresAt": { - "type": "string", - "description": "Timestamp when the lock automatically expires", - "format": "date-time" - } - }, - "description": "Represents an active deploy lock for a workspace" - }, - "DiscordChannelConfig": { - "required": [ - "channelType", - "webhookUrl" - ], - "type": "object", - "properties": { - "channelType": { + "oldStatus": { "type": "string", + "nullable": true, "enum": [ - "discord" + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" ] }, - "webhookUrl": { - "minLength": 1, - "type": "string", - "description": "Discord webhook URL" - }, - "mentionRoleId": { - "type": "string", - "description": "Optional Discord role ID to mention in notifications", - "nullable": true - } - } - }, - "Dns": { - "type": "object", - "description": "DNS check-type-specific details", - "properties": { - "check_type": { + "newStatus": { "type": "string", + "nullable": true, "enum": [ - "dns" + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" ] }, - "hostname": { + "body": { "type": "string", - "description": "Target hostname", "nullable": true }, - "requestedTypes": { - "type": "array", - "description": "Requested DNS record types", - "nullable": true, - "items": { - "type": "string", - "description": "Requested DNS record types", - "nullable": true - } - }, - "usedResolver": { + "createdBy": { "type": "string", - "description": "Resolver used for lookup", - "nullable": true - }, - "records": { - "type": "object", - "additionalProperties": { - "type": "array", - "description": "Resolved DNS records keyed by record type", - "nullable": true, - "items": { - "type": "object", - "additionalProperties": { - "type": "object", - "description": "Resolved DNS records keyed by record type", - "nullable": true - }, - "description": "Resolved DNS records keyed by record type", - "nullable": true - } - }, - "description": "Resolved DNS records keyed by record type", - "nullable": true - }, - "attempts": { - "type": "array", - "description": "DNS resolution attempts", "nullable": true, - "items": { - "type": "object", - "additionalProperties": { - "type": "object", - "description": "DNS resolution attempts", - "nullable": true - }, - "description": "DNS resolution attempts", - "nullable": true - } - }, - "failureKind": { - "type": "string", - "description": "Kind of DNS failure, if any", - "nullable": true - } - }, - "required": [ - "check_type" - ] - }, - "DnsExpectedCnameAssertion": { - "required": [ - "type", - "value" - ], - "type": "object", - "properties": { - "type": { - "type": "string", "enum": [ - "dns_expected_cname" + "SYSTEM", + "USER" ] }, - "value": { - "minLength": 1, + "notifySubscribers": { + "type": "boolean" + }, + "createdAt": { "type": "string", - "description": "Expected CNAME target the resolution must include" + "format": "date-time" } } }, - "DnsExpectedIpsAssertion": { + "IntegrationConfigSchemaDto": { "required": [ - "type", - "ips" + "channelFields", + "connectionFields" ], "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "dns_expected_ips" - ] + "connectionFields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationFieldDto" + } }, - "ips": { - "minItems": 1, + "channelFields": { "type": "array", - "description": "Allowed IP addresses; at least one resolved address must match", "items": { - "type": "string", - "description": "Allowed IP addresses; at least one resolved address must match" + "$ref": "#/components/schemas/IntegrationFieldDto" } } } }, - "DnsMaxAnswersAssertion": { + "IntegrationDto": { "required": [ - "type", - "recordType", - "max" + "authType", + "configSchema", + "description", + "lifecycle", + "logoUrl", + "name", + "setupGuideUrl", + "tierAvailability", + "type" ], "type": "object", "properties": { "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "logoUrl": { + "type": "string" + }, + "authType": { + "type": "string" + }, + "tierAvailability": { "type": "string", "enum": [ - "dns_max_answers" + "FREE", + "STARTER", + "PRO", + "TEAM", + "BUSINESS", + "ENTERPRISE" ] }, - "recordType": { - "minLength": 1, - "type": "string", - "description": "DNS record type whose answer count is checked" + "lifecycle": { + "type": "string" }, - "max": { - "type": "integer", - "description": "Maximum number of answers allowed for that record type", - "format": "int32" + "setupGuideUrl": { + "type": "string" + }, + "configSchema": { + "$ref": "#/components/schemas/IntegrationConfigSchemaDto" } } }, - "DnsMinAnswersAssertion": { + "IntegrationFieldDto": { "required": [ - "type", - "recordType", - "min" + "key", + "label", + "required", + "sensitive", + "type" ], "type": "object", "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, "type": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "sensitive": { + "type": "boolean" + }, + "placeholder": { "type": "string", - "enum": [ - "dns_min_answers" - ] + "nullable": true }, - "recordType": { - "minLength": 1, + "helpText": { "type": "string", - "description": "DNS record type whose answer count is checked" + "nullable": true }, - "min": { - "type": "integer", - "description": "Minimum number of answers required for that record type", - "format": "int32" + "options": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, + "default": { + "type": "string", + "nullable": true } } }, - "DnsMonitorConfig": { + "InviteDto": { "required": [ - "hostname" + "createdAt", + "email", + "expiresAt", + "roleOffered", + "inviteId" ], "type": "object", "properties": { - "hostname": { - "minLength": 1, + "inviteId": { + "type": "integer", + "description": "Unique invite identifier", + "format": "int32" + }, + "email": { "type": "string", - "description": "Domain name to resolve" + "description": "Email address the invite was sent to" }, - "recordTypes": { - "type": "array", - "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", - "nullable": true, - "items": { - "type": "string", - "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", - "nullable": true, - "enum": [ - "A", - "AAAA", - "CNAME", - "MX", - "NS", - "TXT", - "SRV", - "SOA", - "CAA", - "PTR" - ] - } + "roleOffered": { + "type": "string", + "description": "Role that will be assigned to the invitee on acceptance", + "enum": [ + "OWNER", + "ADMIN", + "MEMBER" + ] }, - "nameservers": { - "type": "array", - "description": "Custom nameservers to query (uses system defaults if omitted)", - "nullable": true, - "items": { - "type": "string", - "description": "Custom nameservers to query (uses system defaults if omitted)", - "nullable": true - } + "createdAt": { + "type": "string", + "description": "Timestamp when the invite was created", + "format": "date-time" }, - "timeoutMs": { - "type": "integer", - "description": "Per-query timeout in milliseconds", - "format": "int32", + "expiresAt": { + "type": "string", + "description": "Timestamp when the invite expires", + "format": "date-time" + }, + "consumedAt": { + "type": "string", + "description": "Timestamp when the invite was accepted; null if not yet used", + "format": "date-time", "nullable": true }, - "totalTimeoutMs": { - "type": "integer", - "description": "Total timeout for all queries in milliseconds", - "format": "int32", + "revokedAt": { + "type": "string", + "description": "Timestamp when the invite was revoked; null if active", + "format": "date-time", "nullable": true } - } + }, + "description": "Organization invite sent to an email address" }, - "DnsRecordContainsAssertion": { + "JiraChannelConfig": { "required": [ - "type", - "recordType", - "substring" + "channelType", + "domain", + "email", + "apiToken", + "projectKey" ], "type": "object", "properties": { - "type": { + "channelType": { "type": "string", "enum": [ - "dns_record_contains" + "jira" ] }, - "recordType": { + "domain": { "minLength": 1, "type": "string", - "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + "description": "Atlassian instance domain (e.g. yourteam.atlassian.net)" }, - "substring": { + "email": { + "minLength": 1, + "type": "string", + "description": "Atlassian account email for API authentication" + }, + "apiToken": { "minLength": 1, "type": "string", - "description": "Substring that must appear in a matching record value" + "description": "Atlassian API token" + }, + "projectKey": { + "minLength": 1, + "type": "string", + "description": "Jira project key where issues are created (e.g. OPS)" + }, + "issueType": { + "type": "string", + "description": "Issue type name (e.g. Bug, Task, Incident)", + "nullable": true } } }, - "DnsRecordEqualsAssertion": { + "JsonPathAssertion": { "required": [ "type", - "recordType", - "value" + "path", + "expected", + "operator" ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "dns_record_equals" + "json_path" ] }, - "recordType": { + "path": { "minLength": 1, "type": "string", - "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + "description": "JSONPath expression to extract a value from the response body" }, - "value": { + "expected": { "minLength": 1, "type": "string", - "description": "Expected DNS record value for an exact match" - } - } - }, - "DnsResolvesAssertion": { - "type": "object", - "properties": { - "type": { + "description": "Expected value to compare against" + }, + "operator": { "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", "enum": [ - "dns_resolves" + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" ] } - }, - "required": [ - "type" - ] + } }, - "DnsResponseTimeAssertion": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "dns_response_time" - ] - }, - "maxMs": { - "type": "integer", - "description": "Maximum allowed DNS resolution time in milliseconds", - "format": "int32" - } - }, + "KeyInfo": { "required": [ - "type", - "maxMs" - ] - }, - "DnsResponseTimeWarnAssertion": { + "createdAt", + "name", + "id" + ], "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "dns_response_time_warn" - ] - }, - "warnMs": { + "id": { "type": "integer", - "description": "DNS resolution time in milliseconds that triggers a warning only", + "description": "Key ID", "format": "int32" - } - }, - "required": [ - "type", - "warnMs" - ] - }, - "DnsTtlHighAssertion": { - "type": "object", - "properties": { - "type": { + }, + "name": { "type": "string", - "enum": [ - "dns_ttl_high" - ] + "description": "Human-readable key name" }, - "maxTtl": { - "type": "integer", - "description": "Maximum TTL in seconds before a high-TTL warning is raised", - "format": "int32" - } - }, - "required": [ - "type", - "maxTtl" - ] - }, - "DnsTtlLowAssertion": { - "type": "object", - "properties": { - "type": { + "createdAt": { "type": "string", - "enum": [ - "dns_ttl_low" - ] + "description": "When the key was created", + "format": "date-time" }, - "minTtl": { - "type": "integer", - "description": "Minimum acceptable TTL in seconds before a warning is raised", - "format": "int32" - } - }, - "required": [ - "type", - "minTtl" - ] - }, - "DnsTxtContainsAssertion": { - "required": [ - "type", - "substring" - ], - "type": "object", - "properties": { - "type": { + "expiresAt": { "type": "string", - "enum": [ - "dns_txt_contains" - ] + "description": "When the key expires (null = never)", + "format": "date-time", + "nullable": true }, - "substring": { - "minLength": 1, + "lastUsedAt": { "type": "string", - "description": "Substring that must appear in at least one TXT record" + "description": "Last time the key was used", + "format": "date-time", + "nullable": true } - } + }, + "description": "API key metadata" }, - "EmailChannelConfig": { + "LinearChannelConfig": { "required": [ "channelType", - "recipients" + "apiKey", + "teamId" ], "type": "object", "properties": { "channelType": { "type": "string", "enum": [ - "email" + "linear" ] }, - "recipients": { - "minItems": 1, - "type": "array", - "description": "Email addresses to send notifications to", - "items": { - "type": "string", - "description": "Email addresses to send notifications to", - "format": "email" - } - } - } - }, - "EntitlementDto": { - "required": [ - "key", - "value", - "defaultValue", - "overridden" - ], - "type": "object", - "properties": { - "key": { + "apiKey": { + "minLength": 1, "type": "string", - "description": "Entitlement key" - }, - "value": { - "type": "integer", - "description": "Effective limit value (overrides applied)", - "format": "int64" + "description": "Linear API key" }, - "defaultValue": { - "type": "integer", - "description": "Plan-tier default value before overrides", - "format": "int64" + "teamId": { + "minLength": 1, + "type": "string", + "description": "Team ID to create issues in" }, - "overridden": { - "type": "boolean", - "description": "Whether this entitlement has an org-level override" + "labelId": { + "type": "string", + "description": "Label ID to attach to created issues", + "nullable": true } - }, - "description": "A single resolved entitlement for the organization" + } }, - "EnvironmentDto": { + "LinkedStatusPageIncidentDto": { "required": [ - "createdAt", + "connectionMode", "id", - "name", - "slug", - "updatedAt", - "variables", - "orgId", - "monitorCount", - "isDefault" + "impact", + "pageIncidentMode", + "spIncidentId", + "status", + "statusPageId", + "statusPageName", + "statusPageSlug", + "title", + "scheduled" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique environment identifier", + "description": "Status page incident ID (same value as spIncidentId; kept for backwards compatibility)", "format": "uuid" }, - "orgId": { - "type": "integer", - "description": "Organization this environment belongs to", - "format": "int32" + "spIncidentId": { + "type": "string", + "description": "Status page incident ID (alias for id) \u2014 use this when the outer context is a monitoring incident", + "format": "uuid" }, - "name": { - "minLength": 1, + "statusPageId": { "type": "string", - "description": "Human-readable environment name" + "description": "Parent status page ID", + "format": "uuid" }, - "slug": { - "minLength": 1, + "statusPageName": { "type": "string", - "description": "URL-safe identifier" + "description": "Parent status page display name" }, - "variables": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Key-value variable pairs available for interpolation" - }, - "description": "Key-value variable pairs available for interpolation" + "statusPageSlug": { + "type": "string", + "description": "Parent status page URL slug" }, - "createdAt": { + "title": { "type": "string", - "description": "Timestamp when the environment was created", - "format": "date-time" + "description": "Customer-facing incident title" }, - "updatedAt": { + "status": { "type": "string", - "description": "Timestamp when the environment was last updated", - "format": "date-time" + "description": "Current lifecycle status (INVESTIGATING, IDENTIFIED, MONITORING, RESOLVED)", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] }, - "monitorCount": { - "type": "integer", - "description": "Number of monitors using this environment", - "format": "int32" + "impact": { + "type": "string", + "description": "Impact level (NONE, MINOR, MAJOR, CRITICAL)", + "enum": [ + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" + ] }, - "isDefault": { + "scheduled": { "type": "boolean", - "description": "Whether this is the default environment for new monitors" + "description": "Scheduled maintenance flag" + }, + "publishedAt": { + "type": "string", + "description": "Publish time; null while draft", + "format": "date-time", + "nullable": true + }, + "connectionMode": { + "type": "string", + "description": "Whether the linked SPI was created by automation (AUTO) or by a human/API caller (MANUAL)", + "enum": [ + "AUTO", + "MANUAL" + ] + }, + "pageIncidentMode": { + "type": "string", + "description": "Incident mode of the parent status page at read time (MANUAL, REVIEW, AUTOMATIC)", + "enum": [ + "MANUAL", + "REVIEW", + "AUTOMATIC" + ] } - }, - "description": "Environment with variable substitutions for monitor configs" + } }, - "ErrorEntry": { + "MaintenanceComponentRef": { "required": [ - "code", - "message" + "id", + "name", + "status" ], "type": "object", "properties": { - "code": { - "minLength": 1, + "id": { "type": "string", - "description": "Stable machine-readable code; see ValidationErrorCode for the registry", - "example": "MONITOR_HEARTBEAT_GRACE_EXCEEDS_INTERVAL" + "description": "Component identifier", + "format": "uuid" }, - "field": { + "name": { "type": "string", - "description": "JSON-pointer-like path to the offending field, or null for request-wide errors", - "nullable": true, - "example": "config.gracePeriod" + "description": "Component name" }, - "message": { - "minLength": 1, + "status": { "type": "string", - "description": "Human-readable message; safe to surface to end users" + "description": "Component status at the time of the maintenance update" } }, - "description": "One structured validation rejection" + "description": "A component affected by a scheduled maintenance window" }, - "ErrorResponse": { + "MaintenanceEventDto": { "required": [ - "code", - "message", + "externalId", + "maintenanceId", "status", - "timestamp" + "title" ], "type": "object", "properties": { - "status": { - "type": "integer", - "description": "HTTP status code (mirrors the response status line)", - "format": "int32", - "example": 404 + "maintenanceId": { + "type": "string", + "description": "Vendor catalog maintenance ID", + "format": "uuid" }, - "code": { + "externalId": { "type": "string", - "description": "Coarse machine-readable error category (e.g. NOT_FOUND, RATE_LIMITED); stable per status", - "example": "NOT_FOUND" + "description": "Vendor-supplied external maintenance ID" }, - "message": { + "title": { "type": "string", - "description": "Human-readable error message; safe to surface to end users", - "example": "Monitor not found" + "description": "Maintenance title from the vendor status page" }, - "timestamp": { - "type": "integer", - "description": "Server time when the error was produced (epoch milliseconds)", - "format": "int64", - "example": 1737302400000 + "status": { + "type": "string", + "description": "Lifecycle status: scheduled, in_progress, verifying, completed" }, - "requestId": { + "impact": { "type": "string", - "description": "Opaque per-request id; same value as the X-Request-Id response header. Use in support tickets.", - "nullable": true, - "example": "5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a" + "description": "Vendor impact level", + "nullable": true }, - "errors": { - "type": "array", - "description": "Structured per-field rejections; populated for validation errors, null otherwise", - "nullable": true, - "items": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/ErrorEntry" - } - ] - } - } - }, - "description": "Uniform error envelope returned for every non-2xx response", - "example": { - "status": 404, - "code": "NOT_FOUND", - "message": "Monitor not found", - "timestamp": 1737302400000, - "requestId": "5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a" - } - }, - "EscalationChain": { - "required": [ - "steps" - ], - "type": "object", - "properties": { - "steps": { - "minItems": 1, - "type": "array", - "description": "Ordered escalation steps, evaluated in sequence", - "items": { - "$ref": "#/components/schemas/EscalationStep" - } + "shortlink": { + "type": "string", + "description": "Short public URL for the vendor maintenance", + "nullable": true }, - "onResolve": { + "scheduledFor": { "type": "string", - "description": "Action when the incident resolves", + "description": "Scheduled start; null for undated maintenance", + "format": "date-time", "nullable": true }, - "onReopen": { + "scheduledUntil": { "type": "string", - "description": "Action when a resolved incident reopens", + "description": "Scheduled end", + "format": "date-time", "nullable": true - } - }, - "description": "Escalation chain defining which channels to notify; null preserves current" - }, - "EscalationStep": { - "required": [ - "channelIds", - "delayMinutes" - ], - "type": "object", - "properties": { - "delayMinutes": { - "minimum": 0, - "type": "integer", - "description": "Minutes to wait before executing this step (0 = immediate)", - "format": "int32" }, - "channelIds": { - "minItems": 1, + "startedAt": { + "type": "string", + "description": "When maintenance actually started", + "format": "date-time", + "nullable": true + }, + "completedAt": { + "type": "string", + "description": "When maintenance completed", + "format": "date-time", + "nullable": true + }, + "affectedComponentIds": { "type": "array", - "description": "Alert channel IDs to notify in this step", + "description": "Affected component IDs", + "nullable": true, "items": { "type": "string", - "description": "Alert channel IDs to notify in this step", + "description": "Affected component IDs", "format": "uuid" } - }, - "requireAck": { - "type": "boolean", - "description": "Whether an acknowledgment is required before escalating", - "nullable": true - }, - "repeatIntervalSeconds": { - "minimum": 1, - "type": "integer", - "description": "Repeat notification interval in seconds until acknowledged", - "format": "int32", - "nullable": true } }, - "description": "Ordered escalation steps, evaluated in sequence" + "description": "Vendor maintenance fields for a status-events rail row" }, - "FailureDetail": { + "MaintenanceUpdateDto": { "required": [ - "monitorId", - "reason" + "id", + "status" ], "type": "object", "properties": { - "monitorId": { + "id": { "type": "string", - "description": "Monitor ID that failed", + "description": "Unique update identifier", "format": "uuid" }, - "reason": { - "type": "string", - "description": "Human-readable reason for the failure" - } - }, - "description": "Details about a single monitor that failed the bulk action" - }, - "GitLabChannelConfig": { - "required": [ - "channelType", - "endpointUrl", - "authorizationKey" - ], - "type": "object", - "properties": { - "channelType": { + "status": { "type": "string", - "enum": [ - "gitlab" - ] + "description": "Status at the time of this update" }, - "endpointUrl": { - "minLength": 1, + "body": { "type": "string", - "description": "GitLab alert integration endpoint URL" + "description": "Update message from the vendor", + "nullable": true }, - "authorizationKey": { - "minLength": 1, + "displayAt": { "type": "string", - "description": "Authorization key from GitLab alert integration settings" + "description": "Timestamp when this update was posted", + "format": "date-time", + "nullable": true } - } + }, + "description": "A status update within a scheduled maintenance lifecycle" }, - "GlobalStatusSummaryDto": { + "MaintenanceWindowDto": { "required": [ - "servicesWithIssues", - "totalServices", - "operationalCount", - "degradedCount", - "partialOutageCount", - "majorOutageCount", - "maintenanceCount", - "unknownCount", - "activeIncidentCount" + "createdAt", + "endsAt", + "id", + "startsAt", + "organizationId", + "suppressAlerts" ], "type": "object", "properties": { - "totalServices": { - "type": "integer", - "description": "Total number of services in the catalog", - "format": "int32" + "id": { + "type": "string", + "description": "Unique maintenance window identifier", + "format": "uuid" }, - "operationalCount": { - "type": "integer", - "description": "Number of services currently fully operational", - "format": "int32" + "monitorId": { + "type": "string", + "description": "Monitor this window applies to; null for org-wide windows", + "format": "uuid", + "nullable": true }, - "degradedCount": { + "organizationId": { "type": "integer", - "description": "Number of services with degraded status", + "description": "Organization this maintenance window belongs to", "format": "int32" }, - "partialOutageCount": { - "type": "integer", - "description": "Number of services with partial outage", - "format": "int32" + "startsAt": { + "type": "string", + "description": "Scheduled start of the maintenance window", + "format": "date-time" }, - "majorOutageCount": { - "type": "integer", - "description": "Number of services with major outage", - "format": "int32" + "endsAt": { + "type": "string", + "description": "Scheduled end of the maintenance window", + "format": "date-time" }, - "maintenanceCount": { - "type": "integer", - "description": "Number of services currently under maintenance", - "format": "int32" + "repeatRule": { + "type": "string", + "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)", + "nullable": true }, - "unknownCount": { - "type": "integer", - "description": "Number of services with unknown or null status", - "format": "int32" + "reason": { + "type": "string", + "description": "Human-readable reason for the maintenance", + "nullable": true }, - "activeIncidentCount": { - "type": "integer", - "description": "Total number of active incidents across all services", - "format": "int64" + "suppressAlerts": { + "type": "boolean", + "description": "Whether alerts are suppressed during this window" }, - "servicesWithIssues": { - "type": "array", - "description": "Services that are not fully operational", - "items": { - "$ref": "#/components/schemas/ServiceCatalogDto" - } + "createdAt": { + "type": "string", + "description": "Timestamp when the window was created", + "format": "date-time" } }, - "description": "Global status summary across all subscribed vendor services" + "description": "Scheduled maintenance window for a monitor" }, - "GoogleChatChannelConfig": { + "MatchRule": { "required": [ - "channelType", - "webhookUrl" + "type" ], "type": "object", "properties": { - "channelType": { + "type": { "type": "string", + "description": "Rule type used to evaluate incidents and status events", "enum": [ - "google_chat" + "severity_gte", + "monitor_id_in", + "region_in", + "incident_status", + "monitor_type_in", + "service_id_in", + "resource_group_id_in", + "component_name_in", + "monitor_tag_in" ] }, - "webhookUrl": { - "minLength": 1, - "type": "string", - "description": "Google Chat space webhook URL" - } - } - }, - "GroupComponentOrder": { - "required": [ - "groupId", - "positions" - ], - "type": "object", - "properties": { - "groupId": { + "value": { "type": "string", - "description": "Group these components belong to", - "format": "uuid" + "description": "Comparison value for single-value rules like severity_gte", + "nullable": true }, - "positions": { - "minItems": 1, + "monitorIds": { "type": "array", - "description": "Ordered component IDs with their within-group display order", + "description": "Monitor UUIDs to match for monitor_id_in rules", + "nullable": true, "items": { - "$ref": "#/components/schemas/ComponentPosition" + "type": "string", + "description": "Monitor UUIDs to match for monitor_id_in rules", + "format": "uuid" + } + }, + "regions": { + "type": "array", + "description": "Region codes to match for region_in rules", + "nullable": true, + "items": { + "type": "string", + "description": "Region codes to match for region_in rules" + } + }, + "values": { + "type": "array", + "description": "Values list for multi-value rules like monitor_type_in", + "nullable": true, + "items": { + "type": "string", + "description": "Values list for multi-value rules like monitor_type_in" } } }, - "description": "Component ordering within a single group" + "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)" }, - "HeaderAuthConfig": { + "MattermostChannelConfig": { "required": [ - "type", - "headerName" + "channelType", + "webhookUrl" ], "type": "object", "properties": { - "type": { + "channelType": { "type": "string", "enum": [ - "header" + "mattermost" ] }, - "headerName": { + "webhookUrl": { "minLength": 1, - "pattern": "^[A-Za-z0-9\\-_]+$", "type": "string", - "description": "Custom HTTP header name for the secret value" + "description": "Mattermost incoming webhook URL" }, - "vaultSecretId": { + "channel": { "type": "string", - "description": "Vault secret ID for the header value", - "format": "uuid", + "description": "Override channel (if webhook allows)", + "nullable": true + }, + "iconUrl": { + "type": "string", + "description": "Custom bot icon URL", "nullable": true } } }, - "HeaderValueAssertion": { - "required": [ - "type", - "headerName", - "expected", - "operator" - ], + "McpConnectsAssertion": { "type": "object", "properties": { "type": { "type": "string", "enum": [ - "header_value" - ] - }, - "headerName": { - "minLength": 1, - "type": "string", - "description": "HTTP header name to assert on" - }, - "expected": { - "minLength": 1, - "type": "string", - "description": "Expected value to compare against" - }, - "operator": { - "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" + "mcp_connects" ] } - } + }, + "required": [ + "type" + ] }, - "HeartbeatIntervalDriftAssertion": { + "McpHasCapabilityAssertion": { "required": [ "type", - "maxDeviationPercent" + "capability" ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "heartbeat_interval_drift" + "mcp_has_capability" ] }, - "maxDeviationPercent": { - "maximum": 100, - "minimum": 1, - "type": "integer", - "description": "Max percent drift from expected ping interval before warning (non-fatal)", - "format": "int32" + "capability": { + "minLength": 1, + "type": "string", + "description": "Capability name the server must advertise, e.g. tools or resources" } } }, - "HeartbeatMaxIntervalAssertion": { + "McpMinToolsAssertion": { "required": [ "type", - "maxSeconds" + "min" ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "heartbeat_max_interval" + "mcp_min_tools" ] }, - "maxSeconds": { - "minimum": 1, - "type": "integer", - "description": "Maximum allowed gap in seconds between consecutive heartbeat pings", - "format": "int32" - } - } - }, - "HeartbeatMonitorConfig": { - "required": [ - "expectedInterval", - "gracePeriod" - ], - "type": "object", - "properties": { - "expectedInterval": { - "maximum": 86400, - "minimum": 1, - "type": "integer", - "description": "Expected heartbeat interval in seconds", - "format": "int32" - }, - "gracePeriod": { - "minimum": 1, + "min": { "type": "integer", - "description": "Grace period in seconds before marking as down", + "description": "Minimum number of tools the server must expose", "format": "int32" } } }, - "HeartbeatPayloadContainsAssertion": { + "McpProtocolVersionAssertion": { "required": [ "type", - "path", - "value" + "version" ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "heartbeat_payload_contains" + "mcp_protocol_version" ] }, - "path": { + "version": { "minLength": 1, "type": "string", - "description": "JSONPath expression into the heartbeat ping JSON payload" - }, - "value": { - "type": "string", - "description": "Expected value to compare against at that path" + "description": "Expected MCP protocol version string from the server handshake" } } }, - "HeartbeatPingResponse": { - "required": [ - "ok" - ], - "type": "object", - "properties": { - "ok": { - "type": "boolean", - "description": "Always true on a 2xx response", - "example": true - } - }, - "description": "Acknowledgement that a heartbeat ping was accepted" - }, - "HeartbeatReceivedAssertion": { + "McpResponseTimeAssertion": { "type": "object", "properties": { "type": { "type": "string", "enum": [ - "heartbeat_received" + "mcp_response_time" ] + }, + "maxMs": { + "type": "integer", + "description": "Maximum allowed MCP check duration in milliseconds", + "format": "int32" } }, "required": [ - "type" + "type", + "maxMs" ] }, - "Http": { + "McpResponseTimeWarnAssertion": { "type": "object", - "description": "HTTP check-type-specific details", "properties": { - "check_type": { + "type": { "type": "string", "enum": [ - "http" - ] - }, - "timing": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/TimingPhasesDto" - } + "mcp_response_time_warn" ] }, - "bodyTruncated": { - "type": "boolean", - "description": "Whether the response body was truncated before storage", - "nullable": true + "warnMs": { + "type": "integer", + "description": "MCP check duration in milliseconds that triggers a warning only", + "format": "int32" } }, "required": [ - "check_type" + "type", + "warnMs" ] }, - "HttpMonitorConfig": { - "required": [ - "method", - "url" - ], - "type": "object", - "properties": { - "url": { - "minLength": 1, - "type": "string", - "description": "Target URL to send requests to" - }, - "method": { - "type": "string", - "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD", - "enum": [ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "HEAD" - ] - }, - "customHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Additional HTTP headers to include in requests", - "nullable": true - }, - "description": "Additional HTTP headers to include in requests", - "nullable": true - }, - "requestBody": { - "type": "string", - "description": "Request body content for POST/PUT/PATCH methods", - "nullable": true - }, - "contentType": { - "type": "string", - "description": "Content-Type header value for the request body", - "nullable": true - }, - "verifyTls": { - "type": "boolean", - "description": "Whether to verify TLS certificates (default: true)", - "nullable": true - } - } - }, - "Icmp": { - "required": [ - "check_type", - "host" - ], + "McpServer": { "type": "object", - "description": "ICMP (ping) check-type-specific details", + "description": "MCP server check-type-specific details", "properties": { "check_type": { "type": "string", "enum": [ - "icmp" + "mcp_server" ] }, - "host": { + "url": { "type": "string", - "description": "Target host", - "example": "1.1.1.1" - }, - "packetsSent": { - "type": "integer", - "description": "Number of ICMP packets sent", - "format": "int32", - "nullable": true - }, - "packetsReceived": { - "type": "integer", - "description": "Number of ICMP packets received", - "format": "int32", - "nullable": true - }, - "packetLoss": { - "type": "number", - "description": "Packet loss percentage", - "format": "double", - "nullable": true, - "example": 0 - }, - "avgRttMs": { - "type": "number", - "description": "Average round-trip time in ms", - "format": "double", - "nullable": true - }, - "minRttMs": { - "type": "number", - "description": "Minimum round-trip time in ms", - "format": "double", + "description": "MCP server URL", "nullable": true }, - "maxRttMs": { - "type": "number", - "description": "Maximum round-trip time in ms", - "format": "double", + "protocolVersion": { + "type": "string", + "description": "MCP protocol version", "nullable": true }, - "jitterMs": { - "type": "number", - "description": "Jitter in ms", - "format": "double", + "serverInfo": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "MCP server info (name, version, etc.)", + "nullable": true + }, + "description": "MCP server info (name, version, etc.)", "nullable": true - } - } - }, - "IcmpMonitorConfig": { - "required": [ - "host" - ], - "type": "object", - "properties": { - "host": { - "minLength": 1, - "type": "string", - "description": "Target hostname or IP address to ping" }, - "packetCount": { - "maximum": 20, - "minimum": 1, + "toolCount": { "type": "integer", - "description": "Number of ICMP packets to send", + "description": "Number of tools exposed", "format": "int32", "nullable": true }, - "timeoutMs": { + "resourceCount": { "type": "integer", - "description": "Ping timeout in milliseconds", + "description": "Number of resources exposed", "format": "int32", "nullable": true - } - } - }, - "IcmpPacketLossAssertion": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "icmp_packet_loss" - ] }, - "maxPercent": { - "maximum": 100, - "exclusiveMaximum": false, - "minimum": 0, - "exclusiveMinimum": false, - "type": "number", - "description": "Maximum allowed packet loss percentage before the check fails (0–100)", - "format": "double" + "promptCount": { + "type": "integer", + "description": "Number of prompts exposed", + "format": "int32", + "nullable": true } }, "required": [ - "type", - "maxPercent" + "check_type" ] }, - "IcmpReachableAssertion": { + "McpServerMonitorConfig": { + "required": [ + "command" + ], "type": "object", "properties": { - "type": { + "command": { + "minLength": 1, "type": "string", - "enum": [ - "icmp_reachable" - ] + "description": "Command to execute to start the MCP server" + }, + "args": { + "type": "array", + "description": "Command-line arguments for the MCP server process", + "nullable": true, + "items": { + "type": "string", + "description": "Command-line arguments for the MCP server process", + "nullable": true + } + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Environment variables to pass to the MCP server process", + "nullable": true + }, + "description": "Environment variables to pass to the MCP server process", + "nullable": true } - }, - "required": [ - "type" - ] + } }, - "IcmpResponseTimeAssertion": { + "McpToolAvailableAssertion": { + "required": [ + "type", + "toolName" + ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "icmp_response_time" + "mcp_tool_available" ] }, - "maxMs": { - "type": "integer", - "description": "Maximum average ICMP round-trip time in milliseconds", - "format": "int32" + "toolName": { + "minLength": 1, + "type": "string", + "description": "MCP tool name that must appear in the server's tool list" } - }, + } + }, + "McpToolCountChangedAssertion": { "required": [ "type", - "maxMs" - ] - }, - "IcmpResponseTimeWarnAssertion": { + "expectedCount" + ], "type": "object", "properties": { "type": { "type": "string", "enum": [ - "icmp_response_time_warn" + "mcp_tool_count_changed" ] }, - "warnMs": { + "expectedCount": { "type": "integer", - "description": "ICMP round-trip time in milliseconds that triggers a warning only", + "description": "Expected tool count; warns when the live count differs", "format": "int32" } - }, - "required": [ - "type", - "warnMs" - ] + } }, - "IncidentActivityEventDto": { + "MemberDto": { "required": [ - "at", - "id", - "kind", - "summary" + "createdAt", + "email", + "orgRole", + "status", + "userId" ], "type": "object", "properties": { - "id": { + "userId": { + "type": "integer", + "description": "User identifier of the member", + "format": "int32" + }, + "email": { "type": "string", - "description": "Stable event ID (source row ID)", - "format": "uuid" + "description": "Member email address" }, - "at": { + "name": { "type": "string", - "description": "When the event occurred (ISO 8601)", - "format": "date-time" + "description": "Member display name; null if not set", + "nullable": true }, - "kind": { + "orgRole": { "type": "string", - "description": "Activity event kind in the merged incident activity stream", + "description": "Member role within this organization (OWNER, ADMIN, MEMBER)", "enum": [ - "update", - "dispatch", - "delivery", - "forensic_transition", - "status_page_update" + "OWNER", + "ADMIN", + "MEMBER" ] }, - "actor": { + "status": { "type": "string", - "description": "Actor label when known (user email, system, etc.)", - "nullable": true + "description": "Membership status (ACTIVE, PENDING, SUSPENDED)", + "enum": [ + "INVITED", + "ACTIVE", + "SUSPENDED", + "LEFT", + "REMOVED", + "DECLINED" + ] }, - "summary": { + "createdAt": { "type": "string", - "description": "Human-readable summary of the event" - }, - "payload": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/IncidentActivityPayloadDto" - } - ] + "description": "Timestamp when the member was added to the organization", + "format": "date-time" } }, - "description": "Merged incident activity event (updates, dispatches, deliveries, forensics, SP updates)" + "description": "Organization member with role and status" }, - "IncidentActivityPayloadDto": { + "MemberRoleChangedMetadata": { + "required": [ + "kind", + "oldRole", + "newRole" + ], "type": "object", + "description": "Role transition recorded when an organization member's role changes.", "properties": { - "oldStatus": { - "type": "string", - "description": "Previous incident status on an update", - "nullable": true - }, - "newStatus": { - "type": "string", - "description": "New incident status on an update", - "nullable": true - }, - "body": { - "type": "string", - "description": "Update or status-page note body", - "nullable": true - }, - "createdBy": { - "type": "string", - "description": "Who created the update (SYSTEM, USER, …)", - "nullable": true - }, - "phase": { - "type": "string", - "description": "Dispatch lifecycle phase (fired, acked)", - "nullable": true - }, - "status": { - "type": "string", - "description": "Dispatch, delivery, or status-page status", - "nullable": true - }, - "policyId": { - "type": "string", - "description": "Notification policy id for a dispatch row", - "nullable": true - }, - "policyName": { - "type": "string", - "description": "Notification policy name when resolved", - "nullable": true - }, - "currentStep": { - "type": "integer", - "description": "Current escalation step (1-based)", - "format": "int32", - "nullable": true - }, - "dispatchId": { - "type": "string", - "description": "Notification dispatch id", - "nullable": true - }, - "acknowledgedBy": { - "type": "string", - "description": "Who acknowledged the dispatch", - "nullable": true - }, - "acknowledgedVia": { + "kind": { "type": "string", - "description": "Ack channel (UI, Slack, …)", - "nullable": true + "enum": [ + "member_role_changed" + ] }, - "eventType": { + "oldRole": { "type": "string", - "description": "Alert delivery event type", - "nullable": true - }, - "stepNumber": { - "type": "integer", - "description": "Escalation step that sent this delivery", - "format": "int32", - "nullable": true - }, - "fireCount": { - "type": "integer", - "description": "How many times this delivery has fired", - "format": "int32", - "nullable": true + "description": "Role the member held before the change", + "enum": [ + "OWNER", + "ADMIN", + "MEMBER" + ] }, - "channelId": { + "newRole": { "type": "string", - "description": "Alert channel id", - "nullable": true - }, - "channelName": { + "description": "Role the member holds after the change", + "enum": [ + "OWNER", + "ADMIN", + "MEMBER" + ] + } + } + }, + "MonitorAssertionDto": { + "required": [ + "assertionType", + "config", + "id", + "monitorId", + "severity" + ], + "type": "object", + "properties": { + "id": { "type": "string", - "description": "Alert channel name", - "nullable": true + "format": "uuid" }, - "channelType": { + "monitorId": { "type": "string", - "description": "Alert channel type", - "nullable": true + "format": "uuid" }, - "errorMessage": { + "assertionType": { "type": "string", - "description": "Delivery error message when the send failed", - "nullable": true + "enum": [ + "status_code", + "response_time", + "body_contains", + "json_path", + "header_value", + "regex_body", + "dns_resolves", + "dns_response_time", + "dns_expected_ips", + "dns_expected_cname", + "dns_record_contains", + "dns_record_equals", + "dns_txt_contains", + "dns_min_answers", + "dns_max_answers", + "dns_response_time_warn", + "dns_ttl_low", + "dns_ttl_high", + "mcp_connects", + "mcp_response_time", + "mcp_has_capability", + "mcp_tool_available", + "mcp_min_tools", + "mcp_protocol_version", + "mcp_response_time_warn", + "mcp_tool_count_changed", + "ssl_expiry", + "response_size", + "redirect_count", + "redirect_target", + "response_time_warn", + "tcp_connects", + "tcp_response_time", + "tcp_response_time_warn", + "icmp_reachable", + "icmp_response_time", + "icmp_response_time_warn", + "icmp_packet_loss", + "heartbeat_received", + "heartbeat_max_interval", + "heartbeat_interval_drift", + "heartbeat_payload_contains" + ] }, - "fromStatus": { - "type": "string", - "description": "Forensic from-status", - "nullable": true + "config": { + "oneOf": [ + { + "$ref": "#/components/schemas/BodyContainsAssertion" + }, + { + "$ref": "#/components/schemas/DnsExpectedCnameAssertion" + }, + { + "$ref": "#/components/schemas/DnsExpectedIpsAssertion" + }, + { + "$ref": "#/components/schemas/DnsMaxAnswersAssertion" + }, + { + "$ref": "#/components/schemas/DnsMinAnswersAssertion" + }, + { + "$ref": "#/components/schemas/DnsRecordContainsAssertion" + }, + { + "$ref": "#/components/schemas/DnsRecordEqualsAssertion" + }, + { + "$ref": "#/components/schemas/DnsResolvesAssertion" + }, + { + "$ref": "#/components/schemas/DnsResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/DnsResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/DnsTtlHighAssertion" + }, + { + "$ref": "#/components/schemas/DnsTtlLowAssertion" + }, + { + "$ref": "#/components/schemas/DnsTxtContainsAssertion" + }, + { + "$ref": "#/components/schemas/HeaderValueAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatIntervalDriftAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatMaxIntervalAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatPayloadContainsAssertion" + }, + { + "$ref": "#/components/schemas/HeartbeatReceivedAssertion" + }, + { + "$ref": "#/components/schemas/IcmpPacketLossAssertion" + }, + { + "$ref": "#/components/schemas/IcmpReachableAssertion" + }, + { + "$ref": "#/components/schemas/IcmpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/IcmpResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/JsonPathAssertion" + }, + { + "$ref": "#/components/schemas/McpConnectsAssertion" + }, + { + "$ref": "#/components/schemas/McpHasCapabilityAssertion" + }, + { + "$ref": "#/components/schemas/McpMinToolsAssertion" + }, + { + "$ref": "#/components/schemas/McpProtocolVersionAssertion" + }, + { + "$ref": "#/components/schemas/McpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/McpResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/McpToolAvailableAssertion" + }, + { + "$ref": "#/components/schemas/McpToolCountChangedAssertion" + }, + { + "$ref": "#/components/schemas/RedirectCountAssertion" + }, + { + "$ref": "#/components/schemas/RedirectTargetAssertion" + }, + { + "$ref": "#/components/schemas/RegexBodyAssertion" + }, + { + "$ref": "#/components/schemas/ResponseSizeAssertion" + }, + { + "$ref": "#/components/schemas/ResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/ResponseTimeWarnAssertion" + }, + { + "$ref": "#/components/schemas/SslExpiryAssertion" + }, + { + "$ref": "#/components/schemas/StatusCodeAssertion" + }, + { + "$ref": "#/components/schemas/TcpConnectsAssertion" + }, + { + "$ref": "#/components/schemas/TcpResponseTimeAssertion" + }, + { + "$ref": "#/components/schemas/TcpResponseTimeWarnAssertion" + } + ] }, - "toStatus": { + "severity": { "type": "string", - "description": "Forensic to-status", - "nullable": true + "enum": [ + "fail", + "warn" + ] + } + } + }, + "MonitorAuthConfig": { + "description": "New authentication configuration (full replacement)", + "discriminator": { + "propertyName": "type", + "mapping": { + "bearer": "#/components/schemas/BearerAuthConfig", + "basic": "#/components/schemas/BasicAuthConfig", + "header": "#/components/schemas/HeaderAuthConfig", + "api_key": "#/components/schemas/ApiKeyAuthConfig" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/BearerAuthConfig" }, - "reason": { - "type": "string", - "description": "Forensic transition reason", - "nullable": true + { + "$ref": "#/components/schemas/BasicAuthConfig" }, - "affectedRegions": { - "type": "array", - "description": "Regions named on the forensic transition", - "nullable": true, - "items": { - "type": "string", - "description": "Regions named on the forensic transition" - } + { + "$ref": "#/components/schemas/HeaderAuthConfig" }, - "statusPageIncidentId": { - "type": "string", - "description": "Linked status-page incident id", - "nullable": true + { + "$ref": "#/components/schemas/ApiKeyAuthConfig" } - }, - "description": "Kind-specific activity fields; omitted keys are absent, not null" + ] }, - "IncidentDetailDto": { + "MonitorAuthDto": { "required": [ - "incident", - "updates" + "authType", + "config", + "id", + "monitorId" ], "type": "object", "properties": { - "incident": { - "$ref": "#/components/schemas/IncidentDto" + "id": { + "type": "string", + "format": "uuid" }, - "updates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IncidentUpdateDto" - } + "monitorId": { + "type": "string", + "format": "uuid" }, - "statusPageIncidents": { - "type": "array", - "nullable": true, - "items": { - "$ref": "#/components/schemas/LinkedStatusPageIncidentDto" - } + "authType": { + "type": "string", + "enum": [ + "bearer", + "basic", + "header", + "api_key" + ] }, - "trigger": { - "nullable": true, - "allOf": [ + "config": { + "oneOf": [ { - "$ref": "#/components/schemas/IncidentTriggerDto" + "$ref": "#/components/schemas/ApiKeyAuthConfig" + }, + { + "$ref": "#/components/schemas/BasicAuthConfig" + }, + { + "$ref": "#/components/schemas/BearerAuthConfig" + }, + { + "$ref": "#/components/schemas/HeaderAuthConfig" } ] } } }, - "IncidentDto": { + "MonitorDto": { "required": [ - "affectedRegions", + "config", "createdAt", "id", - "severity", - "source", - "status", + "managedBy", + "name", + "regions", + "type", "updatedAt", "organizationId", - "reopenCount", - "statusPageVisible", - "suppressDispatch" + "frequencySeconds", + "enabled", + "muted" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique incident identifier", + "description": "Unique monitor identifier", "format": "uuid" }, - "monitorId": { - "type": "string", - "description": "Monitor that triggered the incident; null for service or manual incidents", - "format": "uuid", - "nullable": true - }, "organizationId": { "type": "integer", - "description": "Organization this incident belongs to", + "description": "Organization this monitor belongs to", "format": "int32" }, - "source": { + "name": { + "minLength": 1, "type": "string", - "description": "Incident origin: MONITOR, SERVICE, or MANUAL", - "enum": [ - "AUTOMATIC", - "MANUAL", - "MONITORS", - "STATUS_DATA", - "RESOURCE_GROUP" - ] + "description": "Human-readable name for this monitor" }, - "status": { + "type": { "type": "string", - "description": "Current lifecycle status (OPEN, RESOLVED, etc.)", "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, - "severity": { - "type": "string", - "description": "Severity level: DOWN, DEGRADED, or MAINTENANCE", - "enum": [ - "DOWN", - "DEGRADED", - "MAINTENANCE" + "config": { + "oneOf": [ + { + "$ref": "#/components/schemas/DnsMonitorConfig" + }, + { + "$ref": "#/components/schemas/HeartbeatMonitorConfig" + }, + { + "$ref": "#/components/schemas/HttpMonitorConfig" + }, + { + "$ref": "#/components/schemas/IcmpMonitorConfig" + }, + { + "$ref": "#/components/schemas/McpServerMonitorConfig" + }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, + { + "$ref": "#/components/schemas/TcpMonitorConfig" + } ] }, - "title": { - "type": "string", - "description": "Short summary of the incident; null for auto-generated incidents", - "nullable": true - }, - "triggeredByRule": { - "type": "string", - "description": "Human-readable description of the trigger rule that fired", - "nullable": true - }, - "affectedRegions": { - "type": "array", - "description": "Probe regions that observed the failure", - "items": { - "type": "string", - "description": "Probe regions that observed the failure" - } - }, - "reopenCount": { + "frequencySeconds": { "type": "integer", - "description": "Number of times this incident has been reopened", + "description": "Check frequency in seconds (30\u201386400)", "format": "int32" }, - "createdByUserId": { - "type": "integer", - "description": "User who created the incident (manual incidents only)", - "format": "int32", - "nullable": true - }, - "statusPageVisible": { - "type": "boolean", - "description": "Whether this incident is visible on the status page" - }, - "suppressDispatch": { + "enabled": { "type": "boolean", - "description": "When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted" - }, - "serviceIncidentId": { - "type": "string", - "description": "Linked vendor service incident ID; null for monitor incidents", - "format": "uuid", - "nullable": true - }, - "serviceId": { - "type": "string", - "description": "Linked service catalog ID; null for monitor incidents", - "format": "uuid", - "nullable": true - }, - "externalRef": { - "type": "string", - "description": "External reference ID (e.g. PagerDuty incident ID)", - "nullable": true + "description": "Whether the monitor is active" }, - "affectedComponents": { + "regions": { "type": "array", - "description": "Service components affected by this incident", - "nullable": true, + "description": "Probe regions where checks are executed", "items": { "type": "string", - "description": "Service components affected by this incident" + "description": "Probe regions where checks are executed" } }, - "shortlink": { - "type": "string", - "description": "Short URL linking to the incident details", - "nullable": true - }, - "resolutionReason": { + "managedBy": { "type": "string", - "description": "How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.)", - "nullable": true, + "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", "enum": [ - "MANUAL", - "AUTO_RECOVERED", - "AUTO_RESOLVED" + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" ] }, - "resolutionNote": { - "type": "string", - "description": "Body from the most recent resolve update; null when not currently resolved, auto-resolved without a note, or no resolve update body was provided", - "nullable": true - }, - "startedAt": { - "type": "string", - "description": "Timestamp when the incident was detected or created", - "format": "date-time", - "nullable": true - }, - "confirmedAt": { - "type": "string", - "description": "Timestamp when the incident was confirmed (multi-region confirmation)", - "format": "date-time", - "nullable": true - }, - "resolvedAt": { - "type": "string", - "description": "Timestamp when the incident was resolved", - "format": "date-time", - "nullable": true - }, - "cooldownUntil": { - "type": "string", - "description": "Cooldown window end; new incidents suppressed until this time", - "format": "date-time", - "nullable": true - }, "createdAt": { "type": "string", - "description": "Timestamp when the incident record was created", + "description": "Timestamp when the monitor was created", "format": "date-time" }, "updatedAt": { "type": "string", - "description": "Timestamp when the incident was last updated", + "description": "Timestamp when the monitor was last updated", "format": "date-time" }, - "monitorName": { - "type": "string", - "description": "Name of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", - "nullable": true - }, - "serviceName": { - "type": "string", - "description": "Name of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", - "nullable": true - }, - "serviceSlug": { - "type": "string", - "description": "Slug of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", - "nullable": true - }, - "monitorType": { - "type": "string", - "description": "Type of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", - "nullable": true - }, - "resourceGroupId": { - "type": "string", - "description": "Resource group that owns this incident; null when not group-managed", - "format": "uuid", - "nullable": true - }, - "resourceGroupName": { - "type": "string", - "description": "Name of the resource group; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", - "nullable": true - }, - "triggeringCheckId": { - "type": "string", - "description": "Scheduler-minted check execution ID whose result confirmed this incident; joins to check_results, rule_evaluations, and incident_state_transitions. Omitted from JSON (undefined to SDKs) when null, treat missing as null.", - "format": "uuid", - "nullable": true - }, - "triggeredByRuleSnapshotHashHex": { - "type": "string", - "description": "Hex SHA-256 of the canonical policy snapshot that fired; combined with triggeredByRuleIndex points to the exact TriggerRule. Omitted from JSON when null, treat missing as null.", - "nullable": true - }, - "triggeredByRuleIndex": { - "type": "integer", - "description": "Index of the fired rule inside the policy's trigger_rules array. Omitted from JSON when null, treat missing as null.", - "format": "int32", - "nullable": true - }, - "engineVersion": { - "type": "string", - "description": "Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null.", - "nullable": true - }, - "displayKey": { - "type": "string", - "description": "Org-scoped human-readable incident code, e.g. \"ABC-42\". Null on incidents created by pre-INC-keys API pods before the sweep; treat missing as unknown and fall back to the id", - "nullable": true - }, - "alertCollapsedByResourceGroupIds": { + "assertions": { "type": "array", - "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", + "description": "Assertions evaluated against each check result; null on list responses", "nullable": true, "items": { - "type": "string", - "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", - "format": "uuid" + "$ref": "#/components/schemas/MonitorAssertionDto" } }, - "peakFailingMemberCount": { - "type": "integer", - "description": "Peak non-operational member count while this RESOURCE_GROUP incident was open; null otherwise", - "format": "int32", - "nullable": true - }, - "failingMembersAtPeak": { + "tags": { "type": "array", - "description": "Frozen failing members at peakFailingMemberCount; null when not a group incident or never snapshotted", + "description": "Tags applied to this monitor", "nullable": true, "items": { - "$ref": "#/components/schemas/IncidentFailingMemberSnapshotDto" + "$ref": "#/components/schemas/TagDto" } - } - }, - "description": "Incident triggered by a monitor check failure or manual creation" - }, - "IncidentEventDto": { - "required": [ - "incidentId", - "title" - ], - "type": "object", - "properties": { - "incidentId": { - "type": "string", - "description": "Vendor catalog incident ID", - "format": "uuid" - }, - "externalId": { - "type": "string", - "description": "Vendor-supplied external incident ID", - "nullable": true - }, - "title": { - "type": "string", - "description": "Incident title from the vendor status page" - }, - "impact": { - "type": "string", - "description": "Vendor impact level (major, minor, none)", - "nullable": true - }, - "status": { - "type": "string", - "description": "Vendor lifecycle status (only set on incident.update rows)", - "nullable": true - }, - "body": { - "type": "string", - "description": "Update body text (only set on incident.update rows)", - "nullable": true - }, - "shortlink": { - "type": "string", - "description": "Short public URL for the vendor incident", - "nullable": true }, - "startedAt": { - "type": "string", - "description": "When the vendor incident started", - "format": "date-time", - "nullable": true - }, - "resolvedAt": { + "pingUrl": { "type": "string", - "description": "When the vendor incident resolved", - "format": "date-time", + "description": "Heartbeat ping URL; populated for HEARTBEAT monitors only", "nullable": true }, - "detectedAt": { - "type": "string", - "description": "When DevHelm first detected the incident", - "format": "date-time", - "nullable": true + "environment": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/Summary" + } + ] }, - "vendorCreatedAt": { - "type": "string", - "description": "Vendor-reported creation timestamp", - "format": "date-time", - "nullable": true + "auth": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + } + ] }, - "durationSeconds": { - "type": "integer", - "description": "Total duration in seconds (set on incident.resolved)", - "format": "int64", - "nullable": true + "incidentPolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentPolicyDto" + } + ] }, - "affectedComponentIds": { + "alertChannelIds": { "type": "array", - "description": "Affected component IDs from the vendor incident join", + "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses", "nullable": true, "items": { "type": "string", - "description": "Affected component IDs from the vendor incident join", + "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses", "format": "uuid" } - } - }, - "description": "Vendor incident fields for a status-events rail row" - }, - "IncidentFailingMemberSnapshotDto": { - "required": [ - "memberType", - "name" - ], - "type": "object", - "properties": { - "memberType": { - "type": "string", - "description": "Member type: monitor or service" - }, - "monitorId": { - "type": "string", - "description": "Monitor ID when memberType is monitor", - "format": "uuid", - "nullable": true - }, - "serviceId": { - "type": "string", - "description": "Service ID when memberType is service", - "format": "uuid", - "nullable": true - }, - "name": { - "minLength": 1, - "type": "string", - "description": "Frozen display name at snapshot time" }, - "membershipId": { - "type": "string", - "description": "Membership row ID when available", - "format": "uuid", - "nullable": true - } - }, - "description": "Frozen failing member identity at peak failing count for a resource-group incident" - }, - "IncidentFilterParams": { - "type": "object", - "properties": { - "status": { + "currentStatus": { "type": "string", - "description": "Filter by incident lifecycle status; null returns every status", + "description": "Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", "nullable": true, "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" + "up", + "degraded", + "down", + "paused", + "unknown" ] }, - "severity": { + "definitionId": { "type": "string", - "description": "Filter by severity; null returns every severity", - "nullable": true, - "enum": [ - "DOWN", - "DEGRADED", - "MAINTENANCE" - ] + "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", + "format": "uuid", + "nullable": true }, - "source": { - "type": "string", - "description": "Filter by where the incident originated (auto, manual, third-party)", + "capturePolicy": { "nullable": true, - "enum": [ - "AUTOMATIC", - "MANUAL", - "MONITORS", - "STATUS_DATA", - "RESOURCE_GROUP" + "allOf": [ + { + "$ref": "#/components/schemas/CapturePolicy" + } ] }, - "monitorId": { - "type": "string", - "description": "Only return incidents tied to this monitor ID", - "format": "uuid", + "fastRetryMaxAttempts": { + "type": "integer", + "description": "Fast-retry max attempts; null/0 = off", + "format": "int32", "nullable": true }, - "serviceId": { + "muted": { + "type": "boolean", + "description": "Whether alert delivery is muted" + }, + "mutedUntil": { "type": "string", - "description": "Only return incidents tied to this service ID (third-party services)", - "format": "uuid", + "description": "Mute expiry; null means indefinite while muted", + "format": "date-time", "nullable": true }, - "resourceGroupId": { + "muteReason": { "type": "string", - "description": "Only return incidents owned by this resource group (incidents.resource_group_id)", - "format": "uuid", + "description": "Optional mute reason", "nullable": true }, - "tagId": { + "pausedAt": { "type": "string", - "description": "Only return incidents whose monitor carries this tag", - "format": "uuid", + "description": "When the monitor was paused", + "format": "date-time", "nullable": true }, - "environmentId": { + "pauseReason": { "type": "string", - "description": "Only return incidents whose monitor lives in this environment", - "format": "uuid", + "description": "Optional pause reason", "nullable": true }, - "excludeId": { + "pauseExpiresAt": { "type": "string", - "description": "Exclude this incident ID from results (related-incident lists)", - "format": "uuid", + "description": "Pause expiry", + "format": "date-time", "nullable": true }, - "startedFrom": { + "quarantineOwnerId": { "type": "string", - "description": "Earliest startedAt to include (inclusive, ISO 8601)", - "format": "date-time", + "description": "Quarantine person owner id", "nullable": true }, - "startedTo": { + "quarantineUntil": { "type": "string", - "description": "Latest startedAt to include (inclusive, ISO 8601)", + "description": "Quarantine expiry; non-null means quarantined", "format": "date-time", "nullable": true }, - "page": { - "minimum": 0, - "type": "integer", - "description": "Zero-based page index (default: 0)", - "format": "int32", - "example": 0 + "quarantineReason": { + "type": "string", + "description": "Quarantine reason", + "nullable": true }, - "size": { - "maximum": 200, - "minimum": 1, - "type": "integer", - "description": "Number of incidents per page (1–200, default: 10)", - "format": "int32", - "example": 10 + "upload": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/PackageUploadDto" + } + ] } }, - "required": [ - "page", - "size" - ] + "description": "Full monitor representation" }, - "IncidentIoChannelConfig": { - "required": [ - "channelType", - "apiKey" - ], + "MonitorOverlayRequest": { "type": "object", "properties": { - "channelType": { - "type": "string", - "enum": [ - "incident_io" - ] - }, - "apiKey": { - "minLength": 1, - "type": "string", - "description": "incident.io API key with 'Create incidents' permission" - }, - "severityId": { + "reason": { + "maxLength": 280, + "minLength": 0, "type": "string", - "description": "Severity ID for created incidents (from List Severities API)", + "description": "Optional human-readable reason (max 280)", "nullable": true }, - "visibility": { + "expiresAt": { "type": "string", - "description": "Incident visibility: public or private (default: public)", + "description": "When this overlay expires", + "format": "date-time", "nullable": true } } }, - "IncidentPolicyDto": { + "MonitorPackageSpec": { "required": [ - "confirmation", - "createdAt", - "id", - "monitorId", - "recovery", - "triggerRules", - "updatedAt" + "digest", + "entrypoint", + "files" ], "type": "object", "properties": { - "id": { + "digest": { + "maxLength": 64, + "minLength": 64, "type": "string", - "description": "Unique incident policy identifier", - "format": "uuid" + "description": "SHA-256 hex digest of the package zip (64 characters)" }, - "monitorId": { + "entrypoint": { + "maxLength": 512, + "minLength": 0, "type": "string", - "description": "Monitor this policy is attached to", - "format": "uuid" + "description": "Entrypoint path inside the zip, e.g. tests/login.spec.ts" }, - "triggerRules": { + "files": { + "maxItems": 256, + "minItems": 0, "type": "array", - "description": "Array of trigger rules defining when an incident should be raised", + "description": "Relative file paths included in the zip", "items": { - "$ref": "#/components/schemas/TriggerRule" + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "Relative file paths included in the zip" } }, - "confirmation": { - "$ref": "#/components/schemas/ConfirmationPolicy" - }, - "recovery": { - "$ref": "#/components/schemas/RecoveryPolicy" + "keys": { + "maxItems": 64, + "minItems": 0, + "type": "array", + "description": "Secret names the zip demanded. PUT: null preserves, [] clears", + "nullable": true, + "items": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Secret names the zip demanded. PUT: null preserves, [] clears" + } }, - "createdAt": { + "gitSha": { + "maxLength": 64, + "minLength": 0, "type": "string", - "description": "Timestamp when the policy was created", - "format": "date-time" + "description": "Commit SHA from the repo that produced this zip. Client-supplied provenance only", + "nullable": true }, - "updatedAt": { + "gitMessage": { + "maxLength": 1024, + "minLength": 0, "type": "string", - "description": "Timestamp when the policy was last updated", - "format": "date-time" + "description": "Commit message from the repo that produced this zip", + "nullable": true }, - "monitorRegionCount": { - "type": "integer", - "description": "Number of regions configured on the monitor (only set in internal API responses)", - "format": "int32", + "gitFile": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "Path of the declaring file in that repo", "nullable": true }, - "checkFrequencySeconds": { - "type": "integer", - "description": "Monitor check frequency in seconds (only set in internal API responses)", - "format": "int32", + "authoredBy": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Author attribution supplied with the package", "nullable": true + }, + "keyLocations": { + "maxItems": 64, + "minItems": 0, + "type": "array", + "description": "Per-key declaring file and location from package scan", + "nullable": true, + "items": { + "required": ["key"], + "type": "object", + "properties": { + "key": { + "maxLength": 255, + "type": "string", + "description": "Secret name the code reads" + }, + "declaringFile": { + "maxLength": 512, + "type": "string", + "description": "Declaring file path inside the zip", + "nullable": true + }, + "declaringLocation": { + "maxLength": 255, + "type": "string", + "description": "Call site from package scan, e.g. signIn(…) · line 6", + "nullable": true + } + }, + "description": "One demanded key plus the package-scan site that declared it" + } } }, - "description": "Incident detection, confirmation, and recovery policy for a monitor" + "description": "New package zip metadata for this environment" }, - "IncidentRef": { + "MonitorReference": { "required": [ "id", - "impact", - "title" + "name" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Internal incident ID — UUID for status-page incidents, service incident UUID for catalog", + "description": "Monitor identifier", "format": "uuid" }, - "title": { - "type": "string", - "description": "Incident title at the time of the overlap" - }, - "impact": { + "name": { "type": "string", - "description": "Incident impact level (e.g. minor, major, critical for catalog; NONE/MINOR/MAJOR/CRITICAL for status pages)" - } - }, - "description": "Lightweight reference to an incident overlapping a given uptime day" - }, - "IncidentsSummaryDto": { - "type": "object", - "properties": { - "active": { - "type": "integer", - "format": "int64" - }, - "resolvedToday": { - "type": "integer", - "format": "int64" - }, - "mttr30d": { - "type": "number", - "format": "double", - "nullable": true + "description": "Monitor name" } }, - "description": "Incident summary counters", - "required": [ - "active", - "resolvedToday" - ] + "description": "Monitors that reference this secret for authentication" }, - "IncidentStateTransitionDto": { - "required": [ - "affectedRegions", - "checkId", - "details", - "engineVersion", - "fromStatus", - "id", - "monitorId", - "occurredAt", - "policySnapshotHashHex", - "reason", - "toStatus", - "triggeringEvaluationIds" - ], + "MonitorRunListParams": { "type": "object", "properties": { - "id": { - "type": "string", - "description": "Forensic row UUID", - "format": "uuid" - }, - "occurredAt": { - "type": "string", - "description": "When the state transition occurred", - "format": "date-time" - }, - "monitorId": { - "type": "string", - "description": "Monitor this transition pertains to", - "format": "uuid" - }, - "incidentId": { + "phase": { "type": "string", - "description": "Incident this transition belongs to; null for pre-incident (auto-cleared) transitions", - "format": "uuid", + "description": "Filter by run phase; omit to return every phase", "nullable": true }, - "fromStatus": { - "minLength": 1, + "outcome": { "type": "string", - "description": "Previous status (WATCHING | TRIGGERED | CONFIRMED | RESOLVED)" + "description": "Filter by persist outcome; omit to return every outcome", + "nullable": true }, - "toStatus": { - "minLength": 1, + "region": { "type": "string", - "description": "New status (WATCHING | TRIGGERED | CONFIRMED | RESOLVED)" + "description": "Filter by probe region", + "nullable": true }, - "reason": { - "minLength": 1, + "source": { "type": "string", - "description": "Why the transition fired (trigger | confirm | resolve | auto_clear | reopen)" - }, - "triggeringEvaluationIds": { - "type": "array", - "description": "rule_evaluation ids that caused this transition (may be empty for timeout-driven edges)", - "items": { - "type": "string", - "description": "rule_evaluation ids that caused this transition (may be empty for timeout-driven edges)", - "format": "uuid" - } - }, - "affectedRegions": { - "type": "array", - "description": "Regions whose evaluations contributed to this transition", - "items": { - "type": "string", - "description": "Regions whose evaluations contributed to this transition" - } + "description": "Filter by what triggered the run", + "nullable": true }, - "policySnapshotHashHex": { - "minLength": 1, + "q": { "type": "string", - "description": "Hex-encoded hash of the policy snapshot that governed this transition" + "description": "Substring match on headline", + "nullable": true }, - "engineVersion": { - "minLength": 1, + "revisionId": { "type": "string", - "description": "Detection engine version that emitted this transition" + "description": "Only runs for this published revision", + "format": "uuid", + "nullable": true }, - "checkId": { + "cursor": { "type": "string", - "description": "Scheduler-minted check execution ID (V92) of the triggering result", - "format": "uuid" + "description": "Opaque cursor from a previous page", + "nullable": true }, - "details": { - "$ref": "#/components/schemas/StateTransitionDetails" + "limit": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Page size (1\u2013100, default 25)", + "format": "int32" } }, - "description": "State-machine transitions this check caused (may be empty if nothing fired)" + "required": [ + "limit" + ] }, - "IncidentTimelineDto": { + "MonitorSecretRequestsDto": { "required": [ - "transitions", - "triggeringEvaluations" + "environment", + "requests" ], "type": "object", "properties": { - "transitions": { - "type": "array", - "description": "State-machine transitions in chronological order", - "items": { - "$ref": "#/components/schemas/IncidentStateTransitionDto" - } + "environment": { + "$ref": "#/components/schemas/EnvironmentDto" }, - "triggeringEvaluations": { + "requests": { "type": "array", - "description": "Rule evaluations that caused any of the transitions above. Correlate via evaluation.triggeringTransitionId == transition.id", + "description": "Secret keys this monitor requires and their resolve state", "items": { - "$ref": "#/components/schemas/RuleEvaluationDto" + "$ref": "#/components/schemas/SecretRequestDto" } - }, - "policySnapshot": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PolicySnapshotDto" - } - ] } - } + }, + "description": "Environment and secret keys this monitor requires" }, - "IncidentTriggerDto": { + "MonitorSessionDto": { "required": [ - "source" + "cookieNames", + "lifecycle", + "reusePolicy", + "setupFile", + "storageKeys" ], "type": "object", "properties": { - "ruleType": { + "lifecycle": { "type": "string", - "description": "Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", - "nullable": true + "description": "Current session cache state", + "enum": [ + "active", + "expired", + "failed", + "revoked" + ] }, - "ruleIndex": { - "type": "integer", - "description": "0-based index into the policy trigger_rules array; null when unknown", - "format": "int32", + "reusePolicy": { + "type": "string", + "description": "When the cached session is reused across runs", + "enum": [ + "reuse", + "every_run", + "on_failure" + ] + }, + "setupFile": { + "type": "string", + "description": "Setup file path inside the package zip" + }, + "signsInAs": { + "type": "string", + "description": "Account this cache signed in as", "nullable": true }, - "count": { - "type": "integer", - "description": "Observed failing_streak or failures_in_window from forensics; null when unavailable", - "format": "int32", + "expiresAt": { + "type": "string", + "description": "When the cached session expires", + "format": "date-time", "nullable": true }, - "threshold": { + "cookieNames": { + "type": "array", + "description": "Cookie names in the cached session", + "items": { + "type": "string", + "description": "Cookie names in the cached session" + } + }, + "storageKeys": { + "type": "array", + "description": "Storage key names in the cached session", + "items": { + "type": "string", + "description": "Storage key names in the cached session" + } + }, + "sizeBytes": { "type": "integer", - "description": "Rule required count or threshold_ms from forensics; null when unavailable", + "description": "Cached session size in bytes", "format": "int32", "nullable": true }, - "lastError": { + "lastRejectedRunId": { "type": "string", - "description": "failure_reason from the triggering check result; null when unavailable", + "description": "Run that last rejected this cache", + "format": "uuid", "nullable": true }, - "firstFailedCheckAt": { + "updatedAt": { "type": "string", - "description": "Earliest failing check timestamp in the confirm window when computable; null otherwise", + "description": "When this session row was last written", "format": "date-time", "nullable": true - }, - "source": { - "minLength": 1, - "type": "string", - "description": "Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", - "enum": [ - "forensics", - "checks", - "none" - ] } }, - "description": "Honest trigger metadata for the incident origin tooltip / TTD strip" + "description": "Cached sign-in session for a monitor" }, - "IncidentUpdateDto": { - "required": [ - "createdAt", - "id", - "incidentId", - "notifySubscribers" - ], + "MonitorsSummaryDto": { "type": "object", "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "incidentId": { - "type": "string", - "format": "uuid" + "total": { + "type": "integer", + "description": "Total number of monitors in the organization", + "format": "int64" }, - "oldStatus": { - "type": "string", - "nullable": true, - "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" - ] + "up": { + "type": "integer", + "description": "Number of monitors currently passing", + "format": "int64" }, - "newStatus": { - "type": "string", - "nullable": true, - "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" - ] + "down": { + "type": "integer", + "description": "Number of monitors currently failing (DOWN severity)", + "format": "int64" }, - "body": { - "type": "string", - "nullable": true + "degraded": { + "type": "integer", + "description": "Number of monitors with degraded status", + "format": "int64" }, - "createdBy": { - "type": "string", - "nullable": true, - "enum": [ - "SYSTEM", - "USER" - ] + "paused": { + "type": "integer", + "description": "Number of disabled monitors", + "format": "int64" }, - "notifySubscribers": { - "type": "boolean" + "avgUptime24h": { + "type": "number", + "description": "Average uptime percentage across all monitors over last 24h", + "format": "double", + "nullable": true }, - "createdAt": { - "type": "string", - "format": "date-time" + "avgUptime30d": { + "type": "number", + "description": "Average uptime percentage across all monitors over last 30 days", + "format": "double", + "nullable": true } - } - }, - "IntegrationConfigSchemaDto": { + }, + "description": "Dashboard summary counters for monitors", "required": [ - "channelFields", - "connectionFields" - ], - "type": "object", - "properties": { - "connectionFields": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IntegrationFieldDto" - } - }, - "channelFields": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IntegrationFieldDto" - } - } - } + "total", + "up", + "down", + "degraded", + "paused" + ] }, - "IntegrationDto": { + "MonitorTestRequest": { "required": [ - "authType", - "configSchema", - "description", - "lifecycle", - "logoUrl", - "name", - "setupGuideUrl", - "tierAvailability", + "config", "type" ], "type": "object", "properties": { "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "logoUrl": { - "type": "string" - }, - "authType": { - "type": "string" - }, - "tierAvailability": { "type": "string", + "description": "Monitor protocol type to test", "enum": [ - "FREE", - "STARTER", - "PRO", - "TEAM", - "BUSINESS", - "ENTERPRISE" + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, - "lifecycle": { - "type": "string" - }, - "setupGuideUrl": { - "type": "string" + "config": { + "oneOf": [ + { + "$ref": "#/components/schemas/DnsMonitorConfig" + }, + { + "$ref": "#/components/schemas/HeartbeatMonitorConfig" + }, + { + "$ref": "#/components/schemas/HttpMonitorConfig" + }, + { + "$ref": "#/components/schemas/IcmpMonitorConfig" + }, + { + "$ref": "#/components/schemas/McpServerMonitorConfig" + }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, + { + "$ref": "#/components/schemas/TcpMonitorConfig" + } + ] }, - "configSchema": { - "$ref": "#/components/schemas/IntegrationConfigSchemaDto" + "assertions": { + "type": "array", + "description": "Optional assertions to evaluate against the test result", + "nullable": true, + "items": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } } } }, - "IntegrationFieldDto": { + "MonitorTestResultDto": { "required": [ - "key", - "label", - "required", - "sensitive", - "type" + "assertionResults", + "passed" ], "type": "object", "properties": { - "key": { - "type": "string" + "passed": { + "type": "boolean" }, - "label": { - "type": "string" + "error": { + "type": "string", + "nullable": true }, - "type": { - "type": "string" + "statusCode": { + "type": "integer", + "format": "int32", + "nullable": true }, - "required": { - "type": "boolean" + "responseTimeMs": { + "type": "integer", + "format": "int64", + "nullable": true }, - "sensitive": { - "type": "boolean" + "responseHeaders": { + "type": "object", + "additionalProperties": { + "type": "array", + "nullable": true, + "items": { + "type": "string", + "nullable": true + } + }, + "nullable": true }, - "placeholder": { + "bodyPreview": { "type": "string", "nullable": true }, - "helpText": { + "responseSizeBytes": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "redirectCount": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "finalUrl": { "type": "string", "nullable": true }, - "options": { + "assertionResults": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AssertionTestResultDto" + } + }, + "warnings": { "type": "array", "nullable": true, "items": { "type": "string" } - }, - "default": { - "type": "string", - "nullable": true } } }, - "InviteDto": { + "MonitorVersionDto": { "required": [ + "changedVia", "createdAt", - "email", - "expiresAt", - "roleOffered", - "inviteId" + "id", + "monitorId", + "snapshot", + "version" ], "type": "object", "properties": { - "inviteId": { + "id": { + "type": "string", + "description": "Unique version record identifier", + "format": "uuid" + }, + "monitorId": { + "type": "string", + "description": "Monitor this version belongs to", + "format": "uuid" + }, + "version": { "type": "integer", - "description": "Unique invite identifier", + "description": "Monotonically increasing version number", "format": "int32" }, - "email": { - "type": "string", - "description": "Email address the invite was sent to" + "snapshot": { + "$ref": "#/components/schemas/MonitorDto" }, - "roleOffered": { + "changedById": { + "type": "integer", + "description": "User ID who made the change; null for automated changes", + "format": "int32", + "nullable": true + }, + "changedVia": { "type": "string", - "description": "Role that will be assigned to the invitee on acceptance", + "description": "Change source (DASHBOARD, CLI, API)", "enum": [ - "OWNER", - "ADMIN", - "MEMBER" + "API", + "DASHBOARD", + "CLI", + "TERRAFORM" ] }, - "createdAt": { - "type": "string", - "description": "Timestamp when the invite was created", - "format": "date-time" - }, - "expiresAt": { - "type": "string", - "description": "Timestamp when the invite expires", - "format": "date-time" - }, - "consumedAt": { + "changeSummary": { "type": "string", - "description": "Timestamp when the invite was accepted; null if not yet used", - "format": "date-time", + "description": "Human-readable description of what changed", "nullable": true }, - "revokedAt": { + "createdAt": { "type": "string", - "description": "Timestamp when the invite was revoked; null if active", - "format": "date-time", - "nullable": true + "description": "Timestamp when this version was recorded", + "format": "date-time" } }, - "description": "Organization invite sent to an email address" + "description": "A point-in-time version snapshot of a monitor configuration" }, - "JiraChannelConfig": { + "NetworkRowDto": { "required": [ - "channelType", - "domain", - "email", - "apiToken", - "projectKey" + "curl", + "id", + "method", + "requestBody", + "requestHeaders", + "resourceType", + "responseBody", + "responseHeaders", + "source", + "url", + "isNavigation", + "requestBodyTruncated", + "responseBodyTruncated" ], "type": "object", "properties": { - "channelType": { + "id": { + "minLength": 1, "type": "string", - "enum": [ - "jira" - ] + "description": "Stable row id from capture" }, - "domain": { + "stepId": { + "type": "string", + "description": "Step this request belonged to", + "nullable": true + }, + "source": { "minLength": 1, "type": "string", - "description": "Atlassian instance domain (e.g. yourteam.atlassian.net)" + "description": "page for browser, request for API_CHECK" }, - "email": { + "method": { "minLength": 1, "type": "string", - "description": "Atlassian account email for API authentication" + "description": "HTTP method" }, - "apiToken": { + "url": { "minLength": 1, "type": "string", - "description": "Atlassian API token" + "description": "Request URL" }, - "projectKey": { + "resourceType": { "minLength": 1, "type": "string", - "description": "Jira project key where issues are created (e.g. OPS)" + "description": "Chromium type, or api for the request fixture" }, - "issueType": { + "isNavigation": { + "type": "boolean", + "description": "Whether this request started a navigation" + }, + "status": { + "type": "integer", + "description": "HTTP status; null while pending", + "format": "int32", + "nullable": true + }, + "durationMs": { + "type": "integer", + "description": "Request duration in milliseconds", + "format": "int32", + "nullable": true + }, + "encodedBodySize": { + "type": "integer", + "description": "Encoded response body size in bytes", + "format": "int32", + "nullable": true + }, + "startedOffsetMs": { + "type": "integer", + "description": "Offset from case start for the waterfall bar", + "format": "int32", + "nullable": true + }, + "failure": { "type": "string", - "description": "Issue type name (e.g. Bug, Task, Incident)", + "description": "Transport or protocol failure", "nullable": true - } - } - }, - "JsonPathAssertion": { - "required": [ - "type", - "path", - "expected", - "operator" - ], - "type": "object", - "properties": { - "type": { + }, + "redirectedFromUrl": { "type": "string", - "enum": [ - "json_path" + "description": "URL this request redirected from", + "nullable": true + }, + "timing": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NetworkTimingDto" + } ] }, - "path": { - "minLength": 1, + "requestHeaders": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Redacted request headers" + }, + "description": "Redacted request headers" + }, + "responseHeaders": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Redacted response headers" + }, + "description": "Redacted response headers" + }, + "requestBody": { "type": "string", - "description": "JSONPath expression to extract a value from the response body" + "description": "Request body preview, truncated at 256 KiB" }, - "expected": { - "minLength": 1, + "responseBody": { "type": "string", - "description": "Expected value to compare against" + "description": "Response body preview, truncated at 256 KiB" }, - "operator": { + "requestBodyTruncated": { + "type": "boolean", + "description": "Whether requestBody was truncated" + }, + "responseBodyTruncated": { + "type": "boolean", + "description": "Whether responseBody was truncated" + }, + "curl": { + "minLength": 1, "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] + "description": "Copy-as-cURL from the redacted record" + }, + "traceActionIndex": { + "type": "integer", + "description": "Playwright trace action index; null on API_CHECK", + "format": "int32", + "nullable": true } - } + }, + "description": "One waterfall request row" }, - "KeyInfo": { - "required": [ - "createdAt", - "name", - "id" - ], + "NetworkTimingDto": { "type": "object", "properties": { - "id": { + "dnsMs": { "type": "integer", - "description": "Key ID", - "format": "int32" + "description": "DNS lookup time in milliseconds", + "format": "int32", + "nullable": true }, - "name": { - "type": "string", - "description": "Human-readable key name" + "connectMs": { + "type": "integer", + "description": "TCP connect time in milliseconds", + "format": "int32", + "nullable": true }, - "createdAt": { - "type": "string", - "description": "When the key was created", - "format": "date-time" + "tlsMs": { + "type": "integer", + "description": "TLS handshake time in milliseconds", + "format": "int32", + "nullable": true }, - "expiresAt": { - "type": "string", - "description": "When the key expires (null = never)", - "format": "date-time", + "waitingMs": { + "type": "integer", + "description": "Time to first byte in milliseconds", + "format": "int32", "nullable": true }, - "lastUsedAt": { - "type": "string", - "description": "Last time the key was used", - "format": "date-time", + "transferMs": { + "type": "integer", + "description": "Response transfer time in milliseconds", + "format": "int32", "nullable": true } }, - "description": "API key metadata" + "description": "Request timing phases in milliseconds" }, - "LinearChannelConfig": { + "NewTagRequest": { "required": [ - "channelType", - "apiKey", - "teamId" + "name" ], "type": "object", "properties": { - "channelType": { - "type": "string", - "enum": [ - "linear" - ] - }, - "apiKey": { - "minLength": 1, - "type": "string", - "description": "Linear API key" - }, - "teamId": { - "minLength": 1, + "name": { + "maxLength": 100, + "minLength": 0, "type": "string", - "description": "Team ID to create issues in" + "description": "Tag name" }, - "labelId": { + "color": { + "pattern": "^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", "type": "string", - "description": "Label ID to attach to created issues", + "description": "Hex color code (defaults to #6B7280 if omitted)", "nullable": true } - } + }, + "description": "Inline tag creation \u2014 creates the tag if it does not already exist" }, - "LinkedStatusPageIncidentDto": { - "required": [ - "connectionMode", - "id", - "impact", - "pageIncidentMode", - "spIncidentId", - "status", - "statusPageId", - "statusPageName", - "statusPageSlug", - "title", - "scheduled" - ], + "NoSlaContext": { "type": "object", "properties": { - "id": { - "type": "string", - "description": "Status page incident ID (same value as spIncidentId; kept for backwards compatibility)", - "format": "uuid" - }, - "spIncidentId": { - "type": "string", - "description": "Status page incident ID (alias for id) — use this when the outer context is a monitoring incident", - "format": "uuid" - }, - "statusPageId": { - "type": "string", - "description": "Parent status page ID", - "format": "uuid" - }, - "statusPageName": { - "type": "string", - "description": "Parent status page display name" - }, - "statusPageSlug": { - "type": "string", - "description": "Parent status page URL slug" - }, - "title": { - "type": "string", - "description": "Customer-facing incident title" - }, - "status": { - "type": "string", - "description": "Current lifecycle status (INVESTIGATING, IDENTIFIED, MONITORING, RESOLVED)", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - }, - "impact": { + "reason": { "type": "string", - "description": "Impact level (NONE, MINOR, MAJOR, CRITICAL)", - "enum": [ - "NONE", - "MINOR", - "MAJOR", - "CRITICAL" - ] - }, - "scheduled": { - "type": "boolean", - "description": "Scheduled maintenance flag" + "description": "Reason no SLA is published", + "nullable": true }, - "publishedAt": { + "historicalClaim": { "type": "string", - "description": "Publish time; null while draft", - "format": "date-time", + "description": "Non-binding historical uptime claim", "nullable": true }, - "connectionMode": { + "supportSla": { "type": "string", - "description": "Whether the linked SPI was created by automation (AUTO) or by a human/API caller (MANUAL)", - "enum": [ - "AUTO", - "MANUAL" - ] + "description": "Support response time SLA if different from uptime SLA", + "nullable": true }, - "pageIncidentMode": { + "enterpriseNote": { "type": "string", - "description": "Incident mode of the parent status page at read time (MANUAL, REVIEW, AUTOMATIC)", - "enum": [ - "MANUAL", - "REVIEW", - "AUTOMATIC" - ] + "description": "Note about enterprise/custom SLA availability", + "nullable": true } - } + }, + "description": "Context for vendors with no public SLA" }, - "MaintenanceComponentRef": { + "NotificationDispatchDto": { "required": [ + "createdAt", + "deliveries", "id", - "name", - "status" + "incidentId", + "policyId", + "status", + "updatedAt", + "currentStep" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Component identifier", + "description": "Unique dispatch record identifier", "format": "uuid" }, - "name": { + "incidentId": { "type": "string", - "description": "Component name" + "description": "Incident this dispatch is for", + "format": "uuid" }, - "status": { - "type": "string", - "description": "Component status at the time of the maintenance update" - } - }, - "description": "A component affected by a scheduled maintenance window" - }, - "MaintenanceEventDto": { - "required": [ - "externalId", - "maintenanceId", - "status", - "title" - ], - "type": "object", - "properties": { - "maintenanceId": { + "incidentTitle": { "type": "string", - "description": "Vendor catalog maintenance ID", - "format": "uuid" + "description": "Incident title at read time; null if untitled or missing", + "nullable": true }, - "externalId": { + "policyId": { "type": "string", - "description": "Vendor-supplied external maintenance ID" + "description": "Notification policy that matched this incident", + "format": "uuid" }, - "title": { + "policyName": { "type": "string", - "description": "Maintenance title from the vendor status page" + "description": "Human-readable name of the matched policy (null if policy has been deleted)", + "nullable": true }, "status": { "type": "string", - "description": "Lifecycle status: scheduled, in_progress, verifying, completed" + "description": "Current dispatch state", + "enum": [ + "PENDING", + "DISPATCHING", + "DELIVERED", + "ESCALATING", + "ACKNOWLEDGED", + "COMPLETED" + ] }, - "impact": { + "completionReason": { "type": "string", - "description": "Vendor impact level", + "description": "Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states.", + "nullable": true, + "enum": [ + "EXHAUSTED", + "RESOLVED", + "NO_STEPS" + ] + }, + "currentStep": { + "type": "integer", + "description": "1-based index of the currently active escalation step", + "format": "int32" + }, + "totalSteps": { + "type": "integer", + "description": "Total number of escalation steps in the policy (null if policy has been deleted)", + "format": "int32", "nullable": true }, - "shortlink": { + "acknowledgedAt": { "type": "string", - "description": "Short public URL for the vendor maintenance", + "description": "Timestamp when this dispatch was acknowledged (null if not acknowledged)", + "format": "date-time", "nullable": true }, - "scheduledFor": { + "acknowledgedBy": { "type": "string", - "description": "Scheduled start; null for undated maintenance", - "format": "date-time", + "description": "Actor who acknowledged this dispatch (user email, api-key:, voice:, etc.); null if not acknowledged", "nullable": true }, - "scheduledUntil": { + "acknowledgedVia": { "type": "string", - "description": "Scheduled end", - "format": "date-time", + "description": "Channel used to acknowledge (DASHBOARD, API, PHONE_CALL, INTERNAL, etc.); null if not acknowledged", "nullable": true }, - "startedAt": { + "matchedRules": { + "type": "array", + "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]", + "nullable": true, + "items": { + "type": "string", + "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]" + } + }, + "nextEscalationAt": { "type": "string", - "description": "When maintenance actually started", + "description": "Timestamp when the next escalation step will fire (null if not scheduled)", "format": "date-time", "nullable": true }, - "completedAt": { + "lastNotifiedAt": { "type": "string", - "description": "When maintenance completed", + "description": "Timestamp of the most recent notification delivery", "format": "date-time", "nullable": true }, - "affectedComponentIds": { + "deliveries": { "type": "array", - "description": "Affected component IDs", - "nullable": true, + "description": "Delivery records for all channels associated with this dispatch", "items": { - "type": "string", - "description": "Affected component IDs", - "format": "uuid" + "$ref": "#/components/schemas/AlertDeliveryDto" } + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the dispatch was created", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the dispatch was last updated", + "format": "date-time" } }, - "description": "Vendor maintenance fields for a status-events rail row" + "description": "Dispatch state for a single (incident, notification policy) pair, with delivery history" }, - "MaintenanceUpdateDto": { + "NotificationDto": { "required": [ + "createdAt", + "title", + "type", "id", - "status" + "read" ], "type": "object", "properties": { "id": { + "type": "integer", + "description": "Unique notification identifier", + "format": "int64" + }, + "type": { "type": "string", - "description": "Unique update identifier", - "format": "uuid" + "description": "Notification category (e.g. incident, monitor, team)" }, - "status": { + "title": { "type": "string", - "description": "Status at the time of this update" + "description": "Short notification title" }, "body": { "type": "string", - "description": "Update message from the vendor", + "description": "Full notification body; null for title-only notifications", "nullable": true }, - "displayAt": { + "resourceType": { "type": "string", - "description": "Timestamp when this update was posted", - "format": "date-time", + "description": "Type of the resource this notification is about", + "nullable": true + }, + "resourceId": { + "type": "string", + "description": "ID of the resource this notification is about", "nullable": true + }, + "read": { + "type": "boolean", + "description": "Whether the notification has been read" + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the notification was created", + "format": "date-time" } }, - "description": "A status update within a scheduled maintenance lifecycle" + "description": "In-app notification for the current user" }, - "MaintenanceWindowDto": { + "NotificationPolicyDto": { "required": [ "createdAt", - "endsAt", + "escalation", "id", - "startsAt", + "matchRules", + "name", + "updatedAt", "organizationId", - "suppressAlerts" + "enabled", + "priority" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique maintenance window identifier", + "description": "Unique notification policy identifier", "format": "uuid" }, - "monitorId": { + "organizationId": { + "type": "integer", + "description": "Organization this policy belongs to", + "format": "int32" + }, + "name": { + "minLength": 1, "type": "string", - "description": "Monitor this window applies to; null for org-wide windows", - "format": "uuid", + "description": "Human-readable name for this policy" + }, + "description": { + "type": "string", + "description": "Optional note; null when unset", "nullable": true }, - "organizationId": { + "matchRules": { + "type": "array", + "description": "Match rules (all must pass; empty = catch-all)", + "items": { + "$ref": "#/components/schemas/MatchRule" + } + }, + "escalation": { + "$ref": "#/components/schemas/EscalationChain" + }, + "enabled": { + "type": "boolean", + "description": "Whether this policy is active" + }, + "priority": { "type": "integer", - "description": "Organization this maintenance window belongs to", + "description": "Evaluation order; higher value = evaluated first", "format": "int32" }, - "startsAt": { + "createdAt": { "type": "string", - "description": "Scheduled start of the maintenance window", + "description": "Timestamp when the policy was created", "format": "date-time" }, - "endsAt": { + "updatedAt": { "type": "string", - "description": "Scheduled end of the maintenance window", + "description": "Timestamp when the policy was last updated", "format": "date-time" }, - "repeatRule": { + "stats7d": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" + } + ] + }, + "stats30d": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" + } + ] + }, + "lastFiredAt": { "type": "string", - "description": "Reserved: iCal RRULE for recurring windows (stored but not yet honored)", + "description": "Created-at of the most recent dispatch for this policy; null if never fired", + "format": "date-time", "nullable": true }, - "reason": { + "lastFiredIncidentId": { "type": "string", - "description": "Human-readable reason for the maintenance", + "description": "Incident id of the most recent dispatch; null if never fired", + "format": "uuid", "nullable": true + } + }, + "description": "Org-level notification policy with match rules and escalation chain" + }, + "NotificationPolicyWindowStatsDto": { + "required": [ + "ackableFires", + "acknowledgements", + "expired", + "failedSends", + "fires", + "sends" + ], + "type": "object", + "properties": { + "fires": { + "type": "integer", + "description": "Dispatches created in the window", + "format": "int32" }, - "suppressAlerts": { - "type": "boolean", - "description": "Whether alerts are suppressed during this window" + "acknowledgements": { + "type": "integer", + "description": "Fires in the window that were acknowledged", + "format": "int32" }, - "createdAt": { + "ackableFires": { + "type": "integer", + "description": "Ack ratio denominator: fires when the policy has an ack gate, else 0", + "format": "int32" + }, + "expired": { + "type": "integer", + "description": "Fires that exhausted escalation without acknowledgment", + "format": "int32" + }, + "sends": { + "type": "integer", + "description": "Alert deliveries linked to fires in the window", + "format": "int32" + }, + "failedSends": { + "type": "integer", + "description": "Linked deliveries with status FAILED", + "format": "int32" + }, + "medianAckSeconds": { + "type": "integer", + "description": "Median seconds from fire to ack among acknowledged fires; null when none", + "format": "int64", + "nullable": true + }, + "deepestStepReached": { + "type": "integer", + "description": "Highest escalation step reached in the window; null when no fires", + "format": "int32", + "nullable": true + }, + "lastFiredAt": { "type": "string", - "description": "Timestamp when the window was created", - "format": "date-time" + "description": "Created-at of the most recent fire in the window; null when none", + "format": "date-time", + "nullable": true + }, + "lastFiredIncidentId": { + "type": "string", + "description": "Incident id of the most recent fire in the window; null when none", + "format": "uuid", + "nullable": true } }, - "description": "Scheduled maintenance window for a monitor" + "description": "Time-bounded notification policy activity aggregates" }, - "MatchRule": { - "required": [ - "type" - ], + "OfficialSla": { "type": "object", "properties": { - "type": { + "percentage": { "type": "string", - "description": "Rule type used to evaluate incidents and status events", - "enum": [ - "severity_gte", - "monitor_id_in", - "region_in", - "incident_status", - "monitor_type_in", - "service_id_in", - "resource_group_id_in", - "component_name_in", - "monitor_tag_in" - ] + "description": "Advertised uptime percentage, e.g. '99.99%'", + "nullable": true }, - "value": { + "scope": { "type": "string", - "description": "Comparison value for single-value rules like severity_gte", + "description": "Scope of the SLA, e.g. 'Monthly uptime per region'", "nullable": true }, - "monitorIds": { - "type": "array", - "description": "Monitor UUIDs to match for monitor_id_in rules", - "nullable": true, - "items": { - "type": "string", - "description": "Monitor UUIDs to match for monitor_id_in rules", - "format": "uuid" - } + "measurement": { + "type": "string", + "description": "How the vendor measures uptime for SLA purposes", + "nullable": true }, - "regions": { - "type": "array", - "description": "Region codes to match for region_in rules", - "nullable": true, - "items": { - "type": "string", - "description": "Region codes to match for region_in rules" - } + "exclusions": { + "type": "string", + "description": "Summary of exclusions from SLA calculation", + "nullable": true }, - "values": { + "appliesToPlans": { "type": "array", - "description": "Values list for multi-value rules like monitor_type_in", + "description": "Plan names this SLA applies to, e.g. ['Enterprise']", "nullable": true, "items": { "type": "string", - "description": "Values list for multi-value rules like monitor_type_in" + "description": "Plan names this SLA applies to, e.g. ['Enterprise']" } + }, + "notCovered": { + "type": "string", + "description": "Services/components NOT covered by the SLA", + "nullable": true } }, - "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)" + "description": "The vendor's officially advertised SLA commitment" }, - "MattermostChannelConfig": { + "OpsGenieChannelConfig": { "required": [ "channelType", - "webhookUrl" + "apiKey" ], "type": "object", "properties": { "channelType": { "type": "string", "enum": [ - "mattermost" + "opsgenie" ] }, - "webhookUrl": { + "apiKey": { "minLength": 1, "type": "string", - "description": "Mattermost incoming webhook URL" - }, - "channel": { - "type": "string", - "description": "Override channel (if webhook allows)", - "nullable": true + "description": "OpsGenie API key for alert creation" }, - "iconUrl": { + "region": { "type": "string", - "description": "Custom bot icon URL", + "description": "OpsGenie API region: us or eu", "nullable": true } } }, - "McpConnectsAssertion": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "mcp_connects" - ] - } - }, - "required": [ - "type" - ] - }, - "McpHasCapabilityAssertion": { + "OrganizationDto": { "required": [ - "type", - "capability" + "email", + "name", + "id" ], "type": "object", "properties": { - "type": { + "id": { + "type": "integer", + "description": "Unique organization identifier", + "format": "int32" + }, + "name": { "type": "string", - "enum": [ - "mcp_has_capability" - ] + "description": "Organization name" }, - "capability": { - "minLength": 1, + "email": { "type": "string", - "description": "Capability name the server must advertise, e.g. tools or resources" - } - } - }, - "McpMinToolsAssertion": { - "type": "object", - "properties": { - "type": { + "description": "Billing and contact email", + "nullable": true + }, + "size": { "type": "string", - "enum": [ - "mcp_min_tools" - ] + "description": "Team size range (e.g. 1-10, 11-50)", + "nullable": true }, - "min": { - "type": "integer", - "description": "Minimum number of tools the server must expose", - "format": "int32" + "industry": { + "type": "string", + "description": "Industry vertical (e.g. SaaS, Fintech)", + "nullable": true + }, + "websiteUrl": { + "type": "string", + "description": "Organization website URL", + "nullable": true } }, - "required": [ - "type", - "min" - ] + "description": "Organization account details" }, - "McpProtocolVersionAssertion": { + "OrgIncidentAnnotationDto": { "required": [ - "type", - "version" + "incidentId", + "severity", + "status", + "alerted" ], "type": "object", "properties": { - "type": { + "incidentId": { "type": "string", - "enum": [ - "mcp_protocol_version" - ] + "description": "Internal org incident ID", + "format": "uuid" }, - "version": { - "minLength": 1, + "displayKey": { "type": "string", - "description": "Expected MCP protocol version string from the server handshake" - } - } - }, - "McpResponseTimeAssertion": { - "type": "object", - "properties": { - "type": { + "description": "Human display key (e.g. DEV-42); null until platform INC codes ship", + "nullable": true + }, + "status": { "type": "string", + "description": "Internal incident lifecycle status", "enum": [ - "mcp_response_time" + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" ] }, - "maxMs": { - "type": "integer", - "description": "Maximum allowed MCP check duration in milliseconds", - "format": "int32" - } - }, - "required": [ - "type", - "maxMs" - ] - }, - "McpResponseTimeWarnAssertion": { - "type": "object", - "properties": { - "type": { + "severity": { "type": "string", + "description": "Internal incident severity", "enum": [ - "mcp_response_time_warn" + "DOWN", + "DEGRADED", + "MAINTENANCE" ] }, - "warnMs": { - "type": "integer", - "description": "MCP check duration in milliseconds that triggers a warning only", - "format": "int32" + "alerted": { + "type": "boolean", + "description": "Whether alert channels were eligible to fire (false for AWARENESS silent tracking)" + }, + "startedAt": { + "type": "string", + "description": "When the internal incident started", + "format": "date-time", + "nullable": true } }, - "required": [ - "type", - "warnMs" - ] + "description": "Linked internal incident annotation on a vendor status-event row" }, - "McpServer": { + "OrgInfo": { + "required": [ + "name", + "id" + ], "type": "object", - "description": "MCP server check-type-specific details", "properties": { - "check_type": { - "type": "string", - "enum": [ - "mcp_server" - ] - }, - "url": { - "type": "string", - "description": "MCP server URL", - "nullable": true - }, - "protocolVersion": { - "type": "string", - "description": "MCP protocol version", - "nullable": true - }, - "serverInfo": { - "type": "object", - "additionalProperties": { - "type": "object", - "description": "MCP server info (name, version, etc.)", - "nullable": true - }, - "description": "MCP server info (name, version, etc.)", - "nullable": true - }, - "toolCount": { - "type": "integer", - "description": "Number of tools exposed", - "format": "int32", - "nullable": true - }, - "resourceCount": { + "id": { "type": "integer", - "description": "Number of resources exposed", - "format": "int32", - "nullable": true + "description": "Organization ID", + "format": "int32" }, - "promptCount": { - "type": "integer", - "description": "Number of prompts exposed", - "format": "int32", - "nullable": true + "name": { + "type": "string", + "description": "Organization name" } }, - "required": [ - "check_type" - ] + "description": "Organization the key belongs to" }, - "McpServerMonitorConfig": { + "PackageUploadDto": { "required": [ - "command" + "expiresAt", + "putUrl", + "requiredHeaders" ], "type": "object", "properties": { - "command": { + "putUrl": { "minLength": 1, "type": "string", - "description": "Command to execute to start the MCP server" + "description": "Presigned PUT URL for the zip bytes" }, - "args": { - "type": "array", - "description": "Command-line arguments for the MCP server process", - "nullable": true, - "items": { - "type": "string", - "description": "Command-line arguments for the MCP server process", - "nullable": true - } + "expiresAt": { + "type": "string", + "description": "When the signed URL expires", + "format": "date-time" }, - "env": { + "requiredHeaders": { "type": "object", "additionalProperties": { "type": "string", - "description": "Environment variables to pass to the MCP server process", - "nullable": true + "description": "Must send Content-Type: application/zip and If-None-Match: *" }, - "description": "Environment variables to pass to the MCP server process", - "nullable": true + "description": "Must send Content-Type: application/zip and If-None-Match: *" } - } + }, + "description": "Signed package upload target" }, - "McpToolAvailableAssertion": { + "Pageable": { + "type": "object", + "properties": { + "page": { + "minimum": 0, + "type": "integer", + "format": "int32" + }, + "size": { + "minimum": 1, + "type": "integer", + "format": "int32" + }, + "sort": { + "type": "array", + "items": { + "type": "string" + } + } + }, "required": [ - "type", - "toolName" + "page", + "size", + "sort" + ] + }, + "PagerDutyChannelConfig": { + "required": [ + "channelType", + "routingKey" ], "type": "object", "properties": { - "type": { + "channelType": { "type": "string", "enum": [ - "mcp_tool_available" + "pagerduty" ] }, - "toolName": { + "routingKey": { "minLength": 1, "type": "string", - "description": "MCP tool name that must appear in the server's tool list" + "description": "PagerDuty Events API v2 routing (integration) key" + }, + "severityOverride": { + "type": "string", + "description": "Override PagerDuty severity mapping", + "nullable": true } } }, - "McpToolCountChangedAssertion": { + "PageSection": { "type": "object", "properties": { - "type": { + "groupId": { "type": "string", - "enum": [ - "mcp_tool_count_changed" - ] + "description": "Group ID when this section is a group", + "format": "uuid", + "nullable": true }, - "expectedCount": { + "componentId": { + "type": "string", + "description": "Component ID when this section is an ungrouped component", + "format": "uuid", + "nullable": true + }, + "pageOrder": { "type": "integer", - "description": "Expected tool count; warns when the live count differs", + "description": "Position on the page (0-based)", "format": "int32" } }, + "description": "A top-level page section (either a group or an ungrouped component)", "required": [ - "type", - "expectedCount" + "pageOrder" ] }, - "MemberDto": { - "required": [ - "createdAt", - "email", - "orgRole", - "status", - "userId" - ], + "PhoneCallChannelConfig": { "type": "object", "properties": { - "userId": { - "type": "integer", - "description": "User identifier of the member", - "format": "int32" - }, - "email": { + "channelType": { "type": "string", - "description": "Member email address" + "enum": [ + "phone_call" + ] }, - "name": { + "phoneNumber": { "type": "string", - "description": "Member display name; null if not set", + "description": "Recipient phone number in E.164 format, e.g. +14155550123", "nullable": true }, - "orgRole": { - "type": "string", - "description": "Member role within this organization (OWNER, ADMIN, MEMBER)", - "enum": [ - "OWNER", - "ADMIN", - "MEMBER" - ] + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of an org verified_phone_number row; alternative to phoneNumber", + "format": "int64", + "nullable": true }, - "status": { + "phoneNumbers": { + "type": "array", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true + } + }, + "voiceLanguage": { "type": "string", - "description": "Membership status (ACTIVE, PENDING, SUSPENDED)", - "enum": [ - "INVITED", - "ACTIVE", - "SUSPENDED", - "LEFT", - "REMOVED", - "DECLINED" - ] + "description": "TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", + "nullable": true }, - "createdAt": { + "preferredLanguage": { "type": "string", - "description": "Timestamp when the member was added to the organization", - "format": "date-time" + "description": "Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", + "nullable": true } }, - "description": "Organization member with role and status" + "required": [ + "channelType" + ] }, - "MemberRoleChangedMetadata": { + "PlanInfo": { "required": [ - "kind", - "oldRole", - "newRole" + "entitlements", + "tier", + "usage", + "trialActive" ], "type": "object", - "description": "Role transition recorded when an organization member's role changes.", "properties": { - "kind": { + "tier": { "type": "string", + "description": "Resolved plan tier", "enum": [ - "member_role_changed" + "FREE", + "STARTER", + "PRO", + "TEAM", + "BUSINESS", + "ENTERPRISE" ] }, - "oldRole": { + "subscriptionStatus": { "type": "string", - "description": "Role the member held before the change", - "enum": [ - "OWNER", - "ADMIN", - "MEMBER" - ] + "description": "Subscription status (null if no subscription)", + "nullable": true }, - "newRole": { + "trialActive": { + "type": "boolean", + "description": "Whether the org is on a trial" + }, + "trialExpiresAt": { "type": "string", - "description": "Role the member holds after the change", - "enum": [ - "OWNER", - "ADMIN", - "MEMBER" - ] + "description": "Trial expiry (null if not trialing)", + "format": "date-time", + "nullable": true + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/EntitlementDto" + }, + "description": "Entitlement limits keyed by entitlement name" + }, + "usage": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Current usage counters keyed by entitlement name", + "format": "int64" + }, + "description": "Current usage counters keyed by entitlement name" } - } + }, + "description": "Billing plan and entitlement state" }, - "MonitorAssertionDto": { + "PolicySnapshotDto": { "required": [ - "assertionType", - "config", - "id", - "monitorId", - "severity" + "engineVersion", + "firstSeenAt", + "hashHex", + "lastSeenAt", + "policy" ], "type": "object", "properties": { - "id": { + "hashHex": { + "minLength": 1, "type": "string", - "format": "uuid" + "description": "Hex-encoded SHA-256 of the canonical policy JSON" }, - "monitorId": { - "type": "string", - "format": "uuid" + "policy": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Canonical policy document (snake_case, sorted keys)" + }, + "description": "Canonical policy document (snake_case, sorted keys)" }, - "assertionType": { + "engineVersion": { + "minLength": 1, "type": "string", - "enum": [ - "status_code", - "response_time", - "body_contains", - "json_path", - "header_value", - "regex_body", - "dns_resolves", - "dns_response_time", - "dns_expected_ips", - "dns_expected_cname", - "dns_record_contains", - "dns_record_equals", - "dns_txt_contains", - "dns_min_answers", - "dns_max_answers", - "dns_response_time_warn", - "dns_ttl_low", - "dns_ttl_high", - "mcp_connects", - "mcp_response_time", - "mcp_has_capability", - "mcp_tool_available", - "mcp_min_tools", - "mcp_protocol_version", - "mcp_response_time_warn", - "mcp_tool_count_changed", - "ssl_expiry", - "response_size", - "redirect_count", - "redirect_target", - "response_time_warn", - "tcp_connects", - "tcp_response_time", - "tcp_response_time_warn", - "icmp_reachable", - "icmp_response_time", - "icmp_response_time_warn", - "icmp_packet_loss", - "heartbeat_received", - "heartbeat_max_interval", - "heartbeat_interval_drift", - "heartbeat_payload_contains" - ] + "description": "Detection engine version that observed this policy" }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/BodyContainsAssertion" - }, - { - "$ref": "#/components/schemas/DnsExpectedCnameAssertion" - }, - { - "$ref": "#/components/schemas/DnsExpectedIpsAssertion" - }, - { - "$ref": "#/components/schemas/DnsMaxAnswersAssertion" - }, - { - "$ref": "#/components/schemas/DnsMinAnswersAssertion" - }, - { - "$ref": "#/components/schemas/DnsRecordContainsAssertion" - }, - { - "$ref": "#/components/schemas/DnsRecordEqualsAssertion" - }, - { - "$ref": "#/components/schemas/DnsResolvesAssertion" - }, - { - "$ref": "#/components/schemas/DnsResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/DnsResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/DnsTtlHighAssertion" - }, - { - "$ref": "#/components/schemas/DnsTtlLowAssertion" - }, - { - "$ref": "#/components/schemas/DnsTxtContainsAssertion" - }, - { - "$ref": "#/components/schemas/HeaderValueAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatIntervalDriftAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatMaxIntervalAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatPayloadContainsAssertion" - }, - { - "$ref": "#/components/schemas/HeartbeatReceivedAssertion" - }, - { - "$ref": "#/components/schemas/IcmpPacketLossAssertion" - }, - { - "$ref": "#/components/schemas/IcmpReachableAssertion" - }, - { - "$ref": "#/components/schemas/IcmpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/IcmpResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/JsonPathAssertion" - }, - { - "$ref": "#/components/schemas/McpConnectsAssertion" - }, - { - "$ref": "#/components/schemas/McpHasCapabilityAssertion" - }, - { - "$ref": "#/components/schemas/McpMinToolsAssertion" - }, - { - "$ref": "#/components/schemas/McpProtocolVersionAssertion" - }, - { - "$ref": "#/components/schemas/McpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/McpResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/McpToolAvailableAssertion" - }, - { - "$ref": "#/components/schemas/McpToolCountChangedAssertion" - }, - { - "$ref": "#/components/schemas/RedirectCountAssertion" - }, - { - "$ref": "#/components/schemas/RedirectTargetAssertion" - }, - { - "$ref": "#/components/schemas/RegexBodyAssertion" - }, - { - "$ref": "#/components/schemas/ResponseSizeAssertion" - }, - { - "$ref": "#/components/schemas/ResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/ResponseTimeWarnAssertion" - }, - { - "$ref": "#/components/schemas/SslExpiryAssertion" - }, - { - "$ref": "#/components/schemas/StatusCodeAssertion" - }, - { - "$ref": "#/components/schemas/TcpConnectsAssertion" - }, - { - "$ref": "#/components/schemas/TcpResponseTimeAssertion" - }, - { - "$ref": "#/components/schemas/TcpResponseTimeWarnAssertion" - } - ] + "firstSeenAt": { + "type": "string", + "description": "First time the detection engine evaluated against this policy bytes", + "format": "date-time" }, - "severity": { + "lastSeenAt": { "type": "string", - "enum": [ - "fail", - "warn" - ] - } - } - }, - "MonitorAuthConfig": { - "description": "New authentication configuration (full replacement)", - "discriminator": { - "propertyName": "type", - "mapping": { - "bearer": "#/components/schemas/BearerAuthConfig", - "basic": "#/components/schemas/BasicAuthConfig", - "header": "#/components/schemas/HeaderAuthConfig", - "api_key": "#/components/schemas/ApiKeyAuthConfig" + "description": "Most recent time the engine evaluated against this policy bytes", + "format": "date-time" } }, - "oneOf": [ - { - "$ref": "#/components/schemas/BearerAuthConfig" + "description": "Policy snapshot used during this check (all evaluations of a single check are against one policy)", + "nullable": true + }, + "PollChartBucketDto": { + "required": [ + "bucket", + "totalPolls" + ], + "type": "object", + "properties": { + "bucket": { + "type": "string", + "description": "Start of the time bucket (ISO 8601)", + "format": "date-time" }, - { - "$ref": "#/components/schemas/BasicAuthConfig" + "uptimePercent": { + "type": "number", + "description": "Uptime percentage for this bucket; null when no data", + "format": "double", + "nullable": true, + "example": 100 }, - { - "$ref": "#/components/schemas/HeaderAuthConfig" + "avgResponseTimeMs": { + "type": "number", + "description": "Average response time in milliseconds for this bucket", + "format": "double", + "nullable": true, + "example": 245.3 }, - { - "$ref": "#/components/schemas/ApiKeyAuthConfig" + "totalPolls": { + "type": "integer", + "description": "Total polls in this bucket", + "format": "int64", + "example": 60 } - ] + }, + "description": "Aggregated poll metrics for a time bucket" }, - "MonitorAuthDto": { + "PricingTier": { "required": [ - "authType", - "config", - "id", - "monitorId" + "name" ], "type": "object", "properties": { - "id": { + "name": { "type": "string", - "format": "uuid" + "description": "Tier name, e.g. 'Free', 'Pro', 'Enterprise'" }, - "monitorId": { + "slaPercentage": { "type": "string", - "format": "uuid" + "description": "SLA percentage for this tier, e.g. '99.9%'", + "nullable": true }, - "authType": { + "priceFrom": { "type": "string", - "enum": [ - "bearer", - "basic", - "header", - "api_key" - ] - }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/ApiKeyAuthConfig" - }, - { - "$ref": "#/components/schemas/BasicAuthConfig" - }, - { - "$ref": "#/components/schemas/BearerAuthConfig" - }, - { - "$ref": "#/components/schemas/HeaderAuthConfig" - } - ] + "description": "Starting price, e.g. '$0', '$25/mo', 'Custom'", + "nullable": true } - } + }, + "description": "Pricing tiers with associated SLA levels" }, - "MonitorDto": { + "PublishRevisionRequest": { "required": [ - "config", - "createdAt", - "id", - "managedBy", - "name", - "regions", - "type", - "updatedAt", - "organizationId", - "frequencySeconds", - "enabled" + "revisionId" ], "type": "object", "properties": { - "id": { + "revisionId": { "type": "string", - "description": "Unique monitor identifier", + "description": "Existing revision to activate as Head for this monitor's environment", "format": "uuid" - }, - "organizationId": { - "type": "integer", - "description": "Organization this monitor belongs to", - "format": "int32" - }, - "name": { - "minLength": 1, + } + } + }, + "PublishStatusPageIncidentRequest": { + "type": "object", + "properties": { + "title": { + "maxLength": 500, + "minLength": 0, "type": "string", - "description": "Human-readable name for this monitor" + "description": "Customer-facing title; null keeps draft value", + "nullable": true }, - "type": { + "impact": { "type": "string", + "description": "Impact level; null keeps draft value", + "nullable": true, "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT", - "BROWSER", - "MULTI_STEP_API" + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" ] }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/DnsMonitorConfig" - }, - { - "$ref": "#/components/schemas/HeartbeatMonitorConfig" - }, - { - "$ref": "#/components/schemas/HttpMonitorConfig" - }, - { - "$ref": "#/components/schemas/IcmpMonitorConfig" - }, - { - "$ref": "#/components/schemas/McpServerMonitorConfig" - }, - { - "$ref": "#/components/schemas/ScriptMonitorConfig" - }, - { - "$ref": "#/components/schemas/TcpMonitorConfig" - } + "status": { + "type": "string", + "description": "Incident status; null keeps draft value (must be an active status)", + "nullable": true, + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" ] }, - "frequencySeconds": { - "type": "integer", - "description": "Check frequency in seconds (30–86400)", - "format": "int32" - }, - "enabled": { - "type": "boolean", - "description": "Whether the monitor is active" + "body": { + "type": "string", + "description": "Initial update body; null keeps draft value", + "nullable": true }, - "regions": { + "affectedComponents": { "type": "array", - "description": "Probe regions where checks are executed", + "description": "Affected components; null keeps draft value", + "nullable": true, "items": { - "type": "string", - "description": "Probe regions where checks are executed" + "$ref": "#/components/schemas/AffectedComponent" } }, - "managedBy": { + "notifySubscribers": { + "type": "boolean", + "description": "Whether to notify subscribers (default: true)", + "nullable": true + } + } + }, + "PushbulletChannelConfig": { + "required": [ + "channelType", + "accessToken" + ], + "type": "object", + "properties": { + "channelType": { "type": "string", - "description": "Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" + "pushbullet" ] }, - "createdAt": { - "type": "string", - "description": "Timestamp when the monitor was created", - "format": "date-time" - }, - "updatedAt": { + "accessToken": { + "minLength": 1, "type": "string", - "description": "Timestamp when the monitor was last updated", - "format": "date-time" - }, - "assertions": { - "type": "array", - "description": "Assertions evaluated against each check result; null on list responses", - "nullable": true, - "items": { - "$ref": "#/components/schemas/MonitorAssertionDto" - } - }, - "tags": { - "type": "array", - "description": "Tags applied to this monitor", - "nullable": true, - "items": { - "$ref": "#/components/schemas/TagDto" - } + "description": "Pushbullet access token" }, - "pingUrl": { + "deviceIden": { "type": "string", - "description": "Heartbeat ping URL; populated for HEARTBEAT monitors only", + "description": "Target device identifier (broadcasts to all if empty)", "nullable": true - }, - "environment": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/Summary" - } + } + } + }, + "PushoverChannelConfig": { + "required": [ + "channelType", + "userKey", + "appToken" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pushover" ] }, - "auth": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" - } - ] + "userKey": { + "minLength": 1, + "type": "string", + "description": "Pushover user or group key" }, - "incidentPolicy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/IncidentPolicyDto" - } - ] + "appToken": { + "minLength": 1, + "type": "string", + "description": "Pushover application API token" }, - "alertChannelIds": { - "type": "array", - "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses", - "nullable": true, - "items": { - "type": "string", - "description": "Alert channel IDs linked to this monitor; populated on single-monitor responses", - "format": "uuid" - } + "priority": { + "type": "string", + "description": "Notification priority override (-2 to 2)", + "nullable": true }, - "currentStatus": { + "sound": { "type": "string", - "description": "Current operational state — UP, DOWN, DEGRADED, PAUSED, or UNKNOWN if no probe data yet", - "nullable": true, - "enum": [ - "up", - "degraded", - "down", - "paused", - "unknown" - ] + "description": "Notification sound override", + "nullable": true } - }, - "description": "Full monitor representation" + } }, - "MonitorReference": { + "QuarantineMonitorRequest": { "required": [ - "id", - "name" + "expiresAt", + "reason" ], "type": "object", "properties": { - "id": { + "reason": { + "maxLength": 280, + "minLength": 0, "type": "string", - "description": "Monitor identifier", - "format": "uuid" + "description": "Reason for this hold (max 280)" }, - "name": { + "expiresAt": { "type": "string", - "description": "Monitor name" + "description": "When the hold expires", + "format": "date-time" + }, + "fromRunId": { + "type": "string", + "description": "Run that prompted this hold", + "format": "uuid", + "nullable": true } - }, - "description": "Monitors that reference this secret; null on create/update responses" + } }, - "MonitorsSummaryDto": { + "RateLimitInfo": { "type": "object", "properties": { - "total": { + "requestsPerMinute": { "type": "integer", - "description": "Total number of monitors in the organization", + "description": "Maximum requests allowed per window", "format": "int64" }, - "up": { + "remaining": { "type": "integer", - "description": "Number of monitors currently passing", + "description": "Requests remaining in the current window", "format": "int64" }, - "down": { + "windowMs": { "type": "integer", - "description": "Number of monitors currently failing (DOWN severity)", + "description": "Sliding window size in milliseconds", "format": "int64" - }, - "degraded": { + } + }, + "description": "Rate-limit quota for the current sliding window", + "required": [ + "requestsPerMinute", + "remaining", + "windowMs" + ] + }, + "RecoveryPolicy": { + "type": "object", + "properties": { + "consecutiveSuccesses": { "type": "integer", - "description": "Number of monitors with degraded status", - "format": "int64" + "description": "Consecutive passing checks required to auto-resolve the incident", + "format": "int32" }, - "paused": { + "minRegionsPassing": { "type": "integer", - "description": "Number of disabled monitors", - "format": "int64" - }, - "avgUptime24h": { - "type": "number", - "description": "Average uptime percentage across all monitors over last 24h", - "format": "double", - "nullable": true + "description": "Minimum regions that must be passing before recovery can complete", + "format": "int32" }, - "avgUptime30d": { - "type": "number", - "description": "Average uptime percentage across all monitors over last 30 days", - "format": "double", - "nullable": true + "cooldownMinutes": { + "type": "integer", + "description": "Minutes after resolve before a new incident may open on the same monitor", + "format": "int32" } }, - "description": "Dashboard summary counters for monitors", + "description": "Auto-recovery settings", "required": [ - "total", - "up", - "down", - "degraded", - "paused" + "consecutiveSuccesses", + "minRegionsPassing", + "cooldownMinutes" ] }, - "MonitorTestRequest": { + "RedirectCountAssertion": { "required": [ - "config", - "type" + "type", + "maxCount" ], "type": "object", "properties": { "type": { "type": "string", - "description": "Monitor protocol type to test", "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT", - "BROWSER", - "MULTI_STEP_API" - ] - }, - "config": { - "oneOf": [ - { - "$ref": "#/components/schemas/DnsMonitorConfig" - }, - { - "$ref": "#/components/schemas/HeartbeatMonitorConfig" - }, - { - "$ref": "#/components/schemas/HttpMonitorConfig" - }, - { - "$ref": "#/components/schemas/IcmpMonitorConfig" - }, - { - "$ref": "#/components/schemas/McpServerMonitorConfig" - }, - { - "$ref": "#/components/schemas/ScriptMonitorConfig" - }, - { - "$ref": "#/components/schemas/TcpMonitorConfig" - } + "redirect_count" ] }, - "assertions": { - "type": "array", - "description": "Optional assertions to evaluate against the test result", - "nullable": true, - "items": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } + "maxCount": { + "type": "integer", + "description": "Maximum number of HTTP redirects allowed before the check fails", + "format": "int32" } } }, - "MonitorTestResultDto": { + "RedirectTargetAssertion": { "required": [ - "assertionResults", - "passed" + "type", + "expected", + "operator" ], "type": "object", "properties": { - "passed": { - "type": "boolean" - }, - "error": { + "type": { "type": "string", - "nullable": true - }, - "statusCode": { - "type": "integer", - "format": "int32", - "nullable": true - }, - "responseTimeMs": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "responseHeaders": { - "type": "object", - "additionalProperties": { - "type": "array", - "nullable": true, - "items": { - "type": "string", - "nullable": true - } - }, - "nullable": true + "enum": [ + "redirect_target" + ] }, - "bodyPreview": { + "expected": { + "minLength": 1, "type": "string", - "nullable": true - }, - "responseSizeBytes": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "redirectCount": { - "type": "integer", - "format": "int32", - "nullable": true + "description": "Expected final URL after following redirects" }, - "finalUrl": { + "operator": { "type": "string", - "nullable": true - }, - "assertionResults": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssertionTestResultDto" - } + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] + } + } + }, + "RegexBodyAssertion": { + "required": [ + "type", + "pattern" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "regex_body" + ] }, - "warnings": { - "type": "array", - "nullable": true, - "items": { - "type": "string" - } + "pattern": { + "minLength": 1, + "type": "string", + "description": "Regular expression the response body must match" } } }, - "MonitorVersionDto": { + "RegionStatusDto": { "required": [ - "changedVia", - "createdAt", - "id", - "monitorId", - "snapshot", - "version" + "region", + "timestamp", + "passed" ], "type": "object", "properties": { - "id": { - "type": "string", - "description": "Unique version record identifier", - "format": "uuid" - }, - "monitorId": { + "region": { "type": "string", - "description": "Monitor this version belongs to", - "format": "uuid" - }, - "version": { - "type": "integer", - "description": "Monotonically increasing version number", - "format": "int32" + "description": "Region identifier", + "example": "us-east" }, - "snapshot": { - "$ref": "#/components/schemas/MonitorDto" + "passed": { + "type": "boolean", + "description": "Whether the last check in this region passed", + "example": true }, - "changedById": { + "responseTimeMs": { "type": "integer", - "description": "User ID who made the change; null for automated changes", + "description": "Response time in milliseconds for the last check", "format": "int32", - "nullable": true + "nullable": true, + "example": 95 }, - "changedVia": { + "timestamp": { "type": "string", - "description": "Change source (DASHBOARD, CLI, API)", - "enum": [ - "API", - "DASHBOARD", - "CLI", - "TERRAFORM" - ] + "description": "Timestamp of the last check in this region (ISO 8601)", + "format": "date-time" }, - "changeSummary": { + "severityHint": { "type": "string", - "description": "Human-readable description of what changed", + "description": "Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing", "nullable": true - }, - "createdAt": { - "type": "string", - "description": "Timestamp when this version was recorded", - "format": "date-time" } }, - "description": "A point-in-time version snapshot of a monitor configuration" + "description": "Latest check result for a single region" }, - "NewTagRequest": { + "RelatedIncidentsResponse": { "required": [ - "name" + "data", + "total" ], "type": "object", "properties": { - "name": { - "maxLength": 100, - "minLength": 0, - "type": "string", - "description": "Tag name" + "data": { + "type": "array", + "description": "Related incident rows (newest first, capped by limit)", + "items": { + "$ref": "#/components/schemas/IncidentDto" + } }, - "color": { - "pattern": "^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", - "type": "string", - "description": "Hex color code (defaults to #6B7280 if omitted)", - "nullable": true + "total": { + "type": "integer", + "description": "Total matching incidents in the window, excluding the current incident", + "format": "int64" } }, - "description": "Inline tag creation — creates the tag if it does not already exist" + "description": "Related incidents sharing the same origin within a time window" }, - "NoSlaContext": { + "RemapSecretRequest": { "type": "object", "properties": { - "reason": { + "secretId": { "type": "string", - "description": "Reason no SLA is published", - "nullable": true - }, - "historicalClaim": { - "type": "string", - "description": "Non-binding historical uptime claim", - "nullable": true - }, - "supportSla": { - "type": "string", - "description": "Support response time SLA if different from uptime SLA", - "nullable": true - }, - "enterpriseNote": { - "type": "string", - "description": "Note about enterprise/custom SLA availability", + "description": "Secret to attach; null restores name-match", + "format": "uuid", "nullable": true } }, - "description": "Context for vendors with no public SLA" + "description": "Attach or clear a remapped secret" }, - "NotificationDispatchDto": { + "RemoveMonitorTagsRequest": { "required": [ - "createdAt", - "deliveries", - "id", - "incidentId", - "policyId", - "status", - "updatedAt", - "currentStep" + "tagIds" ], "type": "object", "properties": { - "id": { - "type": "string", - "description": "Unique dispatch record identifier", - "format": "uuid" - }, - "incidentId": { - "type": "string", - "description": "Incident this dispatch is for", - "format": "uuid" - }, - "incidentTitle": { - "type": "string", - "description": "Incident title at read time; null if untitled or missing", - "nullable": true - }, - "policyId": { - "type": "string", - "description": "Notification policy that matched this incident", - "format": "uuid" - }, - "policyName": { - "type": "string", - "description": "Human-readable name of the matched policy (null if policy has been deleted)", - "nullable": true - }, - "status": { - "type": "string", - "description": "Current dispatch state", - "enum": [ - "PENDING", - "DISPATCHING", - "DELIVERED", - "ESCALATING", - "ACKNOWLEDGED", - "COMPLETED" - ] - }, - "completionReason": { - "type": "string", - "description": "Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states.", - "nullable": true, - "enum": [ - "EXHAUSTED", - "RESOLVED", - "NO_STEPS" - ] - }, - "currentStep": { - "type": "integer", - "description": "1-based index of the currently active escalation step", - "format": "int32" - }, - "totalSteps": { - "type": "integer", - "description": "Total number of escalation steps in the policy (null if policy has been deleted)", - "format": "int32", - "nullable": true - }, - "acknowledgedAt": { - "type": "string", - "description": "Timestamp when this dispatch was acknowledged (null if not acknowledged)", - "format": "date-time", - "nullable": true - }, - "acknowledgedBy": { - "type": "string", - "description": "Actor who acknowledged this dispatch (user email, api-key:, voice:, etc.); null if not acknowledged", - "nullable": true - }, - "acknowledgedVia": { - "type": "string", - "description": "Channel used to acknowledge (DASHBOARD, API, PHONE_CALL, INTERNAL, etc.); null if not acknowledged", - "nullable": true - }, - "matchedRules": { + "tagIds": { + "minItems": 1, "type": "array", - "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]", - "nullable": true, + "description": "IDs of the tags to detach from the monitor", "items": { "type": "string", - "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]" + "description": "IDs of the tags to detach from the monitor", + "format": "uuid" } - }, - "nextEscalationAt": { - "type": "string", - "description": "Timestamp when the next escalation step will fire (null if not scheduled)", - "format": "date-time", - "nullable": true - }, - "lastNotifiedAt": { - "type": "string", - "description": "Timestamp of the most recent notification delivery", - "format": "date-time", - "nullable": true - }, - "deliveries": { + } + }, + "description": "Request body for removing tags from a monitor" + }, + "ReorderComponentsRequest": { + "required": [ + "positions" + ], + "type": "object", + "properties": { + "positions": { + "minItems": 1, "type": "array", - "description": "Delivery records for all channels associated with this dispatch", + "description": "Ordered list of component IDs with their new positions", "items": { - "$ref": "#/components/schemas/AlertDeliveryDto" + "$ref": "#/components/schemas/ComponentPosition" } - }, - "createdAt": { - "type": "string", - "description": "Timestamp when the dispatch was created", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "description": "Timestamp when the dispatch was last updated", - "format": "date-time" } }, - "description": "Dispatch state for a single (incident, notification policy) pair, with delivery history" + "description": "Batch component reorder request" }, - "NotificationDto": { + "ReorderPageLayoutRequest": { "required": [ - "createdAt", - "title", - "type", - "id", - "read" + "sections" ], "type": "object", "properties": { - "id": { - "type": "integer", - "description": "Unique notification identifier", - "format": "int64" + "sections": { + "minItems": 1, + "type": "array", + "description": "Top-level sections in their new order", + "items": { + "$ref": "#/components/schemas/PageSection" + } }, - "type": { + "groupOrders": { + "type": "array", + "description": "Within-group component ordering; only needed for groups whose internal order changed", + "nullable": true, + "items": { + "$ref": "#/components/schemas/GroupComponentOrder" + } + } + }, + "description": "Reorder page-level layout: groups and ungrouped components share one ordering" + }, + "ResolveIncidentRequest": { + "type": "object", + "properties": { + "body": { "type": "string", - "description": "Notification category (e.g. incident, monitor, team)" - }, - "title": { + "description": "Optional resolution message or post-mortem notes", + "nullable": true + } + } + }, + "ResourceGroupDeleteBlockerDto": { + "required": [ + "componentId", + "componentName", + "statusPageId", + "statusPageName", + "statusPageSlug" + ], + "type": "object", + "properties": { + "statusPageId": { "type": "string", - "description": "Short notification title" + "description": "Status page that owns the blocking component", + "format": "uuid" }, - "body": { + "statusPageName": { + "minLength": 1, "type": "string", - "description": "Full notification body; null for title-only notifications", - "nullable": true + "description": "Human-readable status page name" }, - "resourceType": { + "statusPageSlug": { + "minLength": 1, "type": "string", - "description": "Type of the resource this notification is about", - "nullable": true + "description": "URL-safe status page slug" }, - "resourceId": { + "componentId": { "type": "string", - "description": "ID of the resource this notification is about", - "nullable": true + "description": "Blocking GROUP-typed status page component ID", + "format": "uuid" }, - "read": { - "type": "boolean", - "description": "Whether the notification has been read" + "componentName": { + "minLength": 1, + "type": "string", + "description": "Blocking component display name" }, - "createdAt": { + "hostname": { "type": "string", - "description": "Timestamp when the notification was created", - "format": "date-time" + "description": "Public hostname when a custom domain is configured; null otherwise", + "nullable": true } }, - "description": "In-app notification for the current user" + "description": "Status-page component that references this resource group (blocks delete; public exposure)" }, - "NotificationPolicyDto": { + "ResourceGroupDto": { "required": [ "createdAt", - "escalation", + "health", "id", - "matchRules", "name", + "slug", "updatedAt", "organizationId", - "enabled", - "priority" + "suppressMemberAlerts" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique notification policy identifier", + "description": "Unique resource group identifier", "format": "uuid" }, "organizationId": { "type": "integer", - "description": "Organization this policy belongs to", + "description": "Organization this group belongs to", "format": "int32" }, "name": { "minLength": 1, "type": "string", - "description": "Human-readable name for this policy" + "description": "Human-readable group name" + }, + "slug": { + "minLength": 1, + "type": "string", + "description": "URL-safe group identifier" }, "description": { "type": "string", - "description": "Optional note; null when unset", + "description": "Optional group description", "nullable": true }, - "matchRules": { + "alertPolicyId": { + "type": "string", + "description": "Notification policy applied to this group", + "format": "uuid", + "nullable": true + }, + "defaultFrequency": { + "type": "integer", + "description": "Default check frequency in seconds for member monitors", + "format": "int32", + "nullable": true + }, + "defaultRegions": { "type": "array", - "description": "Match rules (all must pass; empty = catch-all)", + "description": "Default regions for member monitors", + "nullable": true, "items": { - "$ref": "#/components/schemas/MatchRule" + "type": "string", + "description": "Default regions for member monitors" } }, - "escalation": { - "$ref": "#/components/schemas/EscalationChain" + "defaultRetryStrategy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RetryStrategy" + } + ] }, - "enabled": { + "defaultAlertChannels": { + "type": "array", + "description": "Default alert channel IDs for member monitors", + "nullable": true, + "items": { + "type": "string", + "description": "Default alert channel IDs for member monitors", + "format": "uuid" + } + }, + "defaultEnvironmentId": { + "type": "string", + "description": "Default environment ID for member monitors", + "format": "uuid", + "nullable": true + }, + "healthThresholdType": { + "type": "string", + "description": "Health threshold type: COUNT or PERCENTAGE", + "nullable": true, + "enum": [ + "COUNT", + "PERCENTAGE" + ] + }, + "healthThresholdValue": { + "type": "number", + "description": "Health threshold value", + "nullable": true + }, + "suppressMemberAlerts": { "type": "boolean", - "description": "Whether this policy is active" + "description": "When true, member-level incidents skip notification dispatch; only group alerts fire" }, - "priority": { + "confirmationDelaySeconds": { "type": "integer", - "description": "Evaluation order; higher value = evaluated first", - "format": "int32" + "description": "Seconds to wait after health threshold breach before creating group incident", + "format": "int32", + "nullable": true }, - "createdAt": { - "type": "string", - "description": "Timestamp when the policy was created", - "format": "date-time" + "recoveryCooldownMinutes": { + "type": "integer", + "description": "Cooldown minutes after group incident resolves before a new one can open", + "format": "int32", + "nullable": true }, - "updatedAt": { - "type": "string", - "description": "Timestamp when the policy was last updated", - "format": "date-time" + "health": { + "$ref": "#/components/schemas/ResourceGroupHealthDto" }, - "stats7d": { + "members": { + "type": "array", + "description": "Member list with individual statuses; populated on detail GET only", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ResourceGroupMemberDto" + } + }, + "deleteBlockedBy": { + "type": "array", + "description": "Status-page GROUP components that reference this group (delete blockers / public exposure); populated on detail GET only \u2014 omitted on list", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ResourceGroupDeleteBlockerDto" + } + }, + "openRegionIncident": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" + "$ref": "#/components/schemas/IncidentDto" } ] }, - "stats30d": { + "managedBy": { + "type": "string", + "description": "Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" - } + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" ] }, - "lastFiredAt": { + "createdAt": { "type": "string", - "description": "Created-at of the most recent dispatch for this policy; null if never fired", - "format": "date-time", - "nullable": true + "description": "Timestamp when the group was created", + "format": "date-time" }, - "lastFiredIncidentId": { + "updatedAt": { "type": "string", - "description": "Incident id of the most recent dispatch; null if never fired", - "format": "uuid", - "nullable": true + "description": "Timestamp when the group was last updated", + "format": "date-time" } }, - "description": "Org-level notification policy with match rules and escalation chain" + "description": "Resource group with health summary and optional member details" }, - "NotificationPolicyWindowStatsDto": { + "ResourceGroupHealthDto": { "required": [ - "ackableFires", - "acknowledgements", - "expired", - "failedSends", - "fires", - "sends" + "status", + "totalMembers", + "operationalCount", + "activeIncidents" ], "type": "object", "properties": { - "fires": { - "type": "integer", - "description": "Dispatches created in the window", - "format": "int32" - }, - "acknowledgements": { - "type": "integer", - "description": "Fires in the window that were acknowledged", - "format": "int32" - }, - "ackableFires": { - "type": "integer", - "description": "Ack ratio denominator: fires when the policy has an ack gate, else 0", - "format": "int32" + "status": { + "type": "string", + "description": "Worst-of health status across all members", + "enum": [ + "operational", + "maintenance", + "degraded", + "down" + ] }, - "expired": { + "totalMembers": { "type": "integer", - "description": "Fires that exhausted escalation without acknowledgment", + "description": "Total number of members in the group", "format": "int32" }, - "sends": { + "operationalCount": { "type": "integer", - "description": "Alert deliveries linked to fires in the window", + "description": "Number of members currently in operational status", "format": "int32" }, - "failedSends": { + "activeIncidents": { "type": "integer", - "description": "Linked deliveries with status FAILED", + "description": "Number of members currently non-operational (not an incident-row count)", "format": "int32" }, - "medianAckSeconds": { - "type": "integer", - "description": "Median seconds from fire to ack among acknowledged fires; null when none", - "format": "int64", - "nullable": true + "thresholdStatus": { + "type": "string", + "description": "Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured.", + "nullable": true, + "enum": [ + "healthy", + "degraded", + "down" + ] }, - "deepestStepReached": { + "failingCount": { "type": "integer", - "description": "Highest escalation step reached in the window; null when no fires", + "description": "Number of failing members at time of last evaluation; null when no threshold configured", "format": "int32", "nullable": true }, - "lastFiredAt": { + "healthBreachedSince": { "type": "string", - "description": "Created-at of the most recent fire in the window; null when none", + "description": "When the health threshold was first breached in the current cycle; null when not breached", "format": "date-time", "nullable": true }, - "lastFiredIncidentId": { + "healthEvaluatedAt": { "type": "string", - "description": "Incident id of the most recent fire in the window; null when none", - "format": "uuid", + "description": "When group health was last evaluated (threshold or stamp-only); null until first evaluation", + "format": "date-time", "nullable": true } }, - "description": "Time-bounded notification policy activity aggregates" + "description": "Aggregated health summary for a resource group" }, - "OfficialSla": { + "ResourceGroupMemberDto": { + "required": [ + "createdAt", + "groupId", + "id", + "memberType", + "status" + ], "type": "object", "properties": { - "percentage": { + "id": { "type": "string", - "description": "Advertised uptime percentage, e.g. '99.99%'", - "nullable": true + "description": "Unique group member record identifier", + "format": "uuid" }, - "scope": { + "groupId": { "type": "string", - "description": "Scope of the SLA, e.g. 'Monthly uptime per region'", - "nullable": true + "description": "Resource group this member belongs to", + "format": "uuid" }, - "measurement": { + "memberType": { "type": "string", - "description": "How the vendor measures uptime for SLA purposes", - "nullable": true + "description": "Type of member: 'monitor' or 'service'" }, - "exclusions": { + "monitorId": { "type": "string", - "description": "Summary of exclusions from SLA calculation", + "description": "Monitor ID; set when memberType is 'monitor'", + "format": "uuid", "nullable": true }, - "appliesToPlans": { - "type": "array", - "description": "Plan names this SLA applies to, e.g. ['Enterprise']", - "nullable": true, - "items": { - "type": "string", - "description": "Plan names this SLA applies to, e.g. ['Enterprise']" - } - }, - "notCovered": { + "serviceId": { "type": "string", - "description": "Services/components NOT covered by the SLA", + "description": "Service ID; set when memberType is 'service'", + "format": "uuid", "nullable": true - } - }, - "description": "The vendor's officially advertised SLA commitment" - }, - "OpsGenieChannelConfig": { - "required": [ - "channelType", - "apiKey" - ], - "type": "object", - "properties": { - "channelType": { + }, + "name": { "type": "string", - "enum": [ - "opsgenie" - ] + "description": "Display name of the referenced monitor or service", + "nullable": true }, - "apiKey": { - "minLength": 1, + "slug": { "type": "string", - "description": "OpsGenie API key for alert creation" + "description": "Slug identifier for the service (services only); used for icons and uptime API calls", + "nullable": true }, - "region": { + "subscriptionId": { "type": "string", - "description": "OpsGenie API region: us or eu", + "description": "Subscription ID for the service (services only); used to link to the dependency detail page", + "format": "uuid", "nullable": true - } - } - }, - "OrganizationDto": { - "required": [ - "email", - "name", - "id" - ], - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "Unique organization identifier", - "format": "int32" }, - "name": { + "status": { "type": "string", - "description": "Organization name" + "description": "Computed health status for this member", + "enum": [ + "operational", + "maintenance", + "degraded", + "down" + ] }, - "email": { + "effectiveFrequency": { "type": "string", - "description": "Billing and contact email", + "description": "Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured", "nullable": true }, - "size": { + "createdAt": { "type": "string", - "description": "Team size range (e.g. 1-10, 11-50)", + "description": "Timestamp when the member was added to the group", + "format": "date-time" + }, + "uptime24h": { + "type": "number", + "description": "24h uptime percentage; populated when includeMetrics=true", + "format": "double", "nullable": true }, - "industry": { - "type": "string", - "description": "Industry vertical (e.g. SaaS, Fintech)", + "chartData": { + "type": "array", + "description": "Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true", + "nullable": true, + "items": { + "type": "number", + "description": "Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true", + "format": "double" + } + }, + "avgLatencyMs": { + "type": "number", + "description": "Average latency in ms (monitors only); populated when includeMetrics=true", + "format": "double", "nullable": true }, - "websiteUrl": { - "type": "string", - "description": "Organization website URL", + "p95LatencyMs": { + "type": "number", + "description": "P95 latency in ms (monitors only); populated when includeMetrics=true", + "format": "double", "nullable": true - } - }, - "description": "Organization account details" - }, - "OrgIncidentAnnotationDto": { - "required": [ - "incidentId", - "severity", - "status", - "alerted" - ], - "type": "object", - "properties": { - "incidentId": { - "type": "string", - "description": "Internal org incident ID", - "format": "uuid" }, - "displayKey": { + "lastCheckedAt": { "type": "string", - "description": "Human display key (e.g. DEV-42); null until platform INC codes ship", + "description": "Timestamp of the most recent health check; populated when includeMetrics=true", + "format": "date-time", "nullable": true }, - "status": { + "monitorType": { "type": "string", - "description": "Internal incident lifecycle status", - "enum": [ - "WATCHING", - "TRIGGERED", - "CONFIRMED", - "RESOLVED" - ] + "description": "Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only", + "nullable": true }, - "severity": { + "environmentName": { "type": "string", - "description": "Internal incident severity", - "enum": [ - "DOWN", - "DEGRADED", - "MAINTENANCE" - ] + "description": "Environment name; monitors only", + "nullable": true }, - "alerted": { - "type": "boolean", - "description": "Whether alert channels were eligible to fire (false for AWARENESS silent tracking)" + "groupMembershipCount": { + "type": "integer", + "description": "Count of resource groups this monitor or service belongs to; detail GET only \u2014 omitted on list", + "format": "int32", + "nullable": true }, - "startedAt": { + "failingSince": { "type": "string", - "description": "When the internal incident started", + "description": "Start of the current non-operational stretch; null when operational or unknown (services OK); detail GET only \u2014 omitted on list", "format": "date-time", "nullable": true - } - }, - "description": "Linked internal incident annotation on a vendor status-event row" - }, - "OrgInfo": { - "required": [ - "name", - "id" - ], - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "Organization ID", - "format": "int32" - }, - "name": { - "type": "string", - "description": "Organization name" - } - }, - "description": "Organization the key belongs to" - }, - "Pageable": { - "type": "object", - "properties": { - "page": { - "minimum": 0, - "type": "integer", - "format": "int32" }, - "size": { - "minimum": 1, - "type": "integer", - "format": "int32" + "alertCollapsed": { + "type": "boolean", + "description": "True when an active member incident records this group among alertCollapsedByResourceGroupIds; detail GET only \u2014 omitted on list", + "nullable": true }, - "sort": { + "incidentMarks": { "type": "array", + "description": "Incident marks for the trailing 24h strip; null when metrics omitted or failed; detail GET only \u2014 omitted on list", + "nullable": true, "items": { - "type": "string" + "$ref": "#/components/schemas/ResourceGroupMemberIncidentMarkDto" } } }, - "required": [ - "page", - "size", - "sort" - ] + "description": "A single member of a resource group with its computed health status" }, - "PagerDutyChannelConfig": { + "ResourceGroupMemberIncidentMarkDto": { "required": [ - "channelType", - "routingKey" + "at" ], "type": "object", "properties": { - "channelType": { + "at": { "type": "string", - "enum": [ - "pagerduty" - ] + "description": "Incident startedAt (or first confirmed) within the trailing 24h window", + "format": "date-time" }, - "routingKey": { - "minLength": 1, + "incidentId": { "type": "string", - "description": "PagerDuty Events API v2 routing (integration) key" + "description": "Incident ID for navigation; null when unknown", + "format": "uuid", + "nullable": true }, - "severityOverride": { + "severity": { "type": "string", - "description": "Override PagerDuty severity mapping", + "description": "Optional severity display hint", "nullable": true } - } + }, + "description": "Member incident mark for the trailing 24h uptime strip" }, - "PageSection": { + "ResponseSizeAssertion": { "type": "object", "properties": { - "groupId": { - "type": "string", - "description": "Group ID when this section is a group", - "format": "uuid", - "nullable": true - }, - "componentId": { + "type": { "type": "string", - "description": "Component ID when this section is an ungrouped component", - "format": "uuid", - "nullable": true + "enum": [ + "response_size" + ] }, - "pageOrder": { + "maxBytes": { "type": "integer", - "description": "Position on the page (0-based)", + "description": "Maximum response body size in bytes before the check fails", "format": "int32" } }, - "description": "A top-level page section (either a group or an ungrouped component)", "required": [ - "pageOrder" + "type", + "maxBytes" ] }, - "PhoneCallChannelConfig": { + "ResponseTimeAssertion": { "type": "object", "properties": { - "channelType": { + "type": { "type": "string", "enum": [ - "phone_call" + "response_time" ] }, - "phoneNumber": { - "type": "string", - "description": "Recipient phone number in E.164 format, e.g. +14155550123", - "nullable": true - }, - "verifiedPhoneNumberId": { + "thresholdMs": { "type": "integer", - "description": "Id of an org verified_phone_number row; alternative to phoneNumber", - "format": "int64", - "nullable": true - }, - "phoneNumbers": { - "type": "array", - "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", - "nullable": true, - "items": { - "type": "string", - "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", - "nullable": true - } - }, - "voiceLanguage": { - "type": "string", - "description": "TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", - "nullable": true - }, - "preferredLanguage": { - "type": "string", - "description": "Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", - "nullable": true + "description": "Maximum allowed response time in milliseconds before the check fails", + "format": "int32" } }, "required": [ - "channelType" + "type", + "thresholdMs" ] }, - "PlanInfo": { - "required": [ - "entitlements", - "tier", - "usage", - "trialActive" - ], + "ResponseTimeWarnAssertion": { "type": "object", "properties": { - "tier": { + "type": { "type": "string", - "description": "Resolved plan tier", "enum": [ - "FREE", - "STARTER", - "PRO", - "TEAM", - "BUSINESS", - "ENTERPRISE" + "response_time_warn" ] }, - "subscriptionStatus": { - "type": "string", - "description": "Subscription status (null if no subscription)", - "nullable": true - }, - "trialActive": { - "type": "boolean", - "description": "Whether the org is on a trial" - }, - "trialExpiresAt": { - "type": "string", - "description": "Trial expiry (null if not trialing)", - "format": "date-time", - "nullable": true - }, - "entitlements": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/EntitlementDto" - }, - "description": "Entitlement limits keyed by entitlement name" - }, - "usage": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Current usage counters keyed by entitlement name", - "format": "int64" - }, - "description": "Current usage counters keyed by entitlement name" + "warnMs": { + "type": "integer", + "description": "HTTP response time in milliseconds that triggers a warning only", + "format": "int32" } }, - "description": "Billing plan and entitlement state" + "required": [ + "type", + "warnMs" + ] }, - "PolicySnapshotDto": { + "ResultSummaryDto": { "required": [ - "engineVersion", - "firstSeenAt", - "hashHex", - "lastSeenAt", - "policy" + "chartData", + "currentStatus", + "latestPerRegion" ], "type": "object", "properties": { - "hashHex": { - "minLength": 1, - "type": "string", - "description": "Hex-encoded SHA-256 of the canonical policy JSON" - }, - "policy": { - "type": "object", - "additionalProperties": { - "type": "object", - "description": "Canonical policy document (snake_case, sorted keys)" - }, - "description": "Canonical policy document (snake_case, sorted keys)" - }, - "engineVersion": { - "minLength": 1, + "currentStatus": { "type": "string", - "description": "Detection engine version that observed this policy" + "description": "Derived current status across all regions", + "enum": [ + "up", + "degraded", + "down", + "paused", + "unknown" + ] }, - "firstSeenAt": { - "type": "string", - "description": "First time the detection engine evaluated against this policy bytes", - "format": "date-time" + "latestPerRegion": { + "type": "array", + "description": "Latest check result per region", + "items": { + "$ref": "#/components/schemas/RegionStatusDto" + } }, - "lastSeenAt": { - "type": "string", - "description": "Most recent time the engine evaluated against this policy bytes", - "format": "date-time" - } - }, - "description": "Policy snapshot used during this check (all evaluations of a single check are against one policy)", - "nullable": true - }, - "PollChartBucketDto": { - "required": [ - "bucket", - "totalPolls" - ], - "type": "object", - "properties": { - "bucket": { - "type": "string", - "description": "Start of the time bucket (ISO 8601)", - "format": "date-time" + "chartData": { + "type": "array", + "description": "Time-bucketed chart data for the requested window", + "items": { + "$ref": "#/components/schemas/ChartBucketDto" + } }, - "uptimePercent": { + "uptime24h": { "type": "number", - "description": "Uptime percentage for this bucket; null when no data", + "description": "Uptime percentage over the last 24 hours; null when no data", "format": "double", "nullable": true, - "example": 100 + "example": 99.95 }, - "avgResponseTimeMs": { + "uptimeWindow": { "type": "number", - "description": "Average response time in milliseconds for this bucket", + "description": "Uptime percentage for the selected chart window; null when no data", "format": "double", "nullable": true, - "example": 245.3 - }, - "totalPolls": { - "type": "integer", - "description": "Total polls in this bucket", - "format": "int64", - "example": 60 + "example": 99.8 } }, - "description": "Aggregated poll metrics for a time bucket" + "description": "Dashboard summary: current status, per-region latest results, and chart data" }, - "PricingTier": { + "RetryStrategy": { "required": [ - "name" + "type", + "maxRetries", + "interval" ], "type": "object", "properties": { - "name": { + "type": { "type": "string", - "description": "Tier name, e.g. 'Free', 'Pro', 'Enterprise'" + "description": "Retry strategy kind, e.g. fixed interval between attempts" }, - "slaPercentage": { - "type": "string", - "description": "SLA percentage for this tier, e.g. '99.9%'", - "nullable": true + "maxRetries": { + "type": "integer", + "description": "Maximum number of retries after a failed check", + "format": "int32" }, - "priceFrom": { - "type": "string", - "description": "Starting price, e.g. '$0', '$25/mo', 'Custom'", - "nullable": true + "interval": { + "type": "integer", + "description": "Delay between retry attempts in seconds", + "format": "int32" } }, - "description": "Pricing tiers with associated SLA levels" + "description": "Default retry strategy for member monitors; null clears" }, - "PublishStatusPageIncidentRequest": { + "RevisionDiffDto": { + "required": [ + "hunks", + "left", + "right" + ], "type": "object", "properties": { - "title": { - "maxLength": 500, - "minLength": 0, - "type": "string", - "description": "Customer-facing title; null keeps draft value", - "nullable": true - }, - "impact": { - "type": "string", - "description": "Impact level; null keeps draft value", - "nullable": true, - "enum": [ - "NONE", - "MINOR", - "MAJOR", - "CRITICAL" - ] - }, - "status": { - "type": "string", - "description": "Incident status; null keeps draft value (must be an active status)", - "nullable": true, - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + "left": { + "$ref": "#/components/schemas/RevisionDto" }, - "body": { - "type": "string", - "description": "Initial update body; null keeps draft value", - "nullable": true + "right": { + "$ref": "#/components/schemas/RevisionDto" }, - "affectedComponents": { + "hunks": { "type": "array", - "description": "Affected components; null keeps draft value", - "nullable": true, + "description": "File and field-level hunks (bounded)", "items": { - "$ref": "#/components/schemas/AffectedComponent" + "$ref": "#/components/schemas/RevisionDiffHunkDto" } - }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to notify subscribers (default: true)", - "nullable": true } - } + }, + "description": "Bounded comparison of two revisions" }, - "PushbulletChannelConfig": { + "RevisionDiffHunkDto": { "required": [ - "channelType", - "accessToken" + "change", + "path" ], "type": "object", "properties": { - "channelType": { + "path": { + "minLength": 1, + "type": "string", + "description": "Path or field name (entrypoint, keys, or file path)" + }, + "change": { "type": "string", + "description": "Whether this path was added, removed, or changed", "enum": [ - "pushbullet" + "added", + "removed", + "changed" ] }, - "accessToken": { - "minLength": 1, + "left": { "type": "string", - "description": "Pushbullet access token" + "description": "Left value when present", + "nullable": true }, - "deviceIden": { + "right": { "type": "string", - "description": "Target device identifier (broadcasts to all if empty)", + "description": "Right value when present", "nullable": true } - } + }, + "description": "One bounded diff hunk between revisions" }, - "PushoverChannelConfig": { + "RevisionDto": { "required": [ - "channelType", - "userKey", - "appToken" + "createdAt", + "definitionId", + "digest", + "entrypoint", + "files", + "id", + "keys", + "number" ], "type": "object", "properties": { - "channelType": { + "id": { "type": "string", - "enum": [ - "pushover" - ] + "description": "Revision identifier", + "format": "uuid" }, - "userKey": { + "definitionId": { + "type": "string", + "description": "Parent definition", + "format": "uuid" + }, + "number": { + "type": "integer", + "description": "Monotonic revision number within the definition", + "format": "int32" + }, + "digest": { "minLength": 1, "type": "string", - "description": "Pushover user or group key" + "description": "SHA-256 hex digest of the zip" }, - "appToken": { + "entrypoint": { "minLength": 1, "type": "string", - "description": "Pushover application API token" + "description": "Entrypoint file that runs" }, - "priority": { + "files": { + "type": "array", + "description": "Paths present in the zip", + "items": { + "type": "string", + "description": "Paths present in the zip" + } + }, + "keys": { + "type": "array", + "description": "Secret key names the code demands", + "items": { + "type": "string", + "description": "Secret key names the code demands" + } + }, + "downloadUntil": { "type": "string", - "description": "Notification priority override (-2 to 2)", + "description": "When package bytes expire for download", + "format": "date-time", "nullable": true }, - "sound": { + "gitSha": { "type": "string", - "description": "Notification sound override", + "description": "Git commit SHA when sourced from Git", "nullable": true - } - } - }, - "RateLimitInfo": { - "type": "object", - "properties": { - "requestsPerMinute": { - "type": "integer", - "description": "Maximum requests allowed per window", - "format": "int64" }, - "remaining": { - "type": "integer", - "description": "Requests remaining in the current window", - "format": "int64" + "gitMessage": { + "type": "string", + "description": "Git commit message", + "nullable": true }, - "windowMs": { - "type": "integer", - "description": "Sliding window size in milliseconds", - "format": "int64" - } - }, - "description": "Rate-limit quota for the current sliding window", - "required": [ - "requestsPerMinute", - "remaining", - "windowMs" - ] - }, - "RecoveryPolicy": { - "type": "object", - "properties": { - "consecutiveSuccesses": { - "type": "integer", - "description": "Consecutive passing checks required to auto-resolve the incident", - "format": "int32" + "gitFile": { + "type": "string", + "description": "Declaring Git file path", + "nullable": true }, - "minRegionsPassing": { - "type": "integer", - "description": "Minimum regions that must be passing before recovery can complete", - "format": "int32" + "authoredBy": { + "type": "string", + "description": "Who authored this package", + "nullable": true }, - "cooldownMinutes": { - "type": "integer", - "description": "Minutes after resolve before a new incident may open on the same monitor", - "format": "int32" + "createdAt": { + "type": "string", + "description": "When the revision was minted", + "format": "date-time" } }, - "description": "Auto-recovery settings", - "required": [ - "consecutiveSuccesses", - "minRegionsPassing", - "cooldownMinutes" - ] + "description": "Definition revision package" }, - "RedirectCountAssertion": { + "RollbackPreviewDto": { + "required": [ + "affectedMonitors", + "target" + ], "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "redirect_count" + "target": { + "$ref": "#/components/schemas/RevisionDto" + }, + "current": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/DefinitionHeadDto" + } ] }, - "maxCount": { - "type": "integer", - "description": "Maximum number of HTTP redirects allowed before the check fails", - "format": "int32" + "affectedMonitors": { + "type": "array", + "description": "Monitors sharing this definition and environment", + "items": { + "$ref": "#/components/schemas/MonitorDto" + } } }, - "required": [ - "type", - "maxCount" - ] + "description": "Consequence preview for rolling back Head in this environment" }, - "RedirectTargetAssertion": { + "RollbackRevisionRequest": { "required": [ - "type", - "expected", - "operator" + "reason", + "revisionId" ], "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "redirect_target" - ] - }, - "expected": { - "minLength": 1, + "revisionId": { "type": "string", - "description": "Expected final URL after following redirects" + "description": "Existing revision to restore as Head for this monitor's environment", + "format": "uuid" }, - "operator": { + "reason": { + "maxLength": 280, + "minLength": 0, "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] + "description": "Why this rollback was performed (1\u2013280 chars)" } } }, - "RegexBodyAssertion": { + "RootlyChannelConfig": { "required": [ - "type", - "pattern" + "channelType", + "apiKey" ], "type": "object", "properties": { - "type": { + "channelType": { "type": "string", "enum": [ - "regex_body" + "rootly" ] }, - "pattern": { + "apiKey": { "minLength": 1, "type": "string", - "description": "Regular expression the response body must match" + "description": "Rootly API token with incident creation permission" + }, + "severity": { + "type": "string", + "description": "Severity slug override (e.g. sev0, sev1)", + "nullable": true } } }, - "RegionStatusDto": { + "RuleEvaluationDto": { "required": [ + "checkId", + "engineVersion", + "evaluationDetails", + "id", + "inputResultIds", + "monitorId", + "occurredAt", + "policySnapshotHashHex", "region", - "timestamp", - "passed" + "ruleScope", + "ruleType", + "ruleIndex", + "outputMatched" ], "type": "object", "properties": { + "id": { + "type": "string", + "description": "Forensic row UUID", + "format": "uuid" + }, + "occurredAt": { + "type": "string", + "description": "When the evaluation ran", + "format": "date-time" + }, + "monitorId": { + "type": "string", + "description": "Monitor that produced the input check result", + "format": "uuid" + }, "region": { + "minLength": 1, "type": "string", - "description": "Region identifier", - "example": "us-east" + "description": "Probe region of the input check result" }, - "passed": { - "type": "boolean", - "description": "Whether the last check in this region passed", - "example": true + "policySnapshotHashHex": { + "minLength": 1, + "type": "string", + "description": "Hex-encoded hash of the policy snapshot this rule came from" }, - "responseTimeMs": { + "ruleIndex": { "type": "integer", - "description": "Response time in milliseconds for the last check", - "format": "int32", - "nullable": true, - "example": 95 + "description": "Index into the policy's triggerRules array (0-based)", + "format": "int32" }, - "timestamp": { + "ruleType": { + "minLength": 1, "type": "string", - "description": "Timestamp of the last check in this region (ISO 8601)", - "format": "date-time" + "description": "Rule type (e.g. consecutive_failures, failures_in_window)" }, - "severityHint": { + "ruleScope": { + "minLength": 1, "type": "string", - "description": "Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing", - "nullable": true - } - }, - "description": "Latest check result for a single region" - }, - "RelatedIncidentsResponse": { - "required": [ - "data", - "total" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "description": "Related incident rows (newest first, capped by limit)", - "items": { - "$ref": "#/components/schemas/IncidentDto" - } + "description": "Rule scope (per_region | multi_region)" }, - "total": { - "type": "integer", - "description": "Total matching incidents in the window, excluding the current incident", - "format": "int64" - } - }, - "description": "Related incidents sharing the same origin within a time window" - }, - "RemoveMonitorTagsRequest": { - "required": [ - "tagIds" - ], - "type": "object", - "properties": { - "tagIds": { + "inputResultIds": { "minItems": 1, "type": "array", - "description": "IDs of the tags to detach from the monitor", + "description": "check_results IDs that were inputs to this evaluation (newest first)", "items": { "type": "string", - "description": "IDs of the tags to detach from the monitor", + "description": "check_results IDs that were inputs to this evaluation (newest first)", "format": "uuid" } + }, + "outputMatched": { + "type": "boolean", + "description": "Whether the rule fired on this evaluation" + }, + "evaluationDetails": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Structured details (e.g. failure counts, response-time aggregates)" + }, + "description": "Structured details (e.g. failure counts, response-time aggregates)" + }, + "engineVersion": { + "minLength": 1, + "type": "string", + "description": "Detection engine version that ran this evaluation" + }, + "checkId": { + "type": "string", + "description": "Scheduler-minted check execution ID (V92) \u2014 the causal chain identifier", + "format": "uuid" + }, + "triggeringTransitionId": { + "type": "string", + "description": "If this evaluation caused a state transition, points to that transition's id", + "format": "uuid", + "nullable": true } }, - "description": "Request body for removing tags from a monitor" - }, - "ReorderComponentsRequest": { - "required": [ - "positions" - ], - "type": "object", - "properties": { - "positions": { - "minItems": 1, - "type": "array", - "description": "Ordered list of component IDs with their new positions", - "items": { - "$ref": "#/components/schemas/ComponentPosition" - } - } - }, - "description": "Batch component reorder request" + "description": "All rule evaluations that ran for this check" }, - "ReorderPageLayoutRequest": { + "RunArtifactDto": { "required": [ - "sections" + "createdAt", + "id", + "kind", + "lifecycle", + "runId", + "organizationId" ], "type": "object", "properties": { - "sections": { - "minItems": 1, - "type": "array", - "description": "Top-level sections in their new order", - "items": { - "$ref": "#/components/schemas/PageSection" - } + "id": { + "type": "string", + "description": "Unique artifact identifier", + "format": "uuid" }, - "groupOrders": { - "type": "array", - "description": "Within-group component ordering; only needed for groups whose internal order changed", + "organizationId": { + "type": "integer", + "description": "Organization this artifact belongs to", + "format": "int32" + }, + "runId": { + "type": "string", + "description": "Run this artifact belongs to", + "format": "uuid" + }, + "stepId": { + "type": "string", + "description": "Step this screenshot belongs to; null for whole-run kinds", + "format": "uuid", + "nullable": true + }, + "kind": { + "type": "string", + "description": "File kind", + "enum": [ + "screenshot", + "video", + "trace", + "har", + "console", + "runner_log" + ] + }, + "lifecycle": { + "type": "string", + "description": "Whether bytes are available, processing, or gone", + "enum": [ + "available", + "processing", + "failed", + "not_captured", + "suppressed", + "never_reached", + "expired", + "no_browser" + ] + }, + "captureReason": { + "type": "string", + "description": "Why this file was captured", "nullable": true, - "items": { - "$ref": "#/components/schemas/GroupComponentOrder" - } - } - }, - "description": "Reorder page-level layout: groups and ungrouped components share one ordering" - }, - "ResolveIncidentRequest": { - "type": "object", - "properties": { - "body": { + "enum": [ + "on_failure", + "named_step", + "customer" + ] + }, + "byteSize": { + "type": "integer", + "description": "Stored size in bytes", + "format": "int64", + "nullable": true + }, + "contentType": { "type": "string", - "description": "Optional resolution message or post-mortem notes", + "description": "MIME type of the stored file", "nullable": true - } - } - }, - "ResourceGroupDeleteBlockerDto": { - "required": [ - "componentId", - "componentName", - "statusPageId", - "statusPageName", - "statusPageSlug" - ], - "type": "object", - "properties": { - "statusPageId": { + }, + "durationMs": { + "type": "integer", + "description": "Video duration in milliseconds", + "format": "int32", + "nullable": true + }, + "viewport": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactViewport" + } + ] + }, + "expiresAt": { "type": "string", - "description": "Status page that owns the blocking component", - "format": "uuid" + "description": "When stored bytes expire", + "format": "date-time", + "nullable": true + }, + "expectedByteSize": { + "type": "integer", + "description": "Expected size while a video is encoding", + "format": "int64", + "nullable": true + }, + "encodeEtaMs": { + "type": "integer", + "description": "Estimated remaining encode time in milliseconds", + "format": "int32", + "nullable": true }, - "statusPageName": { - "minLength": 1, - "type": "string", - "description": "Human-readable status page name" + "traceMeta": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactTraceMeta" + } + ] }, - "statusPageSlug": { - "minLength": 1, + "createdAt": { "type": "string", - "description": "URL-safe status page slug" + "description": "When this file row was created", + "format": "date-time" + } + }, + "description": "Run evidence file" + }, + "RunAttemptDto": { + "type": "object", + "properties": { + "attempt": { + "type": "integer", + "description": "1-based attempt number", + "format": "int32" }, - "componentId": { + "outcome": { "type": "string", - "description": "Blocking GROUP-typed status page component ID", - "format": "uuid" + "description": "Attempt outcome; null while the case is open", + "nullable": true, + "enum": [ + "passed", + "failed", + "execution_error", + "timed_out", + "passed_on_retry", + "cancelled", + "inconclusive" + ] }, - "componentName": { - "minLength": 1, + "startedAt": { "type": "string", - "description": "Blocking component display name" + "description": "When this attempt started", + "format": "date-time", + "nullable": true }, - "hostname": { + "finishedAt": { "type": "string", - "description": "Public hostname when a custom domain is configured; null otherwise", + "description": "When this attempt finished", + "format": "date-time", "nullable": true } }, - "description": "Status-page component that references this resource group (blocks delete; public exposure)" + "description": "In-check attempt", + "required": [ + "attempt" + ] }, - "ResourceGroupDto": { + "RunCaseDto": { "required": [ - "createdAt", - "health", "id", - "name", - "slug", - "updatedAt", + "runId", + "status", + "steps", + "title", "organizationId", - "suppressMemberAlerts" + "attempt", + "index" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Unique resource group identifier", + "description": "Case identifier", "format": "uuid" }, "organizationId": { "type": "integer", - "description": "Organization this group belongs to", + "description": "Organization this case belongs to", "format": "int32" }, - "name": { - "minLength": 1, - "type": "string", - "description": "Human-readable group name" - }, - "slug": { - "minLength": 1, - "type": "string", - "description": "URL-safe group identifier" - }, - "description": { - "type": "string", - "description": "Optional group description", - "nullable": true - }, - "alertPolicyId": { + "runId": { "type": "string", - "description": "Notification policy applied to this group", - "format": "uuid", - "nullable": true + "description": "Run this case belongs to", + "format": "uuid" }, - "defaultFrequency": { + "attempt": { "type": "integer", - "description": "Default check frequency in seconds for member monitors", - "format": "int32", - "nullable": true - }, - "defaultRegions": { - "type": "array", - "description": "Default regions for member monitors", - "nullable": true, - "items": { - "type": "string", - "description": "Default regions for member monitors" - } + "description": "Playwright in-case attempt number", + "format": "int32" }, - "defaultRetryStrategy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/RetryStrategy" - } - ] + "index": { + "type": "integer", + "description": "Zero-based case index within the attempt", + "format": "int32" }, - "defaultAlertChannels": { - "type": "array", - "description": "Default alert channel IDs for member monitors", - "nullable": true, - "items": { - "type": "string", - "description": "Default alert channel IDs for member monitors", - "format": "uuid" - } + "title": { + "type": "string", + "description": "Case title" }, - "defaultEnvironmentId": { + "file": { "type": "string", - "description": "Default environment ID for member monitors", - "format": "uuid", + "description": "Spec path inside the package", "nullable": true }, - "healthThresholdType": { + "status": { "type": "string", - "description": "Health threshold type: COUNT or PERCENTAGE", - "nullable": true, + "description": "Case status", "enum": [ - "COUNT", - "PERCENTAGE" + "pending", + "running", + "passed", + "failed", + "timed_out", + "skipped", + "interrupted" ] }, - "healthThresholdValue": { - "type": "number", - "description": "Health threshold value", + "startedAt": { + "type": "string", + "description": "When the case started", + "format": "date-time", "nullable": true }, - "suppressMemberAlerts": { - "type": "boolean", - "description": "When true, member-level incidents skip notification dispatch; only group alerts fire" + "finishedAt": { + "type": "string", + "description": "When the case finished", + "format": "date-time", + "nullable": true }, - "confirmationDelaySeconds": { + "durationMs": { "type": "integer", - "description": "Seconds to wait after health threshold breach before creating group incident", + "description": "Reporter duration in milliseconds", "format": "int32", "nullable": true }, - "recoveryCooldownMinutes": { + "steps": { + "type": "array", + "description": "Steps on this case", + "items": { + "$ref": "#/components/schemas/RunStepDto" + } + } + }, + "description": "Run case with nested steps" + }, + "RunCaseListParams": { + "type": "object", + "properties": { + "attempt": { "type": "integer", - "description": "Cooldown minutes after group incident resolves before a new one can open", + "description": "Only return cases for this Playwright attempt", "format": "int32", "nullable": true + } + } + }, + "RunConsoleDto": { + "required": [ + "groups", + "state" + ], + "type": "object", + "properties": { + "state": { + "minLength": 1, + "type": "string", + "description": "on for browser, no_browser for API_CHECK" }, - "health": { - "$ref": "#/components/schemas/ResourceGroupHealthDto" + "reason": { + "type": "string", + "description": "Absence copy when state is no_browser", + "nullable": true }, - "members": { + "groups": { "type": "array", - "description": "Member list with individual statuses; populated on detail GET only", - "nullable": true, + "description": "Grouped messages; empty when ungrouped or no_browser", "items": { - "$ref": "#/components/schemas/ResourceGroupMemberDto" + "$ref": "#/components/schemas/ConsoleGroupDto" } }, - "deleteBlockedBy": { + "lines": { "type": "array", - "description": "Status-page GROUP components that reference this group (delete blockers / public exposure); populated on detail GET only — omitted on list", + "description": "Raw lines when ungrouped=true", "nullable": true, "items": { - "$ref": "#/components/schemas/ResourceGroupDeleteBlockerDto" + "$ref": "#/components/schemas/ConsoleLineDto" } + } + }, + "description": "Console groups or ungrouped lines" + }, + "RunConsoleParams": { + "type": "object", + "properties": { + "attempt": { + "type": "integer", + "description": "In-check attempt (default selected attempt)", + "format": "int32", + "nullable": true }, - "openRegionIncident": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/IncidentDto" - } - ] - }, - "managedBy": { - "type": "string", - "description": "Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.", - "nullable": true, - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] + "ungrouped": { + "type": "boolean", + "description": "Return chronological lines instead of groups", + "nullable": true }, - "createdAt": { + "level": { "type": "string", - "description": "Timestamp when the group was created", - "format": "date-time" + "description": "Filter error, warning, or info", + "nullable": true }, - "updatedAt": { + "format": { "type": "string", - "description": "Timestamp when the group was last updated", - "format": "date-time" + "description": "raw downloads the ungrouped log as text/plain", + "nullable": true } - }, - "description": "Resource group with health summary and optional member details" + } }, - "ResourceGroupHealthDto": { + "RunDto": { "required": [ - "status", - "totalMembers", - "operationalCount", - "activeIncidents" + "attempts", + "bindingVersionSnapshot", + "bundleDigest", + "capturePolicySnapshot", + "enqueuedAt", + "evidence", + "id", + "monitorId", + "phase", + "region", + "revisionId", + "source", + "tabCounts", + "organizationId", + "cancelRequested", + "stream", + "attempt", + "attemptOf" ], "type": "object", "properties": { - "status": { + "id": { "type": "string", - "description": "Worst-of health status across all members", - "enum": [ - "operational", - "maintenance", - "degraded", - "down" - ] + "description": "Unique run identifier", + "format": "uuid" }, - "totalMembers": { + "organizationId": { "type": "integer", - "description": "Total number of members in the group", + "description": "Organization this run belongs to", "format": "int32" }, - "operationalCount": { - "type": "integer", - "description": "Number of members currently in operational status", - "format": "int32" + "monitorId": { + "type": "string", + "description": "Monitor this run belongs to", + "format": "uuid" }, - "activeIncidents": { - "type": "integer", - "description": "Number of members currently non-operational (not an incident-row count)", - "format": "int32" + "monitorName": { + "type": "string", + "description": "Monitor display name", + "nullable": true }, - "thresholdStatus": { + "monitorType": { "type": "string", - "description": "Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured.", + "description": "Monitor type", "nullable": true, "enum": [ - "healthy", - "degraded", - "down" + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, - "failingCount": { - "type": "integer", - "description": "Number of failing members at time of last evaluation; null when no threshold configured", - "format": "int32", + "host": { + "type": "string", + "description": "Target host from the environment BASE_URL", "nullable": true }, - "healthBreachedSince": { + "environmentId": { "type": "string", - "description": "When the health threshold was first breached in the current cycle; null when not breached", - "format": "date-time", + "description": "Environment this run executed in", + "format": "uuid", "nullable": true }, - "healthEvaluatedAt": { + "environmentName": { "type": "string", - "description": "When group health was last evaluated (threshold or stamp-only); null until first evaluation", - "format": "date-time", + "description": "Environment display name", "nullable": true - } - }, - "description": "Aggregated health summary for a resource group" - }, - "ResourceGroupMemberDto": { - "required": [ - "createdAt", - "groupId", - "id", - "memberType", - "status" - ], - "type": "object", - "properties": { - "id": { + }, + "revisionId": { "type": "string", - "description": "Unique group member record identifier", + "description": "Revision this run executed", "format": "uuid" }, - "groupId": { + "region": { + "minLength": 1, "type": "string", - "description": "Resource group this member belongs to", - "format": "uuid" + "description": "Probe region for this run" }, - "memberType": { + "source": { "type": "string", - "description": "Type of member: 'monitor' or 'service'" + "description": "What triggered this run", + "enum": [ + "schedule", + "run_now", + "ci", + "fast_retry", + "remote_validation", + "deployment_validation", + "session_renew" + ] }, - "monitorId": { + "enqueuedAt": { "type": "string", - "description": "Monitor ID; set when memberType is 'monitor'", - "format": "uuid", - "nullable": true + "description": "When this run was enqueued", + "format": "date-time" }, - "serviceId": { + "evaluationCycleId": { "type": "string", - "description": "Service ID; set when memberType is 'service'", + "description": "Evaluation cycle grouping this run with retries", "format": "uuid", "nullable": true }, - "name": { + "retryOfRunId": { "type": "string", - "description": "Display name of the referenced monitor or service", + "description": "Parent run when this is a fast retry", + "format": "uuid", "nullable": true }, - "slug": { + "retriedFromRunId": { "type": "string", - "description": "Slug identifier for the service (services only); used for icons and uptime API calls", + "description": "Fast-retry parent run", + "format": "uuid", "nullable": true }, - "subscriptionId": { + "phase": { "type": "string", - "description": "Subscription ID for the service (services only); used to link to the dependency detail page", - "format": "uuid", - "nullable": true + "description": "Current run phase", + "enum": [ + "created", + "queued", + "starting", + "running", + "finalizing", + "finished" + ] }, - "status": { + "cancelRequested": { + "type": "boolean", + "description": "Whether cancel was requested" + }, + "outcome": { "type": "string", - "description": "Computed health status for this member", + "description": "Outcome; null until the run is finished", + "nullable": true, "enum": [ - "operational", - "maintenance", - "degraded", - "down" + "passed", + "failed", + "execution_error", + "timed_out", + "passed_on_retry", + "cancelled", + "inconclusive" ] }, - "effectiveFrequency": { + "headline": { "type": "string", - "description": "Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured", + "description": "Last control headline", "nullable": true }, - "createdAt": { + "executionLine": { "type": "string", - "description": "Timestamp when the member was added to the group", - "format": "date-time" + "description": "Live execution one-liner", + "nullable": true }, - "uptime24h": { - "type": "number", - "description": "24h uptime percentage; populated when includeMetrics=true", - "format": "double", + "metaLine": { + "type": "string", + "description": "Server-composed header meta line", "nullable": true }, - "chartData": { - "type": "array", - "description": "Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true", - "nullable": true, - "items": { - "type": "number", - "description": "Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true", - "format": "double" - } + "bundleDigest": { + "minLength": 1, + "type": "string", + "description": "Package digest frozen at create" }, - "avgLatencyMs": { - "type": "number", - "description": "Average latency in ms (monitors only); populated when includeMetrics=true", - "format": "double", + "startedAt": { + "type": "string", + "description": "When execution claimed a seat", + "format": "date-time", "nullable": true }, - "p95LatencyMs": { - "type": "number", - "description": "P95 latency in ms (monitors only); populated when includeMetrics=true", - "format": "double", + "finishedAt": { + "type": "string", + "description": "When the run finished", + "format": "date-time", "nullable": true }, - "lastCheckedAt": { + "updatedAt": { "type": "string", - "description": "Timestamp of the most recent health check; populated when includeMetrics=true", + "description": "When the run row last changed", "format": "date-time", "nullable": true }, - "monitorType": { + "lastHeartbeatAt": { "type": "string", - "description": "Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only", + "description": "Last supervisor heartbeat", + "format": "date-time", "nullable": true }, - "environmentName": { + "cancelledBy": { "type": "string", - "description": "Environment name; monitors only", + "description": "Who requested cancel", "nullable": true }, - "groupMembershipCount": { + "artifactsExpiredAt": { + "type": "string", + "description": "When artifact bytes expired", + "format": "date-time", + "nullable": true + }, + "capturePolicySnapshot": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Capture settings frozen at create" + }, + "description": "Capture settings frozen at create" + }, + "bindingVersionSnapshot": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Resolved secret key names frozen at create" + }, + "description": "Resolved secret key names frozen at create" + }, + "durationMs": { + "type": "integer", + "description": "Wall time from claim to finish", + "format": "int64", + "nullable": true + }, + "queueWaitMs": { + "type": "integer", + "description": "Time spent waiting for a seat", + "format": "int64", + "nullable": true + }, + "queuePosition": { "type": "integer", - "description": "Count of resource groups this monitor or service belongs to; detail GET only — omitted on list", + "description": "Live queue position; null when not queued", "format": "int32", "nullable": true }, - "failingSince": { - "type": "string", - "description": "Start of the current non-operational stretch; null when operational or unknown (services OK); detail GET only — omitted on list", - "format": "date-time", + "heartbeatAgeMs": { + "type": "integer", + "description": "Milliseconds since the last supervisor heartbeat", + "format": "int64", "nullable": true }, - "alertCollapsed": { + "stream": { "type": "boolean", - "description": "True when an active member incident records this group among alertCollapsedByResourceGroupIds; detail GET only — omitted on list", - "nullable": true + "description": "True while the run is still live and clients may stream" }, - "incidentMarks": { + "evidence": { "type": "array", - "description": "Incident marks for the trailing 24h strip; null when metrics omitted or failed; detail GET only — omitted on list", + "description": "List evidence chips in SHOT \u2192 TRACE \u2192 VIDEO \u2192 NET order", + "items": { + "$ref": "#/components/schemas/RunEvidenceDto" + } + }, + "tabCounts": { + "$ref": "#/components/schemas/RunTabCountsDto" + }, + "live": { "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunLiveDto" + } + ] + }, + "attempt": { + "type": "integer", + "description": "Selected in-check attempt (1-based)", + "format": "int32" + }, + "attemptOf": { + "type": "integer", + "description": "In-check attempt count", + "format": "int32" + }, + "attempts": { + "type": "array", + "description": "In-check attempts", "items": { - "$ref": "#/components/schemas/ResourceGroupMemberIncidentMarkDto" + "$ref": "#/components/schemas/RunAttemptDto" } + }, + "incidentId": { + "type": "string", + "description": "Open incident for this monitor", + "format": "uuid", + "nullable": true } }, - "description": "A single member of a resource group with its computed health status" + "description": "Code-monitor run" }, - "ResourceGroupMemberIncidentMarkDto": { + "RunEventDto": { "required": [ - "at" + "createdAt", + "id", + "payload", + "runId", + "type", + "organizationId", + "seq" ], "type": "object", "properties": { - "at": { + "id": { "type": "string", - "description": "Incident startedAt (or first confirmed) within the trailing 24h window", + "description": "Event identifier", + "format": "uuid" + }, + "organizationId": { + "type": "integer", + "description": "Organization this event belongs to", + "format": "int32" + }, + "runId": { + "type": "string", + "description": "Run this event belongs to", + "format": "uuid" + }, + "seq": { + "type": "integer", + "description": "Supervisor-monotonic sequence, starts at 1", + "format": "int64" + }, + "type": { + "type": "string", + "description": "Control event type", + "enum": [ + "phase", + "headline", + "case_started", + "case_finished", + "step_started", + "step_finished", + "artifact_ready", + "artifact_lifecycle", + "finished", + "stream_gap" + ] + }, + "caseId": { + "type": "string", + "description": "Case this event refers to", + "format": "uuid", + "nullable": true + }, + "stepId": { + "type": "string", + "description": "Step this event refers to", + "format": "uuid", + "nullable": true + }, + "artifactId": { + "type": "string", + "description": "Artifact this event refers to", + "format": "uuid", + "nullable": true + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Small typed payload for this event" + }, + "description": "Small typed payload for this event" + }, + "createdAt": { + "type": "string", + "description": "When the event was persisted", "format": "date-time" + } + }, + "description": "Run control event" + }, + "RunEventParams": { + "type": "object", + "properties": { + "after": { + "type": "integer", + "description": "Replay events with seq greater than this value", + "format": "int64", + "nullable": true + } + } + }, + "RunEvidenceDto": { + "required": [ + "kind", + "state" + ], + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "Evidence kind in SHOT \u2192 TRACE \u2192 VIDEO \u2192 NET order", + "enum": [ + "screenshot", + "trace", + "video", + "network" + ] }, - "incidentId": { + "state": { + "type": "string", + "description": "Whether the artifact is usable", + "enum": [ + "present", + "bad", + "processing", + "expired" + ] + } + }, + "description": "List evidence chip" + }, + "RunListParams": { + "type": "object", + "properties": { + "phase": { + "type": "string", + "description": "Filter by run phase; omit to return every phase", + "nullable": true + }, + "outcome": { + "type": "string", + "description": "Filter by persist outcome; omit to return every outcome", + "nullable": true + }, + "region": { + "type": "string", + "description": "Filter by probe region", + "nullable": true + }, + "source": { + "type": "string", + "description": "Filter by what triggered the run", + "nullable": true + }, + "environmentId": { "type": "string", - "description": "Incident ID for navigation; null when unknown", + "description": "Only return runs whose monitor lives in this environment", "format": "uuid", "nullable": true }, - "severity": { + "from": { "type": "string", - "description": "Optional severity display hint", + "description": "Inclusive lower bound on enqueued_at (default now-30m)", + "format": "date-time", "nullable": true - } - }, - "description": "Member incident mark for the trailing 24h uptime strip" - }, - "ResponseSizeAssertion": { - "type": "object", - "properties": { - "type": { + }, + "to": { "type": "string", - "enum": [ - "response_size" - ] + "description": "Inclusive upper bound on enqueued_at (default now)", + "format": "date-time", + "nullable": true }, - "maxBytes": { + "q": { + "type": "string", + "description": "Substring match on monitor name or headline", + "nullable": true + }, + "size": { + "maximum": 100, + "minimum": 1, "type": "integer", - "description": "Maximum response body size in bytes before the check fails", + "description": "Page size (1\u2013100, default 50)", "format": "int32" - } - }, - "required": [ - "type", - "maxBytes" - ] - }, - "ResponseTimeAssertion": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "response_time" - ] }, - "thresholdMs": { + "page": { + "minimum": 0, "type": "integer", - "description": "Maximum allowed response time in milliseconds before the check fails", + "description": "Zero-based page index (default 0)", "format": "int32" } }, "required": [ - "type", - "thresholdMs" + "size", + "page" ] }, - "ResponseTimeWarnAssertion": { + "RunLiveDto": { "type": "object", "properties": { - "type": { + "stepIndex": { + "type": "integer", + "description": "Current step index", + "format": "int32", + "nullable": true + }, + "stepTitle": { "type": "string", - "enum": [ - "response_time_warn" - ] + "description": "Current step title", + "nullable": true }, - "warnMs": { + "stepCount": { "type": "integer", - "description": "HTTP response time in milliseconds that triggers a warning only", + "description": "Known step count for this attempt", "format": "int32" + }, + "artifactsUploaded": { + "type": "integer", + "description": "Artifacts already available", + "format": "int32", + "nullable": true + }, + "artifactsExpected": { + "type": "integer", + "description": "Artifacts expected for this run", + "format": "int32", + "nullable": true } }, + "description": "Live run progress", "required": [ - "type", - "warnMs" + "stepCount" ] }, - "ResultSummaryDto": { + "RunnerLogLiveEvent": { "required": [ - "chartData", - "currentStatus", - "latestPerRegion" + "line", + "ts" ], "type": "object", "properties": { - "currentStatus": { + "ts": { "type": "string", - "description": "Derived current status across all regions", - "enum": [ - "up", - "degraded", - "down", - "paused", - "unknown" - ] - }, - "latestPerRegion": { - "type": "array", - "description": "Latest check result per region", - "items": { - "$ref": "#/components/schemas/RegionStatusDto" - } - }, - "chartData": { - "type": "array", - "description": "Time-bucketed chart data for the requested window", - "items": { - "$ref": "#/components/schemas/ChartBucketDto" - } - }, - "uptime24h": { - "type": "number", - "description": "Uptime percentage over the last 24 hours; null when no data", - "format": "double", - "nullable": true, - "example": 99.95 + "description": "Loki timestamp in nanoseconds" }, - "uptimeWindow": { - "type": "number", - "description": "Uptime percentage for the selected chart window; null when no data", - "format": "double", - "nullable": true, - "example": 99.8 + "line": { + "minLength": 1, + "type": "string", + "description": "One runner-log line" } }, - "description": "Dashboard summary: current status, per-region latest results, and chart data" + "description": "Live runner-log line" }, - "RetryStrategy": { + "RunNetworkDto": { "required": [ - "type", - "maxRetries", - "interval" + "data", + "hasMore" ], "type": "object", "properties": { - "type": { - "type": "string", - "description": "Retry strategy kind, e.g. fixed interval between attempts" + "data": { + "type": "array", + "description": "Waterfall rows on this page", + "items": { + "$ref": "#/components/schemas/NetworkRowDto" + } }, - "maxRetries": { + "caseDurationMs": { "type": "integer", - "description": "Maximum number of retries after a failed check", - "format": "int32" + "description": "Case wall time for waterfall bar scale", + "format": "int64", + "nullable": true }, - "interval": { - "type": "integer", - "description": "Delay between retry attempts in seconds", - "format": "int32" + "nextCursor": { + "type": "string", + "description": "Opaque cursor for the next page", + "nullable": true + }, + "hasMore": { + "type": "boolean", + "description": "Whether more rows exist beyond this page" } }, - "description": "Default retry strategy for member monitors; null clears" + "description": "Network waterfall page" }, - "RootlyChannelConfig": { - "required": [ - "channelType", - "apiKey" - ], + "RunNetworkParams": { "type": "object", "properties": { - "channelType": { + "attempt": { + "type": "integer", + "description": "In-check attempt (default selected attempt)", + "format": "int32", + "nullable": true + }, + "failed": { + "type": "boolean", + "description": "Only rows with status >= 400 or a failure", + "nullable": true + }, + "slow": { + "type": "boolean", + "description": "Only rows with durationMs >= 1000", + "nullable": true + }, + "stepId": { "type": "string", - "enum": [ - "rootly" - ] + "description": "Only rows for this step", + "nullable": true }, - "apiKey": { - "minLength": 1, + "xhr": { + "type": "boolean", + "description": "Only xhr, fetch, and api resource types", + "nullable": true + }, + "source": { "type": "string", - "description": "Rootly API token with incident creation permission" + "description": "page or request", + "nullable": true }, - "severity": { + "cursor": { "type": "string", - "description": "Severity slug override (e.g. sev0, sev1)", + "description": "Opaque cursor from the previous page", "nullable": true } } }, - "RuleEvaluationDto": { + "RunStepDto": { "required": [ - "checkId", - "engineVersion", - "evaluationDetails", + "caseId", + "category", "id", - "inputResultIds", - "monitorId", - "occurredAt", - "policySnapshotHashHex", - "region", - "ruleScope", - "ruleType", - "ruleIndex", - "outputMatched" + "runId", + "status", + "title", + "organizationId", + "attempt", + "index" ], "type": "object", "properties": { "id": { "type": "string", - "description": "Forensic row UUID", + "description": "Step identifier", "format": "uuid" }, - "occurredAt": { - "type": "string", - "description": "When the evaluation ran", - "format": "date-time" + "organizationId": { + "type": "integer", + "description": "Organization this step belongs to", + "format": "int32" }, - "monitorId": { + "runId": { "type": "string", - "description": "Monitor that produced the input check result", + "description": "Run this step belongs to", "format": "uuid" }, - "region": { - "minLength": 1, + "caseId": { "type": "string", - "description": "Probe region of the input check result" + "description": "Case this step belongs to", + "format": "uuid" }, - "policySnapshotHashHex": { - "minLength": 1, - "type": "string", - "description": "Hex-encoded hash of the policy snapshot this rule came from" + "attempt": { + "type": "integer", + "description": "Playwright in-case attempt number", + "format": "int32" }, - "ruleIndex": { + "index": { "type": "integer", - "description": "Index into the policy's triggerRules array (0-based)", + "description": "Zero-based index within the case attempt", "format": "int32" }, - "ruleType": { - "minLength": 1, + "title": { "type": "string", - "description": "Rule type (e.g. consecutive_failures, failures_in_window)" + "description": "Step title" }, - "ruleScope": { - "minLength": 1, + "category": { "type": "string", - "description": "Rule scope (per_region | multi_region)" + "description": "Step category", + "enum": [ + "named", + "assertion", + "browser_action" + ] }, - "inputResultIds": { - "minItems": 1, - "type": "array", - "description": "check_results IDs that were inputs to this evaluation (newest first)", - "items": { - "type": "string", - "description": "check_results IDs that were inputs to this evaluation (newest first)", - "format": "uuid" - } + "status": { + "type": "string", + "description": "Step status", + "enum": [ + "pending", + "running", + "passed", + "slow", + "failed", + "skipped", + "suppressed", + "never_reached" + ] }, - "outputMatched": { - "type": "boolean", - "description": "Whether the rule fired on this evaluation" + "startedAt": { + "type": "string", + "description": "When the step started", + "format": "date-time", + "nullable": true }, - "evaluationDetails": { + "finishedAt": { + "type": "string", + "description": "When the step finished", + "format": "date-time", + "nullable": true + }, + "durationMs": { + "type": "integer", + "description": "Reporter duration in milliseconds", + "format": "int32", + "nullable": true + }, + "error": { + "type": "string", + "description": "Error when the step failed", + "nullable": true + }, + "assertion": { "type": "object", "additionalProperties": { "type": "object", - "description": "Structured details (e.g. failure counts, response-time aggregates)" + "description": "Assertion payload when this step is an assertion", + "nullable": true }, - "description": "Structured details (e.g. failure counts, response-time aggregates)" - }, - "engineVersion": { - "minLength": 1, - "type": "string", - "description": "Detection engine version that ran this evaluation" + "description": "Assertion payload when this step is an assertion", + "nullable": true + } + }, + "description": "Run step" + }, + "RunTabCountsDto": { + "type": "object", + "properties": { + "steps": { + "type": "integer", + "description": "Step rows for the selected attempt", + "format": "int32" }, - "checkId": { - "type": "string", - "description": "Scheduler-minted check execution ID (V92) — the causal chain identifier", - "format": "uuid" + "assets": { + "type": "integer", + "description": "Items across asset kinds, excluding dead no-browser rows", + "format": "int32" }, - "triggeringTransitionId": { - "type": "string", - "description": "If this evaluation caused a state transition, points to that transition's id", - "format": "uuid", - "nullable": true + "diff": { + "type": "integer", + "description": "1 when a diff baseline exists or this run passed on retry", + "format": "int32" } }, - "description": "All rule evaluations that ran for this check" + "description": "Run detail tab counts", + "required": [ + "steps", + "assets", + "diff" + ] }, "ScheduledMaintenanceDto": { "required": [ @@ -34642,27 +41941,55 @@ "description": "A scheduled maintenance window from a vendor status page" }, "ScriptMonitorConfig": { - "required": [ - "script" - ], "type": "object", + "additionalProperties": false, "properties": { "script": { "maxLength": 65536, - "minLength": 1, + "minLength": 0, "type": "string", - "description": "Playwright test script source code" + "description": "Legacy inline script on existing rows", + "nullable": true, + "readOnly": true }, "timeoutSeconds": { - "maximum": 120, + "maximum": 240, "minimum": 5, "type": "integer", - "description": "Maximum execution time in seconds (5–120)", + "description": "Maximum execution time in seconds (5\u2013240)", "format": "int32", "nullable": true + }, + "runtimeId": { + "maxLength": 32, + "minLength": 0, + "pattern": "^$|^[A-Za-z0-9._-]+$", + "type": "string", + "description": "Runtime pin YYYY.MM; omit uses workspace default then sole available", + "nullable": true } } }, + "SecretAuditDto": { + "type": "object", + "properties": { + "updatedAt": { + "type": "string", + "description": "When this secret was last updated", + "format": "date-time", + "nullable": true + }, + "updatedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + } + }, + "description": "Last update time and author for a secret" + }, "SecretDto": { "required": [ "createdAt", @@ -34704,14 +42031,91 @@ }, "usedByMonitors": { "type": "array", - "description": "Monitors that reference this secret; null on create/update responses", + "description": "Monitors that reference this secret for authentication", "nullable": true, "items": { "$ref": "#/components/schemas/MonitorReference" } } }, - "description": "Secret with change-detection hash; plaintext value is never returned" + "description": "Organization secret and its change-detection hash" + }, + "SecretRequestDto": { + "required": [ + "key", + "readiness" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Secret key this monitor requires" + }, + "secret": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SecretDto" + } + ] + }, + "readiness": { + "type": "string", + "description": "Whether this key is resolved or missing", + "enum": [ + "resolved", + "missing" + ] + }, + "fulfilledBy": { + "type": "string", + "description": "Fulfilled from environment variables or a secret", + "nullable": true, + "enum": [ + "env", + "secret" + ] + }, + "declaringFile": { + "type": "string", + "description": "Declaring file path inside the package zip", + "nullable": true + }, + "declaringLocation": { + "type": "string", + "description": "Call site from package scan, e.g. signIn(…) · line 6", + "nullable": true + }, + "lastResolvedAt": { + "type": "string", + "format": "date-time", + "description": "When a run last resolved this key", + "nullable": true + }, + "lastResolvedRunId": { + "type": "string", + "format": "uuid", + "description": "Run that last resolved this key", + "nullable": true + } + }, + "description": "Secret key a monitor requires and how it is fulfilled" + }, + "SecretUsageDto": { + "required": [ + "monitors" + ], + "type": "object", + "properties": { + "monitors": { + "type": "array", + "description": "Monitors that reference this secret", + "items": { + "$ref": "#/components/schemas/MonitorDto" + } + } + }, + "description": "Monitors that reference this secret" }, "SeoMetadataDto": { "type": "object", @@ -35529,7 +42933,7 @@ "alertSensitivity": { "pattern": "ALL|AWARENESS|INCIDENTS_ONLY|MAJOR_ONLY", "type": "string", - "description": "Alert sensitivity: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, page on every one), MAJOR_ONLY (only DOWN-level incidents), AWARENESS (track silently — show on dashboard, never send alerts). Defaults to AWARENESS when not provided — silent tracking is the friendliest first-run choice; switch to one of the paging modes to opt in to alert-channel fan-out.", + "description": "Alert sensitivity: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, page on every one), MAJOR_ONLY (only DOWN-level incidents), AWARENESS (track silently \u2014 show on dashboard, never send alerts). Defaults to AWARENESS when not provided \u2014 silent tracking is the friendliest first-run choice; switch to one of the paging modes to opt in to alert-channel fan-out.", "nullable": true } }, @@ -35613,7 +43017,7 @@ "alertSensitivity": { "minLength": 1, "type": "string", - "description": "Alert sensitivity: ALL (synthetic + real incidents, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (real + DOWN severity, paged), AWARENESS (real vendor incidents tracked silently — visible on dashboard, never paged; default for new subscriptions)", + "description": "Alert sensitivity: ALL (synthetic + real incidents, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (real + DOWN severity, paged), AWARENESS (real vendor incidents tracked silently \u2014 visible on dashboard, never paged; default for new subscriptions)", "enum": [ "ALL", "AWARENESS", @@ -35867,6 +43271,28 @@ } } }, + "SingleValueResponseDefinitionDetailDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DefinitionDetailDto" + } + } + }, + "SingleValueResponseDefinitionHeadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DefinitionHeadDto" + } + } + }, "SingleValueResponseDekRotationResultDto": { "required": [ "data" @@ -36037,6 +43463,28 @@ } } }, + "SingleValueResponseMonitorSecretRequestsDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorSecretRequestsDto" + } + } + }, + "SingleValueResponseMonitorSessionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorSessionDto" + } + } + }, "SingleValueResponseMonitorTestResultDto": { "required": [ "data" @@ -36059,6 +43507,17 @@ } } }, + "SingleValueResponseNetworkRowDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NetworkRowDto" + } + } + }, "SingleValueResponseNotificationDispatchDto": { "required": [ "data" @@ -36092,6 +43551,17 @@ } } }, + "SingleValueResponsePackageUploadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PackageUploadDto" + } + } + }, "SingleValueResponsePolicySnapshotDto": { "required": [ "data" @@ -36147,6 +43617,72 @@ } } }, + "SingleValueResponseRevisionDiffDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionDiffDto" + } + } + }, + "SingleValueResponseRevisionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionDto" + } + } + }, + "SingleValueResponseRollbackPreviewDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RollbackPreviewDto" + } + } + }, + "SingleValueResponseRunConsoleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunConsoleDto" + } + } + }, + "SingleValueResponseRunDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunDto" + } + } + }, + "SingleValueResponseSecretAuditDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SecretAuditDto" + } + } + }, "SingleValueResponseSecretDto": { "required": [ "data" @@ -36158,6 +43694,17 @@ } } }, + "SingleValueResponseSecretUsageDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SecretUsageDto" + } + } + }, "SingleValueResponseServiceDayDetailDto": { "required": [ "data" @@ -36658,6 +44205,10 @@ } }, "SslExpiryAssertion": { + "required": [ + "type", + "minDaysRemaining" + ], "type": "object", "properties": { "type": { @@ -36671,11 +44222,7 @@ "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold", "format": "int32" } - }, - "required": [ - "type", - "minDaysRemaining" - ] + } }, "StateTransitionDetails": { "required": [ @@ -36888,14 +44435,14 @@ "maxLength": 50000, "minLength": 0, "type": "string", - "description": "Custom CSS injected via