diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 7ba8f4e..31e1c44 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -46,6 +46,10 @@ "name": "Audit Log", "description": "Organization audit trail" }, + { + "name": "Bundles", + "description": "Upload code for browser and multi-step checks" + }, { "name": "Check Results", "description": "Query raw check results, uptime statistics, and summary data" @@ -62,10 +66,22 @@ "name": "Deploy Lock", "description": "Mutex for CLI deploy operations" }, + { + "name": "Device Login", + "description": "Device-code login that gives the CLI a named, revocable API key" + }, + { + "name": "Device Login", + "description": "Dashboard approval for CLI device-code logins" + }, { "name": "Email Testing", "description": "Receive domains, captured mail, and JSON inject" }, + { + "name": "Entitlements", + "description": "Plan entitlements and usage limits" + }, { "name": "Environments", "description": "Variable namespace management for monitors" @@ -118,6 +134,10 @@ "name": "Monitor definitions", "description": "Publish, rollback, and revision history for code monitors" }, + { + "name": "Monitor History", + "description": "Scheduled ticks that did not run" + }, { "name": "Monitor Runs", "description": "Per-monitor code run history and run-now" @@ -150,6 +170,10 @@ "name": "Organizations", "description": "Organization management" }, + { + "name": "Regions", + "description": "Public regions" + }, { "name": "Resource Groups", "description": "Resource group CRUD and member management" @@ -211,7 +235,7 @@ ], "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.", - "operationId": "list_14", + "operationId": "list_15", "parameters": [ { "name": "type", @@ -311,6 +335,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -341,6 +375,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -378,7 +432,7 @@ "Alert Channels" ], "summary": "Create a new alert channel with encrypted config", - "operationId": "create_15", + "operationId": "create_16", "requestBody": { "content": { "application/json": { @@ -420,38 +474,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -460,60 +484,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/api/v1/alert-channels/{id}": { - "get": { - "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" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -522,8 +494,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -532,8 +504,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -542,8 +514,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -552,8 +524,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -593,13 +565,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", @@ -611,16 +585,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertChannelRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -652,8 +616,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -662,88 +626,8 @@ } } }, - "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" - } - } - } - } - } - }, - "delete": { - "tags": [ - "Alert Channels" - ], - "summary": "Soft-delete an alert channel and return affected policy summary", - "operationId": "delete_10", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/DeleteChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -752,8 +636,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -762,8 +646,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -772,8 +656,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -782,8 +666,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -823,15 +707,13 @@ } } } - } - }, - "/api/v1/alert-channels/{id}/deliveries": { - "get": { + }, + "put": { "tags": [ "Alert Channels" ], - "summary": "List delivery history for an alert channel", - "operationId": "listDeliveries_1", + "summary": "Update an alert channel's name and re-encrypt config", + "operationId": "update_14", "parameters": [ { "name": "id", @@ -843,13 +725,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertChannelRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } @@ -874,6 +766,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -904,6 +806,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -935,15 +857,13 @@ } } } - } - }, - "/api/v1/alert-channels/{id}/enabled": { - "patch": { + }, + "delete": { "tags": [ "Alert Channels" ], - "summary": "Enable or disable an alert channel without re-uploading config", - "operationId": "setEnabled", + "summary": "Soft-delete an alert channel and return affected policy summary", + "operationId": "delete_10", "parameters": [ { "name": "id", @@ -955,23 +875,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetEnabledRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + "$ref": "#/components/schemas/DeleteChannelResult" } } } @@ -996,6 +906,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1026,6 +946,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1059,13 +999,13 @@ } } }, - "/api/v1/alert-channels/{id}/test": { - "post": { + "/api/v1/alert-channels/{id}/deliveries": { + "get": { "tags": [ "Alert Channels" ], - "summary": "Test a saved alert channel's connectivity", - "operationId": "test_2", + "summary": "List delivery history for an alert channel", + "operationId": "listDeliveries_1", "parameters": [ { "name": "id", @@ -1083,7 +1023,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" } } } @@ -1108,18 +1048,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -1128,79 +1058,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/api/v1/alert-channels/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" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1209,8 +1068,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1219,8 +1078,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1229,8 +1088,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -1239,8 +1098,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -1282,14 +1141,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/attempts": { - "get": { + "/api/v1/alert-channels/{id}/enabled": { + "patch": { "tags": [ - "Alert Deliveries" + "Alert Channels" ], - "summary": "List delivery attempts for a specific alert delivery", - "description": "Returns the ordered list of delivery attempts (request/response audit data) for the given delivery ID.", - "operationId": "listAttempts", + "summary": "Enable or disable an alert channel without re-uploading config", + "operationId": "setEnabled", "parameters": [ { "name": "id", @@ -1301,13 +1159,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetEnabledRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } @@ -1332,6 +1200,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1362,6 +1240,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1395,14 +1293,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/retry": { + "/api/v1/alert-channels/{id}/test": { "post": { "tags": [ - "Alert Deliveries" + "Alert Channels" ], - "summary": "Retry a failed delivery", - "description": "Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.", - "operationId": "retry", + "summary": "Test a saved alert channel's connectivity", + "operationId": "test_2", "parameters": [ { "name": "id", @@ -1420,7 +1317,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1445,8 +1342,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -1455,79 +1352,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/api/v1/api-keys": { - "get": { - "tags": [ - "API Keys" - ], - "summary": "List API keys", - "operationId": "list_13", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultApiKeyDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1536,8 +1362,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1546,8 +1372,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1556,8 +1382,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -1566,8 +1392,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -1607,30 +1433,32 @@ } } } - }, + } + }, + "/api/v1/alert-channels/test": { "post": { "tags": [ - "API Keys" + "Alert Channels" ], - "summary": "Create API key", - "operationId": "create_14", + "summary": "Test alert channel connectivity using raw config (no saved channel required)", + "operationId": "testConfig", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateApiKeyRequest" + "$ref": "#/components/schemas/TestAlertChannelRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1655,6 +1483,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1685,6 +1523,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1718,27 +1576,35 @@ } } }, - "/api/v1/api-keys/{id}": { - "delete": { + "/api/v1/alert-deliveries/{id}/attempts": { + "get": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Delete API key", - "operationId": "delete_11", + "summary": "List delivery attempts for a specific alert delivery", + "description": "Returns the ordered list of delivery attempts (request/response audit data) for the given delivery ID.", + "operationId": "listAttempts", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -1760,6 +1626,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1790,6 +1666,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1821,41 +1717,34 @@ } } } - }, - "patch": { + } + }, + "/api/v1/alert-deliveries/{id}/retry": { + "post": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Update API key", - "operationId": "update_16", + "summary": "Retry a failed delivery", + "description": "Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.", + "operationId": "retry", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateApiKeyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" } } } @@ -1880,6 +1769,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1910,6 +1809,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1943,31 +1862,20 @@ } } }, - "/api/v1/api-keys/{id}/regenerate": { - "post": { + "/api/v1/api-keys": { + "get": { "tags": [ "API Keys" ], - "summary": "Regenerate API key", - "operationId": "regenerate", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "summary": "List API keys", + "operationId": "list_14", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/TableValueResultApiKeyDto" } } } @@ -1992,6 +1900,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2022,6 +1940,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2053,33 +1991,30 @@ } } } - } - }, - "/api/v1/api-keys/{id}/revoke": { + }, "post": { "tags": [ "API Keys" ], - "summary": "Revoke API key", - "operationId": "revoke_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + "summary": "Create API key", + "operationId": "create_15", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateApiKeyRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -2104,6 +2039,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2134,6 +2079,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2167,28 +2132,27 @@ } } }, - "/api/v1/artifacts/{id}/content": { - "get": { + "/api/v1/api-keys/{id}": { + "delete": { "tags": [ - "Artifacts" + "API Keys" ], - "summary": "Redirect to signed artifact download", - "description": "Returns 302 Location with a signed GET URL. 410 after the 14-day file clock.", - "operationId": "getArtifactContent", + "summary": "Delete API key", + "operationId": "delete_12", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], "responses": { - "302": { - "description": "Signed download Location" + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -2210,6 +2174,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2241,7 +2215,24 @@ } }, "410": { - "description": "Artifact bytes expired" + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "500": { "description": "Internal server error — see the message field for details", @@ -2274,87 +2265,41 @@ } } } - } - }, - "/api/v1/audit-log": { - "get": { + }, + "patch": { "tags": [ - "Audit Log" + "API Keys" ], - "summary": "List audit events for the current organization", - "operationId": "list_23", + "summary": "Update API key", + "operationId": "update_17", "parameters": [ { - "name": "action", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "actorId", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "integer", "format": "int32" } - }, - { - "name": "resourceType", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "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": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateApiKeyRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAuditEventDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2379,6 +2324,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2409,6 +2364,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2442,21 +2417,31 @@ } } }, - "/api/v1/auth/me": { - "get": { + "/api/v1/api-keys/{id}/regenerate": { + "post": { "tags": [ - "API Auth" + "API Keys" + ], + "summary": "Regenerate API key", + "operationId": "regenerate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } ], - "summary": "Get current API key identity", - "description": "Returns the authenticated API key's metadata, organization, billing plan, entitlements with usage, and current rate-limit quota. Only available for API key authentication (Bearer dh_live_...).", - "operationId": "me_1", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -2481,6 +2466,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2511,6 +2506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2544,22 +2559,21 @@ } } }, - "/api/v1/categories": { - "get": { + "/api/v1/api-keys/{id}/revoke": { + "post": { "tags": [ - "Status Data" + "API Keys" ], - "summary": "List categories with service counts", - "operationId": "listCategories", + "summary": "Revoke API key", + "operationId": "revoke_1", "parameters": [ { - "name": "publishedOnly", - "in": "query", - "description": "Count only published services (curated public pSEO set); default false", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "integer", + "format": "int32" } } ], @@ -2569,7 +2583,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultCategoryDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2594,6 +2608,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2624,6 +2648,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2657,27 +2701,41 @@ } } }, - "/api/v1/dashboard/overview": { + "/api/v1/artifacts/{id}/content": { "get": { "tags": [ - "Dashboard" + "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" + } + } ], - "summary": "Dashboard overview", - "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", - "operationId": "overview", "responses": { - "200": { - "description": "OK", + "302": { + "description": "Signed download Location" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2686,8 +2744,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -2726,6 +2784,19 @@ } } }, + "410": { + "description": "Artifact bytes expired" + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2759,26 +2830,38 @@ } } }, - "/api/v1/definitions": { + "/api/v1/artifacts/{id}/download": { "get": { "tags": [ - "Definitions" + "Artifacts" + ], + "summary": "Get a signed artifact download link", + "description": "Returns the signed GET URL as JSON for browsers that cannot read a redirect. 410 after the 14-day file clock.", + "operationId": "getArtifactDownload", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List definitions", - "operationId": "list_22", "responses": { - "200": { - "description": "OK", + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultDefinitionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2787,8 +2870,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -2827,6 +2910,26 @@ } } }, + "410": { + "description": "Artifact bytes expired", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseArtifactDownloadDto" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2860,21 +2963,84 @@ } } }, - "/api/v1/definitions/{id}": { + "/api/v1/audit-log": { "get": { "tags": [ - "Definitions" + "Audit Log" ], - "summary": "Get definition with Heads", - "operationId": "get_14", + "summary": "List audit events for the current organization", + "operationId": "list_24", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "action", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "resourceType", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "query", + "description": "Only events on this resource id, e.g. a monitor id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "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": 50 } } ], @@ -2884,7 +3050,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" + "$ref": "#/components/schemas/TableValueResultAuditEventDto" } } } @@ -2909,6 +3075,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2939,6 +3115,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2972,37 +3168,92 @@ } } }, - "/api/v1/definitions/{id}/revisions": { + "/api/v1/audit-log/export": { "get": { "tags": [ - "Definitions" + "Audit Log" ], - "summary": "List all revisions for a definition", - "operationId": "listRevisions_1", + "summary": "Export audit events as CSV", + "description": "Same filters as the list. Newest first, up to 10,000 rows. from defaults to 30 days ago", + "operationId": "exportAuditLog", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "action", + "in": "query", + "description": "Only events with this action, e.g. monitor.paused", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "description": "Only events performed by this user", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "resourceType", + "in": "query", + "description": "Only events on this resource type, e.g. monitor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "query", + "description": "Only events on this resource id, e.g. a monitor id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest event time (default: 30 days ago)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "Latest event time", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } } ], "responses": { "200": { - "description": "OK", + "description": "CSV with a header row", "content": { - "*/*": { + "text/csv": {} + } + }, + "400": { + "description": "More than 10,000 events match; narrow the filters", + "content": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/StreamingResponseBody" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3011,8 +3262,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -3051,6 +3302,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3084,21 +3355,31 @@ } } }, - "/api/v1/deploy/lock": { - "get": { + "/api/v1/auth/device": { + "post": { "tags": [ - "Deploy Lock" + "Device Login" ], - "summary": "Get current deploy lock", - "description": "Returns the active deploy lock for the current workspace, if any.", - "operationId": "current", + "summary": "Start a device-code login", + "description": "Returns a device code for the CLI to poll and a short user code for an admin to approve.", + "operationId": "start_1", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDeviceAuthorizationRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/SingleValueResponseDeviceAuthorizationDto" } } } @@ -3123,6 +3404,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3153,6 +3444,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3183,32 +3494,35 @@ } } } - } - }, + }, + "security": [] + } + }, + "/api/v1/auth/device/token": { "post": { "tags": [ - "Deploy Lock" + "Device Login" ], - "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", + "summary": "Poll a device-code login", + "description": "Returns authorization_pending, slow_down, expired, denied, or complete. The API key is returned once, with complete.", + "operationId": "token", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AcquireDeployLockRequest" + "$ref": "#/components/schemas/DeviceTokenRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/SingleValueResponseDeviceTokenDto" } } } @@ -3233,6 +3547,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3263,6 +3587,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3293,31 +3637,28 @@ } } } - } + }, + "security": [] } }, - "/api/v1/deploy/lock/{lockId}": { - "delete": { + "/api/v1/auth/me": { + "get": { "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" - } - } + "API Auth" ], + "summary": "Get current API key identity", + "description": "Returns the authenticated API key's metadata, organization, billing plan, entitlements with usage, and current rate-limit quota. Only available for API key authentication (Bearer dh_live_...).", + "operationId": "me_1", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -3339,6 +3680,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3369,6 +3720,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3402,17 +3773,57 @@ } } }, - "/api/v1/deploy/lock/force": { - "delete": { + "/api/v1/bundles": { + "post": { "tags": [ - "Deploy Lock" + "Bundles" ], - "summary": "Force-release deploy lock", - "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", - "operationId": "forceRelease", + "summary": "Upload a code bundle as a JSON file map", + "operationId": "uploadZip", + "parameters": [ + { + "name": "entrypoint", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "runtimeId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/zip": { + "schema": { + "type": "string", + "format": "byte" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBundleRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBundleDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -3434,6 +3845,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3464,6 +3885,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3497,31 +3938,22 @@ } } }, - "/api/v1/email/{localpart}/wait": { + "/api/v1/bundles/check": { "post": { "tags": [ - "Email Testing" - ], - "summary": "Wait for the oldest matching captured email at a local-part", - "operationId": "waitForEmailByLocalpart", - "parameters": [ - { - "name": "localpart", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Bundles" ], + "summary": "Check every import without storing a bundle", + "operationId": "check", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageRequest" + "$ref": "#/components/schemas/CreateBundleRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -3529,7 +3961,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageResponse" + "$ref": "#/components/schemas/SingleValueResponseBundleCheckResultDto" } } } @@ -3554,6 +3986,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3574,8 +4016,8 @@ } } }, - "408": { - "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3584,8 +4026,18 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -3627,29 +4079,22 @@ } } }, - "/api/v1/email/domains": { + "/api/v1/categories": { "get": { "tags": [ - "Email Testing" + "Status Data" ], - "summary": "List email testing domains for the workspace", - "operationId": "listEmailDomains", + "summary": "List categories with service counts", + "operationId": "listCategories", "parameters": [ { - "name": "search", + "name": "publishedOnly", "in": "query", - "description": "Case-insensitive name search", + "description": "Count only published services (curated public pSEO set); default false", "required": false, "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "boolean", + "default": false } } ], @@ -3659,7 +4104,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultCategoryDto" } } } @@ -3684,6 +4129,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3714,6 +4169,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3745,29 +4220,23 @@ } } } - }, - "post": { + } + }, + "/api/v1/dashboard/overview": { + "get": { "tags": [ - "Email Testing" + "Dashboard" ], - "summary": "Create an assigned or custom email testing domain", - "operationId": "createEmailDomain", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEmailDomainRequest" - } - } - } - }, + "summary": "Dashboard overview", + "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", + "operationId": "overview", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" } } } @@ -3792,6 +4261,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3822,6 +4301,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3855,30 +4354,20 @@ } } }, - "/api/v1/email/domains/{domain}": { + "/api/v1/definitions": { "get": { "tags": [ - "Email Testing" - ], - "summary": "Get an email testing domain including derived DNS records", - "operationId": "getEmailDomain", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Definitions" ], + "summary": "List definitions", + "operationId": "list_23", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultDefinitionDto" } } } @@ -3903,6 +4392,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3933,6 +4432,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3964,26 +4483,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/definitions/{id}": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", - "operationId": "deleteEmailDomain", + "summary": "Get definition with Heads", + "operationId": "get_14", "parameters": [ { - "name": "domain", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4005,6 +4534,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4035,6 +4574,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4066,40 +4625,33 @@ } } } - }, - "patch": { + } + }, + "/api/v1/definitions/{id}/revisions": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Patch an email testing domain", - "operationId": "updateEmailDomain", + "summary": "List all revisions for a definition", + "operationId": "listRevisions_1", "parameters": [ { - "name": "domain", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEmailDomainRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultRevisionDto" } } } @@ -4124,6 +4676,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4154,6 +4716,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4187,34 +4769,52 @@ } } }, - "/api/v1/email/domains/{domain}/inboxes/{inbox}": { - "delete": { + "/api/v1/demo-booking/availability": { + "get": { "tags": [ - "Email Testing" + "dashboard-demo-booking-controller" ], - "summary": "Delete every message for one local-part", - "operationId": "deleteEmailInbox", + "summary": "Get live demo times for the authenticated dashboard user", + "operationId": "getDashboardDemoAvailability", "parameters": [ { - "name": "domain", - "in": "path", + "name": "date", + "in": "query", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "date" } }, { - "name": "inbox", - "in": "path", + "name": "timezone", + "in": "query", "required": true, "schema": { "type": "string" } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 1 + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/DemoAvailabilityDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4236,6 +4836,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4266,6 +4876,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4299,75 +4929,29 @@ } } }, - "/api/v1/email/domains/{domain}/messages": { - "get": { + "/api/v1/demo-booking/bookings": { + "post": { "tags": [ - "Email Testing" + "dashboard-demo-booking-controller" ], - "summary": "Super-inbox: list messages newest-first", - "operationId": "listEmailMessages", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "inbox", - "in": "query", - "description": "Only messages to this local-part, exact match", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "q", - "in": "query", - "description": "Case-insensitive match on subject, sender, or recipient local-part", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "after", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "summary": "Book a demo from the dashboard", + "operationId": "createDashboardDemoBooking", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDemoBookingRequest" + } } } - ], + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageEmailMessageDto" + "$ref": "#/components/schemas/DemoBookingDto" } } } @@ -4392,6 +4976,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4422,6 +5016,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4455,24 +5069,16 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}": { + "/api/v1/demo-booking/bookings/{id}": { "get": { "tags": [ - "Email Testing" + "dashboard-demo-booking-controller" ], - "summary": "Get one captured message", - "operationId": "getEmailMessage", + "summary": "Get the dashboard user's booking attempt", + "operationId": "getDashboardDemoBooking", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", + "name": "id", "in": "path", "required": true, "schema": { @@ -4487,7 +5093,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailMessageDto" + "$ref": "#/components/schemas/DemoBookingDto" } } } @@ -4512,6 +5118,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4542,6 +5158,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4573,24 +5209,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/demo-booking/bookings/{id}/close-unsaved": { + "post": { "tags": [ - "Email Testing" + "dashboard-demo-booking-controller" ], - "summary": "Delete one captured message", - "operationId": "deleteEmailMessage", + "summary": "Recover or close the dashboard user's booking attempt", + "operationId": "closeUnsavedDashboardDemoBooking", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", + "name": "id", "in": "path", "required": true, "schema": { @@ -4600,8 +5230,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/DemoBookingRecoveryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4623,6 +5260,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4653,6 +5300,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4686,48 +5353,21 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { + "/api/v1/deploy/lock": { "get": { "tags": [ - "Email Testing" - ], - "summary": "Signed URL for one attachment", - "operationId": "getEmailMessageAttachment", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "attId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Deploy Lock" ], + "summary": "Get current deploy lock", + "description": "Returns the active deploy lock for the current workspace, if any.", + "operationId": "current", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" } } } @@ -4752,6 +5392,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4782,6 +5432,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4813,41 +5483,31 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/links": { - "get": { + }, + "post": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Extracted links on the message", - "operationId": "listEmailMessageLinks", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" + "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" + } } }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInboundEmailLink" + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" } } } @@ -4872,6 +5532,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4902,6 +5572,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4935,24 +5625,17 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { - "get": { + "/api/v1/deploy/lock/{lockId}": { + "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Extracted one-time codes on the message", - "operationId": "listEmailMessageOtp", + "summary": "Release deploy lock", + "description": "Releases a deploy lock by ID. Only the actor that acquired it can release it.", + "operationId": "release", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", + "name": "lockId", "in": "path", "required": true, "schema": { @@ -4962,18 +5645,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultInboundOtpCode" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4982,8 +5668,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5022,6 +5708,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5055,45 +5761,43 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { - "get": { + "/api/v1/deploy/lock/force": { + "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Signed URL for the raw RFC822 object", - "operationId": "getEmailMessageRaw", + "summary": "Force-release deploy lock", + "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", + "operationId": "forceRelease", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, + "name": "reason", + "in": "query", + "description": "Why the lock is being broken (recorded in the audit log)", + "required": false, "schema": { + "maxLength": 280, + "minLength": 0, "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5102,8 +5806,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5142,6 +5846,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5175,39 +5899,39 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/source": { - "get": { + "/api/v1/email/{localpart}/wait": { + "post": { "tags": [ "Email Testing" ], - "summary": "Original message source as text", - "operationId": "getEmailMessageSource", + "summary": "Wait for the oldest matching captured email at a local-part", + "operationId": "waitForEmailByLocalpart", "parameters": [ { - "name": "domain", + "name": "localpart", "in": "path", "required": true, "schema": { "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaitEmailMessageRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailMessageSourceDto" + "$ref": "#/components/schemas/WaitEmailMessageResponse" } } } @@ -5232,6 +5956,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5252,6 +5986,16 @@ } } }, + "408": { + "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "409": { "description": "Conflict — the request collides with current resource state", "content": { @@ -5262,6 +6006,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5295,40 +6059,39 @@ } } }, - "/api/v1/email/domains/{domain}/messages/inject": { - "post": { + "/api/v1/email/domains": { + "get": { "tags": [ "Email Testing" ], - "summary": "Inject a JSON message onto the same durable path as SMTP", - "operationId": "injectEmailMessage", + "summary": "List email testing domains for the workspace", + "operationId": "listEmailDomains", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, "schema": { "type": "string" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InjectEmailMessageRequest" - } - } - }, - "required": true - }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInjectEmailMessageResponse" + "$ref": "#/components/schemas/TableValueResultEmailDomainDto" } } } @@ -5353,6 +6116,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5383,6 +6156,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5414,28 +6207,25 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/verify": { + }, "post": { "tags": [ "Email Testing" ], - "summary": "Re-check TXT and MX for a custom domain", - "operationId": "verifyEmailDomain", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" + "summary": "Create an assigned or custom email testing domain", + "operationId": "createEmailDomain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEmailDomainRequest" + } } } - ], + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { @@ -5464,6 +6254,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5494,6 +6294,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5527,25 +6347,20 @@ } } }, - "/api/v1/email/domains/activity": { + "/api/v1/email/domains/{domain}": { "get": { "tags": [ "Email Testing" ], - "summary": "Last-24h received-message activity for email domains", - "operationId": "listEmailDomainActivity", + "summary": "Get an email testing domain including derived DNS records", + "operationId": "getEmailDomain", "parameters": [ { - "name": "domainIds", - "in": "query", - "description": "Comma-separated domain ids (1–100)", - "required": false, + "name": "domain", + "in": "path", + "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "type": "string" } } ], @@ -5555,7 +6370,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -5580,6 +6395,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5610,6 +6435,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5641,38 +6486,39 @@ } } } - } - }, - "/api/v1/email/wait": { - "post": { + }, + "delete": { "tags": [ "Email Testing" ], - "summary": "Wait for the oldest matching captured email at a full address", - "operationId": "waitForEmail", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WaitEmailMessageRequest" - } + "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", + "operationId": "deleteEmailDomain", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" } - }, - "required": true - }, + } + ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5681,8 +6527,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5711,8 +6557,8 @@ } } }, - "408": { - "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -5721,8 +6567,18 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -5762,22 +6618,40 @@ } } } - } - }, - "/api/v1/environments": { - "get": { + }, + "patch": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "List environments", - "operationId": "list_12", + "summary": "Patch an email testing domain", + "operationId": "updateEmailDomain", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEmailDomainRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -5802,6 +6676,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5832,6 +6716,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5863,36 +6767,49 @@ } } } - }, - "post": { + } + }, + "/api/v1/email/domains/{domain}/inboxes/{inbox}": { + "delete": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Create environment", - "operationId": "create_13", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEnvironmentRequest" - } + "summary": "Delete every message for one local-part", + "operationId": "deleteEmailInbox", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "inbox", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5901,8 +6818,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5941,6 +6858,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5974,21 +6911,66 @@ } } }, - "/api/v1/environments/{slug}": { + "/api/v1/email/domains/{domain}/messages": { "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Get environment by slug", - "operationId": "get_7", + "summary": "Super-inbox: list messages newest-first", + "operationId": "listEmailMessages", "parameters": [ { - "name": "slug", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "inbox", + "in": "query", + "description": "Only messages to this local-part, exact match", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "q", + "in": "query", + "description": "Case-insensitive match on subject, sender, or recipient local-part", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "after", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } } ], "responses": { @@ -5997,7 +6979,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/CursorPageEmailMessageDto" } } } @@ -6022,6 +7004,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6052,6 +7044,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6083,40 +7095,41 @@ } } } - }, - "put": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Update environment", - "operationId": "update_13", + "summary": "Get one captured message", + "operationId": "getEmailMessage", "parameters": [ { - "name": "slug", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEnvironmentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/SingleValueResponseEmailMessageDto" } } } @@ -6141,6 +7154,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6171,6 +7194,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6205,18 +7248,27 @@ }, "delete": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Delete environment", - "operationId": "delete_9", + "summary": "Delete one captured message", + "operationId": "deleteEmailMessage", "parameters": [ { - "name": "slug", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -6243,6 +7295,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6273,6 +7335,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6306,17 +7388,33 @@ } } }, - "/api/v1/forensics/incidents/{id}/timeline": { + "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "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": "Signed URL for one attachment", + "operationId": "getEmailMessageAttachment", "parameters": [ { - "name": "id", + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "attId", "in": "path", "required": true, "schema": { @@ -6331,7 +7429,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" } } } @@ -6356,6 +7454,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6386,6 +7494,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6419,72 +7547,29 @@ } } }, - "/api/v1/forensics/monitors/{id}/rule-evaluations": { + "/api/v1/email/domains/{domain}/messages/{messageId}/links": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "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": "Extracted links on the message", + "operationId": "listEmailMessageLinks", "parameters": [ { - "name": "id", + "name": "domain", "in": "path", "required": true, - "schema": { - "type": "string", - "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", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "pageable", - "in": "query", + "name": "messageId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -6494,7 +7579,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" + "$ref": "#/components/schemas/TableValueResultInboundEmailLink" } } } @@ -6519,8 +7604,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -6529,8 +7614,18 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "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": { @@ -6549,6 +7644,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6582,48 +7697,29 @@ } } }, - "/api/v1/forensics/monitors/{id}/transitions": { + "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "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": "Extracted one-time codes on the message", + "operationId": "listEmailMessageOtp", "parameters": [ { - "name": "id", + "name": "domain", "in": "path", "required": true, "schema": { - "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" + "type": "string" } }, { - "name": "pageable", - "in": "query", + "name": "messageId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -6633,7 +7729,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" + "$ref": "#/components/schemas/TableValueResultInboundOtpCode" } } } @@ -6658,6 +7754,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6688,6 +7794,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6721,22 +7847,30 @@ } } }, - "/api/v1/forensics/policy-snapshots/{hashHex}": { + "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "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": "Signed URL for the raw RFC822 object", + "operationId": "getEmailMessageRaw", "parameters": [ { - "name": "hashHex", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -6745,7 +7879,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" } } } @@ -6770,6 +7904,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6800,6 +7944,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6833,17 +7997,24 @@ } } }, - "/api/v1/forensics/traces/{checkId}": { + "/api/v1/email/domains/{domain}/messages/{messageId}/source": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "summary": "Replay a single check execution", - "description": "Returns every rule evaluation and state transition emitted for this scheduler-minted check_id (V92), plus the policy snapshot that governed them.", - "operationId": "getTrace", + "summary": "Original message source as text", + "operationId": "getEmailMessageSource", "parameters": [ { - "name": "checkId", + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "messageId", "in": "path", "required": true, "schema": { @@ -6858,7 +8029,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseCheckTraceDto" + "$ref": "#/components/schemas/SingleValueResponseEmailMessageSourceDto" } } } @@ -6883,6 +8054,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6913,6 +8094,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6946,32 +8147,40 @@ } } }, - "/api/v1/heartbeat/{token}": { - "get": { + "/api/v1/email/domains/{domain}/messages/inject": { + "post": { "tags": [ - "Heartbeat" + "Email Testing" ], - "summary": "Record a heartbeat ping (GET)", - "description": "Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.", - "operationId": "pingGet", + "summary": "Inject a JSON message onto the same durable path as SMTP", + "operationId": "injectEmailMessage", "parameters": [ { - "name": "token", + "name": "domain", "in": "path", - "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InjectEmailMessageRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/HeartbeatPingResponse" + "$ref": "#/components/schemas/SingleValueResponseInjectEmailMessageResponse" } } } @@ -6996,6 +8205,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7026,6 +8245,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7057,51 +8296,32 @@ } } } - }, + } + }, + "/api/v1/email/domains/{domain}/verify": { "post": { "tags": [ - "Heartbeat" + "Email Testing" ], - "summary": "Record a heartbeat ping (POST)", - "description": "Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.", - "operationId": "pingPost", + "summary": "Re-check TXT and MX for a custom domain", + "operationId": "verifyEmailDomain", "parameters": [ { - "name": "token", + "name": "domain", "in": "path", - "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "string" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - }, - "*/*": { - "schema": { - "type": "string" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/HeartbeatPingResponse" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -7126,6 +8346,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7156,6 +8386,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7189,20 +8439,25 @@ } } }, - "/api/v1/incidents": { + "/api/v1/email/domains/activity": { "get": { "tags": [ - "Incidents" + "Email Testing" ], - "summary": "List incidents for the authenticated org", - "operationId": "list_11", + "summary": "Last-24h received-message activity for email domains", + "operationId": "listEmailDomainActivity", "parameters": [ { - "name": "params", + "name": "domainIds", "in": "query", - "required": true, + "description": "Comma-separated domain ids (1–100)", + "required": false, "schema": { - "$ref": "#/components/schemas/IncidentFilterParams" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -7212,7 +8467,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" } } } @@ -7237,6 +8492,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7267,6 +8532,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7298,30 +8583,32 @@ } } } - }, + } + }, + "/api/v1/email/wait": { "post": { "tags": [ - "Incidents" + "Email Testing" ], - "summary": "Create a manual incident", - "operationId": "create_12", + "summary": "Wait for the oldest matching captured email at a full address", + "operationId": "waitForEmail", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateManualIncidentRequest" + "$ref": "#/components/schemas/WaitEmailMessageRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/WaitEmailMessageResponse" } } } @@ -7346,6 +8633,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7366,6 +8663,16 @@ } } }, + "408": { + "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "409": { "description": "Conflict — the request collides with current resource state", "content": { @@ -7376,6 +8683,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7409,32 +8736,20 @@ } } }, - "/api/v1/incidents/{id}": { + "/api/v1/entitlements": { "get": { "tags": [ - "Incidents" - ], - "summary": "Get incident details including update timeline", - "description": "Shell payload: incident row, updates, and linked status-page incidents. Trigger enrichment (forensics / check_results) is GET /{id}/trigger so first paint is not blocked on hypertable reads.", - "operationId": "get_9", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Entitlements" ], + "summary": "Get plan limits and this period's usage for the caller's organization", + "operationId": "getCurrentEntitlements", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseEntitlementResponse" } } } @@ -7459,6 +8774,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7489,6 +8814,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7520,41 +8865,22 @@ } } } - }, - "patch": { + } + }, + "/api/v1/environments": { + "get": { "tags": [ - "Incidents" - ], - "summary": "Update incident title and/or severity", - "operationId": "update_15", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Environments" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentRequest" - } - } - }, - "required": true - }, + "summary": "List environments", + "operationId": "list_13", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" } } } @@ -7579,6 +8905,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7609,6 +8945,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7640,34 +8996,30 @@ } } } - } - }, - "/api/v1/incidents/{id}/acknowledge": { + }, "post": { "tags": [ - "Incidents" + "Environments" ], - "summary": "Acknowledge all open notification dispatches for an incident", - "description": "Atomically acknowledges every DELIVERED or ESCALATING dispatch for the incident. Already-acknowledged and non-acknowledgeable dispatches are returned in skipped (not errors). MEMBER+.", - "operationId": "acknowledgeAll", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create environment", + "operationId": "create_14", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEnvironmentRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7692,6 +9044,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7722,6 +9084,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7755,41 +9137,21 @@ } } }, - "/api/v1/incidents/{id}/events": { + "/api/v1/environments/{slug}": { "get": { "tags": [ - "Incidents" + "Environments" ], - "summary": "List merged activity events for an incident", - "description": "Cursor-paginated unified activity stream merging incident updates, notification dispatches, alert deliveries, forensic state transitions, and linked status-page updates. Ordered by time descending.", - "operationId": "listEvents_1", + "summary": "Get environment by slug", + "operationId": "get_7", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "cursor", - "in": "query", - "required": false, "schema": { "type": "string" } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], "responses": { @@ -7798,7 +9160,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7823,6 +9185,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7853,6 +9225,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7884,54 +9276,40 @@ } } } - } - }, - "/api/v1/incidents/{id}/related": { - "get": { + }, + "put": { "tags": [ - "Incidents" + "Environments" ], - "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.", - "operationId": "listRelated", + "summary": "Update environment", + "operationId": "update_13", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "windowDays", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 30 - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 3 + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEnvironmentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RelatedIncidentsResponse" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7956,6 +9334,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7986,6 +9374,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8017,48 +9425,39 @@ } } } - } - }, - "/api/v1/incidents/{id}/resolve": { - "post": { + }, + "delete": { "tags": [ - "Incidents" + "Environments" ], - "summary": "Resolve an incident", - "operationId": "resolve", + "summary": "Delete environment", + "operationId": "delete_9", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -8067,8 +9466,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -8107,6 +9506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8140,14 +9559,14 @@ } } }, - "/api/v1/incidents/{id}/trigger": { + "/api/v1/forensics/incidents/{id}/timeline": { "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Get incident trigger enrichment", - "description": "Rule type, count/threshold, last error, and first-failed-check time derived from forensics and check_results. Not required to render the incident shell.", - "operationId": "getTrigger", + "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": "id", @@ -8165,7 +9584,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" } } } @@ -8190,6 +9609,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8220,6 +9649,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8253,13 +9702,14 @@ } } }, - "/api/v1/incidents/{id}/updates": { - "post": { + "/api/v1/forensics/monitors/{id}/rule-evaluations": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", + "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", @@ -8269,25 +9719,65 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" - } + }, + { + "name": "ruleType", + "in": "query", + "required": false, + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "region", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "onlyMatched", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "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" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" } } } @@ -8312,6 +9802,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8342,6 +9842,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8375,22 +9895,48 @@ } } }, - "/api/v1/ingest/{publicToken}": { + "/api/v1/forensics/monitors/{id}/transitions": { "get": { "tags": [ - "Webhook Testing" + "Forensics" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest", + "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": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "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" } } ], @@ -8400,8 +9946,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" } } } @@ -8426,6 +9971,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8456,6 +10011,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8487,19 +10062,20 @@ } } } - }, - "put": { + } + }, + "/api/v1/forensics/policy-snapshots/{hashHex}": { + "get": { "tags": [ - "Webhook Testing" + "Forensics" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_2", + "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": "publicToken", + "name": "hashHex", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { "type": "string" @@ -8512,8 +10088,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" } } } @@ -8538,6 +10113,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8568,6 +10153,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8599,22 +10204,24 @@ } } } - }, - "post": { + } + }, + "/api/v1/forensics/traces/{checkId}": { + "get": { "tags": [ - "Webhook Testing" + "Forensics" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_1", + "summary": "Replay a single check execution", + "description": "Returns every rule evaluation and state transition emitted for this scheduler-minted check_id (V92), plus the policy snapshot that governed them.", + "operationId": "getTrace", "parameters": [ { - "name": "publicToken", + "name": "checkId", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -8624,8 +10231,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseCheckTraceDto" } } } @@ -8650,6 +10256,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8680,8 +10296,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -8690,8 +10306,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -8700,8 +10316,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -8709,21 +10325,43 @@ } } } - } + }, + "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" + } + } + } + } } - }, - "delete": { + } + }, + "/api/v1/heartbeat/{token}": { + "get": { "tags": [ - "Webhook Testing" + "Heartbeat" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_3", + "summary": "Record a heartbeat ping (GET)", + "description": "Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.", + "operationId": "pingGet", "parameters": [ { - "name": "publicToken", + "name": "token", "in": "path", - "description": "Public token that identifies the inbox", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" @@ -8736,8 +10374,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8762,6 +10399,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8792,6 +10439,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8824,32 +10491,50 @@ } } }, - "options": { + "post": { "tags": [ - "Webhook Testing" + "Heartbeat" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_6", + "summary": "Record a heartbeat ping (POST)", + "description": "Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.", + "operationId": "pingPost", "parameters": [ { - "name": "publicToken", + "name": "token", "in": "path", - "description": "Public token that identifies the inbox", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + }, + "*/*": { + "schema": { + "type": "string" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8874,6 +10559,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -8904,6 +10599,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8935,22 +10650,22 @@ } } } - }, - "head": { + } + }, + "/api/v1/incidents": { + "get": { "tags": [ - "Webhook Testing" + "Incidents" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_5", + "summary": "List incidents for the authenticated org", + "operationId": "list_12", "parameters": [ { - "name": "publicToken", - "in": "path", - "description": "Public token that identifies the inbox", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string" + "$ref": "#/components/schemas/IncidentFilterParams" } } ], @@ -8960,8 +10675,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/TableValueResultIncidentDto" } } } @@ -8986,6 +10700,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9016,6 +10740,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9048,32 +10792,29 @@ } } }, - "patch": { + "post": { "tags": [ - "Webhook Testing" + "Incidents" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_4", - "parameters": [ - { - "name": "publicToken", - "in": "path", - "description": "Public token that identifies the inbox", - "required": true, - "schema": { - "type": "string" + "summary": "Create a manual incident", + "operationId": "create_13", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateManualIncidentRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9098,6 +10839,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9128,6 +10879,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9161,21 +10932,32 @@ } } }, - "/api/v1/integrations": { + "/api/v1/incidents/{id}": { "get": { "tags": [ - "Integrations" + "Incidents" + ], + "summary": "Get incident details including update timeline", + "description": "Shell payload: incident row, updates, and linked status-page incidents. Trigger enrichment (forensics / check_results) is GET /{id}/trigger so first paint is not blocked on hypertable reads.", + "operationId": "get_9", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "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_21", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9200,6 +10982,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9230,6 +11022,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9261,23 +11073,41 @@ } } } - } - }, - "/api/v1/integrations/voice-languages": { - "get": { + }, + "patch": { "tags": [ - "Integrations" + "Incidents" ], - "summary": "List supported voice languages for phone call alerts", - "description": "Returns BCP-47 locale codes and human-readable labels for all TTS languages supported by the phone call alert channel.", - "operationId": "listVoiceLanguages", + "summary": "Update incident title and/or severity", + "operationId": "update_16", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9302,6 +11132,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9332,6 +11172,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9365,20 +11225,32 @@ } } }, - "/api/v1/invites": { - "get": { + "/api/v1/incidents/{id}/acknowledge": { + "post": { "tags": [ - "Invites" + "Incidents" + ], + "summary": "Acknowledge all open notification dispatches for an incident", + "description": "Atomically acknowledges every DELIVERED or ESCALATING dispatch for the incident. Already-acknowledged and non-acknowledgeable dispatches are returned in skipped (not errors). MEMBER+.", + "operationId": "acknowledgeAll", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List invites", - "operationId": "list_10", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInviteDto" + "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" } } } @@ -9403,6 +11275,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9433,6 +11315,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9464,30 +11366,52 @@ } } } - }, - "post": { + } + }, + "/api/v1/incidents/{id}/events": { + "get": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Create invite", - "operationId": "create_11", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" - } + "summary": "List merged activity events for an incident", + "description": "Cursor-paginated unified activity stream merging incident updates, notification dispatches, alert deliveries, forensic state transitions, and linked status-page updates. Ordered by time descending.", + "operationId": "listEvents_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" } } } @@ -9512,6 +11436,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9542,6 +11476,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9575,21 +11529,42 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { - "post": { + "/api/v1/incidents/{id}/related": { + "get": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Resend invite", - "operationId": "resend_1", + "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.", + "operationId": "listRelated", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowDays", + "in": "query", + "required": false, "schema": { "type": "integer", - "format": "int32" + "format": "int32", + "default": 30 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 3 } } ], @@ -9599,7 +11574,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/RelatedIncidentsResponse" } } } @@ -9624,8 +11599,18 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9654,6 +11639,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9687,27 +11692,43 @@ } } }, - "/api/v1/invites/{inviteId}/revoke": { + "/api/v1/incidents/{id}/resolve": { "post": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Revoke invite", - "operationId": "revoke", + "summary": "Resolve an incident", + "operationId": "resolve", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResolveIncidentRequest" + } + } + } + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -9729,6 +11750,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9759,6 +11790,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9792,33 +11843,41 @@ } } }, - "/api/v1/maintenance-windows": { + "/api/v1/incidents/{id}/runs": { "get": { "tags": [ - "Maintenance Windows" + "Incidents" ], - "summary": "List maintenance windows for the authenticated org", - "description": "Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).", - "operationId": "list_9", + "summary": "List code-monitor runs during an incident", + "description": "Runs of the incident's monitor from one cycle before it started until it resolved, newest first. Empty for uptime and manual incidents.", + "operationId": "listIncidentRuns", "parameters": [ { - "name": "monitorId", - "in": "query", - "description": "Filter by monitor UUID", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } }, { - "name": "filter", + "name": "cursor", "in": "query", - "description": "Filter by status: 'active' or 'upcoming'", "required": false, "schema": { "type": "string" } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 + } } ], "responses": { @@ -9827,7 +11886,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -9852,48 +11911,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -9902,48 +11921,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "post": { - "tags": [ - "Maintenance Windows" - ], - "summary": "Create a maintenance window", - "description": "Creates a new maintenance window. Set monitorId to null to create an org-wide window that suppresses alerts for all monitors.", - "operationId": "create_10", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMaintenanceWindowRequest" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -9952,8 +11931,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -9962,8 +11941,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -9972,8 +11951,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -9982,8 +11961,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -10025,13 +12004,14 @@ } } }, - "/api/v1/maintenance-windows/{id}": { + "/api/v1/incidents/{id}/trigger": { "get": { "tags": [ - "Maintenance Windows" + "Incidents" ], - "summary": "Get a single maintenance window by ID", - "operationId": "getById_2", + "summary": "Get incident trigger enrichment", + "description": "Rule type, count/threshold, last error, and first-failed-check time derived from forensics and check_results. Not required to render the incident shell.", + "operationId": "getTrigger", "parameters": [ { "name": "id", @@ -10049,7 +12029,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" } } } @@ -10074,6 +12054,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10104,6 +12094,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10135,13 +12145,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/incidents/{id}/updates": { + "post": { "tags": [ - "Maintenance Windows" + "Incidents" ], - "summary": "Update a maintenance window", - "operationId": "update_12", + "summary": "Add an update to an incident (optionally change status)", + "operationId": "addUpdate", "parameters": [ { "name": "id", @@ -10157,19 +12169,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + "$ref": "#/components/schemas/AddIncidentUpdateRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -10194,6 +12206,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10224,6 +12246,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10255,27 +12297,38 @@ } } } - }, - "delete": { + } + }, + "/api/v1/ingest/{publicToken}": { + "get": { "tags": [ - "Maintenance Windows" + "Webhook Testing" ], - "summary": "Delete a maintenance window", - "operationId": "delete_8", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest", "parameters": [ { - "name": "id", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10297,6 +12350,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10327,6 +12390,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10358,22 +12441,22 @@ } } } - } - }, - "/api/v1/members": { - "get": { + }, + "put": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "List organization members", - "operationId": "list_20", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_2", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "publicToken", + "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string" } } ], @@ -10383,7 +12466,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMemberDto" + "type": "string", + "format": "byte" } } } @@ -10408,6 +12492,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10438,6 +12532,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10469,29 +12583,36 @@ } } } - } - }, - "/api/v1/members/{userId}": { - "delete": { + }, + "post": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "Remove member from organization", - "operationId": "remove_2", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_1", "parameters": [ { - "name": "userId", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10513,6 +12634,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10543,6 +12674,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10574,40 +12725,37 @@ } } } - } - }, - "/api/v1/members/{userId}/role": { - "put": { + }, + "delete": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "Change member role", - "operationId": "changeRole", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_3", "parameters": [ { - "name": "userId", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -10628,6 +12776,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10658,6 +12816,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10689,40 +12867,37 @@ } } } - } - }, - "/api/v1/members/{userId}/status": { - "put": { + }, + "options": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "Change member status", - "operationId": "changeStatus", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_6", "parameters": [ { - "name": "userId", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -10743,6 +12918,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10773,6 +12958,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10804,162 +13009,22 @@ } } } - } - }, - "/api/v1/monitors": { - "get": { + }, + "head": { "tags": [ - "Monitors" + "Webhook Testing" ], - "summary": "List monitors for the authenticated org", - "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type` or `types`, `managedBy`, `tag` / `tags`, `search`, `environmentId`, `displayHealth`, `needsAttention`, and `region`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", - "operationId": "list_8", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_5", "parameters": [ { - "name": "enabled", - "in": "query", - "description": "Filter by enabled state (true/false)", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "status", - "in": "query", - "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "Filter by monitor type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT", - "BROWSER", - "MULTI_STEP_API" - ] - } - }, - { - "name": "types", - "in": "query", - "description": "Filter by monitor types, comma-separated; matches any listed type", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT", - "BROWSER", - "MULTI_STEP_API" - ] - } - } - }, - { - "name": "managedBy", - "in": "query", - "description": "Filter by managed-by source", - "required": false, - "schema": { - "type": "string", - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] - } - }, - { - "name": "tags", - "in": "query", - "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "tag", - "in": "query", - "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", - "in": "query", - "description": "Filter by environment ID", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "displayHealth", - "in": "query", - "description": "Filter by projected chip health", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "needsAttention", - "in": "query", - "description": "When true, only monitors that need operator attention", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "region", - "in": "query", - "description": "Filter by probe region", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", + "name": "publicToken", + "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string" } } ], @@ -10969,7 +13034,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" + "type": "string", + "format": "byte" } } } @@ -10994,6 +13060,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11024,6 +13100,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11056,29 +13152,32 @@ } } }, - "post": { + "patch": { "tags": [ - "Monitors" + "Webhook Testing" ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_4", + "parameters": [ + { + "name": "publicToken", + "in": "path", + "description": "Public token that identifies the inbox", + "required": true, + "schema": { + "type": "string" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "type": "string", + "format": "byte" } } } @@ -11103,6 +13202,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11133,6 +13242,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11166,31 +13295,21 @@ } } }, - "/api/v1/monitors/{id}": { + "/api/v1/integrations": { "get": { "tags": [ - "Monitors" - ], - "summary": "Get a single monitor by id", - "operationId": "get_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Integrations" ], + "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_22", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultIntegrationDto" } } } @@ -11215,6 +13334,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11245,6 +13374,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11276,41 +13425,23 @@ } } } - }, - "put": { + } + }, + "/api/v1/integrations/voice-languages": { + "get": { "tags": [ - "Monitors" - ], - "summary": "Update a monitor", - "operationId": "update_11", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" - } - } - }, - "required": true - }, + "summary": "List supported voice languages for phone call alerts", + "description": "Returns BCP-47 locale codes and human-readable labels for all TTS languages supported by the phone call alert channel.", + "operationId": "listVoiceLanguages", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" } } } @@ -11335,6 +13466,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11365,6 +13506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11396,28 +13557,25 @@ } } } - }, - "delete": { + } + }, + "/api/v1/invites": { + "get": { "tags": [ - "Monitors" - ], - "summary": "Soft-delete a monitor", - "description": "Also deletes status-page components that represent this monitor. The parent status page stays.", - "operationId": "delete_7", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Invites" ], + "summary": "List invites", + "operationId": "list_11", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultInviteDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -11439,6 +13597,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11469,6 +13637,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11500,33 +13688,30 @@ } } } - } - }, - "/api/v1/monitors/{id}/drift": { - "get": { + }, + "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "IaC-declared baseline vs live overlays", - "operationId": "drift", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create invite", + "operationId": "create_12", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateInviteRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -11551,6 +13736,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11581,6 +13776,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11614,40 +13829,31 @@ } } }, - "/api/v1/monitors/{id}/mute": { + "/api/v1/invites/{inviteId}/resend": { "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Mute alert delivery without flipping enabled", - "operationId": "mute", + "summary": "Resend invite", + "operationId": "resend_1", "parameters": [ { - "name": "id", + "name": "inviteId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -11672,6 +13878,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11702,6 +13918,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11735,53 +13971,40 @@ } } }, - "/api/v1/monitors/{id}/overview/steps": { - "get": { + "/api/v1/invites/{inviteId}/revoke": { + "post": { "tags": [ - "Check Results" + "Invites" ], - "summary": "Overview step catalog", - "description": "Step catalog from finished runs of the Head revision in the window, with first-try and flake aggregates. Empty when the monitor has no step catalog.", - "operationId": "getMonitorOverviewSteps", + "summary": "Revoke invite", + "operationId": "revoke", "parameters": [ { - "name": "id", + "name": "inviteId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "window", - "in": "query", - "description": "Time window for step aggregates", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -11790,8 +14013,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -11830,6 +14053,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11863,40 +14106,42 @@ } } }, - "/api/v1/monitors/{id}/pause": { - "post": { + "/api/v1/maintenance-windows": { + "get": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Pause a monitor", - "operationId": "pause", + "summary": "List maintenance windows for the authenticated org", + "description": "Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).", + "operationId": "list_10", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "monitorId", + "in": "query", + "description": "Filter by monitor UUID", + "required": false, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" - } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" } } } @@ -11921,6 +14166,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11951,6 +14206,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11982,44 +14257,31 @@ } } } - } - }, - "/api/v1/monitors/{id}/publish": { + }, "post": { "tags": [ - "Monitor definitions" - ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Maintenance Windows" ], + "summary": "Create a maintenance window", + "description": "Creates a new maintenance window. Set monitorId to null to create an org-wide window that suppresses alerts for all monitors.", + "operationId": "create_11", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublishRevisionRequest" + "$ref": "#/components/schemas/CreateMaintenanceWindowRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -12044,6 +14306,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12074,6 +14346,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12107,13 +14399,13 @@ } } }, - "/api/v1/monitors/{id}/quarantine": { - "post": { + "/api/v1/maintenance-windows/{id}": { + "get": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Quarantine a monitor", - "operationId": "quarantine", + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", "parameters": [ { "name": "id", @@ -12125,23 +14417,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QuarantineMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -12166,6 +14448,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12196,6 +14488,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12227,15 +14539,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/release-quarantine": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Release quarantine", - "operationId": "releaseQuarantine", + "summary": "Update a maintenance window", + "operationId": "update_12", "parameters": [ { "name": "id", @@ -12247,13 +14557,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -12278,6 +14598,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12308,6 +14638,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12339,16 +14689,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/results": { - "get": { + }, + "delete": { "tags": [ - "Check Results" + "Maintenance Windows" ], - "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": "Delete a maintenance window", + "operationId": "delete_8", "parameters": [ { "name": "id", @@ -12358,84 +14705,18 @@ "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–200)", - "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": "Paginated check results", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } - } - } + "204": { + "description": "No Content" }, "400": { - "description": "Invalid query parameters", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12450,28 +14731,8 @@ } } }, - "403": { - "description": "Monitor does not belong to the caller's org", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } - } - } - }, - "404": { - "description": "Monitor not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12480,8 +14741,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12490,8 +14751,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12500,8 +14761,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12509,67 +14770,9 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/results/summary": { - "get": { - "tags": [ - "Check Results" - ], - "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", - "in": "path", - "required": true, - "schema": { - "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" - ] - } - } - ], - "responses": { - "200": { - "description": "Results summary", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" - } - } - } - }, - "400": { - "description": "Invalid chartWindow parameter", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -12578,28 +14781,8 @@ } } }, - "403": { - "description": "Monitor does not belong to the caller's org", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } - }, - "404": { - "description": "Monitor not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -12641,21 +14824,20 @@ } } }, - "/api/v1/monitors/{id}/resume": { - "post": { + "/api/v1/members": { + "get": { "tags": [ - "Monitors" + "Members" ], - "summary": "Resume a paused monitor", - "operationId": "resume", + "summary": "List organization members", + "operationId": "list_21", "parameters": [ { - "name": "id", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -12665,7 +14847,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMemberDto" } } } @@ -12690,6 +14872,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12720,6 +14912,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12753,46 +14965,40 @@ } } }, - "/api/v1/monitors/{id}/revisions": { - "get": { + "/api/v1/members/{userId}": { + "delete": { "tags": [ - "Monitor definitions" + "Members" ], - "summary": "List revisions published in this monitor's environment", - "description": "Omits drafts never published here. Page size default 25.", - "operationId": "listRevisions", + "summary": "Remove member from organization", + "operationId": "remove_2", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12801,8 +15007,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12841,6 +15047,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12874,31 +15100,21 @@ } } }, - "/api/v1/monitors/{id}/revisions/{revisionId}/test": { - "post": { + "/api/v1/members/{userId}/role": { + "put": { "tags": [ - "Monitor definitions" + "Members" ], - "summary": "Run remote validation against a revision without moving Head", - "description": "Admits a queued Run with source=remote_validation. Does not vote on health. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", - "operationId": "testRevision", + "summary": "Change member role", + "operationId": "changeRole", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "revisionId", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], @@ -12906,24 +15122,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" + "$ref": "#/components/schemas/ChangeRoleRequest" } } - } + }, + "required": true }, "responses": { - "202": { - "description": "Accepted", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12932,8 +15152,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12972,6 +15192,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13005,22 +15245,21 @@ } } }, - "/api/v1/monitors/{id}/rollback": { - "post": { + "/api/v1/members/{userId}/status": { + "put": { "tags": [ - "Monitor definitions" + "Members" ], - "summary": "Roll back Head to a prior revision", - "description": "Same Head UPDATE as publish; stores reason on the Head.", - "operationId": "rollback", + "summary": "Change member status", + "operationId": "changeStatus", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], @@ -13028,25 +15267,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RollbackRevisionRequest" + "$ref": "#/components/schemas/ChangeStatusRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13055,8 +15297,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13095,6 +15337,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13128,52 +15390,190 @@ } } }, - "/api/v1/monitors/{id}/rollback-preview": { + "/api/v1/monitors": { "get": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "Preview rollback consequences for this environment", - "operationId": "rollbackPreview", + "summary": "List monitors for the authenticated org", + "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type` or `types`, `managedBy`, `tag` / `tags`, `search`, `environmentId`, `displayHealth`, `needsAttention`, and `region`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", + "operationId": "list_9", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean" } }, { - "name": "revisionId", + "name": "status", "in": "query", - "required": true, + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" - } - } + "type": "string" } }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "types", + "in": "query", + "description": "Filter by monitor types, comma-separated; matches any listed type", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "displayHealth", + "in": "query", + "description": "Filter by projected chip health", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "needsAttention", + "in": "query", + "description": "When true, only monitors that need operator attention", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "region", + "in": "query", + "description": "Filter by probe region", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "triage", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorTriageParams" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, "401": { @@ -13186,6 +15586,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13216,6 +15626,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13247,30 +15677,26 @@ } } } - } - }, - "/api/v1/monitors/{id}/rotate-token": { + }, "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", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a new monitor", + "operationId": "create_10", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { @@ -13299,6 +15725,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13329,6 +15765,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13362,14 +15818,13 @@ } } }, - "/api/v1/monitors/{id}/runs": { + "/api/v1/monitors/{id}": { "get": { "tags": [ - "Monitor Runs" + "Monitors" ], - "summary": "List runs for a code monitor", - "description": "Cursor page of runs from the last 90 days. Default limit 25.", - "operationId": "listMonitorRuns", + "summary": "Get a single monitor by id", + "operationId": "get_6", "parameters": [ { "name": "id", @@ -13379,14 +15834,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/MonitorRunListParams" - } } ], "responses": { @@ -13395,7 +15842,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13420,6 +15867,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13450,6 +15907,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13482,13 +15959,12 @@ } } }, - "post": { + "put": { "tags": [ - "Monitor Runs" + "Monitors" ], - "summary": "Run now", - "description": "Persists a run in queued phase. 409 if no Head or any secret key is missing.", - "operationId": "runNow", + "summary": "Update a monitor", + "operationId": "update_11", "parameters": [ { "name": "id", @@ -13500,13 +15976,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13531,6 +16017,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13561,6 +16057,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13592,16 +16108,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/runs/summary": { - "get": { + }, + "delete": { "tags": [ - "Monitor Runs" + "Monitors" ], - "summary": "Summarize one monitor's execution durations", - "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", - "operationId": "summarizeMonitorRuns", + "summary": "Soft-delete a monitor", + "description": "Also deletes status-page components that represent this monitor. The parent status page stays.", + "operationId": "delete_7", "parameters": [ { "name": "id", @@ -13614,18 +16128,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13634,8 +16151,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13674,6 +16191,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13707,13 +16244,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests": { + "/api/v1/monitors/{id}/drift": { "get": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "List secret requests for a monitor", - "operationId": "list_19", + "summary": "IaC-declared baseline vs live overlays", + "operationId": "drift", "parameters": [ { "name": "id", @@ -13731,7 +16268,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" } } } @@ -13756,6 +16293,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13786,6 +16333,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13819,13 +16386,14 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/{key}": { - "put": { + "/api/v1/monitors/{id}/history": { + "get": { "tags": [ - "Monitor secret requests" + "Monitor History" ], - "summary": "Attach or clear a remapped secret for a key", - "operationId": "remap", + "summary": "List skipped ticks for a monitor", + "description": "Collapsed NotRun rows. These are not Runs and they are not billed.", + "operationId": "listMonitorHistory", "parameters": [ { "name": "id", @@ -13837,31 +16405,31 @@ } }, { - "name": "key", - "in": "path", - "required": true, + "name": "cursor", + "in": "query", + "required": false, "schema": { "type": "string" } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemapSecretRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/CursorPageMonitorHistoryEntryDto" } } } @@ -13886,6 +16454,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13916,6 +16494,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13949,13 +16547,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/rescan": { + "/api/v1/monitors/{id}/mute": { "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "Rescan secret requests from the active package", - "operationId": "rescan", + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", "parameters": [ { "name": "id", @@ -13967,13 +16565,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13998,6 +16605,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14028,6 +16645,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14061,13 +16698,14 @@ } } }, - "/api/v1/monitors/{id}/session": { + "/api/v1/monitors/{id}/overview/steps": { "get": { "tags": [ - "Monitor session" + "Check Results" ], - "summary": "Get the monitor session", - "operationId": "getSession", + "summary": "Overview step catalog", + "description": "Step catalog from finished runs of the Head revision in the window, with first-try and flake aggregates. Empty when the monitor has no step catalog.", + "operationId": "getMonitorOverviewSteps", "parameters": [ { "name": "id", @@ -14077,15 +16715,50 @@ "type": "string", "format": "uuid" } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { + }, + { + "name": "window", + "in": "query", + "description": "Time window for step aggregates", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to inspect; defaults to the live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "lastRuns", + "in": "query", + "description": "Latest settled runs, 1–30; ignores the window within retention", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" } } } @@ -14110,6 +16783,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14140,6 +16823,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14171,13 +16874,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/pause": { + "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Create or update the monitor session", - "operationId": "putSession", + "summary": "Pause a monitor", + "operationId": "pause", "parameters": [ { "name": "id", @@ -14193,11 +16898,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + "$ref": "#/components/schemas/MonitorOverlayRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -14205,7 +16909,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14230,6 +16934,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14260,6 +16974,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14293,13 +17027,14 @@ } } }, - "/api/v1/monitors/{id}/session/renew": { + "/api/v1/monitors/{id}/publish": { "post": { "tags": [ - "Monitor session" + "Monitor definitions" ], - "summary": "Renew the monitor session", - "operationId": "renewSession", + "summary": "Publish a revision as Head for this monitor", + "description": "Untested and failed-test revisions publish. requireTested needs a passing test in this environment on the pinned runtime within 24 hours. Does not upload a new bundle.", + "operationId": "publish", "parameters": [ { "name": "id", @@ -14311,13 +17046,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -14342,6 +17087,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14372,6 +17127,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14405,13 +17180,13 @@ } } }, - "/api/v1/monitors/{id}/session/revoke": { + "/api/v1/monitors/{id}/quarantine": { "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Revoke the monitor session", - "operationId": "revokeSession", + "summary": "Quarantine a monitor", + "operationId": "quarantine", "parameters": [ { "name": "id", @@ -14423,13 +17198,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuarantineMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14454,6 +17239,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14484,6 +17279,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14517,13 +17332,13 @@ } } }, - "/api/v1/monitors/{id}/settings/preview": { - "get": { + "/api/v1/monitors/{id}/release-quarantine": { + "post": { "tags": [ "Monitors" ], - "summary": "Projected run volume and meter headroom", - "operationId": "settingsPreview", + "summary": "Release quarantine", + "operationId": "releaseQuarantine", "parameters": [ { "name": "id", @@ -14541,7 +17356,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14566,6 +17381,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14596,6 +17421,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14629,14 +17474,14 @@ } } }, - "/api/v1/monitors/{id}/status-pages": { - "get": { + "/api/v1/monitors/{id}/restore": { + "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": "Restore a deleted monitor", + "description": "Restores the monitor, its status-page components and its schedule. Counts against the plan's monitor limit. An optional environmentId selects a code monitor's restore environment.", + "operationId": "restore", "parameters": [ { "name": "id", @@ -14648,13 +17493,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreMonitorRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14679,6 +17533,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14709,6 +17573,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14742,13 +17626,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 — 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", @@ -14758,25 +17643,84 @@ "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–200)", + "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" } } } @@ -14791,8 +17735,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14801,12 +17745,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$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" } } } @@ -14821,6 +17775,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14852,13 +17826,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/results/by-region": { + "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 per-region uptime and latency series", + "description": "Returns clock-aligned buckets of p50/p95/p99 latency and pass counts per region. 24h uses 30-minute buckets, 7d uses 3-hour buckets, and 30d uses 12-hour buckets. previousUptimePercent covers the equal-length window before this one.", + "operationId": "getMonitorResultsByRegion", "parameters": [ { "name": "id", @@ -14868,35 +17845,48 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" - } + }, + { + "name": "window", + "in": "query", + "description": "Time window: 24h (30-minute buckets), 7d (3-hour), 30d (12-hour)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d" + ] } }, - "required": true - }, + { + "name": "region", + "in": "query", + "description": "Limit to one of the monitor's regions (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { - "description": "OK", + "description": "Per-region chart series", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/RegionResultSeriesDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid window or region parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" } } } @@ -14911,8 +17901,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14921,12 +17911,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, "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/SingleValueResponseRegionResultSeriesDto" } } } @@ -14941,6 +17941,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14972,13 +17992,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/results/summary": { + "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "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", @@ -14988,28 +18011,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/RemoveMonitorTagsRequest" + "responses": { + "200": { + "description": "Results summary", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ResultSummaryDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -15024,8 +18059,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15034,12 +18069,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$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" } } } @@ -15054,6 +18099,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15087,13 +18152,13 @@ } } }, - "/api/v1/monitors/{id}/takeover": { + "/api/v1/monitors/{id}/resume": { "post": { "tags": [ "Monitors" ], - "summary": "Claim a field for dashboard ownership or reset an overlay", - "operationId": "takeover", + "summary": "Resume a paused monitor", + "operationId": "resume", "parameters": [ { "name": "id", @@ -15105,16 +18170,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TakeoverMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -15146,6 +18201,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15176,6 +18241,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15209,14 +18294,14 @@ } } }, - "/api/v1/monitors/{id}/test": { - "post": { + "/api/v1/monitors/{id}/revisions": { + "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Test an existing monitor", - "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", - "operationId": "testExisting", + "summary": "List revisions that were live for this monitor", + "description": "Default is live and previous revisions. Pass state for drafts, or state=all. Page size default 25.", + "operationId": "listRevisions", "parameters": [ { "name": "id", @@ -15226,40 +18311,48 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } + }, + { + "name": "state", + "in": "query", + "description": "Comma-separated draft, tested_passed, tested_failed, live, previous, discarded, or all; default live,previous", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } - }, + ], "responses": { "200": { - "description": "Probe result for an uptime monitor", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultRevisionDto" } } } }, - "202": { - "description": "Queued validation run for a browser or multi-step API monitor", + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15268,8 +18361,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15308,6 +18401,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15339,16 +18452,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/test-notifications": { + }, "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": "Save a draft revision", + "description": "Does not change the revision scheduled runs execute. Reuses a draft with the same digest.", + "operationId": "createDraft", "parameters": [ { "name": "id", @@ -15358,13 +18469,21 @@ "type": "string", "format": "uuid" } + }, + { + "name": "X-DevHelm-Client", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + "$ref": "#/components/schemas/CreateDraftRevisionRequest" } } }, @@ -15376,7 +18495,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseCreateDraftRevisionResponse" } } } @@ -15401,6 +18520,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15431,6 +18560,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15464,13 +18613,13 @@ } } }, - "/api/v1/monitors/{id}/unmute": { - "post": { + "/api/v1/monitors/{id}/revisions/{revisionId}": { + "delete": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Clear mute overlay", - "operationId": "unmute", + "summary": "Discard a draft revision", + "operationId": "discardDraft", "parameters": [ { "name": "id", @@ -15480,21 +18629,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15503,8 +18664,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15543,6 +18704,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15576,14 +18757,13 @@ } } }, - "/api/v1/monitors/{id}/uptime": { - "get": { + "/api/v1/monitors/{id}/revisions/{revisionId}/keep": { + "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. Daily windows fall back to hourly when the daily rollup reports fewer checks.", - "operationId": "getUptime", + "summary": "Extend an open draft for another fourteen days", + "operationId": "keepDraft", "parameters": [ { "name": "id", @@ -15595,38 +18775,32 @@ } }, { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, + "name": "revisionId", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] + "format": "uuid" } } ], "responses": { "200": { - "description": "Uptime statistics", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } }, "400": { - "description": "Invalid window parameter", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -15641,22 +18815,32 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden — 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 — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -15671,6 +18855,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15704,13 +18908,14 @@ } } }, - "/api/v1/monitors/{id}/usage-preview": { + "/api/v1/monitors/{id}/revisions/{revisionId}/test": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Project monthly usage for an update payload", - "operationId": "previewUsage", + "summary": "Run remote validation against a revision without moving Head", + "description": "Admits a queued Run with source=remote_validation. Does not vote on health. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", + "operationId": "testRevision", "parameters": [ { "name": "id", @@ -15720,25 +18925,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" + "$ref": "#/components/schemas/CodeTestTargetRequest" } } - }, - "required": true + } }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -15763,6 +18976,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15793,6 +19016,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15826,14 +19069,14 @@ } } }, - "/api/v1/monitors/{id}/versions": { - "get": { + "/api/v1/monitors/{id}/rollback": { + "post": { "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": "Roll back Head to a prior live revision", + "description": "revisionId null restores the previous live revision. Returns this monitor's head and its open incidents.", + "operationId": "rollback", "parameters": [ { "name": "id", @@ -15843,23 +19086,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RollbackRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -15884,6 +19129,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15914,6 +19169,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15947,14 +19222,13 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { + "/api/v1/monitors/{id}/rollback-preview": { "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "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": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", "parameters": [ { "name": "id", @@ -15966,12 +19240,13 @@ } }, { - "name": "version", - "in": "path", - "required": true, + "name": "revisionId", + "in": "query", + "description": "Revision to preview; null previews the previous live revision", + "required": false, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], @@ -15981,7 +19256,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" } } } @@ -16006,6 +19281,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16036,6 +19321,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16069,16 +19374,17 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ - "Monitor Alert Channels" + "Monitors" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "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": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16087,23 +19393,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -16128,6 +19424,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16158,6 +19464,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16191,41 +19517,40 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions": { - "post": { + "/api/v1/monitors/{id}/runs": { + "get": { "tags": [ - "Monitor Assertions" + "Monitor Runs" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "List runs for a code monitor", + "description": "Cursor page of runs from the last 90 days. 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/CreateAssertionRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -16250,6 +19575,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16280,6 +19615,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16311,18 +19666,17 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + }, + "post": { "tags": [ - "Monitor Assertions" + "Monitor Runs" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "summary": "Run a code monitor now", + "description": "Starts one queued run in the monitor's first region. Works on paused monitors and does not affect health.", + "operationId": "runNow", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16331,32 +19685,21 @@ } }, { - "name": "assertionId", - "in": "path", - "required": true, + "name": "Idempotency-Key", + "in": "header", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -16381,6 +19724,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16411,6 +19764,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16442,25 +19815,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/runs/regional-health": { + "get": { "tags": [ - "Monitor Assertions" + "monitor-run-diagnostics-controller" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Get regional run health without changing incident evaluation", + "operationId": "health", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16470,8 +19836,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRegionalHealthDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16493,6 +19866,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16523,6 +19906,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16556,16 +19959,16 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { - "put": { + "/api/v1/monitors/{id}/runs/schedule": { + "get": { "tags": [ - "Monitor Auth" + "monitor-run-diagnostics-controller" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "Get the next actual scheduler admission time", + "operationId": "schedule", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16574,23 +19977,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorScheduleDto" } } } @@ -16615,6 +20008,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16645,6 +20048,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16676,41 +20099,62 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/runs/series": { + "get": { "tags": [ - "Monitor Auth" + "monitor-run-diagnostics-controller" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Get execution-duration and regional target-health chart buckets", + "operationId": "series", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } + }, + { + "name": "window", + "in": "query", + "description": "Chart window: 24h, 7d, or 30d", + "required": false, + "schema": { + "type": "string", + "default": "24h" } }, - "required": true - }, + { + "name": "revisionId", + "in": "query", + "description": "Limit chart samples to one revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "region", + "in": "query", + "description": "Limit chart samples to one configured region", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunSeriesDto" } } } @@ -16735,6 +20179,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16765,6 +20219,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16796,16 +20270,19 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/runs/summary": { + "get": { "tags": [ - "Monitor Auth" + "Monitor Runs" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", + "summary": "Summarize one monitor's execution durations", + "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", + "operationId": "summarizeMonitorRuns", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16815,8 +20292,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16838,6 +20322,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16868,6 +20362,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16901,33 +20415,41 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { + "/api/v1/monitors/{id}/secret-requests": { "get": { "tags": [ - "Incident Policies" + "Monitor secret requests" ], - "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": "List secret requests for a monitor", + "operationId": "list_20", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision whose key demand to preview; null uses live", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -16952,6 +20474,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16963,11 +20495,11 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -16982,6 +20514,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17013,31 +20565,39 @@ } } } - }, + } + }, + "/api/v1/monitors/{id}/secret-requests/{key}": { "put": { "tags": [ - "Incident Policies" + "Monitor secret requests" ], - "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": "Attach or clear a remapped secret for a key", + "operationId": "remap", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + "$ref": "#/components/schemas/RemapSecretRequest" } } }, @@ -17045,21 +20605,21 @@ }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } }, "400": { - "description": "Validation error in JSONB shape", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17074,6 +20634,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17085,11 +20655,11 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17104,6 +20674,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17137,31 +20727,31 @@ } } }, - "/api/v1/monitors/bulk": { + "/api/v1/monitors/{id}/secret-requests/rescan": { "post": { "tags": [ - "Monitors" + "Monitor secret requests" ], - "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": "Rescan secret requests from the active package", + "operationId": "rescan", + "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/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -17186,6 +20776,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17216,6 +20816,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17249,30 +20869,31 @@ } } }, - "/api/v1/monitors/package-uploads": { - "post": { + "/api/v1/monitors/{id}/session": { + "get": { "tags": [ - "Monitors" + "Monitor session" ], - "summary": "Mint a signed package upload URL", - "operationId": "createPackageUpload", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreatePackageUploadRequest" - } + "summary": "Get the monitor session", + "operationId": "getSession", + "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/SingleValueResponsePackageUploadDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17297,6 +20918,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17327,6 +20958,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17358,21 +21009,29 @@ } } } - } - }, - "/api/v1/monitors/test": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Monitor session" + ], + "summary": "Create or update the monitor session", + "operationId": "putSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "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. Inline browser and multi-step API code is refused with MONITOR_TEST_BUNDLE_UNAVAILABLE until a bundle can be uploaded.", - "operationId": "testAdHoc", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" } } }, @@ -17384,7 +21043,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17409,6 +21068,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17439,99 +21108,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/api/v1/monitors/usage-preview": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Project monthly usage for a create payload", - "operationId": "previewUsage_1", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" - } - } - } - }, - "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", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -17540,8 +21118,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -17583,19 +21161,17 @@ } } }, - "/api/v1/notification-dispatches": { - "get": { + "/api/v1/monitors/{id}/session/renew": { + "post": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "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": "Renew the monitor session", + "operationId": "renewSession", "parameters": [ { - "name": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { "type": "string", @@ -17604,12 +21180,12 @@ } ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -17634,6 +21210,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17664,6 +21250,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17697,14 +21303,13 @@ } } }, - "/api/v1/notification-dispatches/{id}": { - "get": { + "/api/v1/monitors/{id}/session/revoke": { + "post": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "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": "Revoke the monitor session", + "operationId": "revokeSession", "parameters": [ { "name": "id", @@ -17722,7 +21327,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17747,6 +21352,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17777,6 +21392,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17810,14 +21445,13 @@ } } }, - "/api/v1/notification-dispatches/{id}/acknowledge": { - "post": { + "/api/v1/monitors/{id}/sessions": { + "get": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "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": "List sign-in sessions by setup file", + "operationId": "listMonitorSetupSessions", "parameters": [ { "name": "id", @@ -17835,7 +21469,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultMonitorSessionDto" } } } @@ -17860,6 +21494,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17890,6 +21534,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17921,16 +21585,13 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { - "post": { + }, + "put": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "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": "Create or update one setup-file session", + "operationId": "upsertMonitorSetupSession", "parameters": [ { "name": "id", @@ -17942,13 +21603,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17973,6 +21644,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18003,6 +21684,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18036,20 +21737,40 @@ } } }, - "/api/v1/notification-policies": { - "get": { + "/api/v1/monitors/{id}/sessions/renew": { + "post": { "tags": [ - "Notification Policies" + "Monitor session" + ], + "summary": "Capture a new session for one setup file", + "operationId": "renewMonitorSetupSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "setupFile", + "in": "query", + "description": "Setup file to capture", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -18074,48 +21795,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -18124,47 +21805,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "post": { - "tags": [ - "Notification Policies" - ], - "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": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18173,8 +21815,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18183,8 +21825,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -18193,8 +21835,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -18203,8 +21845,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -18246,13 +21888,13 @@ } } }, - "/api/v1/notification-policies/{id}": { - "get": { + "/api/v1/monitors/{id}/sessions/revoke": { + "post": { "tags": [ - "Notification Policies" + "Monitor session" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "Revoke the cache for one setup file", + "operationId": "revokeMonitorSetupSession", "parameters": [ { "name": "id", @@ -18262,6 +21904,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "setupFile", + "in": "query", + "description": "Setup file to revoke", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -18270,7 +21921,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -18295,6 +21946,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18325,6 +21986,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18356,13 +22037,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/settings/preview": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "summary": "Projected run volume and meter headroom", + "operationId": "settingsPreview", "parameters": [ { "name": "id", @@ -18374,23 +22057,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" } } } @@ -18415,6 +22088,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18445,6 +22128,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18476,13 +22179,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/status-pages": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", + "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", @@ -18495,8 +22201,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -18518,6 +22231,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18548,6 +22271,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18581,14 +22324,13 @@ } } }, - "/api/v1/notification-policies/{id}/dispatches": { + "/api/v1/monitors/{id}/tags": { "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "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", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { "name": "id", @@ -18598,45 +22340,6 @@ "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" - } } ], "responses": { @@ -18645,7 +22348,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -18670,6 +22373,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18700,6 +22413,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18731,15 +22464,13 @@ } } } - } - }, - "/api/v1/notification-policies/{id}/test": { + }, "post": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { "name": "id", @@ -18755,10 +22486,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" + "$ref": "#/components/schemas/AddMonitorTagsRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -18766,7 +22498,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -18791,6 +22523,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18821,6 +22563,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18852,57 +22614,38 @@ } } } - } - }, - "/api/v1/notifications": { - "get": { + }, + "delete": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "List notifications for the current user", - "operationId": "list_18", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, + "name": "id", + "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" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -18923,6 +22666,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18953,6 +22706,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18986,27 +22759,44 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/monitors/{id}/takeover": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Claim a field for dashboard ownership or reset an overlay", + "operationId": "takeover", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TakeoverMonitorRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19028,6 +22818,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19058,6 +22858,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19091,16 +22911,54 @@ } } }, - "/api/v1/notifications/read-all": { - "put": { + "/api/v1/monitors/{id}/test": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", + "summary": "Test an existing monitor", + "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", + "operationId": "testExisting", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeTestTargetRequest" + } + } + } + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "Probe result for an uptime monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19122,6 +22980,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19152,6 +23020,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19185,20 +23073,42 @@ } } }, - "/api/v1/notifications/unread-count": { - "get": { + "/api/v1/monitors/{id}/test-notifications": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "Get unread notification count", - "operationId": "unreadCount", + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -19223,6 +23133,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19253,6 +23173,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19286,20 +23226,42 @@ } } }, - "/api/v1/org": { - "get": { + "/api/v1/monitors/{id}/transfer": { + "post": { "tags": [ - "Organizations" + "Monitors" ], - "summary": "Get the current organization", - "operationId": "get_4", + "summary": "Transfer a monitor to another owning tool", + "description": "Changes managedBy in one audited call. Required to change the owner of an owner-enforced or code monitor.", + "operationId": "transfer", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -19324,6 +23286,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19354,6 +23326,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19385,30 +23377,51 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/triggers": { + "post": { "tags": [ - "Organizations" + "Monitor Runs" + ], + "summary": "Trigger a code monitor in several regions", + "description": "Starts one queued run per region; every configured region when none are given. Works on paused monitors. Does not affect health unless signal is true.", + "operationId": "triggerMonitorRuns", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } ], - "summary": "Update the current organization", - "operationId": "update_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + "$ref": "#/components/schemas/TriggerRunRequest" } } - }, - "required": true + } }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/SingleValueResponseTriggerRunsResponse" } } } @@ -19433,6 +23446,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19463,8 +23486,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -19473,8 +23496,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -19483,8 +23506,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -19492,40 +23515,9 @@ } } } - } - } - } - }, - "/api/v1/resource-groups": { - "get": { - "tags": [ - "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/TableValueResultResourceGroupDto" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19534,8 +23526,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "503": { + "description": "Service unavailable — try again shortly", "content": { "application/json": { "schema": { @@ -19543,29 +23535,41 @@ } } } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + } + } + }, + "/api/v1/monitors/{id}/unmute": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Clear mute overlay", + "operationId": "unmute", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + } + ], + "responses": { + "200": { + "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, - "500": { - "description": "Internal server error — see the message field for details", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -19574,8 +23578,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19584,8 +23588,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19593,38 +23597,9 @@ } } } - } - } - }, - "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", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19633,8 +23608,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19643,8 +23618,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -19653,8 +23628,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -19663,8 +23638,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -19706,14 +23681,14 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/monitors/{id}/uptime": { "get": { "tags": [ - "Resource Groups" + "Check Results" ], - "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 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. Daily windows fall back to hourly when the daily rollup reports fewer checks.", + "operationId": "getUptime", "parameters": [ { "name": "id", @@ -19725,32 +23700,38 @@ } }, { - "name": "includeMetrics", + "name": "window", "in": "query", + "description": "Time window for uptime calculation", "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] } } ], "responses": { "200": { - "description": "OK", + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$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" } } } @@ -19765,8 +23746,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19775,12 +23756,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$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" } } } @@ -19795,6 +23786,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19826,13 +23837,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/usage-preview": { + "post": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "summary": "Project monthly usage for an update payload", + "operationId": "previewUsage", "parameters": [ { "name": "id", @@ -19848,7 +23861,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" + "$ref": "#/components/schemas/UpdateMonitorRequest" } } }, @@ -19860,7 +23873,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -19885,6 +23898,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19915,6 +23938,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19946,14 +23989,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/versions": { + "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "Delete a resource group (cascades to member rows)", - "description": "Also deletes status-page components that represent this group. The parent status page stays.", - "operationId": "delete_5", + "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", @@ -19963,11 +24008,26 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19989,6 +24049,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20019,6 +24089,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20052,14 +24142,14 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/monitors/{id}/versions/{version}": { "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "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", + "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", @@ -20069,6 +24159,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { @@ -20077,7 +24176,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } @@ -20102,6 +24201,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20132,6 +24241,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20165,17 +24294,16 @@ } } }, - "/api/v1/resource-groups/{id}/matched-policies": { - "get": { + "/api/v1/monitors/{monitorId}/alert-channels": { + "put": { "tags": [ - "Resource Groups" + "Monitor Alert Channels" ], - "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", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20184,13 +24312,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetAlertChannelsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } @@ -20215,6 +24353,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20245,6 +24393,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20278,16 +24446,16 @@ } } }, - "/api/v1/resource-groups/{id}/members": { + "/api/v1/monitors/{monitorId}/assertions": { "post": { "tags": [ - "Resource Groups" + "Monitor Assertions" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20300,7 +24468,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + "$ref": "#/components/schemas/CreateAssertionRequest" } } }, @@ -20312,7 +24480,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -20337,6 +24505,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20367,6 +24545,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20400,16 +24598,16 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Resource Groups" + "Monitor Assertions" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "Update an assertion on a monitor", + "operationId": "update_10", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20418,7 +24616,7 @@ } }, { - "name": "memberId", + "name": "assertionId", "in": "path", "required": true, "schema": { @@ -20427,9 +24625,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20451,6 +24666,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20481,6 +24706,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20512,18 +24757,25 @@ } } } - } - }, - "/api/v1/revisions/{id}": { - "get": { + }, + "delete": { "tags": [ - "Revisions" + "Monitor Assertions" ], - "summary": "Get revision package", - "operationId": "get_13", + "summary": "Remove an assertion from a monitor", + "operationId": "remove_1", "parameters": [ { - "name": "id", + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", "in": "path", "required": true, "schema": { @@ -20533,18 +24785,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20553,8 +24808,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -20593,6 +24848,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20626,17 +24901,16 @@ } } }, - "/api/v1/revisions/{id}/bundle": { - "get": { + "/api/v1/monitors/{monitorId}/auth": { + "put": { "tags": [ - "Revisions" + "Monitor Auth" ], - "summary": "Redirect to signed package download", - "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", - "operationId": "bundle", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20645,9 +24919,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK" + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20669,6 +24960,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20699,6 +25000,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20730,19 +25051,16 @@ } } } - } - }, - "/api/v1/revisions/{id}/bundle/content": { - "get": { + }, + "post": { "tags": [ - "Revisions" + "Monitor Auth" ], - "summary": "Download revision archive", - "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", - "operationId": "bundleContent", + "summary": "Set authentication config for a monitor", + "operationId": "set", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20751,14 +25069,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { - "application/zip": { + "*/*": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -20783,6 +25110,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20813,6 +25150,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20844,27 +25201,16 @@ } } } - } - }, - "/api/v1/revisions/{id}/diff/{other}": { - "get": { + }, + "delete": { "tags": [ - "Revisions" + "Monitor Auth" ], - "summary": "Compare two revisions (bounded hunks)", - "operationId": "diff", + "summary": "Remove authentication config from a monitor", + "operationId": "remove", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "other", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20874,18 +25220,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20894,8 +25243,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -20934,6 +25283,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20967,31 +25336,33 @@ } } }, - "/api/v1/runs": { + "/api/v1/monitors/{monitorId}/policy": { "get": { "tags": [ - "Runs" + "Incident Policies" ], - "summary": "List code runs", - "description": "Org index. Default window last 30 minutes; from clamped to 90 days. Page size 50.", - "operationId": "listRuns", + "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": "params", - "in": "query", + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string", + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } @@ -21016,6 +25387,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21027,11 +25408,11 @@ } }, "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" } } } @@ -21046,6 +25427,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21077,19 +25478,19 @@ } } } - } - }, - "/api/v1/runs/{id}": { - "get": { + }, + "put": { "tags": [ - "Runs" + "Incident Policies" ], - "summary": "Get a run", - "operationId": "getRun", + "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": "id", + "name": "monitorId", "in": "path", + "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -21097,23 +25498,33 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$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" } } } @@ -21128,6 +25539,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21139,11 +25560,11 @@ } }, "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" } } } @@ -21158,6 +25579,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21191,22 +25632,45 @@ } } }, - "/api/v1/runs/{id}/artifacts": { + "/api/v1/monitors/batch-history": { "get": { "tags": [ - "Runs" + "Monitors" ], - "summary": "List run artifacts", - "description": "Complete persist manifest for this run.", - "operationId": "listRunArtifacts", + "summary": "Availability, p95 and ticks for several monitors", + "description": "History for up to 100 monitors in one call, so a list page needs no per-monitor request. window is 24h (default), 7d or 30d.", + "operationId": "batchHistory", "parameters": [ { - "name": "id", - "in": "path", + "name": "ids", + "in": "query", + "description": "Monitor ids, comma-separated; at most 100", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + }, + { + "name": "window", + "in": "query", + "description": "History window: 24h (default), 7d or 30d", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "density", + "in": "query", + "description": "Return 48 display-only history buckets", + "required": false, + "schema": { + "type": "integer", + "format": "int32" } } ], @@ -21216,7 +25680,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunArtifactDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorBatchHistoryDto" } } } @@ -21241,6 +25705,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21271,6 +25745,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21304,32 +25798,31 @@ } } }, - "/api/v1/runs/{id}/cancel": { + "/api/v1/monitors/bulk": { "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "Request run cancel", - "description": "Sets cancel_requested; phase unchanged.", - "operationId": "cancelRun", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG, UPDATE_SCHEDULE, or RUN 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/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -21354,6 +25847,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21384,6 +25887,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21417,31 +25940,24 @@ } } }, - "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "/api/v1/monitors/export.csv": { "get": { "tags": [ - "Runs" + "monitor-export-controller" ], - "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", + "summary": "Export up to 200 explicitly selected monitors as CSV", + "operationId": "csv", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "artifactId", - "in": "path", + "name": "ids", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -21449,9 +25965,10 @@ "200": { "description": "OK", "content": { - "application/json": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + "type": "string", + "format": "byte" } } } @@ -21476,6 +25993,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21506,6 +26033,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21539,29 +26086,160 @@ } } }, - "/api/v1/runs/{id}/cases": { + "/api/v1/monitors/facets": { "get": { "tags": [ - "Runs" + "Monitors" ], - "summary": "List run cases with nested steps", - "operationId": "listRunCases", + "summary": "Count monitors per list group and facet value", + "description": "Takes the same filters as the monitor list. Groups: failing, not_running, flaky, passing, running, paused. Facet fields: type, environment, region, tag, owner.", + "operationId": "facets", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "types", + "in": "query", + "description": "Filter by monitor types, comma-separated; matches any listed type", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, "schema": { "type": "string", "format": "uuid" } }, { - "name": "params", + "name": "displayHealth", + "in": "query", + "description": "Filter by projected chip health", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "needsAttention", + "in": "query", + "description": "When true, only monitors that need operator attention", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "region", + "in": "query", + "description": "Filter by probe region", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "triage", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/RunCaseListParams" + "$ref": "#/components/schemas/MonitorTriageParams" } } ], @@ -21571,7 +26249,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunCaseDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorListFacetsDto" } } } @@ -21596,6 +26274,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21626,6 +26314,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21659,45 +26367,41 @@ } } }, - "/api/v1/runs/{id}/console": { - "get": { + "/api/v1/monitors/test": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "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" + "summary": "Ad-hoc monitor test", + "description": "Uptime monitors run once from an inline config and return a probe result (200). Browser and multi-step API monitors with code admit a queued validation run (202) when that bundle is already saved on a monitor. Inline code without a bundle is refused.", + "operationId": "testAdHoc", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorTestRequest" + } } }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunConsoleParams" - } - } - ], + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Probe result for an uptime monitor", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" } - }, - "text/plain": { + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API bundle", + "content": { + "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -21722,6 +26426,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21752,6 +26466,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21785,31 +26519,20 @@ } } }, - "/api/v1/runs/{id}/diff": { + "/api/v1/monitors/trash": { "get": { "tags": [ - "Runs" + "Monitors" ], - "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", + "summary": "List deleted monitors that can still be restored", + "operationId": "listTrash", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "baselineRunId", + "name": "pageable", "in": "query", - "required": false, + "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -21817,9 +26540,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -21844,6 +26567,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21874,6 +26607,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21907,47 +26660,30 @@ } } }, - "/api/v1/runs/{id}/events": { - "get": { + "/api/v1/monitors/usage-preview": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "Stream run control events", - "operationId": "streamRunEvents", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunEventParams" + "summary": "Project monthly usage for a create payload", + "operationId": "previewUsage_1", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } } }, - { - "name": "Last-Event-ID", - "in": "header", - "required": false, - "schema": { - "type": "string" - } - } - ], + "required": true + }, "responses": { "200": { - "description": "Server-sent persist control events", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunEventDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -21972,6 +26708,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22002,6 +26748,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22035,30 +26801,32 @@ } } }, - "/api/v1/runs/{id}/export": { - "get": { + "/api/v1/monitors/validate": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Dry-run plan, secret, and runtime checks", + "operationId": "validateMonitors", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateMonitorsRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { - "description": "Zip of snapshot.json and available artifacts", + "description": "OK", "content": { - "application/zip": {} + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorValidationResultDto" + } + } } }, "400": { @@ -22081,6 +26849,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22111,6 +26889,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22144,31 +26942,24 @@ } } }, - "/api/v1/runs/{id}/network": { + "/api/v1/notification-dispatches": { "get": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "List run network rows", - "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", - "operationId": "listRunNetwork", + "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": "id", - "in": "path", + "name": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunNetworkParams" - } } ], "responses": { @@ -22177,7 +26968,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RunNetworkDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } @@ -22202,6 +26993,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22232,6 +27033,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22265,14 +27086,14 @@ } } }, - "/api/v1/runs/{id}/network/{rowId}": { + "/api/v1/notification-dispatches/{id}": { "get": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Get one network row", - "description": "Includes redacted headers, bodies, and copy-as-cURL.", - "operationId": "getRunNetworkRow", + "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", @@ -22282,14 +27103,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "rowId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } } ], "responses": { @@ -22298,7 +27111,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -22323,6 +27136,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22353,6 +27176,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22386,14 +27229,14 @@ } } }, - "/api/v1/runs/{id}/runner-log": { - "get": { + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Snapshot in-flight runner log", - "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail — 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", + "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", @@ -22409,14 +27252,9 @@ "200": { "description": "OK", "content": { - "text/plain": { - "schema": { - "type": "string" - } - }, "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -22441,6 +27279,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22471,6 +27319,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22504,14 +27372,14 @@ } } }, - "/api/v1/runs/{id}/runner-log/live": { - "get": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "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", + "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", @@ -22525,11 +27393,11 @@ ], "responses": { "200": { - "description": "Server-sent runner-log lines", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunnerLogLiveEvent" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -22554,6 +27422,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22584,6 +27462,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22617,31 +27515,20 @@ } } }, - "/api/v1/runs/summary": { + "/api/v1/notification-policies": { "get": { "tags": [ - "Runs" - ], - "summary": "Summarize the filtered Runs population", - "description": "Uses the same enqueue-time window and filters as the Runs list; independent of pagination.", - "operationId": "summarizeRuns", - "parameters": [ - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunListParams" - } - } + "Notification Policies" ], + "summary": "List all notification policies for the authenticated org", + "operationId": "list_8", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -22666,6 +27553,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22696,6 +27593,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22727,22 +27644,30 @@ } } } - } - }, - "/api/v1/secrets": { - "get": { + }, + "post": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "List organization secrets", - "operationId": "list_5", + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_9", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22767,6 +27692,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22797,6 +27732,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22828,30 +27783,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/notification-policies/{id}": { + "get": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } + "summary": "Get a notification policy by ID", + "operationId": "getById_1", + "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/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22876,6 +27834,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22906,6 +27874,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22937,22 +27925,21 @@ } } } - } - }, - "/api/v1/secrets/{key}": { + }, "put": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Update secret", - "operationId": "update_4", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -22960,7 +27947,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" } } }, @@ -22972,7 +27959,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22997,6 +27984,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23027,6 +28024,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23061,17 +28078,18 @@ }, "delete": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Delete secret", - "operationId": "delete_4", + "summary": "Delete a notification policy", + "operationId": "delete_6", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -23099,6 +28117,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23129,6 +28157,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23162,21 +28210,62 @@ } } }, - "/api/v1/secrets/{key}/audit": { + "/api/v1/notification-policies/{id}/dispatches": { "get": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Last update metadata for a secret", - "operationId": "audit", + "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": "key", + "name": "id", "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" + } } ], "responses": { @@ -23185,7 +28274,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } @@ -23210,6 +28299,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23240,6 +28339,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23273,24 +28392,16 @@ } } }, - "/api/v1/secrets/{key}/environments/{environmentId}": { - "put": { + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Write a secret value for one environment", - "operationId": "writeEnvironmentValue", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -23303,15 +28414,21 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" + "$ref": "#/components/schemas/TestNotificationPolicyRequest" } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -23333,6 +28450,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23363,6 +28490,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23396,20 +28543,41 @@ } } }, - "/api/v1/secrets/{key}/usage": { + "/api/v1/notifications": { "get": { "tags": [ - "Secrets" + "Notifications" ], - "summary": "Secret usage across monitors", - "operationId": "usage", + "summary": "List notifications for the current user", + "operationId": "list_19", "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 } } ], @@ -23419,7 +28587,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" + "$ref": "#/components/schemas/TableValueResultNotificationDto" } } } @@ -23444,6 +28612,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23474,6 +28652,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23507,26 +28705,40 @@ } } }, - "/api/v1/service-subscriptions": { - "get": { + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Service Subscriptions" + "Notifications" + ], + "summary": "Mark a notification as read", + "operationId": "markRead", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_17", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23535,8 +28747,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -23575,6 +28787,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23608,37 +28840,29 @@ } } }, - "/api/v1/service-subscriptions/{id}": { - "get": { + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Service Subscriptions" - ], - "summary": "Get a subscription by its ID", - "operationId": "get_12", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23647,8 +28871,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -23687,6 +28911,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23718,28 +28962,25 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notifications/unread-count": { + "get": { "tags": [ - "Service Subscriptions" - ], - "summary": "Remove a subscription by its ID", - "description": "Removes a specific subscription (whole-service or component-level). Also deletes status-page components that represent this dependency. The parent status page stays. No-op if not found.", - "operationId": "unsubscribe_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseLong" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -23761,6 +29002,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23791,6 +29042,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23824,42 +29095,20 @@ } } }, - "/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" } } } @@ -23884,6 +29133,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23914,6 +29173,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23945,42 +29224,30 @@ } } } - } - }, - "/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" } } } @@ -24005,6 +29272,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24035,6 +29312,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24068,96 +29365,20 @@ } } }, - "/api/v1/services": { + "/api/v1/regions": { "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 - } - } + "Regions" ], + "summary": "List public regions", + "operationId": "listRegions", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/SingleValueResponseListRegionDto" } } } @@ -24182,6 +29403,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24212,6 +29443,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24245,51 +29496,20 @@ } } }, - "/api/v1/services/{slugOrId}": { + "/api/v1/resource-groups": { "get": { "tags": [ - "Status Data" - ], - "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 - } - }, - { - "name": "publishedOnly", - "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - } + "Resource Groups" ], + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } @@ -24314,6 +29534,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24344,6 +29574,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24375,72 +29625,30 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components": { - "get": { + }, + "post": { "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", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + "summary": "Create a new resource group", + "operationId": "create_8", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateResourceGroupRequest" + } } }, - { - "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" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24465,6 +29673,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24495,6 +29713,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24528,25 +29766,17 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "/api/v1/resource-groups/{id}": { "get": { "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": "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", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "componentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -24555,38 +29785,12 @@ } }, { - "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", + "name": "includeMetrics", "in": "query", - "description": "Explicit window end (ISO date); defaults to today", "required": false, "schema": { - "type": "string", - "format": "date" + "type": "boolean", + "default": false } } ], @@ -24596,7 +29800,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24621,6 +29825,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24651,6 +29865,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24682,81 +29916,41 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components/uptime": { - "get": { + }, + "put": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Batch daily uptime data for leaf components", - "description": "Returns daily uptime keyed by component ID. Pass ``componentIds`` to limit the batch to those components (max 100); omit it for every active component with uptime data. 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": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_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" - } - }, - { - "name": "componentIds", - "in": "query", - "description": "Component ids to include (max 100); omit for every component", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24781,6 +29975,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24811,6 +30015,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24842,49 +30066,41 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/days/{date}": { - "get": { + }, + "delete": { "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": "Delete a resource group (cascades to member rows)", + "description": "Also deletes status-page components that represent this group. The parent status page stays.", + "operationId": "delete_5", "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" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24893,8 +30109,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -24933,6 +30149,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24966,51 +30202,22 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { + "/api/v1/resource-groups/{id}/health": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "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", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "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": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "format": "uuid" } } ], @@ -25020,7 +30227,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -25045,6 +30252,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25075,6 +30292,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25108,24 +30345,17 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_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", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "incidentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -25140,7 +30370,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -25165,6 +30395,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25195,6 +30435,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25228,31 +30488,41 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { - "get": { + "/api/v1/resource-groups/{id}/members": { + "post": { "tags": [ - "Status Data" + "Resource Groups" ], - "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": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "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/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } @@ -25277,6 +30547,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25307,6 +30587,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25340,45 +30640,36 @@ } } }, - "/api/v1/services/{slugOrId}/maintenances": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "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": "status", - "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, + "name": "memberId", + "in": "path", + "required": true, "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -25400,6 +30691,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25430,6 +30731,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25463,40 +30784,21 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/revisions/{id}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "Get revision package", + "operationId": "get_13", "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" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "string", + "format": "uuid" } } ], @@ -25506,7 +30808,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -25531,6 +30833,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25561,6 +30873,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25594,50 +30926,41 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { + "/api/v1/revisions/{id}/bundle": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "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": "window", - "in": "query", - "description": "Time window", - "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -25646,8 +30969,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -25686,6 +31009,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25719,84 +31062,22 @@ } } }, - "/api/v1/services/{slugOrId}/status-events": { + "/api/v1/revisions/{id}/bundle/content": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "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": "Download revision archive", + "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", + "operationId": "bundleContent", "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" } } ], @@ -25804,9 +31085,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/zip": { "schema": { - "$ref": "#/components/schemas/CursorPageStatusEventDto" + "type": "string", + "format": "binary" } } } @@ -25831,6 +31113,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25861,6 +31153,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25894,53 +31206,30 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/revisions/{id}/diff/{other}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", "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" - ] + "format": "uuid" } }, { - "name": "granularity", - "in": "query", - "description": "Bucket granularity", - "required": false, + "name": "other", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "format": "uuid" } } ], @@ -25950,7 +31239,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } @@ -25975,6 +31264,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26005,6 +31304,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26035,61 +31354,25 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] + } } }, - "/api/v1/services/incidents": { + "/api/v1/revisions/{id}/files": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "Read revision source files", + "description": "Returns the entry file path and source text by path. Returns 404 when the package is unavailable.", + "operationId": "files", "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" } } ], @@ -26099,7 +31382,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionFilesDto" } } } @@ -26124,6 +31407,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26154,6 +31447,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26187,33 +31500,42 @@ } } }, - "/api/v1/services/summary": { - "get": { + "/api/v1/revisions/{id}/purge": { + "post": { "tags": [ - "Status Data" + "Revisions" ], - "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": "Purge revision package bytes", + "description": "Deletes stored package bytes unless another revision shares them. The revision stays; bundle, files and rollback then return 410. 409 while live. Requires an org admin.", + "operationId": "purgeRevision", "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" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -26238,6 +31560,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26268,6 +31600,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26301,20 +31653,31 @@ } } }, - "/api/v1/status-pages": { + "/api/v1/runs": { "get": { "tags": [ - "Status Pages" + "Runs" + ], + "summary": "List code runs", + "description": "Cursor page of runs across the organization. Default window last 24 hours; from is clamped to 90 days.", + "operationId": "listRuns", + "parameters": [ + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunListParams" + } + } ], - "summary": "List status pages for the workspace", - "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -26339,6 +31702,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26369,6 +31742,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26400,30 +31793,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Create a status page", - "operationId": "create_5", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - } + "summary": "Get a run", + "operationId": "getRun", + "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/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26448,6 +31844,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26478,6 +31884,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26511,13 +31937,14 @@ } } }, - "/api/v1/status-pages/{id}": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get a status page", - "operationId": "get_2", + "summary": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", "parameters": [ { "name": "id", @@ -26535,7 +31962,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } @@ -26560,6 +31987,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26590,6 +32027,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26621,13 +32078,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}/cancel": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", "parameters": [ { "name": "id", @@ -26639,23 +32099,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26680,6 +32130,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26710,6 +32170,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26741,13 +32221,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "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": "id", @@ -26757,11 +32240,27 @@ "type": "string", "format": "uuid" } + }, + { + "name": "artifactId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -26783,6 +32282,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26813,6 +32322,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26846,13 +32375,13 @@ } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/runs/{id}/cases": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List all components", - "operationId": "listComponents", + "summary": "List run cases with nested steps", + "operationId": "listRunCases", "parameters": [ { "name": "id", @@ -26862,6 +32391,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunCaseListParams" + } } ], "responses": { @@ -26870,7 +32407,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } @@ -26895,6 +32432,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26925,6 +32472,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26956,13 +32523,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/console": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", "parameters": [ { "name": "id", @@ -26972,25 +32542,28 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunConsoleParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" } } } @@ -27015,6 +32588,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27045,6 +32628,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27078,13 +32681,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + "/api/v1/runs/{id}/diff": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a component", - "operationId": "updateComponent", + "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", @@ -27096,32 +32700,22 @@ } }, { - "name": "componentId", - "in": "path", - "required": true, + "name": "baselineRunId", + "in": "query", + "required": false, "schema": { "type": "string", "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" } } } @@ -27146,6 +32740,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27176,6 +32780,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27207,13 +32831,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/events": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "parameters": [ { "name": "id", @@ -27225,18 +32851,32 @@ } }, { - "name": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunEventParams" + } + }, + { + "name": "Last-Event-ID", + "in": "header", + "required": false, + "schema": { + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "Server-sent persist control events", + "content": { + "text/event-stream": { + "schema": { + "$ref": "#/components/schemas/RunEventDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -27258,6 +32898,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27288,6 +32938,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27321,14 +32991,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + "/api/v1/runs/{id}/export": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "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", + "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", @@ -27338,36 +33008,13 @@ "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 - } } ], "responses": { "200": { - "description": "OK", + "description": "Zip of snapshot.json and available artifacts", "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" - } - } + "application/zip": {} } }, "400": { @@ -27390,6 +33037,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27420,6 +33077,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27453,14 +33130,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/override": { - "put": { + "/api/v1/runs/{id}/network": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "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", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "parameters": [ { "name": "id", @@ -27472,32 +33149,21 @@ } }, { - "name": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunNetworkParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/RunNetworkDto" } } } @@ -27522,6 +33188,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27552,6 +33228,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27583,13 +33279,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/network/{rowId}": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Clear a timed human status override on a component", - "operationId": "clearComponentOverride", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { "name": "id", @@ -27601,12 +33300,11 @@ } }, { - "name": "componentId", + "name": "rowId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -27616,7 +33314,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" } } } @@ -27641,6 +33339,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27671,6 +33379,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27704,14 +33432,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { - "get": { + "/api/v1/runs/{id}/pin": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "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": "Pin a run past retention", + "description": "Keeps the run and its evidence past the retention windows until unpinned.", + "operationId": "pinRun", "parameters": [ { "name": "id", @@ -27721,25 +33449,6 @@ "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 - } } ], "responses": { @@ -27748,7 +33457,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -27773,6 +33482,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27803,6 +33522,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27834,15 +33573,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + }, + "delete": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", + "summary": "Unpin a run", + "description": "Normal retention applies again from the next sweep.", + "operationId": "unpinRun", "parameters": [ { "name": "id", @@ -27854,20 +33592,17 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -27888,6 +33623,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27918,6 +33663,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27951,13 +33716,14 @@ } } }, - "/api/v1/status-pages/{id}/domains": { - "get": { + "/api/v1/runs/{id}/purge": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Purge stored run evidence", + "description": "Deletes artifacts, runner log, console, network and event payloads. The run and its outcome stay; evidence reads return 410. Requires an org admin.", + "operationId": "purgeRun", "parameters": [ { "name": "id", @@ -27969,13 +33735,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -28000,6 +33776,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28030,6 +33816,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28061,13 +33867,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/runner-log": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "Snapshot in-flight runner log", + "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail — 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", @@ -28079,23 +33888,18 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { + "text/plain": { + "schema": { + "type": "string" + } + }, "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "type": "string" } } } @@ -28120,6 +33924,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28150,6 +33964,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28183,13 +34017,14 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/runs/{id}/runner-log/live": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", + "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", @@ -28199,20 +34034,18 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "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", @@ -28234,6 +34067,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28264,6 +34107,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28297,13 +34160,14 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { - "post": { + "/api/v1/runs/{id}/trace-summary": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", + "summary": "Summarize a failed trace", + "description": "Bounded text of failed actions, failed requests, and console errors.", + "operationId": "getRunTraceSummary", "parameters": [ { "name": "id", @@ -28313,15 +34177,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -28330,7 +34185,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseRunTraceSummaryDto" } } } @@ -28355,6 +34210,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28385,6 +34250,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28418,30 +34303,21 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { + "/api/v1/runs/export": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", + "summary": "Export filtered run attempts as CSV", + "description": "At most 31 days and 10000 attempts; refuses larger exports with a structured error. Rows are attempts, not a cycle event history.", + "operationId": "exportRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], @@ -28449,9 +34325,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "type": "string" } } } @@ -28476,6 +34352,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28506,6 +34392,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28539,21 +34445,21 @@ } } }, - "/api/v1/status-pages/{id}/groups": { + "/api/v1/runs/monitors": { "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "List component groups with nested components", - "operationId": "listGroups", + "summary": "Summarize monitor display verdicts for a run window", + "description": "Counts are display categories, not uptime or confirmed incidents. Unknown and pending verdicts remain unclassified.", + "operationId": "getRunMonitorStrip", "parameters": [ { - "name": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -28563,7 +34469,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRunMonitorStripDto" } } } @@ -28588,6 +34494,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28618,6 +34534,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28649,41 +34585,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/revisions": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "List the latest recorded activation of each revision in the window", + "description": "Publication rows are mutable. Repeated activations of the same revision are not an immutable event history.", + "operationId": "listRunRevisionMarkers", "parameters": [ { - "name": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/CursorPageRunRevisionMarkerDto" } } } @@ -28708,6 +34636,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28738,6 +34676,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28771,50 +34729,30 @@ } } }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + "/api/v1/runs/skipped": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Update a component group", - "operationId": "updateGroup", + "summary": "List recorded skipped ticks and current plan-disabled intervals", + "operationId": "listSkippedRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "groupId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunSkippedListParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/CursorPageRunSkippedEntryDto" } } } @@ -28839,6 +34777,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28869,6 +34817,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28900,36 +34868,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/summary": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "summary": "Summarize the filtered Runs population", + "description": "Uses the same enqueue-time window and filters as the Runs list; independent of pagination.", + "operationId": "summarizeRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "groupId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28951,6 +34919,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28981,6 +34959,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29014,46 +35012,22 @@ } } }, - "/api/v1/status-pages/{id}/incidents": { + "/api/v1/secrets": { "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "List incidents for this status page (paginated)", - "operationId": "listIncidents", + "summary": "List organization secrets", + "operationId": "list_6", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "status", + "name": "environmentId", "in": "query", + "description": "Environment whose value metadata to show", "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": "string", + "format": "uuid" } } ], @@ -29063,7 +35037,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } @@ -29088,6 +35062,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29118,6 +35102,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29152,26 +35156,15 @@ }, "post": { "tags": [ - "Status Pages" - ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Secrets" ], + "summary": "Create secret", + "operationId": "create_7", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" + "$ref": "#/components/schemas/CreateSecretRequest" } } }, @@ -29183,7 +35176,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -29208,6 +35201,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29238,6 +35241,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29271,40 +35294,40 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - "get": { + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", + "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/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -29329,6 +35352,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29359,6 +35392,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29391,55 +35444,38 @@ } } }, - "put": { + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29448,8 +35484,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29488,6 +35524,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29519,36 +35575,35 @@ } } } - }, - "delete": { + } + }, + "/api/v1/secrets/{key}/audit": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Last update metadata for a secret", + "operationId": "audit", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29570,6 +35625,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29600,6 +35665,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29633,25 +35718,24 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + "/api/v1/secrets/{key}/environments/{environmentId}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", - "operationId": "dismissIncident", + "summary": "Write a secret value for one environment", + "operationId": "writeEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -29660,6 +35744,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" @@ -29684,6 +35778,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29714,6 +35818,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29745,27 +35869,24 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + }, + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "Remove a secret value from one environment", + "operationId": "deleteEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -29774,28 +35895,22 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29804,8 +35919,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29844,6 +35959,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29877,50 +36012,30 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + "/api/v1/secrets/{key}/usage": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "Secret usage across monitors", + "operationId": "usage", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "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/SingleValueResponseSecretUsageDto" } } } @@ -29945,6 +36060,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29975,6 +36100,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30008,59 +36153,20 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { - "patch": { + "/api/v1/service-subscriptions": { + "get": { "tags": [ - "Status Pages" - ], - "summary": "Edit an existing incident timeline update body", - "operationId": "patchIncidentUpdate", - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Service Subscriptions" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, + "summary": "List all service subscriptions for the organization", + "operationId": "list_18", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" } } } @@ -30085,6 +36191,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30115,6 +36231,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30148,13 +36284,13 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/service-subscriptions/{id}": { + "get": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "Get a subscription by its ID", + "operationId": "get_12", "parameters": [ { "name": "id", @@ -30166,20 +36302,17 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -30200,6 +36333,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30230,6 +36373,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30261,15 +36424,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/maintenance": { - "get": { + }, + "delete": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "List maintenance windows for this status page (paginated)", - "operationId": "listMaintenance", + "summary": "Remove a subscription by its ID", + "description": "Removes a specific subscription (whole-service or component-level). Also deletes status-page components that represent this dependency. The parent status page stays. No-op if not found.", + "operationId": "unsubscribe_1", "parameters": [ { "name": "id", @@ -30279,46 +36441,24 @@ "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": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -30327,8 +36467,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -30367,6 +36507,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30398,13 +36558,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Schedule a maintenance window", - "operationId": "createMaintenance", + "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", @@ -30420,19 +36583,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -30457,6 +36620,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30487,6 +36660,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30520,40 +36713,40 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}": { - "get": { + "/api/v1/service-subscriptions/{slug}": { + "post": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Get a maintenance window with timeline", - "operationId": "getMaintenance", + "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": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "windowId", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceSubscribeRequest" + } + } + } + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -30578,6 +36771,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30608,6 +36811,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30639,50 +36862,98 @@ } } } - }, - "put": { + } + }, + "/api/v1/services": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a maintenance window", - "operationId": "updateMaintenance", + "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": "windowId", - "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/UpdateStatusPageIncidentRequest" - } + }, + { + "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–100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } @@ -30707,6 +36978,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30737,6 +37018,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30768,36 +37069,56 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Cancel a maintenance window", - "operationId": "deleteMaintenance", + "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" } }, { - "name": "windowId", - "in": "path", - "required": true, + "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": "string", - "format": "uuid" + "type": "boolean", + "default": false + } + }, + { + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30819,6 +37140,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30849,6 +37180,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30882,62 +37233,109 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { - "post": { + "/api/v1/services/{slugOrId}/components": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "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", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", - "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" } - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "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" - } - } + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { + { + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" } } @@ -30963,6 +37361,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30996,49 +37414,75 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { - "post": { + "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "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": "windowId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } + }, + { + "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": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -31063,6 +37507,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31093,6 +37547,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31126,50 +37600,79 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Post a maintenance window timeline update", - "operationId": "postMaintenanceUpdate", + "summary": "Batch daily uptime data for leaf components", + "description": "Returns daily uptime keyed by component ID. Pass ``componentIds`` to limit the batch to those components (max 100); omit it for every active component with uptime data. 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", "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": "windowId", - "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" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" } }, - "required": true - }, + { + "name": "componentIds", + "in": "query", + "description": "Component ids to include (max 100); omit for every component", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" } } } @@ -31194,6 +37697,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31224,6 +37737,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31257,59 +37790,41 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + "/api/v1/services/{slugOrId}/days/{date}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Edit an existing maintenance timeline update body", - "operationId": "patchMaintenanceUpdate", + "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", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "windowId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "updateId", + "name": "date", "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "uuid" + "format": "date" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" } } } @@ -31334,6 +37849,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31364,6 +37889,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31397,46 +37942,52 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { + "/api/v1/services/{slugOrId}/incidents": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List notification delivery receipts", - "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", - "operationId": "listNotificationDeliveries", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "from", "in": "query", + "description": "Earliest start date (ISO 8601 date)", "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "eventType", + "name": "status", "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", "required": false, "schema": { "type": "string", "enum": [ - "SUBSCRIPTION_CONFIRMATION", - "INCIDENT_CREATED", - "INCIDENT_UPDATED", - "INCIDENT_RESOLVED" + "active", + "resolved" ] } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -31445,7 +37996,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -31470,6 +38021,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31500,6 +38061,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31533,25 +38114,24 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", + "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" } }, { - "name": "deliveryId", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -31566,7 +38146,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -31591,6 +38171,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31621,6 +38211,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31654,31 +38264,21 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { - "post": { + "/api/v1/services/{slugOrId}/live-status": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "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": "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": "deliveryId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -31688,7 +38288,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } @@ -31713,6 +38313,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31743,6 +38353,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31776,29 +38406,32 @@ } } }, - "/api/v1/status-pages/{id}/subscribers": { + "/api/v1/services/{slugOrId}/maintenances": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List subscribers including awaiting confirmation (paginated)", - "operationId": "listSubscribers", + "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": "pageable", + "name": "status", "in": "query", - "required": true, + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "array", + "items": { + "type": "string" + } } } ], @@ -31808,7 +38441,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -31833,6 +38466,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31863,6 +38506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31894,41 +38557,52 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/poll-results": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", - "operationId": "addSubscriber", + "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" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" - } + }, + { + "name": "cursor", + "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", + "required": false, + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } @@ -31953,6 +38627,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31983,6 +38667,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32016,36 +38720,47 @@ } } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/services/{slugOrId}/poll-summary": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "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", - "format": "uuid" + "type": "string" } }, { - "name": "subscriberId", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d" + ] } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -32067,6 +38782,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32097,6 +38822,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32130,21 +38875,94 @@ } } }, - "/api/v1/synthetics/metrics": { + "/api/v1/services/{slugOrId}/status-events": { "get": { "tags": [ - "Synthetics metrics" + "Status Data" + ], + "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": "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", + "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 + } + } ], - "summary": "Get whole-family Synthetics metrics", - "description": "Returns measured target availability for 30 days and distinct recovered monitors for 7 days.", - "operationId": "getSyntheticsFamilyMetrics", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSyntheticsFamilyMetricsDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } @@ -32169,6 +38987,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32199,6 +39027,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32232,25 +39080,53 @@ } } }, - "/api/v1/synthetics/metrics/run-durations": { + "/api/v1/services/{slugOrId}/uptime": { "get": { "tags": [ - "Synthetics metrics" + "Status Data" ], - "summary": "Get code-monitor duration percentiles", - "description": "Returns exact per-monitor p50 execution durations for the rolling 30-day window.", - "operationId": "getSyntheticsRunDurations", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "monitorIds", - "in": "query", + "name": "slugOrId", + "in": "path", "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "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" + ] } } ], @@ -32260,7 +39136,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" } } } @@ -32285,6 +39161,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32315,6 +39201,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32345,22 +39251,71 @@ } } } - } + }, + "security": [ + { + "BearerAuth": [] + } + ] } }, - "/api/v1/synthetics/runtime-profiles": { + "/api/v1/services/incidents": { "get": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Data" + ], + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", + "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", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } ], - "operationId": "list_16", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuntimeProfileDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -32385,6 +39340,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32415,6 +39380,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32448,19 +39433,23 @@ } } }, - "/api/v1/synthetics/runtime-profiles/{id}": { + "/api/v1/services/summary": { "get": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Data" ], - "operationId": "get_11", + "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, + "name": "publishedOnly", + "in": "query", + "description": "Aggregate only published services (curated public pSEO set); default false", + "required": false, "schema": { - "type": "string" + "type": "boolean", + "default": false } } ], @@ -32470,7 +39459,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRuntimeProfileDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } @@ -32495,6 +39484,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32525,6 +39524,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32558,30 +39577,20 @@ } } }, - "/api/v1/tags": { + "/api/v1/status-pages": { "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" - } - } + "Status Pages" ], - "responses": { + "summary": "List status pages for the workspace", + "operationId": "list_5", + "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -32606,6 +39615,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32636,6 +39655,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32670,15 +39709,15 @@ }, "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Create a new tag", - "operationId": "create_4", + "summary": "Create a status page", + "operationId": "create_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateTagRequest" + "$ref": "#/components/schemas/CreateStatusPageRequest" } } }, @@ -32690,7 +39729,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32715,6 +39754,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32745,6 +39794,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32778,13 +39847,13 @@ } } }, - "/api/v1/tags/{id}": { + "/api/v1/status-pages/{id}": { "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Get a tag by ID", - "operationId": "getById", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", @@ -32802,7 +39871,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32827,6 +39896,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32857,6 +39936,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32891,10 +39990,10 @@ }, "put": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { "name": "id", @@ -32910,7 +40009,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" + "$ref": "#/components/schemas/UpdateStatusPageRequest" } } }, @@ -32922,7 +40021,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32947,6 +40046,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32977,6 +40086,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33011,10 +40140,10 @@ }, "delete": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", + "summary": "Delete a status page", + "operationId": "delete_3", "parameters": [ { "name": "id", @@ -33050,8 +40179,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33060,80 +40189,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/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 — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -33142,8 +40199,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -33152,8 +40209,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -33162,8 +40219,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -33172,8 +40229,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -33215,29 +40272,21 @@ } } }, - "/api/v1/webhook/inboxes": { + "/api/v1/status-pages/{id}/components": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List webhook testing inboxes for the workspace", - "operationId": "listWebhookInboxes", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -33247,7 +40296,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookInboxDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" } } } @@ -33272,6 +40321,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33302,6 +40361,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33336,15 +40415,26 @@ }, "post": { "tags": [ - "Webhook Testing" + "Status Pages" + ], + "summary": "Add a component to the status page", + "operationId": "createComponent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create a webhook testing inbox", - "operationId": "createWebhookInbox", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookInboxRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, @@ -33356,7 +40446,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -33381,6 +40471,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33411,6 +40511,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33444,16 +40564,25 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}": { - "get": { + "/api/v1/status-pages/{id}/components/{componentId}": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get a webhook testing inbox", - "operationId": "getWebhookInbox", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { - "name": "inboxId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", "in": "path", "required": true, "schema": { @@ -33462,13 +40591,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -33493,6 +40632,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33523,6 +40672,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33557,13 +40726,22 @@ }, "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete a webhook testing inbox and cascade events", - "operationId": "deleteWebhookInbox", + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { - "name": "inboxId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", "in": "path", "required": true, "schema": { @@ -33596,58 +40774,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33655,49 +40783,9 @@ } } } - } - } - }, - "patch": { - "tags": [ - "Webhook Testing" - ], - "summary": "Patch a webhook testing inbox", - "operationId": "updateWebhookInbox", - "parameters": [ - { - "name": "inboxId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWebhookInboxRequest" - } - } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -33706,8 +40794,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -33716,8 +40804,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -33726,8 +40814,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -33736,8 +40824,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -33779,16 +40867,17 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events": { + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List captured HTTP events newest-first", - "operationId": "listWebhookEvents", + "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": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33797,46 +40886,22 @@ } }, { - "name": "cursor", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "method", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "path", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "after", - "in": "query", - "required": false, + "name": "componentId", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } }, { - "name": "limit", + "name": "days", "in": "query", "required": false, "schema": { "type": "integer", "format": "int32", - "default": 50 + "default": 90 } } ], @@ -33846,7 +40911,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageWebhookEventDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } @@ -33871,6 +40936,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33901,91 +40976,8 @@ } } }, - "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" - } - } - } - } - } - }, - "delete": { - "tags": [ - "Webhook Testing" - ], - "summary": "Delete every captured event on this inbox", - "operationId": "deleteWebhookEvents", - "parameters": [ - { - "name": "inboxId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "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", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -33994,8 +40986,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -34037,16 +41029,17 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}": { - "get": { + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get one captured HTTP event", - "operationId": "getWebhookEvent", + "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": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34055,7 +41048,7 @@ } }, { - "name": "eventId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -34064,13 +41057,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEventDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -34095,6 +41098,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34125,6 +41138,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34159,13 +41192,13 @@ }, "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete one captured event", - "operationId": "deleteWebhookEvent", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34174,7 +41207,7 @@ } }, { - "name": "eventId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -34184,8 +41217,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -34207,6 +41247,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34237,6 +41287,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34270,16 +41340,17 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}/raw": { + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Signed URL for the raw captured request", - "operationId": "getWebhookEventRaw", + "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", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34288,13 +41359,23 @@ } }, { - "name": "eventId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 + } } ], "responses": { @@ -34303,7 +41384,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -34328,6 +41409,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34358,6 +41449,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34391,16 +41502,16 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/wait": { - "post": { + "/api/v1/status-pages/{id}/components/reorder": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Wait for the oldest matching captured HTTP event", - "operationId": "waitForWebhookEvent", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34413,21 +41524,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WaitWebhookEventRequest" + "$ref": "#/components/schemas/ReorderComponentsRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/WaitWebhookEventResponse" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -34449,6 +41554,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34469,8 +41584,8 @@ } } }, - "408": { - "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -34479,8 +41594,18 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -34522,25 +41647,21 @@ } } }, - "/api/v1/webhook/inboxes/activity": { + "/api/v1/status-pages/{id}/domains": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Last-24h received-request activity for webhook inboxes", - "operationId": "listWebhookInboxActivity", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { - "name": "inboxIds", - "in": "query", - "description": "Comma-separated inbox ids (1–100)", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "type": "string", + "format": "uuid" } } ], @@ -34550,7 +41671,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListWebhookInboxActivityDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" } } } @@ -34575,38 +41696,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34615,59 +41706,8 @@ } } }, - "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" - } - } - } - } - } - } - }, - "/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 — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -34676,8 +41716,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -34686,8 +41726,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -34696,8 +41736,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -34706,8 +41746,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -34750,15 +41790,26 @@ }, "post": { "tags": [ - "Webhooks" + "Status Pages" + ], + "summary": "Add a custom domain", + "operationId": "addDomain", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + "$ref": "#/components/schemas/AddCustomDomainRequest" } } }, @@ -34770,7 +41821,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -34795,6 +41846,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34825,6 +41886,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34858,13 +41939,13 @@ } } }, - "/api/v1/webhooks/{id}": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { "name": "id", @@ -34874,21 +41955,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -34897,8 +41990,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34937,6 +42030,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34968,13 +42081,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", "parameters": [ { "name": "id", @@ -34984,25 +42099,24 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "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" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -35027,6 +42141,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35057,6 +42181,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35088,13 +42232,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { "name": "id", @@ -35104,11 +42250,27 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -35130,6 +42292,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35160,6 +42332,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35193,13 +42385,13 @@ } } }, - "/api/v1/webhooks/{id}/deliveries": { + "/api/v1/status-pages/{id}/groups": { "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", + "summary": "List component groups with nested components", + "operationId": "listGroups", "parameters": [ { "name": "id", @@ -35209,16 +42401,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 - } } ], "responses": { @@ -35227,7 +42409,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" } } } @@ -35252,6 +42434,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35282,6 +42474,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35313,15 +42525,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 component group", + "operationId": "createGroup", "parameters": [ { "name": "id", @@ -35337,18 +42547,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -35373,58 +42584,8 @@ } } }, - "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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35432,31 +42593,9 @@ } } } - } - } - } - }, - "/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 — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -35465,8 +42604,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -35475,8 +42614,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -35485,8 +42624,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -35495,8 +42634,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -35538,20 +42677,50 @@ } } }, - "/api/v1/webhooks/signing-secret": { - "get": { + "/api/v1/status-pages/{id}/groups/{groupId}": { + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", + "summary": "Update a component group", + "operationId": "updateGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -35576,6 +42745,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35606,6 +42785,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35637,28 +42836,49 @@ } } } - } - }, - "/api/v1/webhooks/signing-secret/rotate": { - "post": { + }, + "delete": { "tags": [ - "Webhooks" + "Status Pages" + ], + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseString" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -35667,8 +42887,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35707,6 +42927,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35740,14 +42980,40 @@ } } }, - "/api/v1/workspaces": { + "/api/v1/status-pages/{id}/incidents": { "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "List workspaces", - "operationId": "list_1", + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "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", @@ -35763,7 +43029,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -35788,6 +43054,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35818,6 +43094,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35852,15 +43148,26 @@ }, "post": { "tags": [ - "Workspaces" + "Status Pages" + ], + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", + "parameters": [ + { + "name": "id", + "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/CreateStatusPageIncidentRequest" } } }, @@ -35872,7 +43179,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35897,6 +43204,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35927,6 +43244,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35960,21 +43297,30 @@ } } }, - "/api/v1/workspaces/{workspaceId}": { + "/api/v1/status-pages/{id}/incidents/{incidentId}": { "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Get workspace by ID", - "operationId": "get", + "summary": "Get incident details with timeline", + "operationId": "getIncident", "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" } } ], @@ -35984,7 +43330,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -36009,6 +43355,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36039,6 +43395,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36073,18 +43449,27 @@ }, "put": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Update workspace", - "operationId": "update", + "summary": "Update an incident", + "operationId": "updateIncident", "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" } } ], @@ -36092,7 +43477,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRequest" + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" } } }, @@ -36104,7 +43489,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -36129,6 +43514,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36159,6 +43554,8810 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { + "post": { + "tags": [ + "Status Pages" + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", + "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/PublishStatusPageIncidentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { + "post": { + "tags": [ + "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" + } + } + ], + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { + "tags": [ + "Status Pages" + ], + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", + "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", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/layout/reorder": { + "put": { + "tags": [ + "Status Pages" + ], + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderPageLayoutRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "put": { + "tags": [ + "Status Pages" + ], + "summary": "Update a maintenance window", + "operationId": "updateMaintenance", + "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/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/fleet": { + "get": { + "tags": [ + "synthetics-inventory-controller" + ], + "summary": "Get workspace monitor fleet history and group counts", + "operationId": "fleet", + "parameters": [ + { + "name": "window", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorFleetSummaryDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/metrics": { + "get": { + "tags": [ + "Synthetics metrics" + ], + "summary": "Get whole-family Synthetics metrics", + "description": "Returns measured target availability for 30 days and distinct recovered monitors for 7 days.", + "operationId": "getSyntheticsFamilyMetrics", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSyntheticsFamilyMetricsDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/metrics/run-durations": { + "get": { + "tags": [ + "Synthetics metrics" + ], + "summary": "Get code-monitor duration percentiles", + "description": "Returns exact per-monitor p50 execution durations for the rolling 30-day window.", + "operationId": "getSyntheticsRunDurations", + "parameters": [ + { + "name": "monitorIds", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/regions/status": { + "get": { + "tags": [ + "synthetics-inventory-controller" + ], + "summary": "Get public runner-region acceptance status", + "operationId": "regions", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunnerRegionStatusesDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/runtime-profiles": { + "get": { + "tags": [ + "synthetics-runtime-profile-controller" + ], + "operationId": "list_17", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRuntimeProfileDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/runtime-profiles/{id}": { + "get": { + "tags": [ + "synthetics-runtime-profile-controller" + ], + "operationId": "get_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRuntimeProfileDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/synthetics/usage": { + "get": { + "tags": [ + "synthetics-usage-controller" + ], + "summary": "Read billable synthetics usage for the current period", + "operationId": "getCurrentSyntheticsUsage", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSyntheticsUsagePeriodDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/tags": { + "get": { + "tags": [ + "Tags" + ], + "summary": "List tags for the authenticated organization", + "operationId": "list_4", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Tags" + ], + "summary": "Create a new tag", + "operationId": "create_5", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "List webhook testing inboxes for the workspace", + "operationId": "listWebhookInboxes", + "parameters": [ + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookInboxDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Webhook Testing" + ], + "summary": "Create a webhook testing inbox", + "operationId": "createWebhookInbox", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookInboxRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Get a webhook testing inbox", + "operationId": "getWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete a webhook testing inbox and cascade events", + "operationId": "deleteWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Webhook Testing" + ], + "summary": "Patch a webhook testing inbox", + "operationId": "updateWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookInboxRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "List captured HTTP events newest-first", + "operationId": "listWebhookEvents", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "method", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "path", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "after", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageWebhookEventDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete every captured event on this inbox", + "operationId": "deleteWebhookEvents", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Get one captured HTTP event", + "operationId": "getWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEventDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete one captured event", + "operationId": "deleteWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}/raw": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Signed URL for the raw captured request", + "operationId": "getWebhookEventRaw", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/wait": { + "post": { + "tags": [ + "Webhook Testing" + ], + "summary": "Wait for the oldest matching captured HTTP event", + "operationId": "waitForWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaitWebhookEventRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WaitWebhookEventResponse" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "408": { + "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/activity": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Last-24h received-request activity for webhook inboxes", + "operationId": "listWebhookInboxActivity", + "parameters": [ + { + "name": "inboxIds", + "in": "query", + "description": "Comma-separated inbox ids (1–100)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseListWebhookInboxActivityDto" + } + } + } + }, + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/webhooks": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List webhook endpoints for the authenticated org", + "operationId": "list_3", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Register a new webhook endpoint", + "operationId": "create_4", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/api/v1/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "List workspaces", + "operationId": "list_2", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Workspaces" + ], + "summary": "Create workspace", + "operationId": "create_3", + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + } + }, + "/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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "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" + } + } + } + } + } + }, + "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 — 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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "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" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36232,6 +52431,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36262,6 +52471,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36354,6 +52583,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36384,6 +52623,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36465,6 +52724,32 @@ }, "description": "Request to acquire a deploy lock for the current workspace" }, + "ActorDisplayDto": { + "required": [ + "identity" + ], + "type": "object", + "properties": { + "identity": { + "type": "string", + "description": "Stable actor identity" + }, + "user": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "keyName": { + "type": "string", + "description": "API key display name; never the key value", + "nullable": true + } + }, + "description": "Actor that last wrote this environment value" + }, "AddCustomDomainRequest": { "required": [ "hostname" @@ -36990,6 +53275,7 @@ "createdAt", "key", "name", + "scopes", "id" ], "type": "object", @@ -37019,6 +53305,26 @@ "description": "Timestamp when the key expires; null if no expiration", "format": "date-time", "nullable": true + }, + "scopes": { + "type": "array", + "description": "Scopes this key is allowed to call; full grants everything", + "items": { + "type": "string", + "description": "Scopes this key is allowed to call; full grants everything" + } + }, + "tool": { + "type": "string", + "description": "Tool this key writes as on owner-enforced monitors; null means API", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] } }, "description": "Created API key with the full key value — store it now, it won't be shown again" @@ -37028,6 +53334,7 @@ "createdAt", "key", "name", + "scopes", "updatedAt", "id" ], @@ -37075,10 +53382,49 @@ "description": "Timestamp when the key expires; null if no expiration", "format": "date-time", "nullable": true + }, + "scopes": { + "type": "array", + "description": "Scopes this key is allowed to call; full grants everything", + "items": { + "type": "string", + "description": "Scopes this key is allowed to call; full grants everything" + } + }, + "tool": { + "type": "string", + "description": "Tool this key writes as on owner-enforced monitors; null means API", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] } }, "description": "API key for programmatic access to the DevHelm API" }, + "ArtifactDownloadDto": { + "required": [ + "expiresAt", + "url" + ], + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "Signed GET URL for the artifact bytes" + }, + "expiresAt": { + "type": "string", + "description": "When the signed URL stops working", + "format": "date-time" + } + }, + "description": "Signed, short-lived download link for one run artifact" + }, "ArtifactTraceMeta": { "type": "object", "properties": { @@ -37290,7 +53636,7 @@ }, "actorEmail": { "type": "string", - "description": "Email of the actor; null for system actions", + "description": "User email, api-key:{id} for API keys, or system for automated actions", "nullable": true }, "action": { @@ -37324,6 +53670,14 @@ "type": "string", "description": "Timestamp when the action was performed", "format": "date-time" + }, + "changes": { + "type": "array", + "description": "Non-secret settings changed by this action", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorFieldChange" + } } } }, @@ -37333,12 +53687,20 @@ "discriminator": { "propertyName": "kind", "mapping": { - "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata" + "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata", + "evidence_purged": "#/components/schemas/EvidencePurgedMetadata", + "monitor_ownership": "#/components/schemas/MonitorOwnershipMetadata" } }, "oneOf": [ { "$ref": "#/components/schemas/MemberRoleChangedMetadata" + }, + { + "$ref": "#/components/schemas/EvidencePurgedMetadata" + }, + { + "$ref": "#/components/schemas/MonitorOwnershipMetadata" } ] }, @@ -37494,6 +53856,68 @@ "upload" ] }, + "Bucket": { + "required": [ + "start", + "passed", + "failed", + "timedOut", + "couldntRun", + "passedOnRetry", + "durationSamples" + ], + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "Inclusive clock-aligned bucket start", + "format": "date-time" + }, + "passed": { + "type": "integer", + "description": "Health-voting region cycles whose final attempt passed", + "format": "int64" + }, + "failed": { + "type": "integer", + "description": "Health-voting region cycles whose final attempt failed", + "format": "int64" + }, + "timedOut": { + "type": "integer", + "description": "Region cycles whose final attempt timed out", + "format": "int64" + }, + "couldntRun": { + "type": "integer", + "description": "Region cycles with a final non-target outcome", + "format": "int64" + }, + "passedOnRetry": { + "type": "integer", + "description": "Passed cycles that had an earlier failed attempt", + "format": "int64" + }, + "durationSamples": { + "type": "integer", + "description": "Executions with a completed duration in this bucket", + "format": "int64" + }, + "p50Ms": { + "type": "number", + "description": "Median duration of completed executions in milliseconds", + "format": "double", + "nullable": true + }, + "p95Ms": { + "type": "number", + "description": "p95 duration of completed executions in milliseconds", + "format": "double", + "nullable": true + } + }, + "description": "Clock-aligned chart buckets" + }, "BulkMonitorActionRequest": { "required": [ "action", @@ -37520,7 +53944,12 @@ "RESUME", "DELETE", "ADD_TAG", - "REMOVE_TAG" + "REMOVE_TAG", + "UPDATE_SCHEDULE", + "RUN", + "MUTE", + "UNMUTE", + "ACKNOWLEDGE" ] }, "tagIds": { @@ -37540,6 +53969,22 @@ "items": { "$ref": "#/components/schemas/NewTagRequest" } + }, + "frequencySeconds": { + "maximum": 86400, + "minimum": 10, + "type": "integer", + "description": "New check frequency in seconds (10–86400), required for UPDATE_SCHEDULE", + "format": "int32", + "nullable": true + }, + "overlay": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + ] } }, "description": "Request body for performing a bulk action on multiple monitors" @@ -37570,6 +54015,64 @@ }, "description": "Result of a bulk monitor action, including partial-success details" }, + "BundleCheckResultDto": { + "required": [ + "findings" + ], + "type": "object", + "properties": { + "findings": { + "type": "array", + "description": "Problems found in the supplied source files", + "items": { + "$ref": "#/components/schemas/Finding" + } + } + } + }, + "BundleDto": { + "required": [ + "digest", + "files", + "keys", + "uploadDigest", + "size" + ], + "type": "object", + "properties": { + "digest": { + "minLength": 1, + "type": "string", + "description": "Closure digest, sha256:. Same files always return this value" + }, + "uploadDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of every file that was sent, before import closure" + }, + "files": { + "type": "array", + "description": "Files in the import closure", + "items": { + "type": "string", + "description": "Files in the import closure" + } + }, + "keys": { + "type": "array", + "description": "Secret names detected in the closure", + "items": { + "type": "string", + "description": "Secret names detected in the closure" + } + }, + "size": { + "type": "integer", + "description": "Uncompressed closure size in bytes", + "format": "int64" + } + } + }, "CaptureCompareDto": { "required": [ "baselineKind", @@ -37649,9 +54152,19 @@ "on_failure", "off" ] + }, + "network": { + "type": "string", + "description": "When network rows and HAR are retained; null uses always", + "nullable": true, + "enum": [ + "always", + "on_failure", + "off" + ] } }, - "description": "When to capture screenshots, traces, and video during a code run" + "description": "When to retain screenshots, traces, video, and network evidence" }, "CategoryDto": { "required": [ @@ -38047,6 +54560,40 @@ }, "description": "A single named step within a code check execution" }, + "CodeSource": { + "type": "object", + "properties": { + "repo": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "Repository that produced this code", + "nullable": true + }, + "branch": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Branch that produced this code", + "nullable": true + }, + "commit": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "Commit that produced this code", + "nullable": true + }, + "file": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "Declaring file in that repository", + "nullable": true + } + }, + "description": "Advisory source location. Untrusted, and unknown when omitted" + }, "CodeTestTargetRequest": { "type": "object", "properties": { @@ -38060,6 +54607,22 @@ "type": "string", "description": "Region for this test; null uses the monitor's first region", "nullable": true + }, + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "session": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunSessionContext" + } + ] } } }, @@ -38559,6 +55122,32 @@ "description": "Optional expiration timestamp in ISO 8601 format", "format": "date-time", "nullable": true + }, + "preset": { + "type": "string", + "description": "Preset expanded into scopes: ci-pr, ci-deploy, agent-responder, agent-author", + "nullable": true + }, + "scopes": { + "type": "array", + "description": "Scopes to grant (default: full)", + "nullable": true, + "items": { + "type": "string", + "description": "Scopes to grant (default: full)" + } + }, + "tool": { + "type": "string", + "description": "Tool this key writes as on owner-enforced monitors (default: API)", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] } } }, @@ -38710,6 +55299,168 @@ }, "description": "Replace all assertions. Null preserves current" }, + "CreateBundleRequest": { + "required": [ + "files" + ], + "type": "object", + "properties": { + "files": { + "minProperties": 1, + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Path to UTF-8 text. Paths are relative to the bundle root" + }, + "description": "Path to UTF-8 text. Paths are relative to the bundle root" + }, + "entrypoint": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "File that runs. Omit when the map is already the import closure", + "nullable": true + }, + "runtimeId": { + "maxLength": 32, + "minLength": 0, + "type": "string", + "description": "Runtime used to refuse imports. Omit for the newest runtime that can run", + "nullable": true + } + } + }, + "CreateDemoBookingRequest": { + "required": [ + "attemptId", + "attribution", + "companyUrl", + "email", + "fullName", + "leadId", + "message", + "product", + "slotToken", + "startTime", + "timezone" + ], + "type": "object", + "properties": { + "leadId": { + "type": "string", + "description": "Lead identifier reused for this form submission", + "format": "uuid" + }, + "attemptId": { + "type": "string", + "description": "Booking identifier reused when retrying the same time", + "format": "uuid" + }, + "fullName": { + "maxLength": 150, + "minLength": 0, + "type": "string", + "description": "Your full name" + }, + "email": { + "maxLength": 254, + "minLength": 0, + "type": "string", + "description": "Email address for the calendar invitation", + "format": "email" + }, + "companyUrl": { + "maxLength": 2048, + "minLength": 0, + "pattern": "^$|https?://[^\\s]+", + "type": "string", + "description": "Optional company website URL" + }, + "product": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "Product you would like to explore" + }, + "message": { + "maxLength": 3000, + "minLength": 0, + "type": "string", + "description": "Optional context for your demo" + }, + "startTime": { + "type": "string", + "description": "Selected demo start time in UTC", + "format": "date-time" + }, + "timezone": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "description": "IANA timezone for your calendar invitation" + }, + "slotToken": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "Availability token for the selected time" + }, + "attribution": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Marketing attribution captured with this request" + }, + "description": "Marketing attribution captured with this request" + } + } + }, + "CreateDeviceAuthorizationRequest": { + "required": [ + "clientName" + ], + "type": "object", + "properties": { + "clientName": { + "maxLength": 190, + "minLength": 0, + "type": "string", + "description": "Client name stored on the minted API key, e.g. devhelm-cli on mbp (max 190)" + } + }, + "description": "Start a device-code login so the CLI can receive an API key" + }, + "CreateDraftRevisionRequest": { + "required": [ + "code" + ], + "type": "object", + "properties": { + "code": { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + } + }, + "CreateDraftRevisionResponse": { + "required": [ + "revision" + ], + "type": "object", + "properties": { + "revision": { + "$ref": "#/components/schemas/RevisionDto" + }, + "evicted": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + } + }, + "description": "Draft revision, and the draft discarded when the cap was full" + }, "CreateEmailDomainRequest": { "type": "object", "properties": { @@ -38969,6 +55720,18 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Only the managedBy tool may change configuration (default: false)", + "nullable": true + }, + "ownerProject": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the owning tool declares for this monitor, e.g. acme/web", + "nullable": true + }, "environmentId": { "type": "string", "description": "Environment to associate with this monitor. Required for browser and multi-step monitors", @@ -39044,13 +55807,34 @@ "format": "uuid", "nullable": true }, - "package": { + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "ownerDeclaration": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/OwnerDeclaration" } ] + }, + "secretKeys": { + "maxItems": 256, + "minItems": 0, + "type": "array", + "description": "Secret keys to attach; null starts with the scanned set", + "nullable": true, + "items": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Secret keys to attach; null starts with the scanned set" + } } } }, @@ -39101,20 +55885,6 @@ }, "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" @@ -39892,6 +56662,32 @@ }, "description": "Cursor-paginated response for time-series and append-only data" }, + "CursorPageMonitorHistoryEntryDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/MonitorHistoryEntryDto" + } + }, + "nextCursor": { + "type": "string", + "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": "Cursor-paginated response for time-series and append-only data" + }, "CursorPageNotificationDispatchDto": { "required": [ "data", @@ -39944,6 +56740,58 @@ }, "description": "Cursor-paginated response for time-series and append-only data" }, + "CursorPageRunRevisionMarkerDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/RunRevisionMarkerDto" + } + }, + "nextCursor": { + "type": "string", + "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": "Cursor-paginated response for time-series and append-only data" + }, + "CursorPageRunSkippedEntryDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/RunSkippedEntryDto" + } + }, + "nextCursor": { + "type": "string", + "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": "Cursor-paginated response for time-series and append-only data" + }, "CursorPageServiceCatalogDto": { "required": [ "data", @@ -40269,6 +57117,32 @@ "type": "string", "description": "Rollback reason when this Head was restored", "nullable": true + }, + "rolledBackDigest": { + "type": "string", + "description": "Digest the last rollback replaced; cleared by the next publish", + "nullable": true + }, + "linkedIncidents": { + "type": "array", + "description": "Open incidents on this monitor", + "nullable": true, + "items": { + "$ref": "#/components/schemas/LinkedIncidentDto" + } + }, + "note": { + "type": "string", + "description": "Note from the latest publish", + "nullable": true + }, + "activatedByActor": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ActorDisplayDto" + } + ] } }, "description": "Active Head for a definition in one environment" @@ -40407,34 +57281,99 @@ }, "description": "Single delivery attempt with request/response audit data" }, - "DemandedKeyLocation": { + "DemoAvailabilityDto": { "required": [ - "key" + "slots" ], "type": "object", "properties": { - "key": { - "maxLength": 255, - "minLength": 0, + "slots": { + "type": "array", + "description": "Available demo times in UTC", + "items": { + "$ref": "#/components/schemas/Slot" + } + } + } + }, + "DemoBookingDto": { + "required": [ + "id", + "startTime", + "state", + "timezone" + ], + "type": "object", + "properties": { + "id": { "type": "string", - "description": "Secret name the code reads" + "description": "Identifier for this booking attempt", + "format": "uuid" }, - "declaringFile": { - "maxLength": 512, - "minLength": 0, + "state": { "type": "string", - "description": "Declaring file path inside the zip", + "description": "Current booking state", + "enum": [ + "RECEIVED", + "CREATING", + "RECONCILING", + "CONFIRMED", + "SLOT_UNAVAILABLE", + "PROVIDER_UNAVAILABLE", + "NEEDS_FOLLOW_UP", + "CANCELED" + ] + }, + "startTime": { + "type": "string", + "description": "Demo start time in UTC", + "format": "date-time" + }, + "timezone": { + "type": "string", + "description": "Timezone for the calendar invitation" + }, + "meetingUrl": { + "type": "string", + "description": "Link to join the confirmed demo", "nullable": true }, - "declaringLocation": { - "maxLength": 255, - "minLength": 0, + "cancelUrl": { "type": "string", - "description": "Call site from package scan, e.g. signIn(…) · line 6", + "description": "Link to cancel the confirmed demo", + "nullable": true + }, + "rescheduleUrl": { + "type": "string", + "description": "Link to reschedule the confirmed demo", + "nullable": true + }, + "errorCode": { + "type": "string", + "description": "Reason the booking could not be confirmed", "nullable": true } - }, - "description": "Per-key declaring file and location from package scan" + } + }, + "DemoBookingRecoveryDto": { + "required": [ + "closed" + ], + "type": "object", + "properties": { + "closed": { + "type": "boolean", + "description": "Whether this unsaved attempt is closed and can be retried" + }, + "booking": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/DemoBookingDto" + } + ] + } + } }, "DeployLockDto": { "required": [ @@ -40468,6 +57407,108 @@ }, "description": "Represents an active deploy lock for a workspace" }, + "DeviceAuthorizationDto": { + "required": [ + "deviceCode", + "userCode", + "verificationUri", + "verificationUriComplete", + "expiresIn", + "interval" + ], + "type": "object", + "properties": { + "deviceCode": { + "minLength": 1, + "type": "string", + "description": "Secret code the CLI sends when polling for the API key" + }, + "userCode": { + "minLength": 1, + "type": "string", + "description": "Short code the user confirms in the dashboard, e.g. ABCD-EFGH" + }, + "verificationUri": { + "minLength": 1, + "type": "string", + "description": "Dashboard page where the user enters the code" + }, + "verificationUriComplete": { + "minLength": 1, + "type": "string", + "description": "Dashboard page with the user code already filled in" + }, + "expiresIn": { + "type": "integer", + "description": "Seconds until the codes expire", + "format": "int32" + }, + "interval": { + "type": "integer", + "description": "Minimum seconds between token polls", + "format": "int32" + } + }, + "description": "Device-code challenge the CLI polls until an admin approves it" + }, + "DeviceTokenDto": { + "required": [ + "status", + "interval" + ], + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Poll outcome", + "enum": [ + "authorization_pending", + "slow_down", + "expired", + "denied", + "complete" + ] + }, + "interval": { + "type": "integer", + "description": "Minimum seconds before the next poll", + "format": "int32" + }, + "apiKey": { + "type": "string", + "description": "Minted API key, returned once with status complete", + "nullable": true + }, + "organizationId": { + "type": "integer", + "description": "Organization that owns the minted API key", + "format": "int32", + "nullable": true + }, + "workspaceId": { + "type": "integer", + "description": "Workspace chosen when the login was approved", + "format": "int32", + "nullable": true + } + }, + "description": "Result of polling a device-code login" + }, + "DeviceTokenRequest": { + "required": [ + "deviceCode" + ], + "type": "object", + "properties": { + "deviceCode": { + "maxLength": 128, + "minLength": 0, + "type": "string", + "description": "Device code returned when the login was started" + } + }, + "description": "Poll a device-code login for the minted API key" + }, "DiscordChannelConfig": { "required": [ "channelType", @@ -41279,6 +58320,83 @@ }, "description": "A single resolved entitlement for the organization" }, + "EntitlementResponse": { + "required": [ + "entitlements", + "tier", + "usage", + "usagePeriodStart", + "trialActive" + ], + "type": "object", + "properties": { + "tier": { + "type": "string", + "description": "Resolved billing plan tier", + "enum": [ + "FREE", + "STARTER", + "PRO", + "TEAM", + "BUSINESS", + "ENTERPRISE" + ] + }, + "entitlements": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/EntitlementDto" + }, + "description": "All entitlements keyed by entitlement key" + }, + "usage": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Current usage counters keyed by entitlement key (only for countable resources)", + "format": "int64" + }, + "description": "Current usage counters keyed by entitlement key (only for countable resources)" + }, + "trialActive": { + "type": "boolean", + "description": "Whether the org is currently on a trial" + }, + "trialExpiresAt": { + "type": "string", + "description": "Trial expiry date (null if not trialing)", + "format": "date-time", + "nullable": true + }, + "subscriptionStatus": { + "type": "string", + "description": "Current subscription status (null if no subscription)", + "nullable": true + }, + "usagePeriodStart": { + "type": "string", + "description": "Start of the current usage window", + "format": "date-time" + }, + "syntheticsOverageCents": { + "type": "integer", + "description": "Consumed overage cents this period, including when overage is now off", + "format": "int64", + "nullable": true + }, + "capStops": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Stopped meters keyed by meter name, with included or spend_cap reasons", + "nullable": true + }, + "description": "Stopped meters keyed by meter name, with included or spend_cap reasons", + "nullable": true + } + }, + "description": "Full entitlement state for an organization: resolved limits, usage, and trial info" + }, "EnvironmentDto": { "required": [ "createdAt", @@ -41391,7 +58509,6 @@ }, "ErrorNext": { "type": "object", - "description": "Command and documentation that fix this error", "properties": { "command": { "type": "string", @@ -41405,16 +58522,17 @@ "nullable": true, "example": "https://docs.devhelm.io/errors/SYNTHETICS_USAGE_CAPPED" } - } + }, + "description": "Command and documentation that fix this error" }, "ErrorResponse": { "required": [ "category", "code", "message", - "retryable", "status", - "timestamp" + "timestamp", + "retryable" ], "type": "object", "properties": { @@ -41539,14 +58657,13 @@ "type": "string", "description": "Why permission was refused: scope or role", "nullable": true, + "example": "role", "enum": [ "scope", "role" - ], - "example": "role" + ] }, "next": { - "description": "Command and docs that fix this error", "nullable": true, "allOf": [ { @@ -41556,9 +58673,13 @@ }, "details": { "type": "object", + "additionalProperties": { + "type": "object", + "description": "Extra fields for this error, such as a missing secret key and environment", + "nullable": true + }, "description": "Extra fields for this error, such as a missing secret key and environment", - "nullable": true, - "additionalProperties": true + "nullable": true }, "expiredAt": { "type": "string", @@ -41577,7 +58698,6 @@ "status": 404, "code": "NOT_FOUND", "category": "not_found", - "retryable": false, "message": "Monitor not found", "timestamp": 1737302400000, "requestId": "5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a" @@ -41648,6 +58768,42 @@ }, "description": "Ordered escalation steps, evaluated in sequence" }, + "EvidencePurgedMetadata": { + "required": [ + "kind", + "reason" + ], + "type": "object", + "description": "Reason recorded when stored evidence is purged", + "properties": { + "kind": { + "type": "string", + "enum": [ + "evidence_purged" + ] + }, + "reason": { + "minLength": 1, + "type": "string", + "description": "Why the evidence was deleted" + } + } + }, + "EvidencePurgeRequest": { + "required": [ + "reason" + ], + "type": "object", + "properties": { + "reason": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Why the evidence must be deleted; kept in the audit log (max 500)" + } + }, + "description": "Purge of stored evidence" + }, "FailureDetail": { "required": [ "monitorId", @@ -41663,10 +58819,433 @@ "reason": { "type": "string", "description": "Human-readable reason for the failure" + }, + "code": { + "type": "string", + "description": "Error code for the failure, as returned by the single-monitor operation", + "nullable": true } }, "description": "Details about a single monitor that failed the bulk action" }, + "Finding": { + "required": [ + "code", + "message" + ], + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Import validation code", + "enum": [ + "MONITOR_CONFIG_TYPE_MISMATCH", + "MONITOR_FREQUENCY_BELOW_PLAN_MIN", + "MONITOR_LIMIT_REACHED", + "MONITOR_AUTH_TYPE_UNSUPPORTED", + "MONITOR_HEARTBEAT_REGIONS_NOT_SUPPORTED", + "MONITOR_HEARTBEAT_INTERVAL_TOO_SHORT", + "MONITOR_HEARTBEAT_GRACE_TOO_SHORT", + "MONITOR_HEARTBEAT_GRACE_EXCEEDS_INTERVAL", + "MONITOR_HTTP_HEADERS_TOO_MANY", + "MONITOR_HTTP_HEADER_RESERVED", + "MONITOR_HTTP_BODY_METHOD_INVALID", + "MONITOR_HTTP_BODY_TOO_LARGE", + "MONITOR_ASSERTION_TYPE_NOT_ALLOWED", + "MONITOR_ALERT_CHANNEL_NOT_FOUND", + "MONITOR_TAGS_ADD_INVALID", + "MONITOR_TAGS_REMOVE_INVALID", + "MONITOR_TOKEN_ROTATION_HEARTBEAT_ONLY", + "MONITOR_CODE_CHECK_NOT_AVAILABLE", + "MONITOR_CODE_CHECK_LIMIT_REACHED", + "MONITOR_CODE_CHECK_REGION_UNAVAILABLE", + "MONITOR_CODE_CHECK_TEST_UNAVAILABLE", + "MONITOR_TEST_BUNDLE_UNAVAILABLE", + "MONITOR_BROWSER_CHECKS_DISABLED", + "MONITOR_ENVIRONMENT_REQUIRED", + "MONITOR_ENVIRONMENT_CLEAR_FORBIDDEN", + "MONITOR_PACKAGE_XOR_DEFINITION", + "MONITOR_PACKAGE_DIGEST_INVALID", + "MONITOR_PACKAGE_NOT_SUPPORTED", + "MONITOR_PACKAGE_PATH_INVALID", + "MONITOR_PACKAGE_CONCURRENT", + "MONITOR_DEFINITION_HAS_NO_REVISION", + "MONITOR_DEFINITION_IN_USE", + "MONITOR_STATUS_NOT_WRITABLE", + "MONITOR_PAUSED", + "MONITOR_OVERLAY_EXPIRES_IN_PAST", + "MONITOR_QUARANTINE_FIELDS_REQUIRED", + "MONITOR_MANAGED_BY_TAKEOVER_REQUIRED", + "MONITOR_HISTORY_PARAM_INVALID", + "MONITOR_TAKEOVER_FIELD_UNKNOWN", + "MONITOR_CAPTURE_POLICY_INVALID", + "MONITOR_RUN_PARALLEL_CODE_ONLY", + "REVISION_PACKAGE_BYTES_UNAVAILABLE", + "MONITOR_CODE_TYPE_REQUIRED", + "MONITOR_DEFINITION_REQUIRED", + "REVISION_NOT_ON_DEFINITION", + "REVISION_DIFF_CROSS_DEFINITION", + "DEFINITION_HEAD_INCOMPLETE", + "MONITOR_ASSERTION_NOT_SUPPORTED_FOR_TYPE", + "MONITOR_AUTH_ALREADY_EXISTS", + "MONITOR_AUTH_NOT_SUPPORTED_FOR_TYPE", + "MONITOR_AUTH_VAULT_FOREIGN_ORG", + "ALERT_CHANNEL_DISABLED", + "ALERT_CHANNEL_PLAN_REQUIRED", + "ALERT_CHANNEL_TYPE_IMMUTABLE", + "ALERT_CHANNEL_CONFIG_INVALID", + "ALERT_CHANNEL_SLACK_WEBHOOK_INVALID", + "ALERT_CHANNEL_DISCORD_WEBHOOK_INVALID", + "ALERT_CHANNEL_TEAMS_WEBHOOK_INVALID", + "ALERT_CHANNEL_TEAMS_WEBHOOK_CLASSIC_RETIRED", + "ALERT_CHANNEL_TEAMS_WEBHOOK_HOST", + "ALERT_CHANNEL_WEBHOOK_URL_INVALID", + "ALERT_CHANNEL_WEBHOOK_HEADER_RESERVED", + "ALERT_CHANNEL_OPSGENIE_REGION_INVALID", + "ALERT_CHANNEL_PAGERDUTY_SEVERITY_INVALID", + "ALERT_CHANNEL_GOOGLE_CHAT_WEBHOOK_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_UNVERIFIED", + "ALERT_CHANNEL_PHONE_NUMBERS_COUNT_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_REQUIRED", + "ALERT_CHANNEL_VERIFIED_PHONE_NOT_FOUND", + "ALERT_CHANNEL_PHONE_DESTINATION_MISMATCH", + "ALERT_CHANNEL_VOICE_LANGUAGE_INVALID", + "NOTIFICATION_POLICY_RULE_TYPE_REQUIRED", + "NOTIFICATION_POLICY_RULE_TYPE_INVALID", + "NOTIFICATION_POLICY_RULE_VALUE_REQUIRED", + "NOTIFICATION_POLICY_RULE_VALUE_INVALID", + "NOTIFICATION_POLICY_RULE_VALUES_REQUIRED", + "NOTIFICATION_POLICY_RULE_MONITOR_IDS_REQUIRED", + "NOTIFICATION_POLICY_RULE_REGIONS_REQUIRED", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_REQUIRED", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_INVALID", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_CONFLICT", + "NOTIFICATION_POLICY_ESCALATION_REQUIRED", + "NOTIFICATION_POLICY_STEPS_REQUIRED", + "NOTIFICATION_POLICY_ON_RESOLVE_INVALID", + "NOTIFICATION_POLICY_ON_REOPEN_INVALID", + "NOTIFICATION_POLICY_STEP_CHANNELS_EMPTY", + "NOTIFICATION_POLICY_STEP_DELAY_NEGATIVE", + "NOTIFICATION_POLICY_STEP_DELAY_TOO_LARGE", + "NOTIFICATION_POLICY_STEP_REPEAT_INVALID", + "NOTIFICATION_POLICY_STEP_REPEAT_TOO_LARGE", + "NOTIFICATION_POLICY_STEPS_TOO_MANY", + "NOTIFICATION_POLICY_STEP_CHANNEL_NOT_FOUND", + "NOTIFICATION_POLICY_DELETE_BLOCKED", + "MONITOR_POLICY_TRIGGER_RULES_EMPTY", + "MONITOR_POLICY_RULE_TYPE_REQUIRED", + "MONITOR_POLICY_RULE_SEVERITY_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_TYPE_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_REGIONS_TOO_FEW", + "MONITOR_POLICY_CONFIRMATION_WAIT_TOO_SHORT", + "MONITOR_POLICY_CONFIRMATION_WAIT_BELOW_INVARIANT", + "MONITOR_POLICY_RECOVERY_REQUIRED", + "MONITOR_POLICY_RECOVERY_SUCCESSES_TOO_FEW", + "MONITOR_POLICY_RECOVERY_REGIONS_TOO_FEW", + "MONITOR_POLICY_RECOVERY_COOLDOWN_OUT_OF_RANGE", + "MONITOR_POLICY_FIELD_REQUIRED", + "MONITOR_POLICY_FIELD_NOT_POSITIVE", + "MONITOR_POLICY_FIELD_OUT_OF_RANGE", + "URL_INVALID", + "URL_SCHEME_UNSUPPORTED", + "URL_HOST_REQUIRED", + "URL_HOST_PRIVATE", + "RESOURCE_GROUP_LIMIT_REACHED", + "RESOURCE_GROUP_MEMBER_LIMIT_REACHED", + "RESOURCE_GROUP_MEMBER_ALREADY_PRESENT", + "RESOURCE_GROUP_MEMBER_TYPE_INVALID", + "RESOURCE_GROUP_THRESHOLD_VALUE_REQUIRED", + "RESOURCE_GROUP_THRESHOLD_TYPE_REQUIRED", + "RESOURCE_GROUP_THRESHOLD_OUT_OF_RANGE", + "RESOURCE_GROUP_SLUG_GENERATION_FAILED", + "STATUS_PAGE_LIMIT_REACHED", + "STATUS_PAGE_SLUG_TAKEN", + "STATUS_PAGE_SLUG_REQUIRED", + "STATUS_PAGE_SLUG_RESERVED", + "STATUS_PAGE_VISIBILITY_UNSUPPORTED", + "STATUS_PAGE_FEATURE_PLAN_REQUIRED", + "STATUS_PAGE_HOSTNAME_FIRST_PARTY_RESERVED", + "STATUS_PAGE_HOSTNAME_TLD_RESERVED", + "STATUS_PAGE_HOSTNAME_TAKEN", + "STATUS_PAGE_DOMAIN_NOT_VERIFIED", + "STATUS_PAGE_COMPONENT_GROUP_NOT_FOUND", + "STATUS_PAGE_COMPONENT_MONITOR_REQUIRED", + "STATUS_PAGE_COMPONENT_GROUP_REQUIRED", + "STATUS_PAGE_COMPONENT_STATIC_REFS_INVALID", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_REQUIRED", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_NOT_FOUND", + "STATUS_PAGE_COMPONENT_DEPENDENCY_REFS_INVALID", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_REFS_INVALID", + "STATUS_PAGE_NOTIFICATION_DELIVERY_RETRY_NOT_FAILED", + "STATUS_PAGE_NOTIFICATION_DELIVERY_RETRY_TERMINAL", + "STATUS_PAGE_MEASURED_UPTIME_MONITOR_ONLY", + "STATUS_PAGE_COMPONENT_OVERRIDE_EXPIRES_AT_IN_PAST", + "STATUS_PAGE_COMPONENT_OVERRIDE_EXPIRES_AT_EXCEEDS_MAX", + "STATUS_PAGE_SUBSCRIBER_DESTINATION_REQUIRED", + "STATUS_PAGE_SUBSCRIBER_DESTINATION_INVALID", + "STATUS_PAGE_SUBSCRIBER_COMPONENT_NOT_FOUND", + "SP_INCIDENT_PUBLISH_RESOLVED", + "SP_INCIDENT_DISMISS_PUBLISHED", + "SP_INCIDENT_SCHEDULED_FOR_REQUIRED", + "SP_INCIDENT_SCHEDULED_UNTIL_BEFORE_FOR", + "SP_INCIDENT_AUTO_RESOLVE_REQUIRES_UNTIL", + "SP_INCIDENT_COMPONENT_FOREIGN", + "SP_INCIDENT_MONITORING_INCIDENT_NOT_FOUND", + "SUBSCRIPTION_PRICE_INACTIVE", + "SUBSCRIPTION_PRICE_UNAVAILABLE", + "SUBSCRIPTION_ALREADY_ACTIVE", + "SUBSCRIPTION_NOT_ACTIVE", + "SUBSCRIPTION_NO_SCHEDULED_CHANGE", + "SUBSCRIPTION_CHANGE_PENDING", + "SUBSCRIPTION_CANCELING", + "SUBSCRIPTION_CADENCE_UNAVAILABLE", + "SUBSCRIPTION_PRICES_INVALID", + "BILLING_OVERAGE_CAP_INVALID", + "BILLING_OVERAGE_NOT_ACTIVE", + "SERVICE_SUBSCRIPTION_FREE_TIER_LIMIT", + "SERVICE_SUBSCRIPTION_SERVICE_UNAVAILABLE", + "ACTOR_BAD_REQUEST", + "ORGANIZATION_ID_REQUIRED", + "WORKSPACE_REQUIRED", + "WORKSPACE_INTERNAL_ACTOR_NO_WORKSPACE", + "WORKSPACE_NOT_FOUND_ON_ORG", + "ENVIRONMENT_LIMIT_REACHED", + "ENVIRONMENT_SLUG_TAKEN", + "ENVIRONMENT_DELETE_BLOCKED", + "INBOUND_INBOX_NAME_BLANK", + "INBOUND_HTTP_RESPONSE_DELAY_INVALID", + "INBOUND_HTTP_RESPONSE_STATUS_INVALID", + "INBOUND_HTTP_RESPONSE_BODY_TOO_LARGE", + "INBOUND_HTTP_RESPONSE_BODY_INVALID", + "INBOUND_HTTP_RESPONSE_CONTENT_TYPE_INVALID", + "INBOUND_HTTP_RESPONSE_HEADERS_INVALID", + "INBOUND_EVENTS_CURSOR_INVALID", + "INBOUND_EVENTS_LIMIT_OUT_OF_RANGE", + "INBOUND_DOMAIN_CUSTOM_NAME_REQUIRED", + "INBOUND_DOMAIN_IN_ASSIGNED_ZONE", + "INBOUND_DOMAIN_NAME_TAKEN", + "INBOUND_DOMAIN_KIND_INVALID", + "INBOUND_DOMAIN_STATUS_INVALID", + "INBOUND_DOMAIN_NAME_INVALID", + "INBOUND_INJECT_TO_BLANK", + "INBOUND_INJECT_FROM_BLANK", + "INBOUND_INJECT_DOMAIN_DISABLED", + "INBOUND_INJECT_TO_INVALID", + "INBOUND_INJECT_FROM_INVALID", + "INBOUND_INJECT_HEADER_INVALID", + "INBOUND_WAIT_TO_REQUIRED", + "INBOUND_WAIT_TO_INVALID", + "INBOUND_WAIT_DOMAIN_REQUIRED", + "INBOUND_WEBHOOK_INBOX_LIMIT_REACHED", + "INBOUND_EMAIL_DOMAIN_LIMIT_REACHED", + "INBOUND_CUSTOM_MX_PLAN_REQUIRED", + "INBOUND_RETENTION_ABOVE_PLAN", + "INBOUND_EVENTS_MONTHLY_LIMIT_REACHED", + "INBOUND_ACTIVITY_INBOX_IDS_REQUIRED", + "INBOUND_ACTIVITY_INBOX_IDS_TOO_MANY", + "INBOUND_ACTIVITY_DOMAIN_IDS_REQUIRED", + "INBOUND_ACTIVITY_DOMAIN_IDS_TOO_MANY", + "TAG_NAME_TAKEN", + "SAVED_VIEW_TABLE_UNKNOWN", + "SAVED_VIEW_LIMIT_REACHED", + "SAVED_VIEW_FILTERS_TOO_LARGE", + "SECRET_KEY_TAKEN", + "SECRET_ENVIRONMENT_VALUE_BLANK", + "SECRET_REQUEST_ENVIRONMENT_QUERY", + "SECRET_REQUEST_HEAD_REQUIRED", + "SECRET_REQUEST_REMAP_SECRET_ID", + "SESSION_SETUP_FILE_BLANK", + "SESSION_HEAD_REQUIRED", + "RUN_NO_HEAD", + "RUN_KEYS_MISSING", + "SYNTHETICS_USAGE_CAPPED", + "RUN_LIST_PARAM_INVALID", + "ARTIFACT_BYTES_TOO_LARGE", + "SUPERVISOR_TOKEN_INVALID", + "LEASE_COMPLETION_CONFLICT", + "LEASE_FENCE_REJECTED", + "CAPACITY_TARGET_INVALID", + "ADMISSIONS_NOT_HELD", + "RUNTIME_UNKNOWN", + "RUNTIME_RETIRED", + "RUNTIME_NOT_AVAILABLE", + "RUNTIME_UNAVAILABLE", + "RUNTIME_EOL", + "RUNTIME_AMBIGUOUS", + "RUNTIME_DIGEST_IMMUTABLE", + "RUNTIME_DIGEST_INVALID", + "API_KEY_LIMIT_REACHED", + "API_KEY_REVOKED", + "AUDIT_EXPORT_LIMIT_EXCEEDED", + "AUTH_FIELD_BLANK", + "AUTH_EMAIL_INVALID", + "AUTH_EMAIL_TAKEN", + "EMAIL_ALREADY_VERIFIED", + "ORG_EMAIL_TAKEN", + "ONBOARDING_STAGE_BACKWARD", + "INVITE_USER_ALREADY_MEMBER", + "INVITE_ALREADY_ACCEPTED", + "INVITE_REVOKED", + "INVITE_EXPIRED", + "INVITE_EMAIL_MISMATCH", + "MEMBER_LIMIT_REACHED", + "MAINTENANCE_WINDOW_END_BEFORE_START", + "FORENSICS_HASH_BLANK", + "FORENSICS_HASH_INVALID", + "CHECK_RESULTS_LIMIT_OUT_OF_RANGE", + "CHECK_RESULTS_WINDOW_INVALID", + "CHECK_RESULTS_CURSOR_INVALID", + "CHECK_RESULTS_REGION_INVALID", + "STATUS_DATA_STATUS_INVALID", + "STATUS_DATA_PERIOD_INVALID", + "STATUS_DATA_GRANULARITY_INVALID", + "STATUS_DATA_GRANULARITY_PERIOD_MISMATCH", + "STATUS_DATA_PERIOD_UNKNOWN", + "STATUS_DATA_FROM_REQUIRED_WITH_TO", + "STATUS_DATA_TO_IN_FUTURE", + "STATUS_DATA_FROM_AFTER_TO", + "STATUS_DATA_WINDOW_TOO_WIDE", + "STATUS_DATA_TYPES_INVALID", + "STATUS_DATA_CURSOR_INVALID", + "STATUS_DATA_LIMIT_OUT_OF_RANGE", + "STATUS_DATA_COMPONENT_IDS_TOO_MANY", + "INCIDENT_ACTIVE_EXISTS", + "INCIDENT_TRANSITION_INVALID", + "INCIDENT_SERVICE_NOT_FOUND", + "INCIDENT_SERVICE_INCIDENT_NOT_FOUND", + "INCIDENT_SERVICE_MISMATCH", + "INCIDENT_EVENTS_CURSOR_INVALID", + "INCIDENT_EVENTS_LIMIT_OUT_OF_RANGE", + "NOTIFICATION_DISPATCH_INVALID_STATE", + "NOTIFICATION_POLICY_DISPATCHES_LIMIT_OUT_OF_RANGE", + "NOTIFICATION_POLICY_DISPATCHES_WINDOW_INVALID", + "NOTIFICATION_POLICY_DISPATCHES_CURSOR_INVALID", + "WEBHOOK_LIMIT_REACHED", + "WEBHOOK_URL_BLANK", + "WEBHOOK_EVENT_TYPES_INVALID", + "WEBHOOK_EVENT_TYPE_INVALID", + "ALERT_DELIVERY_RETRY_NOT_FAILED", + "ADMIN_BACKFILL_TYPE_UNKNOWN", + "ADMIN_PUBLISH_BLOCKED", + "ADMIN_ADAPTER_TYPE_UNKNOWN", + "ADMIN_SEO_METADATA_INVALID", + "ADMIN_RELATED_SERVICES_TOO_MANY", + "ADMIN_RELATED_SERVICE_SELF", + "ADMIN_PROBE_NO_OFFICIAL_URL", + "ADMIN_PROBE_URL_MALFORMED", + "ADMIN_LIFECYCLE_TRANSITION_INVALID", + "CLOUDFLARE_REQUEST_FAILED", + "CLOUDFLARE_API_ERROR", + "FIELD_REQUIRED", + "FIELD_TOO_SMALL", + "FIELD_TOO_LARGE", + "FIELD_OUT_OF_RANGE", + "FIELD_PATTERN_MISMATCH", + "FIELD_INVALID_EMAIL", + "FIELD_INVALID_URL", + "FIELD_INVALID_FORMAT", + "FIELD_INVARIANT_VIOLATED", + "FIELD_VALIDATION_FAILED", + "REQUEST_BODY_REQUIRED", + "REQUEST_BODY_MALFORMED", + "REQUEST_BODY_TYPE_MISMATCH", + "REQUEST_PARAMETER_REQUIRED", + "REQUEST_MEDIA_TYPE_UNSUPPORTED", + "CARRIER_CREDITS_EXHAUSTED", + "SYNTHETICS_USAGE_RESERVED", + "TESTING_QUOTA_EXHAUSTED", + "RATE_LIMITED", + "NOTIFY_RATE", + "SCOPE_REQUIRED", + "RUN_TOKEN_ADDRESS_FORBIDDEN", + "MONITOR_OWNED_BY_OTHER", + "DEPLOY_LOCKED", + "LIVE_REVISION_CHANGED", + "CONFIRMATION_REQUIRED", + "UPDATE_REQUIRED", + "CLAIMED", + "REVISION_ROLLED_BACK", + "REVISION_NEVER_LIVE", + "ROLLBACK_INCIDENT_REQUIRED", + "REVISION_UNTESTED", + "REVISION_DISCARDED", + "REVISION_IS_LIVE", + "DRAFT_LIMIT", + "NO_TOKEN", + "CLIENT_TOO_OLD", + "MAX_RUNS_EXCEEDED", + "IMPORT_NOT_IN_BUNDLE", + "USE_PROBE", + "IDEMPOTENCY_KEY_REUSED", + "IDEMPOTENCY_KEY_IN_PROGRESS", + "IDEMPOTENCY_KEY_ORPHANED", + "TRIGGER_UNSUPPORTED_TYPE", + "ENVIRONMENT_NOT_FOUND", + "EVIDENCE_EXPIRED", + "RUN_EXPIRED", + "BUNDLE_TOO_LARGE", + "BUNDLE_NOT_FOUND", + "IMPORT_NOT_IN_RUNTIME", + "SECRET_LITERAL", + "FIELD_UNKNOWN", + "API_KEY_EXPIRED", + "DEVICE_AUTHORIZATION_NOT_FOUND", + "DEVICE_AUTHORIZATION_EXPIRED", + "DEVICE_WORKSPACE_ORG_MISMATCH" + ] + }, + "file": { + "type": "string", + "description": "Source file containing the import", + "nullable": true + }, + "line": { + "type": "integer", + "description": "One-based source line containing the import", + "format": "int32", + "nullable": true + }, + "message": { + "type": "string", + "description": "Description of the import problem" + } + }, + "description": "Problems found in the supplied source files" + }, + "Flakiness": { + "required": [ + "from", + "to", + "cycleCount", + "flakyCycleCount" + ], + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Start of the seven-day measurement window", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive end of the measurement window", + "format": "date-time" + }, + "cycleCount": { + "type": "integer", + "description": "Completed region cycles in this window", + "format": "int64" + }, + "flakyCycleCount": { + "type": "integer", + "description": "Completed region cycles recovered by retry", + "format": "int64" + } + }, + "description": "Completed region-cycle retry recovery counts" + }, "GitLabChannelConfig": { "required": [ "channelType", @@ -42875,6 +60454,12 @@ "format": "uuid", "nullable": true }, + "triggeringRunId": { + "type": "string", + "description": "Code-monitor run whose failing tick confirmed this incident; null for uptime", + "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.", @@ -43455,6 +61040,14 @@ "format": "date-time", "nullable": true }, + "triggeringRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, "source": { "minLength": 1, "type": "string", @@ -43772,6 +61365,45 @@ }, "description": "Organization invite sent to an email address" }, + "Item": { + "required": [ + "bucket", + "monitor", + "streakTruncated" + ], + "type": "object", + "properties": { + "monitor": { + "$ref": "#/components/schemas/MonitorDto" + }, + "bucket": { + "type": "string", + "description": "Display bucket: failing, flaky, or healthy" + }, + "worstRegion": { + "type": "string", + "description": "Region deciding this cycle display verdict", + "nullable": true + }, + "streakStartedAt": { + "type": "string", + "description": "Earliest recorded failure after the last retained passing group", + "format": "date-time", + "nullable": true + }, + "streakTruncated": { + "type": "boolean", + "description": "True when retention prevents proving the failure streak start" + }, + "flakyRate": { + "type": "number", + "description": "Current seven-day fraction of retry-saved cycles", + "format": "double", + "nullable": true + } + }, + "description": "At most 100 monitor chips; counts cover the complete population" + }, "JiraChannelConfig": { "required": [ "channelType", @@ -43858,6 +61490,7 @@ "required": [ "createdAt", "name", + "scopes", "id" ], "type": "object", @@ -43887,6 +61520,14 @@ "description": "Last time the key was used", "format": "date-time", "nullable": true + }, + "scopes": { + "type": "array", + "description": "Scopes this key is allowed to call; full grants everything", + "items": { + "type": "string", + "description": "Scopes this key is allowed to call; full grants everything" + } } }, "description": "API key metadata" @@ -43922,6 +61563,42 @@ } } }, + "LinkedIncidentDto": { + "required": [ + "id", + "monitorId", + "status" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Incident identifier", + "format": "uuid" + }, + "monitorId": { + "type": "string", + "description": "Monitor the incident belongs to", + "format": "uuid" + }, + "status": { + "type": "string", + "description": "Incident status", + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] + }, + "title": { + "type": "string", + "description": "Incident title", + "nullable": true + } + }, + "description": "Open incident on a monitor affected by this rollback" + }, "LinkedStatusPageIncidentDto": { "required": [ "connectionMode", @@ -44615,6 +62292,32 @@ } } }, + "Meter": { + "type": "object", + "properties": { + "used": { + "type": "integer", + "description": "Billable runs consumed", + "format": "int64" + }, + "included": { + "type": "integer", + "description": "Included runs; null means unlimited", + "format": "int64", + "nullable": true + }, + "testRuns": { + "type": "integer", + "description": "Billable validation runs included in consumed runs", + "format": "int64" + } + }, + "description": "Multi-step API usage totals", + "required": [ + "used", + "testRuns" + ] + }, "MonitorAssertionDto": { "required": [ "assertionType", @@ -44889,6 +62592,177 @@ } } }, + "MonitorBatchHistoryDto": { + "required": [ + "monitors" + ], + "type": "object", + "properties": { + "monitors": { + "type": "array", + "description": "One entry per requested monitor that exists in the workspace", + "items": { + "$ref": "#/components/schemas/MonitorBatchHistoryItemDto" + } + } + }, + "description": "History for a set of monitors" + }, + "MonitorBatchHistoryItemDto": { + "required": [ + "id", + "ticks" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Monitor identifier", + "format": "uuid" + }, + "availability": { + "type": "number", + "description": "Share of checks that passed, 0–100; null when no checks ran", + "format": "double", + "nullable": true + }, + "p95": { + "type": "number", + "description": "95th percentile response time in milliseconds; null when none recorded", + "format": "double", + "nullable": true + }, + "ticks": { + "type": "array", + "description": "Outcome per time bucket, oldest first", + "items": { + "$ref": "#/components/schemas/MonitorHistoryTickDto" + } + }, + "displayTicks": { + "type": "array", + "description": "48 display buckets; present only when density=48", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorDisplayTickDto" + } + } + }, + "description": "Availability, p95 latency and ticks of one monitor over the window" + }, + "MonitorCappedDto": { + "type": "object", + "properties": { + "resumesAt": { + "type": "string", + "description": "When runs resume; null when unknown", + "format": "date-time", + "nullable": true + }, + "kind": { + "type": "string", + "description": "Allowance stopping this meter: included or spend_cap", + "nullable": true + } + }, + "description": "Run allowance that is keeping a code monitor from running" + }, + "MonitorCodeSpec": { + "required": [ + "bundle", + "entrypoint" + ], + "type": "object", + "properties": { + "bundle": { + "maxLength": 80, + "minLength": 0, + "pattern": "^sha256:[a-f0-9]{64}$", + "type": "string", + "description": "Closure digest from POST /bundles (sha256:)" + }, + "entrypoint": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "File that runs, relative to the bundle root" + }, + "source": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeSource" + } + ] + } + }, + "description": "Bundle digest and entrypoint to publish as the live revision" + }, + "MonitorDisplayTickDto": { + "required": [ + "at", + "failingRegions", + "outcome", + "retryPassCount" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Inclusive start of this bucket", + "format": "date-time" + }, + "outcome": { + "type": "string", + "description": "passed, failed, degraded, timed_out, passed_on_retry, couldnt_run, skipped, or no_data" + }, + "runId": { + "type": "string", + "description": "Representative run to open for this bucket", + "format": "uuid", + "nullable": true + }, + "failingRegions": { + "type": "array", + "description": "Regions with a target failure in this bucket", + "items": { + "type": "string", + "description": "Regions with a target failure in this bucket" + } + }, + "retryPassCount": { + "type": "integer", + "description": "Region cycles that passed after retry in this bucket", + "format": "int64" + } + }, + "description": "Display history bucket; infrastructure outcomes do not vote on target health" + }, + "MonitorDriftCodeDto": { + "required": [ + "gitDigest", + "liveDigest", + "drifted" + ], + "type": "object", + "properties": { + "liveDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of the code revision running now" + }, + "gitDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of the code revision last applied from Git" + }, + "drifted": { + "type": "boolean", + "description": "Whether the live digest differs from the Git digest" + } + }, + "description": "Live code digest compared with the last digest applied from Git" + }, "MonitorDriftDto": { "required": [ "fields" @@ -44901,9 +62775,25 @@ "items": { "$ref": "#/components/schemas/MonitorDriftFieldDto" } + }, + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorDriftCodeDto" + } + ] + }, + "settings": { + "type": "array", + "description": "Settings that differ from the last values applied from Git; null without a settings baseline", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorDriftSettingDto" + } } }, - "description": "Live overlay drift against the implied declared baseline" + "description": "How the live monitor differs from what was last applied from code" }, "MonitorDriftFieldDto": { "required": [ @@ -44931,6 +62821,51 @@ }, "description": "One field where live state differs from declared" }, + "MonitorDriftSettingDto": { + "required": [ + "field", + "git", + "live" + ], + "type": "object", + "properties": { + "field": { + "minLength": 1, + "type": "string", + "description": "Setting name: frequency or regions" + }, + "live": { + "minLength": 1, + "type": "string", + "description": "Live value: seconds for frequency, comma-separated ids for regions" + }, + "git": { + "minLength": 1, + "type": "string", + "description": "Value last applied from Git, in the same format as live" + }, + "changedAt": { + "type": "string", + "description": "When this setting was last changed", + "format": "date-time", + "nullable": true + }, + "changedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "reason": { + "type": "string", + "description": "Recorded reason; null when no reason was stored", + "nullable": true + } + }, + "description": "One setting where the live value differs from Git" + }, "MonitorDto": { "required": [ "config", @@ -44944,6 +62879,7 @@ "organizationId", "frequencySeconds", "enabled", + "ownerEnforced", "muted" ], "type": "object", @@ -45029,6 +62965,10 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Whether only the managedBy tool may change this monitor's configuration" + }, "createdAt": { "type": "string", "description": "Timestamp when the monitor was created", @@ -45126,135 +63066,595 @@ "infra", "flaky", "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "bindingReadiness": { + "type": "string", + "description": "Secret binding state: ready, blocked, or not_applicable", + "nullable": true, + "enum": [ + "ready", + "blocked", + "not_applicable" + ] + }, + "needsAttention": { + "type": "boolean", + "description": "True when the monitor needs operator attention", + "nullable": true + }, + "openIncident": { + "type": "string", + "description": "Open confirmed incident id", + "format": "uuid", + "nullable": true + }, + "lastRunAt": { + "type": "string", + "description": "When the latest code run was enqueued", + "format": "date-time", + "nullable": true + }, + "lastRunId": { + "type": "string", + "description": "Latest code run id", + "format": "uuid", + "nullable": true + }, + "resumesAt": { + "type": "string", + "description": "When a capped monitor resumes", + "format": "date-time", + "nullable": true + }, + "capped": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCappedDto" + } + ] + }, + "missingKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "blockedKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "owner": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOwnerDto" + } + ] + }, + "flakyRate": { + "type": "number", + "description": "Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + "format": "double", + "nullable": true + }, + "flakySince": { + "type": "string", + "description": "When the first retry-passed cycle in the last 7 days finished", + "format": "date-time", + "nullable": true + }, + "flakySeverity": { + "type": "string", + "description": "How flaky the monitor is: LOW, MEDIUM, or HIGH", + "nullable": true, + "enum": [ + "low", + "medium", + "high" + ] + }, + "lastCheckOutcome": { + "type": "string", + "description": "Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + "nullable": true, + "enum": [ + "passed", + "degraded", + "failed" + ] + }, + "lastCheckRegion": { + "type": "string", + "description": "Region of the most recent check", + "nullable": true + }, + "lastFailureSummary": { + "type": "string", + "description": "Why the latest failing region failed", + "nullable": true + }, + "lastStateChangeAt": { + "type": "string", + "description": "When the monitor last changed state: paused, evaluation change, or incident open or resolve", + "format": "date-time", + "nullable": true + }, + "regionHealth": { + "type": "array", + "description": "Latest verdict per region the monitor runs from; null while paused", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorRegionHealthDto" + } + }, + "definitionId": { + "type": "string", + "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", + "format": "uuid", + "nullable": true + }, + "capturePolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CapturePolicy" + } + ] + }, + "secretKeys": { + "type": "array", + "description": "Explicit attached secret keys; null uses scanned demand", + "nullable": true, + "items": { + "type": "string", + "description": "Explicit attached secret keys; null uses scanned demand" + } + }, + "fastRetryMaxAttempts": { + "type": "integer", + "description": "Fast-retry max attempts; null/0 = off", + "format": "int32", + "nullable": true + }, + "runParallel": { + "type": "boolean", + "description": "When multiple locations are set, run all of them each interval. False rotates one location per interval", + "nullable": true + }, + "muted": { + "type": "boolean", + "description": "Whether alert delivery is muted" + }, + "mutedUntil": { + "type": "string", + "description": "Mute expiry; null means indefinite while muted", + "format": "date-time", + "nullable": true + }, + "muteReason": { + "type": "string", + "description": "Optional mute reason", + "nullable": true + }, + "pausedAt": { + "type": "string", + "description": "When the monitor was paused", + "format": "date-time", + "nullable": true + }, + "pauseReason": { + "type": "string", + "description": "Optional pause reason", + "nullable": true + }, + "pauseExpiresAt": { + "type": "string", + "description": "Pause expiry", + "format": "date-time", + "nullable": true + }, + "quarantineOwnerId": { + "type": "string", + "description": "Quarantine person owner id", + "nullable": true + }, + "quarantineUntil": { + "type": "string", + "description": "Quarantine expiry; non-null means quarantined", + "format": "date-time", + "nullable": true + }, + "quarantineReason": { + "type": "string", + "description": "Quarantine reason", + "nullable": true + }, + "usageProjection": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorUsageProjectionDto" + } + ] + }, + "liveRevisionId": { + "type": "string", + "description": "Revision scheduled runs execute", + "format": "uuid", + "nullable": true + }, + "liveRevisionDigest": { + "type": "string", + "description": "Closure digest of the revision scheduled runs execute", + "nullable": true + }, + "triage": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorTriageDto" + } + ] + }, + "deletedAt": { + "type": "string", + "description": "When the monitor was moved to Trash", + "format": "date-time", + "nullable": true + }, + "deletedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "createdVia": { + "type": "string", + "description": "Client that originally created the monitor", + "nullable": true + } + }, + "description": "Full monitor representation" + }, + "MonitorFacetDto": { + "required": [ + "field", + "values" + ], + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "Facet field: type, environment, region, tag, or owner", + "enum": [ + "type", + "environment", + "region", + "tag", + "owner", + "project" + ] + }, + "values": { + "type": "array", + "description": "Values with at least one monitor, largest first", + "items": { + "$ref": "#/components/schemas/MonitorFacetValueDto" + } + } + }, + "description": "Values of one facet field" + }, + "MonitorFacetValueDto": { + "required": [ + "value", + "worstState", + "count" + ], + "type": "object", + "properties": { + "value": { + "minLength": 1, + "type": "string", + "description": "Value as the list filter takes it: type name, environment id, region, tag name, or owner" + }, + "count": { + "type": "integer", + "description": "Monitors with this value", + "format": "int64" + }, + "worstState": { + "type": "string", + "description": "Most severe displayHealth among the monitors with this value", + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", "paused", "never_run", "confirming" ] }, - "bindingReadiness": { + "failing": { + "type": "integer", + "description": "Matching monitors currently failing", + "format": "int64", + "nullable": true + }, + "notRunning": { + "type": "integer", + "description": "Matching monitors currently unable to run", + "format": "int64", + "nullable": true + }, + "flaky": { + "type": "integer", + "description": "Matching running monitors recovered by retry", + "format": "int64", + "nullable": true + }, + "owner": { "type": "string", - "description": "Secret binding state: ready, blocked, or not_applicable", + "description": "Owning tool for a project facet value", "nullable": true, "enum": [ - "ready", - "blocked", - "not_applicable" + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" ] + } + }, + "description": "One value of a facet field" + }, + "MonitorFieldChange": { + "required": [ + "field" + ], + "type": "object", + "properties": { + "field": { + "minLength": 1, + "type": "string", + "description": "Setting that changed" }, - "needsAttention": { - "type": "boolean", - "description": "True when the monitor needs operator attention", + "from": { + "type": "string", + "description": "Previous setting value", "nullable": true }, - "openIncident": { + "to": { "type": "string", - "description": "Open confirmed incident id", - "format": "uuid", + "description": "New setting value", "nullable": true + } + }, + "description": "One non-secret setting changed by a monitor action" + }, + "MonitorFleetSummaryDto": { + "required": [ + "from", + "groups", + "ticks", + "to", + "window", + "openIncidentCount" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Window: 24h, 7d, or 30d" }, - "lastRunAt": { + "from": { "type": "string", - "description": "When the latest code run was enqueued", - "format": "date-time", - "nullable": true + "description": "Inclusive start of the history window", + "format": "date-time" }, - "lastRunId": { + "to": { "type": "string", - "description": "Latest code run id", - "format": "uuid", + "description": "Exclusive end of the history window", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed target checks divided by measured target checks, 0–100", + "format": "double", "nullable": true }, - "definitionId": { + "lastFailureBucketAt": { "type": "string", - "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", - "format": "uuid", + "description": "Start of the most recent failing display bucket", + "format": "date-time", "nullable": true }, - "capturePolicy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/CapturePolicy" - } - ] - }, - "fastRetryMaxAttempts": { + "openIncidentCount": { "type": "integer", - "description": "Fast-retry max attempts; null/0 = off", - "format": "int32", - "nullable": true - }, - "runParallel": { - "type": "boolean", - "description": "When multiple locations are set, run all of them each interval. False rotates one location per interval", - "nullable": true + "description": "Open confirmed monitor incidents", + "format": "int64" }, - "muted": { - "type": "boolean", - "description": "Whether alert delivery is muted" + "groups": { + "type": "array", + "description": "Current monitor group counts, independent of list filters", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "mutedUntil": { + "ticks": { + "type": "array", + "description": "48 display buckets showing the worst observed monitor outcome", + "items": { + "$ref": "#/components/schemas/MonitorDisplayTickDto" + } + } + }, + "description": "Whole-workspace monitor history and live group counts" + }, + "MonitorHistoryEntryDto": { + "required": [ + "from", + "kind", + "monitorId", + "reason", + "to", + "count" + ], + "type": "object", + "properties": { + "kind": { "type": "string", - "description": "Mute expiry; null means indefinite while muted", - "format": "date-time", - "nullable": true + "description": "Row kind: not_run" }, - "muteReason": { + "monitorId": { "type": "string", - "description": "Optional mute reason", - "nullable": true + "description": "Monitor this row belongs to", + "format": "uuid" }, - "pausedAt": { + "region": { "type": "string", - "description": "When the monitor was paused", - "format": "date-time", + "description": "Region of the skipped ticks; null when they span several regions", "nullable": true }, - "pauseReason": { + "reason": { "type": "string", - "description": "Optional pause reason", - "nullable": true + "description": "Why the ticks were skipped: quota, blocked, or plan_limit" }, - "pauseExpiresAt": { + "from": { "type": "string", - "description": "Pause expiry", - "format": "date-time", - "nullable": true + "description": "First skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineOwnerId": { + "to": { "type": "string", - "description": "Quarantine person owner id", - "nullable": true + "description": "Latest skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineUntil": { - "type": "string", - "description": "Quarantine expiry; non-null means quarantined", - "format": "date-time", - "nullable": true + "count": { + "type": "integer", + "description": "Skipped ticks collapsed into this row", + "format": "int32" }, - "quarantineReason": { + "missingKeys": { + "type": "array", + "description": "Secret keys recorded as missing for this interval", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys recorded as missing for this interval" + } + }, + "environment": { "type": "string", - "description": "Quarantine reason", + "description": "Environment recorded when these ticks were skipped", "nullable": true + } + }, + "description": "Collapsed scheduled ticks that did not run" + }, + "MonitorHistoryTickDto": { + "required": [ + "at", + "outcome" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Start of the bucket", + "format": "date-time" }, - "upload": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PackageUploadDto" - } + "outcome": { + "type": "string", + "description": "PASSED when every check passed, FAILED when none did, otherwise DEGRADED", + "enum": [ + "passed", + "degraded", + "failed" ] + } + }, + "description": "Outcome of the checks in one time bucket" + }, + "MonitorListFacetsDto": { + "required": [ + "facets", + "groups" + ], + "type": "object", + "properties": { + "groups": { + "type": "array", + "description": "Count per list group", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "usageProjection": { + "facets": { + "type": "array", + "description": "Values and counts per facet field", + "items": { + "$ref": "#/components/schemas/MonitorFacetDto" + } + }, + "sources": { + "type": "array", + "description": "Matching monitors per owning tool and project", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/MonitorUsageProjectionDto" - } + "items": { + "$ref": "#/components/schemas/MonitorSourceSummaryDto" + } + } + }, + "description": "Group and facet counts for the monitors a list filter selects" + }, + "MonitorListGroupDto": { + "required": [ + "key", + "count" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Group: failing, not_running, flaky, passing, running, or paused", + "enum": [ + "failing", + "not_running", + "flaky", + "passing", + "running", + "paused" ] + }, + "count": { + "type": "integer", + "description": "Monitors in the group", + "format": "int64" } }, - "description": "Full monitor representation" + "description": "Number of monitors in one list group" }, "MonitorOverlayRequest": { "type": "object", @@ -45274,91 +63674,90 @@ } } }, - "MonitorPackageSpec": { + "MonitorOwnerDto": { "required": [ - "digest", - "entrypoint", - "files" + "type" ], "type": "object", "properties": { - "digest": { - "maxLength": 64, - "minLength": 64, + "type": { "type": "string", - "description": "SHA-256 hex digest of the package zip (64 characters)" + "description": "Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] }, - "entrypoint": { - "maxLength": 512, - "minLength": 0, + "project": { "type": "string", - "description": "Entrypoint path inside the zip, e.g. tests/login.spec.ts" - }, - "files": { - "maxItems": 256, - "minItems": 0, - "type": "array", - "description": "Relative file paths included in the zip", - "items": { - "maxLength": 512, - "minLength": 0, - "type": "string", - "description": "Relative file paths included in the zip" - } - }, - "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" - } + "description": "Project the owning tool declares; null when it declares none", + "nullable": true }, - "gitSha": { - "maxLength": 64, - "minLength": 0, + "address": { "type": "string", - "description": "Commit SHA from the repo that produced this zip. Client-supplied provenance only", + "description": "Resource address declared by the owning tool", "nullable": true }, - "gitMessage": { - "maxLength": 1024, - "minLength": 0, + "label": { "type": "string", - "description": "Commit message from the repo that produced this zip", + "description": "Display label declared by the owning client", "nullable": true }, - "gitFile": { - "maxLength": 512, - "minLength": 0, + "labeledAt": { "type": "string", - "description": "Path of the declaring file in that repo", + "description": "When the owner label was declared", + "format": "date-time", "nullable": true + } + }, + "description": "Tool that owns a monitor and the project it declares" + }, + "MonitorOwnershipMetadata": { + "type": "object", + "description": "Ownership change, admin override, or forced deploy-lock release", + "properties": { + "kind": { + "type": "string", + "enum": [ + "monitor_ownership" + ] }, - "authoredBy": { - "maxLength": 255, - "minLength": 0, + "fromOwner": { "type": "string", - "description": "Author attribution supplied with the package", - "nullable": true + "description": "Owning tool before the change", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] }, - "keyLocations": { - "maxItems": 64, - "minItems": 0, - "type": "array", - "description": "Per-key declaring file and location from package scan", + "toOwner": { + "type": "string", + "description": "Owning tool after the change", "nullable": true, - "items": { - "$ref": "#/components/schemas/DemandedKeyLocation" - } + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "reason": { + "type": "string", + "description": "Reason the caller gave", + "nullable": true } }, - "description": "New package zip metadata for this environment" + "required": [ + "kind" + ] }, "MonitorReference": { "required": [ @@ -45377,7 +63776,87 @@ "description": "Monitor name" } }, - "description": "Monitors that reference this secret for authentication" + "description": "Monitors that reference this secret in code, authentication, or sessions" + }, + "MonitorRegionalHealthDto": { + "required": [ + "regions" + ], + "type": "object", + "properties": { + "regionalDisplayHealth": { + "type": "string", + "description": "Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + "nullable": true, + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "evaluationCycleId": { + "type": "string", + "description": "Cycle used for the regional presentation", + "format": "uuid", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Latest health-voting execution for each configured region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "lastFailure": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "failingCycleCount": { + "type": "integer", + "description": "Failing cycles since evaluation changed; null outside retained history", + "format": "int64", + "nullable": true + } + }, + "description": "Regional presentation from runs, independent of incident evaluation" + }, + "MonitorRegionHealthDto": { + "required": [ + "region", + "verdict" + ], + "type": "object", + "properties": { + "region": { + "minLength": 1, + "type": "string", + "description": "Probe region" + }, + "verdict": { + "type": "string", + "description": "Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check", + "enum": [ + "up", + "degraded", + "down", + "paused", + "unknown" + ] + } + }, + "description": "Latest verdict for one region of a monitor" }, "MonitorRunDurationBatchDto": { "required": [ @@ -45475,7 +63954,7 @@ }, "outcome": { "type": "string", - "description": "Filter by outcome; not_passed also includes passed-on-retry runs", + "description": "Outcomes, repeated or comma-separated; not_passed includes retries", "nullable": true }, "region": { @@ -45499,6 +63978,18 @@ "format": "uuid", "nullable": true }, + "from": { + "type": "string", + "description": "Inclusive enqueue lower bound (clamped to 90 days)", + "format": "date-time", + "nullable": true + }, + "to": { + "type": "string", + "description": "Inclusive enqueue upper bound (default now)", + "format": "date-time", + "nullable": true + }, "cursor": { "type": "string", "description": "Opaque cursor from the previous page; results cover the last 90 days", @@ -45510,12 +64001,146 @@ "type": "integer", "description": "Page size (1–100, default 25)", "format": "int32" + }, + "monitorType": { + "type": "string", + "description": "Monitor type: BROWSER or MULTI_STEP_API", + "nullable": true + }, + "incidentId": { + "type": "string", + "description": "Runs in the incident window, intersected with from and to", + "format": "uuid", + "nullable": true + }, + "branch": { + "type": "string", + "description": "Exact branch from revision provenance", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Select monitors currently flaky over the last seven days", + "nullable": true + }, + "sessionId": { + "type": "string", + "description": "Caller-provided CI session identifier", + "nullable": true + }, + "evaluationCycleId": { + "type": "string", + "description": "Only runs in this evaluation cycle, including retries", + "format": "uuid", + "nullable": true + }, + "excludeSource": { + "type": "string", + "description": "Exclude this source; omitted preserves all sources", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Enqueue order: asc or desc (default: desc)", + "nullable": true + }, + "step": { + "minimum": 0, + "type": "integer", + "description": "Zero-based failed step index; requires monitor and caseIndex", + "format": "int32", + "nullable": true + }, + "caseIndex": { + "minimum": 0, + "type": "integer", + "description": "Zero-based case index qualifying the failed step", + "format": "int32", + "nullable": true } }, "required": [ "limit" ] }, + "MonitorRunSeriesDto": { + "required": [ + "buckets", + "from", + "regions", + "to", + "window", + "pointsTruncated" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Requested chart window" + }, + "from": { + "type": "string", + "description": "Inclusive start of the chart", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive end of the chart", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed final target outcomes as a percent of passed and failed", + "format": "double", + "nullable": true + }, + "previousUptimePercent": { + "type": "number", + "description": "Target uptime in the previous equal-length period", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Buckets across every selected region", + "items": { + "$ref": "#/components/schemas/Bucket" + } + }, + "regions": { + "type": "array", + "description": "Buckets for each selected region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "points": { + "type": "array", + "description": "Latest execution points for 24h; null for longer windows", + "nullable": true, + "items": { + "$ref": "#/components/schemas/Point" + } + }, + "pointsTruncated": { + "type": "boolean", + "description": "More 24h points exist than the returned 2000-point limit" + } + }, + "description": "Execution chart and target-health cycles, read directly from retained runs. Health retries are reduced before assigning a cycle to its initial enqueue bucket; execution durations use their own enqueue window. Both comparison windows use the same current retained-cycle evidence" + }, + "MonitorScheduleDto": { + "type": "object", + "properties": { + "nextRunAt": { + "type": "string", + "description": "When the next scheduled cycle is due for admission", + "format": "date-time", + "nullable": true + } + }, + "description": "Scheduler admission clock for a code monitor" + }, "MonitorSecretRequestsDto": { "required": [ "environment", @@ -45532,6 +64157,14 @@ "items": { "$ref": "#/components/schemas/SecretRequestDto" } + }, + "undemanded": { + "type": "array", + "description": "Keys retained outside the selected revision scanned demand", + "nullable": true, + "items": { + "$ref": "#/components/schemas/SecretRequestDto" + } } }, "description": "Environment and secret keys this monitor requires" @@ -45613,6 +64246,23 @@ "description": "When this session row was last written", "format": "date-time", "nullable": true + }, + "capturedAt": { + "type": "string", + "description": "When storage state was last captured successfully", + "format": "date-time", + "nullable": true + }, + "captureRunId": { + "type": "string", + "description": "Run that last captured storage state successfully", + "format": "uuid", + "nullable": true + }, + "defaultSession": { + "type": "boolean", + "description": "Whether legacy single-session routes select this setup file; absent on older APIs", + "nullable": true } }, "description": "Cached sign-in session for a monitor" @@ -45659,6 +64309,24 @@ }, "description": "Projected run volume and meter headroom for this monitor" }, + "MonitorSourceSummaryDto": { + "required": [ + "owner", + "count" + ], + "type": "object", + "properties": { + "owner": { + "$ref": "#/components/schemas/MonitorOwnerDto" + }, + "count": { + "type": "integer", + "description": "Number of matching monitors", + "format": "int64" + } + }, + "description": "Monitors declared by one owning tool and project" + }, "MonitorsSummaryDto": { "type": "object", "properties": { @@ -45768,6 +64436,22 @@ "description": "Environment to test against; null uses the monitor environment", "format": "uuid", "nullable": true + }, + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "session": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunSessionContext" + } + ] } } }, @@ -45835,11 +64519,175 @@ "type": "array", "nullable": true, "items": { - "type": "string" + "type": "string", + "nullable": true + } + } + } + }, + "MonitorTriageDto": { + "required": [ + "deletedBindings", + "restoreBlockers" + ], + "type": "object", + "properties": { + "lastCheckAt": { + "type": "string", + "description": "When the latest completed check finished", + "format": "date-time", + "nullable": true + }, + "latestRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "latestHealthRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "incident": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentDto" + } + ] + }, + "pausedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "flakiness": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/Flakiness" + } + ] + }, + "restoreBlockers": { + "type": "array", + "description": "Reasons this trashed monitor cannot currently be restored", + "items": { + "type": "string", + "description": "Reasons this trashed monitor cannot currently be restored" } + }, + "deletedBindings": { + "type": "array", + "description": "Status-page bindings retained for restoration", + "items": { + "$ref": "#/components/schemas/RestorableBinding" + } + } + }, + "description": "Operational facts for a monitor" + }, + "MonitorTriageParams": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Exact monitor name, ignoring case and surrounding spaces", + "nullable": true + }, + "openIncident": { + "type": "boolean", + "description": "Whether a confirmed incident is open", + "nullable": true + }, + "muted": { + "type": "boolean", + "description": "Whether alert delivery is currently muted", + "nullable": true + }, + "quarantined": { + "type": "boolean", + "description": "Whether quarantine has not expired", + "nullable": true + }, + "pausedBefore": { + "type": "string", + "description": "Only monitors paused before this timestamp", + "format": "date-time", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Whether recent completed cycles recovered on retry", + "nullable": true + }, + "group": { + "type": "string", + "description": "List group: failing, not_running, passing, or paused", + "nullable": true + }, + "ownerProject": { + "type": "string", + "description": "Exact project declared by the owning tool", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Use state for group and streak ordering", + "nullable": true } } }, + "MonitorUsage": { + "required": [ + "meter", + "monitorId", + "deleted", + "runs", + "testRuns" + ], + "type": "object", + "properties": { + "monitorId": { + "type": "string", + "description": "Monitor owning this usage", + "format": "uuid" + }, + "monitorName": { + "type": "string", + "description": "Monitor name; null when unavailable", + "nullable": true + }, + "deleted": { + "type": "boolean", + "description": "Whether the monitor has been deleted" + }, + "meter": { + "type": "string", + "description": "Meter this usage counts toward" + }, + "runs": { + "type": "integer", + "description": "Billable runs consumed", + "format": "int64" + }, + "testRuns": { + "type": "integer", + "description": "Billable validation runs included in consumed runs", + "format": "int64" + } + }, + "description": "Usage grouped by monitor and meter, including deleted monitors" + }, "MonitorUsageProjectionDto": { "type": "object", "properties": { @@ -45898,6 +64746,128 @@ "projectedOverageRuns" ] }, + "MonitorValidationFindingDto": { + "required": [ + "code", + "message", + "severity" + ], + "type": "object", + "properties": { + "severity": { + "type": "string", + "description": "error blocks a write; warning does not", + "enum": [ + "ERROR", + "WARNING" + ] + }, + "code": { + "type": "string", + "description": "Stable problem code, such as MONITOR_FREQUENCY_BELOW_PLAN_MIN" + }, + "message": { + "type": "string", + "description": "What is wrong" + }, + "field": { + "type": "string", + "description": "Request field this finding refers to", + "nullable": true + }, + "have": { + "type": "integer", + "description": "Current or requested amount", + "format": "int64", + "nullable": true + }, + "limit": { + "type": "integer", + "description": "Plan limit or floor", + "format": "int64", + "nullable": true + }, + "plan": { + "type": "string", + "description": "Billing plan, such as FREE", + "nullable": true + }, + "upgradeUrl": { + "type": "string", + "description": "Where to change plan", + "nullable": true + }, + "environment": { + "type": "string", + "description": "Destination environment slug or id", + "nullable": true + }, + "secretKey": { + "type": "string", + "description": "Secret key name with no value in this environment", + "nullable": true + }, + "runtimeId": { + "type": "string", + "description": "Runtime id this finding refers to", + "nullable": true + }, + "monitorIndex": { + "type": "integer", + "description": "Index of the monitor in the request", + "format": "int32", + "nullable": true + } + }, + "description": "One problem found while checking monitors" + }, + "MonitorValidationProjectionDto": { + "required": [ + "usage", + "monitorIndex" + ], + "type": "object", + "properties": { + "monitorIndex": { + "type": "integer", + "description": "Index of the monitor in the request", + "format": "int32" + }, + "environment": { + "type": "string", + "description": "Destination environment slug or id", + "nullable": true + }, + "usage": { + "$ref": "#/components/schemas/MonitorUsageProjectionDto" + } + }, + "description": "Projected monthly runs for one code monitor destination" + }, + "MonitorValidationResultDto": { + "required": [ + "findings", + "projections" + ], + "type": "object", + "properties": { + "findings": { + "type": "array", + "description": "Every problem found, including warnings", + "items": { + "$ref": "#/components/schemas/MonitorValidationFindingDto" + } + }, + "projections": { + "type": "array", + "description": "Projected monthly runs for each code monitor destination", + "items": { + "$ref": "#/components/schemas/MonitorValidationProjectionDto" + } + } + }, + "description": "Dry-run findings and projected runs. Nothing is saved" + }, "MonitorVersionDto": { "required": [ "changedVia", @@ -45958,7 +64928,7 @@ }, "NearestOtherRegion": { "required": [ - "artifactId", + "finishedAt", "region", "runId" ], @@ -45966,20 +64936,21 @@ "properties": { "runId": { "type": "string", - "description": "Run that holds the other-region shot", + "description": "Passing run identifier", "format": "uuid" }, "region": { + "minLength": 1, "type": "string", - "description": "Region of that run" + "description": "Region of the passing run" }, - "artifactId": { + "finishedAt": { "type": "string", - "description": "Screenshot on that run", - "format": "uuid" + "description": "When the passing run finished", + "format": "date-time" } }, - "description": "Prior pass of this step in another region" + "description": "Nearest earlier pass in another region when this region has none" }, "NetworkRowDto": { "required": [ @@ -46774,6 +65745,12 @@ "format": "double", "nullable": true }, + "p99Ms": { + "type": "number", + "description": "p99 duration in ms; null without settled timings", + "format": "double", + "nullable": true + }, "failed": { "type": "integer", "description": "Failed first-attempt count in the window", @@ -46848,34 +65825,25 @@ }, "description": "Overview step catalog joined to run-step aggregates" }, - "PackageUploadDto": { - "required": [ - "expiresAt", - "putUrl", - "requiredHeaders" - ], + "OwnerDeclaration": { "type": "object", "properties": { - "putUrl": { - "minLength": 1, + "address": { + "maxLength": 512, + "minLength": 0, "type": "string", - "description": "Presigned PUT URL for the zip bytes" + "description": "Resource address declared by the owning tool", + "nullable": true }, - "expiresAt": { + "label": { + "maxLength": 255, + "minLength": 0, "type": "string", - "description": "When the signed URL expires", - "format": "date-time" - }, - "requiredHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Must send Content-Type: application/zip and If-None-Match: *" - }, - "description": "Must send Content-Type: application/zip and If-None-Match: *" + "description": "Display label declared by the owning client", + "nullable": true } }, - "description": "Signed package upload target" + "description": "Advisory location and label declared by the owner" }, "Pageable": { "type": "object", @@ -47021,6 +65989,33 @@ "type": "string", "description": "When that run finished", "format": "date-time" + }, + "region": { + "type": "string", + "description": "Region of this finished run", + "nullable": true + }, + "outcome": { + "type": "string", + "description": "Outcome of this finished run", + "nullable": true, + "enum": [ + "passed", + "failed", + "execution_error", + "timed_out", + "passed_on_retry", + "cancelled", + "inconclusive" + ] + }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] } }, "description": "Finished run offered as an alternate baseline" @@ -47080,6 +66075,42 @@ }, "description": "Billing plan and entitlement state" }, + "Point": { + "required": [ + "at", + "outcome", + "region", + "runId" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "When the execution finished", + "format": "date-time" + }, + "runId": { + "type": "string", + "description": "Execution identifier", + "format": "uuid" + }, + "region": { + "type": "string", + "description": "Execution region" + }, + "outcome": { + "type": "string", + "description": "Recorded execution outcome" + }, + "durationMs": { + "type": "integer", + "description": "Execution duration in milliseconds", + "format": "int64", + "nullable": true + } + }, + "description": "Latest execution points for 24h; null for longer windows" + }, "PolicySnapshotDto": { "required": [ "engineVersion", @@ -47188,8 +66219,36 @@ "properties": { "revisionId": { "type": "string", - "description": "Existing revision to activate as Head for this monitor's environment", + "description": "Revision to make live for this monitor's environment", "format": "uuid" + }, + "expectedLiveRevisionId": { + "type": "string", + "description": "Live revision this publish replaces; null skips the check", + "format": "uuid", + "nullable": true + }, + "requireTested": { + "type": "boolean", + "description": "When true, require a passing test in this environment within 24 hours", + "nullable": true + }, + "force": { + "type": "boolean", + "description": "Skip the requireTested check; needs the publish-untested scope", + "nullable": true + }, + "acknowledgeRollback": { + "type": "string", + "description": "Rolled-back digest this publish re-applies on purpose", + "nullable": true + }, + "note": { + "maxLength": 280, + "minLength": 0, + "type": "string", + "description": "Optional note describing this publish", + "nullable": true } } }, @@ -47457,6 +66516,161 @@ } } }, + "Region": { + "required": [ + "buckets", + "region" + ], + "type": "object", + "properties": { + "region": { + "type": "string", + "description": "Execution region" + }, + "uptimePercent": { + "type": "number", + "description": "Final target uptime in this region", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Clock-aligned chart buckets", + "items": { + "$ref": "#/components/schemas/Bucket" + } + } + }, + "description": "Buckets for each selected region" + }, + "RegionBucketDto": { + "required": [ + "from", + "to", + "total", + "passed" + ], + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Inclusive bucket start (ISO 8601)", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive bucket end (ISO 8601)", + "format": "date-time" + }, + "p50": { + "type": "number", + "description": "50th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "p95": { + "type": "number", + "description": "95th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "p99": { + "type": "number", + "description": "99th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "total": { + "type": "integer", + "description": "Checks run in this bucket", + "format": "int64" + }, + "passed": { + "type": "integer", + "description": "Checks that passed in this bucket", + "format": "int64" + } + }, + "description": "One chart bucket of checks and latency percentiles" + }, + "RegionDto": { + "required": [ + "displayName", + "id" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Region id, such as us-east" + }, + "displayName": { + "type": "string", + "description": "Name shown for this region" + } + }, + "description": "Public region checks can run from" + }, + "RegionResultSeriesDto": { + "required": [ + "regions", + "window", + "bucketSeconds" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Requested window (24h, 7d, or 30d)" + }, + "bucketSeconds": { + "type": "integer", + "description": "Chart bucket width in seconds", + "format": "int32" + }, + "previousUptimePercent": { + "type": "number", + "description": "Uptime percent for the previous equal-length window", + "format": "double", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Per-region series covering the requested window", + "items": { + "$ref": "#/components/schemas/RegionSeriesDto" + } + } + }, + "description": "Per-region uptime and latency series for a monitor chart window" + }, + "RegionSeriesDto": { + "required": [ + "buckets", + "region" + ], + "type": "object", + "properties": { + "region": { + "type": "string", + "description": "Probe region identifier" + }, + "uptimePercent": { + "type": "number", + "description": "Uptime percent over checks run in the window", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Clock-aligned buckets spanning the window", + "items": { + "$ref": "#/components/schemas/RegionBucketDto" + } + } + }, + "description": "Uptime and latency buckets for one region" + }, "RegionStatusDto": { "required": [ "region", @@ -48107,6 +67321,33 @@ "warnMs" ] }, + "RestorableBinding": { + "required": [ + "component", + "statusPage" + ], + "type": "object", + "properties": { + "statusPage": { + "$ref": "#/components/schemas/StatusPageDto" + }, + "component": { + "$ref": "#/components/schemas/StatusPageBindingSnapshot" + } + }, + "description": "Status-page binding retained while a monitor is trashed" + }, + "RestoreMonitorRequest": { + "type": "object", + "properties": { + "environmentId": { + "type": "string", + "description": "Environment to restore a code monitor into; null preserves its environment", + "format": "uuid", + "nullable": true + } + } + }, "ResultSummaryDto": { "required": [ "chartData", @@ -48277,7 +67518,7 @@ "digest": { "minLength": 1, "type": "string", - "description": "SHA-256 hex digest of the zip" + "description": "Closure digest from POST /bundles (sha256:)" }, "entrypoint": { "minLength": 1, @@ -48306,6 +67547,12 @@ "format": "date-time", "nullable": true }, + "purgedAt": { + "type": "string", + "description": "When package bytes were purged", + "format": "date-time", + "nullable": true + }, "gitSha": { "type": "string", "description": "Git commit SHA when sourced from Git", @@ -48326,14 +67573,146 @@ "description": "Who authored this package", "nullable": true }, + "source": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeSource" + } + ] + }, "createdAt": { "type": "string", "description": "When the revision was minted", "format": "date-time" + }, + "state": { + "type": "string", + "description": "draft, tested_passed, tested_failed, live, previous, or discarded", + "nullable": true, + "enum": [ + "draft", + "tested_passed", + "tested_failed", + "live", + "previous", + "discarded" + ] + }, + "testRunId": { + "type": "string", + "description": "Latest validation run for this revision", + "format": "uuid", + "nullable": true + }, + "testOutcome": { + "type": "string", + "description": "Latest test outcome; absent until a test finishes", + "nullable": true, + "enum": [ + "passed", + "failed" + ] + }, + "liveStats": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionLiveStatsDto" + } + ] + }, + "expiresAt": { + "type": "string", + "description": "When this draft expires; preserved after discard", + "format": "date-time", + "nullable": true + }, + "createdByKind": { + "type": "string", + "description": "Tool that created this draft", + "nullable": true, + "enum": [ + "dashboard", + "git", + "terraform", + "api", + "mcp" + ] + }, + "baseRevision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionReferenceDto" + } + ] } }, "description": "Definition revision package" }, + "RevisionFilesDto": { + "required": [ + "entrypoint", + "files" + ], + "type": "object", + "properties": { + "entrypoint": { + "type": "string", + "description": "Entry file path inside the bundle" + }, + "files": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Source text by file path" + }, + "description": "Source text by file path" + } + }, + "description": "Source files of a revision bundle" + }, + "RevisionLiveStatsDto": { + "type": "object", + "properties": { + "runs": { + "type": "integer", + "description": "Scheduled runs and fast retries of this revision", + "format": "int64" + }, + "failed": { + "type": "integer", + "description": "How many of those runs failed", + "format": "int64" + } + }, + "description": "Scheduled runs of this revision, and how many failed", + "required": [ + "runs", + "failed" + ] + }, + "RevisionReferenceDto": { + "required": [ + "id", + "number" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Related revision identifier", + "format": "uuid" + }, + "number": { + "type": "integer", + "description": "Revision number within its definition", + "format": "int32" + } + }, + "description": "Live revision this draft was based on" + }, "RollbackPreviewDto": { "required": [ "affectedMonitors", @@ -48364,21 +67743,32 @@ }, "RollbackRevisionRequest": { "required": [ - "reason", - "revisionId" + "reason" ], "type": "object", "properties": { "revisionId": { "type": "string", - "description": "Existing revision to restore as Head for this monitor's environment", - "format": "uuid" + "description": "Revision to restore; null restores the previous live revision", + "format": "uuid", + "nullable": true }, "reason": { "maxLength": 280, "minLength": 0, "type": "string", "description": "Why this rollback was performed (1–280 chars)" + }, + "emergency": { + "type": "boolean", + "description": "Emergency rollback; requires a confirmed incident on this monitor", + "nullable": true + }, + "expectedLiveRevisionId": { + "type": "string", + "description": "Live revision this rollback replaces; null skips the check", + "format": "uuid", + "nullable": true } } }, @@ -48904,7 +68294,8 @@ "last_pass_same_revision_region", "last_pass_any_revision", "attempts_in_run", - "none" + "none", + "selected_run" ] }, "readsAs": { @@ -48925,6 +68316,14 @@ "items": { "$ref": "#/components/schemas/PickerItem" } + }, + "nearestOtherRegion": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NearestOtherRegion" + } + ] } }, "description": "Step duration diff against a prior pass" @@ -48950,7 +68349,8 @@ "cancelRequested", "stream", "attempt", - "attemptOf" + "attemptOf", + "billable" ], "type": "object", "properties": { @@ -49010,6 +68410,14 @@ "description": "Revision this run executed", "format": "uuid" }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + }, "region": { "minLength": 1, "type": "string", @@ -49037,6 +68445,12 @@ "description": "When this run was enqueued", "format": "date-time" }, + "startDeadlineAt": { + "type": "string", + "description": "When this queued run must start", + "format": "date-time", + "nullable": true + }, "evaluationCycleId": { "type": "string", "description": "Evaluation cycle grouping this run with retries", @@ -49140,6 +68554,18 @@ "format": "date-time", "nullable": true }, + "pinnedAt": { + "type": "string", + "description": "When this run was pinned past retention", + "format": "date-time", + "nullable": true + }, + "purgedAt": { + "type": "string", + "description": "When stored evidence was purged", + "format": "date-time", + "nullable": true + }, "capturePolicySnapshot": { "type": "object", "additionalProperties": { @@ -49239,6 +68665,61 @@ "items": { "$ref": "#/components/schemas/RunExecutionAttemptDto" } + }, + "url": { + "type": "string", + "description": "Dashboard URL for this run", + "nullable": true + }, + "triggerId": { + "type": "string", + "description": "Groups runs started by one manual trigger; null for other runs", + "format": "uuid", + "nullable": true + }, + "session": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunSessionContext" + } + ] + }, + "runtimeId": { + "type": "string", + "description": "Runtime profile that executed this run", + "nullable": true + }, + "cause": { + "type": "string", + "description": "Platform cause for an execution error, inconclusive finish, or network failure", + "nullable": true, + "enum": [ + "platform", + "runtime_unavailable", + "testing_quota_exhausted", + "no_seat", + "lease_lost", + "target_unreachable" + ] + }, + "billable": { + "type": "boolean", + "description": "Whether a finished run counts against the included run pool" + }, + "failure": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunFailureDto" + } + ] + }, + "artifactsExpireAt": { + "type": "string", + "description": "When artifact bytes will expire", + "format": "date-time", + "nullable": true } }, "description": "Code-monitor run" @@ -49473,6 +68954,99 @@ }, "description": "Frozen execution identity; null when historical identity is unknown" }, + "RunFacetDto": { + "required": [ + "field", + "values" + ], + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "Filter field these values describe" + }, + "values": { + "type": "array", + "description": "Values selected by the other filters", + "items": { + "$ref": "#/components/schemas/Value" + } + } + }, + "description": "Run facets respecting the other active filters" + }, + "RunFailureDto": { + "required": [ + "kind" + ], + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "Failure category", + "enum": [ + "assertion", + "timeout", + "navigation", + "network", + "target_blocked", + "script_error", + "wait_timeout", + "setup" + ] + }, + "step": { + "type": "string", + "description": "Step title that failed; null when the run failed before a step", + "nullable": true + }, + "message": { + "type": "string", + "description": "Reporter message, trimmed", + "nullable": true + }, + "file": { + "type": "string", + "description": "User source file; null when the reporter did not capture one", + "nullable": true + }, + "line": { + "type": "integer", + "description": "1-based line in the user source file", + "format": "int32", + "nullable": true + }, + "index": { + "type": "integer", + "description": "0-based index of the failed step", + "format": "int32", + "nullable": true + } + }, + "description": "Why a run failed, including the source location when the reporter captured one" + }, + "RunHistogramBucketDto": { + "required": [ + "counts", + "start" + ], + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "Inclusive UTC start of this bucket", + "format": "date-time" + }, + "counts": { + "type": "array", + "description": "Health-voting run attempt counts", + "items": { + "$ref": "#/components/schemas/RunOutcomeCountDto" + } + } + }, + "description": "UTC time buckets of health-voting run attempts" + }, "RunListParams": { "type": "object", "properties": { @@ -49483,7 +69057,7 @@ }, "outcome": { "type": "string", - "description": "Filter by outcome; not_passed also includes passed-on-retry runs", + "description": "Outcomes, repeated or comma-separated; not_passed includes retries", "nullable": true }, "region": { @@ -49504,7 +69078,7 @@ }, "from": { "type": "string", - "description": "Inclusive enqueue lower bound (default last 30 minutes; clamped to 90 days)", + "description": "Inclusive enqueue lower bound (default last 24 hours; clamped to 90 days)", "format": "date-time", "nullable": true }, @@ -49519,23 +69093,94 @@ "description": "Substring match on monitor name or headline", "nullable": true }, - "size": { + "cursor": { + "type": "string", + "description": "Opaque cursor from the previous page", + "nullable": true + }, + "limit": { "maximum": 100, "minimum": 1, "type": "integer", "description": "Page size (1–100, default 50)", "format": "int32" }, - "page": { + "monitorId": { + "type": "string", + "description": "Only runs for this monitor", + "format": "uuid", + "nullable": true + }, + "revisionId": { + "type": "string", + "description": "Only runs for this revision", + "format": "uuid", + "nullable": true + }, + "monitorType": { + "type": "string", + "description": "Monitor type: BROWSER or MULTI_STEP_API", + "nullable": true + }, + "incidentId": { + "type": "string", + "description": "Runs in the incident window, intersected with from and to", + "format": "uuid", + "nullable": true + }, + "branch": { + "type": "string", + "description": "Exact branch from revision provenance", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Select monitors currently flaky over the last seven days", + "nullable": true + }, + "sessionId": { + "type": "string", + "description": "Caller-provided CI session identifier", + "nullable": true + }, + "evaluationCycleId": { + "type": "string", + "description": "Only runs in this evaluation cycle, including retries", + "format": "uuid", + "nullable": true + }, + "excludeSource": { + "type": "string", + "description": "Exclude this source; omitted preserves all sources", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Enqueue order: asc or desc (default: desc)", + "nullable": true + }, + "step": { "minimum": 0, "type": "integer", - "description": "Zero-based page index (default 0)", - "format": "int32" + "description": "Zero-based failed step index; requires monitor and caseIndex", + "format": "int32", + "nullable": true + }, + "caseIndex": { + "minimum": 0, + "type": "integer", + "description": "Zero-based case index qualifying the failed step", + "format": "int32", + "nullable": true + }, + "bucket": { + "type": "string", + "description": "Histogram width: 30m, 1h or 1d; at most 1000 buckets", + "nullable": true } }, "required": [ - "size", - "page" + "limit" ] }, "RunLiveDto": { @@ -49681,10 +69326,109 @@ "description": "Required artifact records explicitly suppressed, not reached, or not captured", "format": "int64", "nullable": true + }, + "outcomeCounts": { + "type": "array", + "description": "Health-voting run attempts by projected outcome", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunOutcomeCountDto" + } + }, + "excludedRunCount": { + "type": "integer", + "description": "Matching attempts that do not vote on health", + "format": "int64", + "nullable": true + }, + "cycleCount": { + "type": "integer", + "description": "Distinct scheduled cycle identities in the filtered population", + "format": "int64", + "nullable": true + }, + "failedCycleCount": { + "type": "integer", + "description": "Recorded complete cycles with a final failed or timed-out region; display count", + "format": "int64", + "nullable": true + }, + "displayGroupCount": { + "type": "integer", + "description": "Cycle and manual-trigger groups in the filtered population", + "format": "int64", + "nullable": true + }, + "healthVotingP95DurationMs": { + "type": "number", + "description": "95th-percentile duration of health-voting run attempts", + "format": "double", + "nullable": true + }, + "sessionLastRunAt": { + "type": "string", + "description": "Latest session enqueue within retention, independent of the window", + "format": "date-time", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "UTC time buckets of health-voting run attempts", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunHistogramBucketDto" + } + }, + "facets": { + "type": "array", + "description": "Run facets respecting the other active filters", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunFacetDto" + } } }, "description": "Duration and evidence metrics for the filtered Runs population" }, + "RunMonitorStripDto": { + "required": [ + "monitors", + "failingCount", + "flakyCount", + "healthyCount", + "unclassifiedCount" + ], + "type": "object", + "properties": { + "failingCount": { + "type": "integer", + "description": "Monitors whose latest window group is complete with a failed or timed-out region", + "format": "int64" + }, + "flakyCount": { + "type": "integer", + "description": "Passing monitors with current seven-day flakiness", + "format": "int64" + }, + "healthyCount": { + "type": "integer", + "description": "Monitors whose latest window group passed without current flakiness", + "format": "int64" + }, + "unclassifiedCount": { + "type": "integer", + "description": "Monitors whose latest voting group is pending or has no passing/failing verdict", + "format": "int64" + }, + "monitors": { + "type": "array", + "description": "At most 100 monitor chips; counts cover the complete population", + "items": { + "$ref": "#/components/schemas/Item" + } + } + } + }, "RunnerLogLiveEvent": { "required": [ "line", @@ -49704,6 +69448,40 @@ }, "description": "Live runner-log line" }, + "RunnerRegionStatusDto": { + "required": [ + "id", + "status" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Public region identifier" + }, + "status": { + "type": "string", + "description": "ok when both code-monitor types have an active accepting pool; otherwise degraded" + } + }, + "description": "Whether a public region accepts browser and multi-step runs" + }, + "RunnerRegionStatusesDto": { + "required": [ + "regions" + ], + "type": "object", + "properties": { + "regions": { + "type": "array", + "description": "Acceptance status per public region", + "items": { + "$ref": "#/components/schemas/RunnerRegionStatusDto" + } + } + }, + "description": "Public runner-region acceptance status" + }, "RunNetworkDto": { "required": [ "data", @@ -49777,6 +69555,209 @@ } } }, + "RunOutcomeCountDto": { + "required": [ + "outcome", + "count" + ], + "type": "object", + "properties": { + "outcome": { + "type": "string", + "description": "Projected run outcome" + }, + "count": { + "type": "integer", + "description": "Matching run attempts with this outcome", + "format": "int64" + } + }, + "description": "Per-outcome attempt counts; populated for region facets" + }, + "RunRevisionMarkerDto": { + "required": [ + "activatedAt", + "monitor", + "revision" + ], + "type": "object", + "properties": { + "monitor": { + "$ref": "#/components/schemas/MonitorDto" + }, + "revision": { + "$ref": "#/components/schemas/RevisionDto" + }, + "activatedAt": { + "type": "string", + "description": "Latest recorded activation of this revision in the monitor environment", + "format": "date-time" + } + }, + "description": "Items on this page" + }, + "RunSessionContext": { + "required": [ + "id" + ], + "type": "object", + "properties": { + "id": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Caller-provided CI session identifier" + }, + "label": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "CI session label, such as CI #4812", + "nullable": true + }, + "commit": { + "maxLength": 64, + "minLength": 0, + "type": "string", + "description": "Commit that started this CI session", + "nullable": true + }, + "branch": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Branch that started this CI session", + "nullable": true + }, + "url": { + "maxLength": 2048, + "minLength": 0, + "pattern": "^[hH][tT][tT][pP][sS]?://\\S+$", + "type": "string", + "description": "HTTP or HTTPS URL of the CI job", + "nullable": true + } + }, + "description": "CI session that started this run; absent on historical runs" + }, + "RunSkippedEntryDto": { + "required": [ + "from", + "kind", + "missingKeys", + "reason", + "to" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Persisted skipped row identity; absent for a plan-disabled interval", + "format": "uuid", + "nullable": true + }, + "kind": { + "type": "string", + "description": "not_run for recorded ticks; plan_disabled for a current plan pause" + }, + "monitor": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorDto" + } + ] + }, + "reason": { + "type": "string", + "description": "Cause: quota, blocked, spend_cap, or plan_limit" + }, + "region": { + "type": "string", + "description": "Region; absent when ticks cover multiple regions", + "nullable": true + }, + "from": { + "type": "string", + "description": "Beginning of the recorded interval", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "End of the interval; current plan pauses end at the query snapshot", + "format": "date-time" + }, + "count": { + "type": "integer", + "description": "Recorded ticks in the whole folded row; absent for a plan pause", + "format": "int64", + "nullable": true + }, + "missingKeys": { + "type": "array", + "description": "Secret keys recorded as missing", + "items": { + "type": "string", + "description": "Secret keys recorded as missing" + } + }, + "environment": { + "type": "string", + "description": "Environment recorded when ticks were skipped", + "nullable": true + } + }, + "description": "Items on this page" + }, + "RunSkippedListParams": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Inclusive window start; default last 24 hours, clamped to 90 days", + "format": "date-time", + "nullable": true + }, + "to": { + "type": "string", + "description": "Inclusive window end; default now", + "format": "date-time", + "nullable": true + }, + "monitorId": { + "type": "string", + "description": "Only entries for this monitor", + "format": "uuid", + "nullable": true + }, + "cursor": { + "type": "string", + "description": "Opaque cursor returned by this endpoint", + "nullable": true + }, + "limit": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Page size (1–100, default 50)", + "format": "int32" + }, + "environmentId": { + "type": "string", + "description": "Current monitor environment; historical ticks retain their snapshot", + "format": "uuid", + "nullable": true + }, + "monitorType": { + "type": "string", + "description": "Monitor type: BROWSER or MULTI_STEP_API", + "nullable": true + } + }, + "required": [ + "limit" + ] + }, "RunStepDto": { "required": [ "caseId", @@ -49876,10 +69857,10 @@ "type": "object", "additionalProperties": { "type": "object", - "description": "Assertion payload when this step is an assertion", + "description": "Assertion or safe wait-result metadata", "nullable": true }, - "description": "Assertion payload when this step is an assertion", + "description": "Assertion or safe wait-result metadata", "nullable": true } }, @@ -50002,6 +69983,95 @@ }, "description": "Default execution environment; null uses the catalog default" }, + "RunTraceSummaryDto": { + "required": [ + "consoleErrors", + "failedActions", + "failedRequests", + "runId", + "text", + "truncated" + ], + "type": "object", + "properties": { + "runId": { + "type": "string", + "description": "Run this summary belongs to", + "format": "uuid" + }, + "failedActions": { + "type": "array", + "description": "Failed step titles and messages", + "items": { + "type": "string", + "description": "Failed step titles and messages" + } + }, + "failedRequests": { + "type": "array", + "description": "Failed network requests", + "items": { + "type": "string", + "description": "Failed network requests" + } + }, + "consoleErrors": { + "type": "array", + "description": "Console error lines", + "items": { + "type": "string", + "description": "Console error lines" + } + }, + "text": { + "type": "string", + "description": "Plain-text summary, length-capped" + }, + "truncated": { + "type": "boolean", + "description": "Whether any section was cut to the cap" + } + }, + "description": "Bounded trace summary for a run" + }, + "RunWindowListParams": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Inclusive window start; default last 24 hours, clamped to 90 days", + "format": "date-time", + "nullable": true + }, + "to": { + "type": "string", + "description": "Inclusive window end; default now", + "format": "date-time", + "nullable": true + }, + "monitorId": { + "type": "string", + "description": "Only entries for this monitor", + "format": "uuid", + "nullable": true + }, + "cursor": { + "type": "string", + "description": "Opaque cursor returned by this endpoint", + "nullable": true + }, + "limit": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Page size (1–100, default 50)", + "format": "int32" + } + }, + "required": [ + "limit" + ] + }, "ScheduledMaintenanceDto": { "required": [ "affectedComponents", @@ -50085,14 +70155,6 @@ "type": "object", "additionalProperties": false, "properties": { - "script": { - "maxLength": 65536, - "minLength": 0, - "type": "string", - "description": "Legacy inline script on existing rows", - "nullable": true, - "readOnly": true - }, "timeoutSeconds": { "maximum": 240, "minimum": 5, @@ -50106,7 +70168,7 @@ "minLength": 0, "pattern": "^$|^[A-Za-z0-9._-]+$", "type": "string", - "description": "Runtime pin such as 2026.11; omit to pin the current runtime at create", + "description": "Runtime pin such as 2026.11; omit to pin the newest runtime that can run", "nullable": true } } @@ -50172,11 +70234,27 @@ }, "usedByMonitors": { "type": "array", - "description": "Monitors that reference this secret for authentication", + "description": "Monitors that reference this secret in code, authentication, or sessions", "nullable": true, "items": { "$ref": "#/components/schemas/MonitorReference" } + }, + "valuesAt": { + "type": "array", + "description": "Environments in which this secret has a value", + "nullable": true, + "items": { + "$ref": "#/components/schemas/Summary" + } + }, + "valueStamp": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SecretValueStampDto" + } + ] } }, "description": "Organization secret and its change-detection hash" @@ -50238,6 +70316,24 @@ "description": "Run that last resolved this key", "format": "uuid", "nullable": true + }, + "demanded": { + "type": "boolean", + "description": "Whether the selected revision statically declares this key", + "nullable": true + }, + "attached": { + "type": "boolean", + "description": "Whether this key is attached for vault resolution", + "nullable": true + }, + "valueStamp": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SecretValueStampDto" + } + ] } }, "description": "Secret key a monitor requires and how it is fulfilled" @@ -50258,6 +70354,32 @@ }, "description": "Monitors that reference this secret" }, + "SecretValueStampDto": { + "required": [ + "environment" + ], + "type": "object", + "properties": { + "environment": { + "$ref": "#/components/schemas/Summary" + }, + "updatedAt": { + "type": "string", + "description": "When this environment value was last written", + "format": "date-time", + "nullable": true + }, + "updatedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ActorDisplayDto" + } + ] + } + }, + "description": "Change metadata for the requested environment value" + }, "SeoMetadataDto": { "type": "object", "properties": { @@ -51403,6 +71525,17 @@ } } }, + "SingleValueResponseArtifactDownloadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ArtifactDownloadDto" + } + } + }, "SingleValueResponseAuthMeResponse": { "required": [ "data" @@ -51436,6 +71569,28 @@ } } }, + "SingleValueResponseBundleCheckResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleCheckResultDto" + } + } + }, + "SingleValueResponseBundleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleDto" + } + } + }, "SingleValueResponseCaptureCompareDto": { "required": [ "data" @@ -51458,6 +71613,17 @@ } } }, + "SingleValueResponseCreateDraftRevisionResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateDraftRevisionResponse" + } + } + }, "SingleValueResponseDashboardOverviewDto": { "required": [ "data" @@ -51513,6 +71679,28 @@ } } }, + "SingleValueResponseDeviceAuthorizationDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DeviceAuthorizationDto" + } + } + }, + "SingleValueResponseDeviceTokenDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DeviceTokenDto" + } + } + }, "SingleValueResponseEmailDomainDto": { "required": [ "data" @@ -51546,6 +71734,17 @@ } } }, + "SingleValueResponseEntitlementResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EntitlementResponse" + } + } + }, "SingleValueResponseEnvironmentDto": { "required": [ "data" @@ -51648,6 +71847,20 @@ } } }, + "SingleValueResponseListRegionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegionDto" + } + } + } + }, "SingleValueResponseListUUID": { "required": [ "data" @@ -51722,6 +71935,17 @@ } } }, + "SingleValueResponseMonitorBatchHistoryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorBatchHistoryDto" + } + } + }, "SingleValueResponseMonitorDriftDto": { "required": [ "data" @@ -51744,6 +71968,39 @@ } } }, + "SingleValueResponseMonitorFleetSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorFleetSummaryDto" + } + } + }, + "SingleValueResponseMonitorListFacetsDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorListFacetsDto" + } + } + }, + "SingleValueResponseMonitorRegionalHealthDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorRegionalHealthDto" + } + } + }, "SingleValueResponseMonitorRunDurationBatchDto": { "required": [ "data" @@ -51766,6 +72023,28 @@ } } }, + "SingleValueResponseMonitorRunSeriesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorRunSeriesDto" + } + } + }, + "SingleValueResponseMonitorScheduleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorScheduleDto" + } + } + }, "SingleValueResponseMonitorSecretRequestsDto": { "required": [ "data" @@ -51821,6 +72100,17 @@ } } }, + "SingleValueResponseMonitorValidationResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorValidationResultDto" + } + } + }, "SingleValueResponseMonitorVersionDto": { "required": [ "data" @@ -51887,25 +72177,25 @@ } } }, - "SingleValueResponsePackageUploadDto": { + "SingleValueResponsePolicySnapshotDto": { "required": [ "data" ], "type": "object", "properties": { "data": { - "$ref": "#/components/schemas/PackageUploadDto" + "$ref": "#/components/schemas/PolicySnapshotDto" } } }, - "SingleValueResponsePolicySnapshotDto": { + "SingleValueResponseRegionResultSeriesDto": { "required": [ "data" ], "type": "object", "properties": { "data": { - "$ref": "#/components/schemas/PolicySnapshotDto" + "$ref": "#/components/schemas/RegionResultSeriesDto" } } }, @@ -51975,6 +72265,17 @@ } } }, + "SingleValueResponseRevisionFilesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionFilesDto" + } + } + }, "SingleValueResponseRollbackPreviewDto": { "required": [ "data" @@ -52030,6 +72331,28 @@ } } }, + "SingleValueResponseRunMonitorStripDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunMonitorStripDto" + } + } + }, + "SingleValueResponseRunnerRegionStatusesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunnerRegionStatusesDto" + } + } + }, "SingleValueResponseRuntimeProfileDto": { "required": [ "data" @@ -52041,6 +72364,17 @@ } } }, + "SingleValueResponseRunTraceSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunTraceSummaryDto" + } + } + }, "SingleValueResponseSecretAuditDto": { "required": [ "data" @@ -52283,6 +72617,17 @@ } } }, + "SingleValueResponseSyntheticsUsagePeriodDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SyntheticsUsagePeriodDto" + } + } + }, "SingleValueResponseTagDto": { "required": [ "data" @@ -52316,6 +72661,17 @@ } } }, + "SingleValueResponseTriggerRunsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerRunsResponse" + } + } + }, "SingleValueResponseUptimeDto": { "required": [ "data" @@ -52520,6 +72876,25 @@ }, "description": "Researched vendor SLA/pricing data for pSEO SLA report pages" }, + "Slot": { + "required": [ + "startTime", + "token" + ], + "type": "object", + "properties": { + "startTime": { + "type": "string", + "description": "Demo start time in UTC", + "format": "date-time" + }, + "token": { + "type": "string", + "description": "Token used to confirm this time" + } + }, + "description": "Available demo times in UTC" + }, "SmsChannelConfig": { "type": "object", "properties": { @@ -52753,6 +73128,53 @@ }, "description": "Curated vendor status-event row for the Dependencies Detail rail" }, + "StatusPageBindingSnapshot": { + "required": [ + "name", + "showUptime", + "displayOrder", + "excludeFromOverall" + ], + "type": "object", + "properties": { + "name": { + "minLength": 1, + "type": "string", + "description": "Component display name" + }, + "description": { + "type": "string", + "description": "Optional component description", + "nullable": true + }, + "groupId": { + "type": "string", + "description": "Group that contains this component", + "format": "uuid", + "nullable": true + }, + "showUptime": { + "type": "boolean", + "description": "Whether to show measured uptime" + }, + "displayOrder": { + "type": "integer", + "description": "Position within the page or group", + "format": "int32" + }, + "excludeFromOverall": { + "type": "boolean", + "description": "Whether to exclude this component from overall status" + }, + "startDate": { + "type": "string", + "description": "Optional start date for published uptime history", + "format": "date", + "nullable": true + } + }, + "description": "Saved component configuration" + }, "StatusPageBoundComponentDto": { "required": [ "componentId", @@ -53762,6 +74184,9 @@ } } }, + "StreamingResponseBody": { + "type": "object" + }, "Summary": { "required": [ "id", @@ -53783,7 +74208,7 @@ "type": "string" } }, - "description": "Environment associated with this monitor; null when unassigned" + "description": "Environment containing this value" }, "SyntheticsFamilyMetricsDto": { "required": [ @@ -53853,6 +74278,42 @@ }, "description": "Measured availability and recovery metrics for code monitors" }, + "SyntheticsUsagePeriodDto": { + "required": [ + "api", + "browser", + "monitors", + "periodEnd", + "periodStart" + ], + "type": "object", + "properties": { + "periodStart": { + "type": "string", + "description": "Start of the usage period", + "format": "date-time" + }, + "periodEnd": { + "type": "string", + "description": "End of the usage period", + "format": "date-time" + }, + "browser": { + "$ref": "#/components/schemas/Meter" + }, + "api": { + "$ref": "#/components/schemas/Meter" + }, + "monitors": { + "type": "array", + "description": "Usage grouped by monitor and meter, including deleted monitors", + "items": { + "$ref": "#/components/schemas/MonitorUsage" + } + } + }, + "description": "Billable synthetics usage in the current period" + }, "TableValueResultAlertChannelDto": { "required": [ "data", @@ -54205,39 +74666,71 @@ } } }, - "TableValueResultInboundOtpCode": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/InboundOtpCode" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultIncidentDto": { + "TableValueResultInboundOtpCode": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InboundOtpCode" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IncidentDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentStateTransitionDto": { "required": [ "data", "hasNext", @@ -54248,7 +74741,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IncidentDto" + "$ref": "#/components/schemas/IncidentStateTransitionDto" } }, "hasNext": { @@ -54269,7 +74762,7 @@ } } }, - "TableValueResultIncidentStateTransitionDto": { + "TableValueResultIntegrationDto": { "required": [ "data", "hasNext", @@ -54280,7 +74773,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IncidentStateTransitionDto" + "$ref": "#/components/schemas/IntegrationDto" } }, "hasNext": { @@ -54301,7 +74794,7 @@ } } }, - "TableValueResultIntegrationDto": { + "TableValueResultInviteDto": { "required": [ "data", "hasNext", @@ -54312,7 +74805,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IntegrationDto" + "$ref": "#/components/schemas/InviteDto" } }, "hasNext": { @@ -54333,7 +74826,7 @@ } } }, - "TableValueResultInviteDto": { + "TableValueResultMaintenanceWindowDto": { "required": [ "data", "hasNext", @@ -54344,7 +74837,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/InviteDto" + "$ref": "#/components/schemas/MaintenanceWindowDto" } }, "hasNext": { @@ -54365,7 +74858,7 @@ } } }, - "TableValueResultMaintenanceWindowDto": { + "TableValueResultMemberDto": { "required": [ "data", "hasNext", @@ -54376,7 +74869,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MaintenanceWindowDto" + "$ref": "#/components/schemas/MemberDto" } }, "hasNext": { @@ -54397,7 +74890,7 @@ } } }, - "TableValueResultMemberDto": { + "TableValueResultMonitorDto": { "required": [ "data", "hasNext", @@ -54408,7 +74901,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MemberDto" + "$ref": "#/components/schemas/MonitorDto" } }, "hasNext": { @@ -54429,7 +74922,7 @@ } } }, - "TableValueResultMonitorDto": { + "TableValueResultMonitorSessionDto": { "required": [ "data", "hasNext", @@ -54440,7 +74933,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MonitorDto" + "$ref": "#/components/schemas/MonitorSessionDto" } }, "hasNext": { @@ -54749,38 +75242,6 @@ } } }, - "TableValueResultRunDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RunDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, "TableValueResultRuntimeProfileDto": { "required": [ "data", @@ -56040,6 +76501,47 @@ }, "description": "Actions around the failure, teardown labelled" }, + "TransferMonitorRequest": { + "required": [ + "reason", + "to" + ], + "type": "object", + "properties": { + "to": { + "type": "string", + "description": "New owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "reason": { + "maxLength": 280, + "minLength": 0, + "type": "string", + "description": "Why ownership is moving (recorded in the audit log)" + }, + "project": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the new owner declares for this monitor; null clears it", + "nullable": true + }, + "ownerDeclaration": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/OwnerDeclaration" + } + ] + } + } + }, "TriggerRule": { "required": [ "scope", @@ -56106,6 +76608,100 @@ }, "description": "Array of trigger rules defining when an incident should be raised" }, + "TriggerRunRef": { + "required": [ + "id", + "phase", + "region", + "url" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Run identifier", + "format": "uuid" + }, + "region": { + "minLength": 1, + "type": "string", + "description": "Probe region for this run" + }, + "phase": { + "type": "string", + "description": "Current run phase", + "enum": [ + "created", + "queued", + "starting", + "running", + "finalizing", + "finished" + ] + }, + "url": { + "minLength": 1, + "type": "string", + "description": "API path for this run" + } + }, + "description": "One region of a trigger" + }, + "TriggerRunRequest": { + "type": "object", + "properties": { + "regions": { + "type": "array", + "description": "Regions to run; empty or omitted runs every configured region", + "nullable": true, + "items": { + "type": "string", + "description": "Regions to run; empty or omitted runs every configured region" + } + }, + "signal": { + "type": "boolean", + "description": "Count these runs toward health and incidents (default: false)", + "nullable": true + }, + "session": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunSessionContext" + } + ] + } + } + }, + "TriggerRunsResponse": { + "required": [ + "runs", + "triggerId", + "billedRuns" + ], + "type": "object", + "properties": { + "triggerId": { + "type": "string", + "description": "Groups every run started by this trigger; scheduled runs group by evaluation cycle instead", + "format": "uuid" + }, + "billedRuns": { + "type": "integer", + "description": "Runs billed for this trigger, one per region", + "format": "int32" + }, + "runs": { + "type": "array", + "description": "Queued runs, one per region", + "items": { + "$ref": "#/components/schemas/TriggerRunRef" + } + } + }, + "description": "Runs started by one trigger" + }, "UpdateAlertChannelRequest": { "required": [ "config", @@ -56865,6 +77461,18 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Only the managedBy tool may change configuration. Null preserves current", + "nullable": true + }, + "ownerProject": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the owning tool declares; null preserves current", + "nullable": true + }, "environmentId": { "type": "string", "description": "New environment; null preserves current", @@ -56944,18 +77552,42 @@ "description": "Run every location each interval; false rotates one. Null preserves current", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" } ] }, + "acknowledgeRollback": { + "type": "string", + "description": "Rolled-back digest this code publish re-applies on purpose", + "nullable": true + }, "status": { "type": "string", "description": "Not writable; use pause or resume", "nullable": true + }, + "expectedUpdatedAt": { + "type": "string", + "description": "Last updatedAt this edit was based on; null skips the check", + "format": "date-time", + "nullable": true + }, + "secretKeys": { + "maxItems": 256, + "minItems": 0, + "type": "array", + "description": "Replace attached secret keys; null preserves current", + "nullable": true, + "items": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Replace attached secret keys; null preserves current" + } } } }, @@ -58131,6 +78763,56 @@ }, "description": "User account details" }, + "ValidateMonitorsRequest": { + "required": [ + "monitors" + ], + "type": "object", + "properties": { + "monitors": { + "maxItems": 100, + "minItems": 1, + "type": "array", + "description": "Monitors to check as create payloads, before anything is saved", + "items": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } + } + } + }, + "Value": { + "required": [ + "value", + "count" + ], + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Exact filter value; steps use caseIndex:step" + }, + "count": { + "type": "integer", + "description": "Matching run attempts for this value", + "format": "int64" + }, + "failedCount": { + "type": "integer", + "description": "Failed attempt count; populated for region facets", + "format": "int64", + "nullable": true + }, + "outcomeCounts": { + "type": "array", + "description": "Per-outcome attempt counts; populated for region facets", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunOutcomeCountDto" + } + } + }, + "description": "Values selected by the other filters" + }, "VoiceLanguageDto": { "required": [ "code", diff --git a/src/devhelm/_generated.py b/src/devhelm/_generated.py index b801323..03c4478 100644 --- a/src/devhelm/_generated.py +++ b/src/devhelm/_generated.py @@ -423,6 +423,16 @@ class ApiKeyCreateResponse(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None class ApiKeyDto(BaseModel): @@ -463,6 +473,25 @@ class ApiKeyDto(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None + + +class ArtifactDownloadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + url: Annotated[str, Field(description="Signed GET URL for the artifact bytes")] + expires_at: Annotated[ + AwareDatetime, + Field(alias="expiresAt", description="When the signed URL stops working"), + ] class ArtifactViewport(BaseModel): @@ -554,12 +583,95 @@ class BrowserCapabilityEnvelope(BaseModel): upload: Annotated[bool, Field(description="File upload is enabled")] +class Bucket(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start: Annotated[ + AwareDatetime, Field(description="Inclusive clock-aligned bucket start") + ] + passed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt passed") + ] + failed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt failed") + ] + timed_out: Annotated[ + int, + Field( + alias="timedOut", description="Region cycles whose final attempt timed out" + ), + ] + couldnt_run: Annotated[ + int, + Field( + alias="couldntRun", + description="Region cycles with a final non-target outcome", + ), + ] + passed_on_retry: Annotated[ + int, + Field( + alias="passedOnRetry", + description="Passed cycles that had an earlier failed attempt", + ), + ] + duration_samples: Annotated[ + int, + Field( + alias="durationSamples", + description="Executions with a completed duration in this bucket", + ), + ] + p50_ms: Annotated[ + float | None, + Field( + alias="p50Ms", + description="Median duration of completed executions in milliseconds", + ), + ] = None + p95_ms: Annotated[ + float | None, + Field( + alias="p95Ms", + description="p95 duration of completed executions in milliseconds", + ), + ] = None + + class Action(StrEnum): pause = "PAUSE" resume = "RESUME" delete = "DELETE" add_tag = "ADD_TAG" remove_tag = "REMOVE_TAG" + update_schedule = "UPDATE_SCHEDULE" + run = "RUN" + mute = "MUTE" + unmute = "UNMUTE" + acknowledge = "ACKNOWLEDGE" + + +class BundleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + digest: Annotated[ + str, + Field( + description="Closure digest, sha256:. Same files always return this value", + min_length=1, + ), + ] + upload_digest: Annotated[ + str, + Field( + alias="uploadDigest", + description="Digest of every file that was sent, before import closure", + min_length=1, + ), + ] + files: Annotated[list[str], Field(description="Files in the import closure")] + keys: Annotated[ + list[str], Field(description="Secret names detected in the closure") + ] + size: Annotated[int, Field(description="Uncompressed closure size in bytes")] class Screenshots(StrEnum): @@ -580,6 +692,12 @@ class Video(StrEnum): off = "off" +class Network(StrEnum): + always = "always" + on_failure = "on_failure" + off = "off" + + class CapturePolicy(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) screenshots: Annotated[ @@ -589,6 +707,10 @@ class CapturePolicy(BaseModel): Trace | None, Field(description="When to capture a Playwright trace") ] = None video: Annotated[Video | None, Field(description="When to capture video")] = None + network: Annotated[ + Network | None, + Field(description="When network rows and HAR are retained; null uses always"), + ] = None class CategoryDto(BaseModel): @@ -689,18 +811,35 @@ class CodeCheckStep(BaseModel): ] = None -class CodeTestTargetRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - environment_id: Annotated[ - UUID | None, +class CodeSource(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + repo: Annotated[ + str | None, Field( - alias="environmentId", - description="Environment to test against; null uses the monitor's environment", + description="Repository that produced this code", + max_length=512, + min_length=0, ), ] = None - region: Annotated[ + branch: Annotated[ str | None, - Field(description="Region for this test; null uses the monitor's first region"), + Field( + description="Branch that produced this code", max_length=255, min_length=0 + ), + ] = None + commit: Annotated[ + str | None, + Field( + description="Commit that produced this code", max_length=64, min_length=0 + ), + ] = None + file: Annotated[ + str | None, + Field( + description="Declaring file in that repository", + max_length=512, + min_length=0, + ), ] = None @@ -939,6 +1078,14 @@ class ManagedBy(StrEnum): api = "API" +class Tool(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + class CreateApiKeyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -956,6 +1103,21 @@ class CreateApiKeyRequest(BaseModel): description="Optional expiration timestamp in ISO 8601 format", ), ] = None + preset: Annotated[ + str | None, + Field( + description="Preset expanded into scopes: ci-pr, ci-deploy, agent-responder, agent-author" + ), + ] = None + scopes: Annotated[ + list[str] | None, Field(description="Scopes to grant (default: full)") + ] = None + tool: Annotated[ + Tool | None, + Field( + description="Tool this key writes as on owner-enforced monitors (default: API)" + ), + ] = None class Severity(StrEnum): @@ -963,6 +1125,125 @@ class Severity(StrEnum): warn = "warn" +class CreateBundleRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + files: Annotated[ + dict[str, str], + Field(description="Path to UTF-8 text. Paths are relative to the bundle root"), + ] + entrypoint: Annotated[ + str | None, + Field( + description="File that runs. Omit when the map is already the import closure", + max_length=512, + min_length=0, + ), + ] = None + runtime_id: Annotated[ + str | None, + Field( + alias="runtimeId", + description="Runtime used to refuse imports. Omit for the newest runtime that can run", + max_length=32, + min_length=0, + ), + ] = None + + +class CreateDemoBookingRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + lead_id: Annotated[ + UUID, + Field( + alias="leadId", + description="Lead identifier reused for this form submission", + ), + ] + attempt_id: Annotated[ + UUID, + Field( + alias="attemptId", + description="Booking identifier reused when retrying the same time", + ), + ] + full_name: Annotated[ + str, + Field( + alias="fullName", description="Your full name", max_length=150, min_length=0 + ), + ] + email: Annotated[ + EmailStr, + Field( + description="Email address for the calendar invitation", + max_length=254, + min_length=0, + ), + ] + company_url: Annotated[ + str, + Field( + alias="companyUrl", + description="Optional company website URL", + max_length=2048, + min_length=0, + pattern="^$|https?://[^\\s]+", + ), + ] + product: Annotated[ + str, + Field( + description="Product you would like to explore", + max_length=100, + min_length=0, + ), + ] + message: Annotated[ + str, + Field( + description="Optional context for your demo", max_length=3000, min_length=0 + ), + ] + start_time: Annotated[ + AwareDatetime, + Field(alias="startTime", description="Selected demo start time in UTC"), + ] + timezone: Annotated[ + str, + Field( + description="IANA timezone for your calendar invitation", + max_length=100, + min_length=0, + ), + ] + slot_token: Annotated[ + str, + Field( + alias="slotToken", + description="Availability token for the selected time", + max_length=512, + min_length=0, + ), + ] + attribution: Annotated[ + dict[str, str], + Field(description="Marketing attribution captured with this request"), + ] + + +class CreateDeviceAuthorizationRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + client_name: Annotated[ + str, + Field( + alias="clientName", + description="Client name stored on the minted API key, e.g. devhelm-cli on mbp (max 190)", + max_length=190, + min_length=0, + ), + ] + + class Kind(StrEnum): assigned = "assigned" custom = "custom" @@ -1127,14 +1408,13 @@ class Type(StrEnum): multi_step_api = "MULTI_STEP_API" -class CreatePackageUploadRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - digest: Annotated[ +class SecretKey(RootModel[str]): + root: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip to upload (64 chars)", - max_length=64, - min_length=64, + description="Secret keys to attach; null starts with the scanned set", + max_length=255, + min_length=0, ), ] @@ -1679,32 +1959,45 @@ class DeliveryAttemptDto(BaseModel): attempted_at: Annotated[AwareDatetime, Field(alias="attemptedAt")] -class DemandedKeyLocation(BaseModel): +class DemoBookingDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - key: Annotated[ - str, - Field(description="Secret name the code reads", max_length=255, min_length=0), + id: Annotated[UUID, Field(description="Identifier for this booking attempt")] + state: Annotated[str, Field(description="Current booking state")] + start_time: Annotated[ + AwareDatetime, Field(alias="startTime", description="Demo start time in UTC") ] - declaring_file: Annotated[ + timezone: Annotated[str, Field(description="Timezone for the calendar invitation")] + meeting_url: Annotated[ + str | None, + Field(alias="meetingUrl", description="Link to join the confirmed demo"), + ] = None + cancel_url: Annotated[ + str | None, + Field(alias="cancelUrl", description="Link to cancel the confirmed demo"), + ] = None + reschedule_url: Annotated[ str | None, Field( - alias="declaringFile", - description="Declaring file path inside the zip", - max_length=512, - min_length=0, + alias="rescheduleUrl", description="Link to reschedule the confirmed demo" ), ] = None - declaring_location: Annotated[ + error_code: Annotated[ str | None, Field( - alias="declaringLocation", - description="Call site from package scan, e.g. signIn(…) · line 6", - max_length=255, - min_length=0, + alias="errorCode", description="Reason the booking could not be confirmed" ), ] = None +class DemoBookingRecoveryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + closed: Annotated[ + bool, + Field(description="Whether this unsaved attempt is closed and can be retried"), + ] + booking: DemoBookingDto | None = None + + class DeployLockDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique lock identifier")] @@ -1729,26 +2022,106 @@ class DeployLockDto(BaseModel): ] -class DiscordChannelConfig(BaseModel): +class DeviceAuthorizationDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - channel_type: Annotated[Literal["discord"], Field(alias="channelType")] = "discord" - webhook_url: Annotated[ - str, Field(alias="webhookUrl", description="Discord webhook URL", min_length=1) + device_code: Annotated[ + str, + Field( + alias="deviceCode", + description="Secret code the CLI sends when polling for the API key", + min_length=1, + ), ] - mention_role_id: Annotated[ - str | None, + user_code: Annotated[ + str, Field( - alias="mentionRoleId", - description="Optional Discord role ID to mention in notifications", + alias="userCode", + description="Short code the user confirms in the dashboard, e.g. ABCD-EFGH", + min_length=1, ), - ] = None + ] + verification_uri: Annotated[ + str, + Field( + alias="verificationUri", + description="Dashboard page where the user enters the code", + min_length=1, + ), + ] + verification_uri_complete: Annotated[ + str, + Field( + alias="verificationUriComplete", + description="Dashboard page with the user code already filled in", + min_length=1, + ), + ] + expires_in: Annotated[ + int, Field(alias="expiresIn", description="Seconds until the codes expire") + ] + interval: Annotated[int, Field(description="Minimum seconds between token polls")] -class Dns(BaseModel): +class DeviceTokenDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - check_type: Literal["dns"] = "dns" - hostname: Annotated[str | None, Field(description="Target hostname")] = None - requested_types: Annotated[ + status: Annotated[str, Field(description="Poll outcome")] + interval: Annotated[int, Field(description="Minimum seconds before the next poll")] + api_key: Annotated[ + str | None, + Field( + alias="apiKey", + description="Minted API key, returned once with status complete", + ), + ] = None + organization_id: Annotated[ + int | None, + Field( + alias="organizationId", + description="Organization that owns the minted API key", + ), + ] = None + workspace_id: Annotated[ + int | None, + Field( + alias="workspaceId", + description="Workspace chosen when the login was approved", + ), + ] = None + + +class DeviceTokenRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + device_code: Annotated[ + str, + Field( + alias="deviceCode", + description="Device code returned when the login was started", + max_length=128, + min_length=0, + ), + ] + + +class DiscordChannelConfig(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + channel_type: Annotated[Literal["discord"], Field(alias="channelType")] = "discord" + webhook_url: Annotated[ + str, Field(alias="webhookUrl", description="Discord webhook URL", min_length=1) + ] + mention_role_id: Annotated[ + str | None, + Field( + alias="mentionRoleId", + description="Optional Discord role ID to mention in notifications", + ), + ] = None + + +class Dns(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + check_type: Literal["dns"] = "dns" + hostname: Annotated[str | None, Field(description="Target hostname")] = None + requested_types: Annotated[ list[str] | None, Field(alias="requestedTypes", description="Requested DNS record types"), ] = None @@ -2109,6 +2482,61 @@ class EntitlementDto(BaseModel): ] +class EntitlementResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + tier: Annotated[str, Field(description="Resolved billing plan tier")] + entitlements: Annotated[ + dict[str, EntitlementDto], + Field(description="All entitlements keyed by entitlement key"), + ] + usage: Annotated[ + dict[str, int], + Field( + description="Current usage counters keyed by entitlement key (only for countable resources)" + ), + ] + trial_active: Annotated[ + bool, + Field( + alias="trialActive", description="Whether the org is currently on a trial" + ), + ] + trial_expires_at: Annotated[ + AwareDatetime | None, + Field( + alias="trialExpiresAt", + description="Trial expiry date (null if not trialing)", + ), + ] = None + subscription_status: Annotated[ + str | None, + Field( + alias="subscriptionStatus", + description="Current subscription status (null if no subscription)", + ), + ] = None + usage_period_start: Annotated[ + AwareDatetime, + Field( + alias="usagePeriodStart", description="Start of the current usage window" + ), + ] + synthetics_overage_cents: Annotated[ + int | None, + Field( + alias="syntheticsOverageCents", + description="Consumed overage cents this period, including when overage is now off", + ), + ] = None + cap_stops: Annotated[ + dict[str, str] | None, + Field( + alias="capStops", + description="Stopped meters keyed by meter name, with included or spend_cap reasons", + ), + ] = None + + class EnvironmentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique environment identifier")] @@ -2323,11 +2751,9 @@ class ErrorResponse(BaseModel): description="Why permission was refused: scope or role", examples=["role"] ), ] = None - next: Annotated[ - ErrorNext | None, Field(description="Command and docs that fix this error") - ] = None + next: ErrorNext | None = None details: Annotated[ - dict[str, Any] | None, + dict[str, dict[str, Any]] | None, Field( description="Extra fields for this error, such as a missing secret key and environment" ), @@ -2377,12 +2803,72 @@ class EscalationStep(BaseModel): ] = None +class EvidencePurgedMetadata(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Literal["evidence_purged"] = "evidence_purged" + reason: Annotated[ + str, Field(description="Why the evidence was deleted", min_length=1) + ] + + +class EvidencePurgeRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[ + str, + Field( + description="Why the evidence must be deleted; kept in the audit log (max 500)", + max_length=500, + min_length=0, + ), + ] + + class FailureDetail(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitor_id: Annotated[ UUID, Field(alias="monitorId", description="Monitor ID that failed") ] reason: Annotated[str, Field(description="Human-readable reason for the failure")] + code: Annotated[ + str | None, + Field( + description="Error code for the failure, as returned by the single-monitor operation" + ), + ] = None + + +class Finding(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + code: Annotated[str, Field(description="Import validation code")] + file: Annotated[ + str | None, Field(description="Source file containing the import") + ] = None + line: Annotated[ + int | None, Field(description="One-based source line containing the import") + ] = None + message: Annotated[str, Field(description="Description of the import problem")] + + +class Flakiness(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Start of the seven-day measurement window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the measurement window") + ] + cycle_count: Annotated[ + int, + Field(alias="cycleCount", description="Completed region cycles in this window"), + ] + flaky_cycle_count: Annotated[ + int, + Field( + alias="flakyCycleCount", + description="Completed region cycles recovered by retry", + ), + ] class GitLabChannelConfig(BaseModel): @@ -3195,57 +3681,6 @@ class IncidentsSummaryDto(BaseModel): mttr30d: float | None = None -class IncidentTriggerDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - rule_type: Annotated[ - str | None, - Field( - alias="ruleType", - description="Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", - ), - ] = None - rule_index: Annotated[ - int | None, - Field( - alias="ruleIndex", - description="0-based index into the policy trigger_rules array; null when unknown", - ), - ] = None - count: Annotated[ - int | None, - Field( - description="Observed failing_streak or failures_in_window from forensics; null when unavailable" - ), - ] = None - threshold: Annotated[ - int | None, - Field( - description="Rule required count or threshold_ms from forensics; null when unavailable" - ), - ] = None - last_error: Annotated[ - str | None, - Field( - alias="lastError", - description="failure_reason from the triggering check result; null when unavailable", - ), - ] = None - first_failed_check_at: Annotated[ - AwareDatetime | None, - Field( - alias="firstFailedCheckAt", - description="Earliest failing check timestamp in the confirm window when computable; null otherwise", - ), - ] = None - source: Annotated[ - str, - Field( - description="Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", - min_length=1, - ), - ] - - class IncidentUpdateDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -3407,6 +3842,10 @@ class KeyInfo(BaseModel): AwareDatetime | None, Field(alias="lastUsedAt", description="Last time the key was used"), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] class LinearChannelConfig(BaseModel): @@ -3425,6 +3864,16 @@ class LinearChannelConfig(BaseModel): ] = None +class LinkedIncidentDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Incident identifier")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor the incident belongs to") + ] + status: Annotated[str, Field(description="Incident status")] + title: Annotated[str | None, Field(description="Incident title")] = None + + class LinkedStatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[ @@ -3826,6 +4275,21 @@ class MemberRoleChangedMetadata(BaseModel): ] +class Meter(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + used: Annotated[int, Field(description="Billable runs consumed")] + included: Annotated[ + int | None, Field(description="Included runs; null means unlimited") + ] = None + test_runs: Annotated[ + int, + Field( + alias="testRuns", + description="Billable validation runs included in consumed runs", + ), + ] + + class MonitorAuthConfig( RootModel[BearerAuthConfig | BasicAuthConfig | HeaderAuthConfig | ApiKeyAuthConfig] ): @@ -3846,138 +4310,259 @@ class MonitorAuthDto(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig -class MonitorDriftFieldDto(BaseModel): +class MonitorCappedDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - field: Annotated[ - str, - Field( - description="Field name: enabled, muted, quarantine, or managedBy", - min_length=1, - ), - ] - live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] - declared: Annotated[ - str, Field(description="Implied declared / IaC baseline", min_length=1) - ] - - -class MonitorOverlayRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - reason: Annotated[ - str | None, - Field( - description="Optional human-readable reason (max 280)", - max_length=280, - min_length=0, - ), - ] = None - expires_at: Annotated[ + resumes_at: Annotated[ AwareDatetime | None, - Field(alias="expiresAt", description="When this overlay expires"), + Field(alias="resumesAt", description="When runs resume; null when unknown"), + ] = None + kind: Annotated[ + str | None, + Field(description="Allowance stopping this meter: included or spend_cap"), ] = None -class File(RootModel[str]): - root: Annotated[ +class MonitorCodeSpec(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + bundle: Annotated[ str, Field( - description="Relative file paths included in the zip", - max_length=512, + description="Closure digest from POST /bundles (sha256:)", + max_length=80, min_length=0, + pattern="^sha256:[a-f0-9]{64}$", ), ] - - -class Key(RootModel[str]): - root: Annotated[ + entrypoint: Annotated[ str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=255, + description="File that runs, relative to the bundle root", + max_length=512, min_length=0, ), ] + source: CodeSource | None = None -class MonitorPackageSpec(BaseModel): +class MonitorDisplayTickDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - digest: Annotated[ + at: Annotated[AwareDatetime, Field(description="Inclusive start of this bucket")] + outcome: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip (64 characters)", - max_length=64, - min_length=64, + description="passed, failed, degraded, timed_out, passed_on_retry, couldnt_run, skipped, or no_data" ), ] - entrypoint: Annotated[ - str, + run_id: Annotated[ + UUID | None, + Field(alias="runId", description="Representative run to open for this bucket"), + ] = None + failing_regions: Annotated[ + list[str], Field( - description="Entrypoint path inside the zip, e.g. tests/login.spec.ts", - max_length=512, - min_length=0, + alias="failingRegions", + description="Regions with a target failure in this bucket", ), ] - files: Annotated[ - list[File], + retry_pass_count: Annotated[ + int, Field( - description="Relative file paths included in the zip", - max_length=256, - min_length=0, + alias="retryPassCount", + description="Region cycles that passed after retry in this bucket", ), ] - keys: Annotated[ - list[Key] | None, + + +class MonitorDriftCodeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + live_digest: Annotated[ + str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=64, - min_length=0, + alias="liveDigest", + description="Digest of the code revision running now", + min_length=1, ), - ] = None - git_sha: Annotated[ - str | None, + ] + git_digest: Annotated[ + str, Field( - alias="gitSha", - description="Commit SHA from the repo that produced this zip. Client-supplied provenance only", - max_length=64, - min_length=0, + alias="gitDigest", + description="Digest of the code revision last applied from Git", + min_length=1, + ), + ] + drifted: Annotated[ + bool, Field(description="Whether the live digest differs from the Git digest") + ] + + +class MonitorDriftFieldDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[ + str, + Field( + description="Field name: enabled, muted, quarantine, or managedBy", + min_length=1, + ), + ] + live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] + declared: Annotated[ + str, Field(description="Implied declared / IaC baseline", min_length=1) + ] + + +class MonitorFacetValueDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + value: Annotated[ + str, + Field( + description="Value as the list filter takes it: type name, environment id, region, tag name, or owner", + min_length=1, ), + ] + count: Annotated[int, Field(description="Monitors with this value")] + worst_state: Annotated[ + str, + Field( + alias="worstState", + description="Most severe displayHealth among the monitors with this value", + ), + ] + failing: Annotated[ + int | None, Field(description="Matching monitors currently failing") ] = None - git_message: Annotated[ - str | None, + not_running: Annotated[ + int | None, Field( - alias="gitMessage", - description="Commit message from the repo that produced this zip", - max_length=1024, - min_length=0, + alias="notRunning", description="Matching monitors currently unable to run" ), ] = None - git_file: Annotated[ + flaky: Annotated[ + int | None, Field(description="Matching running monitors recovered by retry") + ] = None + owner: Annotated[ + str | None, Field(description="Owning tool for a project facet value") + ] = None + + +class MonitorFieldChange(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[str, Field(description="Setting that changed", min_length=1)] + from_: Annotated[ + str | None, Field(alias="from", description="Previous setting value") + ] = None + to: Annotated[str | None, Field(description="New setting value")] = None + + +class MonitorHistoryEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Row kind: not_run")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this row belongs to") + ] + region: Annotated[ str | None, Field( - alias="gitFile", - description="Path of the declaring file in that repo", - max_length=512, - min_length=0, + description="Region of the skipped ticks; null when they span several regions" ), ] = None - authored_by: Annotated[ + reason: Annotated[ + str, + Field(description="Why the ticks were skipped: quota, blocked, or plan_limit"), + ] + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="First skipped tick in this collapsed row"), + ] + to: Annotated[ + AwareDatetime, Field(description="Latest skipped tick in this collapsed row") + ] + count: Annotated[int, Field(description="Skipped ticks collapsed into this row")] + missing_keys: Annotated[ + list[str] | None, + Field( + alias="missingKeys", + description="Secret keys recorded as missing for this interval", + ), + ] = None + environment: Annotated[ str | None, + Field(description="Environment recorded when these ticks were skipped"), + ] = None + + +class MonitorHistoryTickDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + at: Annotated[AwareDatetime, Field(description="Start of the bucket")] + outcome: Annotated[ + str, Field( - alias="authoredBy", - description="Author attribution supplied with the package", - max_length=255, + description="PASSED when every check passed, FAILED when none did, otherwise DEGRADED" + ), + ] + + +class MonitorListGroupDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + key: Annotated[ + str, + Field( + description="Group: failing, not_running, flaky, passing, running, or paused" + ), + ] + count: Annotated[int, Field(description="Monitors in the group")] + + +class MonitorOverlayRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[ + str | None, + Field( + description="Optional human-readable reason (max 280)", + max_length=280, min_length=0, ), ] = None - key_locations: Annotated[ - list[DemandedKeyLocation] | None, + expires_at: Annotated[ + AwareDatetime | None, + Field(alias="expiresAt", description="When this overlay expires"), + ] = None + + +class MonitorOwnerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + type: Annotated[ + str, Field(description="Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + project: Annotated[ + str | None, Field( - alias="keyLocations", - description="Per-key declaring file and location from package scan", - max_length=64, - min_length=0, + description="Project the owning tool declares; null when it declares none" ), ] = None + address: Annotated[ + str | None, Field(description="Resource address declared by the owning tool") + ] = None + label: Annotated[ + str | None, Field(description="Display label declared by the owning client") + ] = None + labeled_at: Annotated[ + AwareDatetime | None, + Field(alias="labeledAt", description="When the owner label was declared"), + ] = None + + +class MonitorOwnershipMetadata(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Literal["monitor_ownership"] = "monitor_ownership" + from_owner: Annotated[ + str | None, + Field(alias="fromOwner", description="Owning tool before the change"), + ] = None + to_owner: Annotated[ + str | None, Field(alias="toOwner", description="Owning tool after the change") + ] = None + reason: Annotated[str | None, Field(description="Reason the caller gave")] = None class MonitorReference(BaseModel): @@ -3986,6 +4571,17 @@ class MonitorReference(BaseModel): name: Annotated[str, Field(description="Monitor name")] +class MonitorRegionHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Probe region", min_length=1)] + verdict: Annotated[ + str, + Field( + description="Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check" + ), + ] + + class MonitorRunDurationMetricDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitor_id: Annotated[ @@ -4040,7 +4636,7 @@ class MonitorRunListParams(BaseModel): outcome: Annotated[ str | None, Field( - description="Filter by outcome; not_passed also includes passed-on-retry runs" + description="Outcomes, repeated or comma-separated; not_passed includes retries" ), ] = None region: Annotated[str | None, Field(description="Filter by probe region")] = None @@ -4052,6 +4648,17 @@ class MonitorRunListParams(BaseModel): UUID | None, Field(alias="revisionId", description="Only runs for this published revision"), ] = None + from_: Annotated[ + AwareDatetime | None, + Field( + alias="from", + description="Inclusive enqueue lower bound (clamped to 90 days)", + ), + ] = None + to: Annotated[ + AwareDatetime | None, + Field(description="Inclusive enqueue upper bound (default now)"), + ] = None cursor: Annotated[ str | None, Field( @@ -4061,6 +4668,73 @@ class MonitorRunListParams(BaseModel): limit: Annotated[ int, Field(description="Page size (1–100, default 25)", ge=1, le=100) ] + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), + ] = None + incident_id: Annotated[ + UUID | None, + Field( + alias="incidentId", + description="Runs in the incident window, intersected with from and to", + ), + ] = None + branch: Annotated[ + str | None, Field(description="Exact branch from revision provenance") + ] = None + flaky: Annotated[ + bool | None, + Field(description="Select monitors currently flaky over the last seven days"), + ] = None + session_id: Annotated[ + str | None, + Field(alias="sessionId", description="Caller-provided CI session identifier"), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Only runs in this evaluation cycle, including retries", + ), + ] = None + exclude_source: Annotated[ + str | None, + Field( + alias="excludeSource", + description="Exclude this source; omitted preserves all sources", + ), + ] = None + sort: Annotated[ + str | None, Field(description="Enqueue order: asc or desc (default: desc)") + ] = None + step: Annotated[ + int | None, + Field( + description="Zero-based failed step index; requires monitor and caseIndex", + ge=0, + ), + ] = None + case_index: Annotated[ + int | None, + Field( + alias="caseIndex", + description="Zero-based case index qualifying the failed step", + ge=0, + ), + ] = None + + +class MonitorScheduleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + next_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="nextRunAt", + description="When the next scheduled cycle is due for admission", + ), + ] = None class MonitorSessionDto(BaseModel): @@ -4108,6 +4782,27 @@ class MonitorSessionDto(BaseModel): AwareDatetime | None, Field(alias="updatedAt", description="When this session row was last written"), ] = None + captured_at: Annotated[ + AwareDatetime | None, + Field( + alias="capturedAt", + description="When storage state was last captured successfully", + ), + ] = None + capture_run_id: Annotated[ + UUID | None, + Field( + alias="captureRunId", + description="Run that last captured storage state successfully", + ), + ] = None + default_session: Annotated[ + bool | None, + Field( + alias="defaultSession", + description="Whether legacy single-session routes select this setup file; absent on older APIs", + ), + ] = None class MonitorSettingsPreviewDto(BaseModel): @@ -4138,6 +4833,12 @@ class MonitorSettingsPreviewDto(BaseModel): ] = None +class MonitorSourceSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + owner: MonitorOwnerDto + count: Annotated[int, Field(description="Number of matching monitors")] + + class MonitorsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) total: Annotated[ @@ -4197,6 +4898,70 @@ class MonitorTestResultDto(BaseModel): warnings: list[str] | None = None +class MonitorTriageParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str | None, + Field(description="Exact monitor name, ignoring case and surrounding spaces"), + ] = None + open_incident: Annotated[ + bool | None, + Field(alias="openIncident", description="Whether a confirmed incident is open"), + ] = None + muted: Annotated[ + bool | None, Field(description="Whether alert delivery is currently muted") + ] = None + quarantined: Annotated[ + bool | None, Field(description="Whether quarantine has not expired") + ] = None + paused_before: Annotated[ + AwareDatetime | None, + Field( + alias="pausedBefore", + description="Only monitors paused before this timestamp", + ), + ] = None + flaky: Annotated[ + bool | None, + Field(description="Whether recent completed cycles recovered on retry"), + ] = None + group: Annotated[ + str | None, + Field(description="List group: failing, not_running, passing, or paused"), + ] = None + owner_project: Annotated[ + str | None, + Field( + alias="ownerProject", + description="Exact project declared by the owning tool", + ), + ] = None + sort: Annotated[ + str | None, Field(description="Use state for group and streak ordering") + ] = None + + +class MonitorUsage(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor owning this usage") + ] + monitor_name: Annotated[ + str | None, + Field(alias="monitorName", description="Monitor name; null when unavailable"), + ] = None + deleted: Annotated[bool, Field(description="Whether the monitor has been deleted")] + meter: Annotated[str, Field(description="Meter this usage counts toward")] + runs: Annotated[int, Field(description="Billable runs consumed")] + test_runs: Annotated[ + int, + Field( + alias="testRuns", + description="Billable validation runs included in consumed runs", + ), + ] + + class MonitorUsageProjectionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) meter: Annotated[ @@ -4260,31 +5025,95 @@ class MonitorUsageProjectionDto(BaseModel): ] = None -class NearestOtherRegion(BaseModel): +class MonitorValidationFindingDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - run_id: Annotated[ - UUID, Field(alias="runId", description="Run that holds the other-region shot") + severity: Annotated[ + str, Field(description="error blocks a write; warning does not") ] - region: Annotated[str, Field(description="Region of that run")] - artifact_id: Annotated[ - UUID, Field(alias="artifactId", description="Screenshot on that run") + code: Annotated[ + str, + Field( + description="Stable problem code, such as MONITOR_FREQUENCY_BELOW_PLAN_MIN" + ), ] - - -class NetworkTimingDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - dns_ms: Annotated[ - int | None, Field(alias="dnsMs", description="DNS lookup time in milliseconds") + message: Annotated[str, Field(description="What is wrong")] + field: Annotated[ + str | None, Field(description="Request field this finding refers to") ] = None - connect_ms: Annotated[ - int | None, - Field(alias="connectMs", description="TCP connect time in milliseconds"), + have: Annotated[int | None, Field(description="Current or requested amount")] = None + limit: Annotated[int | None, Field(description="Plan limit or floor")] = None + plan: Annotated[str | None, Field(description="Billing plan, such as FREE")] = None + upgrade_url: Annotated[ + str | None, Field(alias="upgradeUrl", description="Where to change plan") ] = None - tls_ms: Annotated[ - int | None, - Field(alias="tlsMs", description="TLS handshake time in milliseconds"), + environment: Annotated[ + str | None, Field(description="Destination environment slug or id") ] = None - waiting_ms: Annotated[ + secret_key: Annotated[ + str | None, + Field( + alias="secretKey", + description="Secret key name with no value in this environment", + ), + ] = None + runtime_id: Annotated[ + str | None, + Field(alias="runtimeId", description="Runtime id this finding refers to"), + ] = None + monitor_index: Annotated[ + int | None, + Field(alias="monitorIndex", description="Index of the monitor in the request"), + ] = None + + +class MonitorValidationProjectionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor_index: Annotated[ + int, + Field(alias="monitorIndex", description="Index of the monitor in the request"), + ] + environment: Annotated[ + str | None, Field(description="Destination environment slug or id") + ] = None + usage: MonitorUsageProjectionDto + + +class MonitorValidationResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + findings: Annotated[ + list[MonitorValidationFindingDto], + Field(description="Every problem found, including warnings"), + ] + projections: Annotated[ + list[MonitorValidationProjectionDto], + Field(description="Projected monthly runs for each code monitor destination"), + ] + + +class NearestOtherRegion(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[UUID, Field(alias="runId", description="Passing run identifier")] + region: Annotated[str, Field(description="Region of the passing run", min_length=1)] + finished_at: Annotated[ + AwareDatetime, + Field(alias="finishedAt", description="When the passing run finished"), + ] + + +class NetworkTimingDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + dns_ms: Annotated[ + int | None, Field(alias="dnsMs", description="DNS lookup time in milliseconds") + ] = None + connect_ms: Annotated[ + int | None, + Field(alias="connectMs", description="TCP connect time in milliseconds"), + ] = None + tls_ms: Annotated[ + int | None, + Field(alias="tlsMs", description="TLS handshake time in milliseconds"), + ] = None + waiting_ms: Annotated[ int | None, Field(alias="waitingMs", description="Time to first byte in milliseconds"), ] = None @@ -4658,6 +5487,13 @@ class OverviewStepDto(BaseModel): description="p95 duration in ms; null until the step has settled timings", ), ] = None + p99_ms: Annotated[ + float | None, + Field( + alias="p99Ms", + description="p99 duration in ms; null without settled timings", + ), + ] = None failed: Annotated[ int, Field(description="Failed first-attempt count in the window") ] @@ -4714,27 +5550,24 @@ class OverviewStepsDto(BaseModel): ] -class PackageUploadDto(BaseModel): +class OwnerDeclaration(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - put_url: Annotated[ - str, + address: Annotated[ + str | None, Field( - alias="putUrl", - description="Presigned PUT URL for the zip bytes", - min_length=1, + description="Resource address declared by the owning tool", + max_length=512, + min_length=0, ), - ] - expires_at: Annotated[ - AwareDatetime, - Field(alias="expiresAt", description="When the signed URL expires"), - ] - required_headers: Annotated[ - dict[str, str], + ] = None + label: Annotated[ + str | None, Field( - alias="requiredHeaders", - description="Must send Content-Type: application/zip and If-None-Match: *", + description="Display label declared by the owning client", + max_length=255, + min_length=0, ), - ] + ] = None class Pageable(BaseModel): @@ -4825,17 +5658,6 @@ class PhoneCallChannelConfig(BaseModel): ] = None -class PickerItem(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - run_id: Annotated[UUID, Field(alias="runId", description="Finished run identifier")] - revision_id: Annotated[ - UUID, Field(alias="revisionId", description="Revision that run executed") - ] - finished_at: Annotated[ - AwareDatetime, Field(alias="finishedAt", description="When that run finished") - ] - - class PlanInfo(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) tier: Annotated[str, Field(description="Resolved plan tier")] @@ -4865,6 +5687,18 @@ class PlanInfo(BaseModel): ] +class Point(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + at: Annotated[AwareDatetime, Field(description="When the execution finished")] + run_id: Annotated[UUID, Field(alias="runId", description="Execution identifier")] + region: Annotated[str, Field(description="Execution region")] + outcome: Annotated[str, Field(description="Recorded execution outcome")] + duration_ms: Annotated[ + int | None, + Field(alias="durationMs", description="Execution duration in milliseconds"), + ] = None + + class PolicySnapshotDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) hash_hex: Annotated[ @@ -4959,9 +5793,44 @@ class PublishRevisionRequest(BaseModel): UUID, Field( alias="revisionId", - description="Existing revision to activate as Head for this monitor's environment", + description="Revision to make live for this monitor's environment", ), ] + expected_live_revision_id: Annotated[ + UUID | None, + Field( + alias="expectedLiveRevisionId", + description="Live revision this publish replaces; null skips the check", + ), + ] = None + require_tested: Annotated[ + bool | None, + Field( + alias="requireTested", + description="When true, require a passing test in this environment within 24 hours", + ), + ] = None + force: Annotated[ + bool | None, + Field( + description="Skip the requireTested check; needs the publish-untested scope" + ), + ] = None + acknowledge_rollback: Annotated[ + str | None, + Field( + alias="acknowledgeRollback", + description="Rolled-back digest this publish re-applies on purpose", + ), + ] = None + note: Annotated[ + str | None, + Field( + description="Optional note describing this publish", + max_length=280, + min_length=0, + ), + ] = None class Status7(StrEnum): @@ -5145,6 +6014,60 @@ class RegexBodyAssertion(BaseModel): ] +class Region(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Execution region")] + uptime_percent: Annotated[ + float | None, + Field(alias="uptimePercent", description="Final target uptime in this region"), + ] = None + buckets: Annotated[list[Bucket], Field(description="Clock-aligned chart buckets")] + + +class RegionBucketDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive bucket start (ISO 8601)"), + ] + to: Annotated[AwareDatetime, Field(description="Exclusive bucket end (ISO 8601)")] + p50: Annotated[ + float | None, Field(description="50th-percentile latency in milliseconds") + ] = None + p95: Annotated[ + float | None, Field(description="95th-percentile latency in milliseconds") + ] = None + p99: Annotated[ + float | None, Field(description="99th-percentile latency in milliseconds") + ] = None + total: Annotated[int, Field(description="Checks run in this bucket")] + passed: Annotated[int, Field(description="Checks that passed in this bucket")] + + +class RegionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[str, Field(description="Region id, such as us-east")] + display_name: Annotated[ + str, Field(alias="displayName", description="Name shown for this region") + ] + + +class RegionSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Probe region identifier")] + uptime_percent: Annotated[ + float | None, + Field( + alias="uptimePercent", + description="Uptime percent over checks run in the window", + ), + ] = None + buckets: Annotated[ + list[RegionBucketDto], + Field(description="Clock-aligned buckets spanning the window"), + ] + + class RegionStatusDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) region: Annotated[str, Field(description="Region identifier", examples=["us-east"])] @@ -5387,6 +6310,17 @@ class ResponseTimeWarnAssertion(BaseModel): ] +class RestoreMonitorRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + environment_id: Annotated[ + UUID | None, + Field( + alias="environmentId", + description="Environment to restore a code monitor into; null preserves its environment", + ), + ] = None + + class ResultSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) current_status: Annotated[ @@ -5465,57 +6399,35 @@ class RevisionDiffHunkDto(BaseModel): right: Annotated[str | None, Field(description="Right value when present")] = None -class RevisionDto(BaseModel): +class RevisionFilesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Revision identifier")] - definition_id: Annotated[ - UUID, Field(alias="definitionId", description="Parent definition") - ] - number: Annotated[ - int, Field(description="Monotonic revision number within the definition") - ] - digest: Annotated[ - str, Field(description="SHA-256 hex digest of the zip", min_length=1) - ] - entrypoint: Annotated[ - str, Field(description="Entrypoint file that runs", min_length=1) - ] - files: Annotated[list[str], Field(description="Paths present in the zip")] - keys: Annotated[list[str], Field(description="Secret key names the code demands")] - download_until: Annotated[ - AwareDatetime | None, - Field( - alias="downloadUntil", description="When package bytes expire for download" - ), - ] = None - git_sha: Annotated[ - str | None, - Field(alias="gitSha", description="Git commit SHA when sourced from Git"), - ] = None - git_message: Annotated[ - str | None, Field(alias="gitMessage", description="Git commit message") - ] = None - git_file: Annotated[ - str | None, Field(alias="gitFile", description="Declaring Git file path") - ] = None - authored_by: Annotated[ - str | None, Field(alias="authoredBy", description="Who authored this package") - ] = None - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="When the revision was minted"), + entrypoint: Annotated[str, Field(description="Entry file path inside the bundle")] + files: Annotated[dict[str, str], Field(description="Source text by file path")] + + +class RevisionLiveStatsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + runs: Annotated[ + int, Field(description="Scheduled runs and fast retries of this revision") ] + failed: Annotated[int, Field(description="How many of those runs failed")] + + +class RevisionReferenceDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Related revision identifier")] + number: Annotated[int, Field(description="Revision number within its definition")] class RollbackRevisionRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) revision_id: Annotated[ - UUID, + UUID | None, Field( alias="revisionId", - description="Existing revision to restore as Head for this monitor's environment", + description="Revision to restore; null restores the previous live revision", ), - ] + ] = None reason: Annotated[ str, Field( @@ -5524,6 +6436,19 @@ class RollbackRevisionRequest(BaseModel): min_length=0, ), ] + emergency: Annotated[ + bool | None, + Field( + description="Emergency rollback; requires a confirmed incident on this monitor" + ), + ] = None + expected_live_revision_id: Annotated[ + UUID | None, + Field( + alias="expectedLiveRevisionId", + description="Live revision this rollback replaces; null skips the check", + ), + ] = None class RootlyChannelConfig(BaseModel): @@ -5718,32 +6643,6 @@ class RunConsoleParams(BaseModel): ] = None -class RunDiffDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - baseline_run_id: Annotated[ - UUID | None, - Field( - alias="baselineRunId", description="Baseline run; null when no prior pass" - ), - ] = None - baseline_kind: Annotated[ - str, Field(alias="baselineKind", description="How the baseline was chosen") - ] - reads_as: Annotated[ - str, - Field( - alias="readsAs", - description="Human-readable baseline sentence", - min_length=1, - ), - ] - rows: Annotated[list[Row], Field(description="One row per step on this run")] - picker: Annotated[ - list[PickerItem], - Field(description="Other finished runs of this monitor for the picker"), - ] - - class RunEventDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Event identifier")] @@ -5817,6 +6716,32 @@ class RunExecutionAttemptDto(BaseModel): ] +class RunFailureDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Failure category")] + step: Annotated[ + str | None, + Field( + description="Step title that failed; null when the run failed before a step" + ), + ] = None + message: Annotated[str | None, Field(description="Reporter message, trimmed")] = ( + None + ) + file: Annotated[ + str | None, + Field( + description="User source file; null when the reporter did not capture one" + ), + ] = None + line: Annotated[ + int | None, Field(description="1-based line in the user source file") + ] = None + index: Annotated[ + int | None, Field(description="0-based index of the failed step") + ] = None + + class RunListParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) phase: Annotated[ @@ -5826,7 +6751,7 @@ class RunListParams(BaseModel): outcome: Annotated[ str | None, Field( - description="Filter by outcome; not_passed also includes passed-on-retry runs" + description="Outcomes, repeated or comma-separated; not_passed includes retries" ), ] = None region: Annotated[str | None, Field(description="Filter by probe region")] = None @@ -5844,7 +6769,7 @@ class RunListParams(BaseModel): AwareDatetime | None, Field( alias="from", - description="Inclusive enqueue lower bound (default last 30 minutes; clamped to 90 days)", + description="Inclusive enqueue lower bound (default last 24 hours; clamped to 90 days)", ), ] = None to: Annotated[ @@ -5854,146 +6779,99 @@ class RunListParams(BaseModel): q: Annotated[ str | None, Field(description="Substring match on monitor name or headline") ] = None - size: Annotated[ + cursor: Annotated[ + str | None, Field(description="Opaque cursor from the previous page") + ] = None + limit: Annotated[ int, Field(description="Page size (1–100, default 50)", ge=1, le=100) ] - page: Annotated[int, Field(description="Zero-based page index (default 0)", ge=0)] - - -class RunLiveDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - step_index: Annotated[ - int | None, Field(alias="stepIndex", description="Current step index") + monitor_id: Annotated[ + UUID | None, Field(alias="monitorId", description="Only runs for this monitor") ] = None - step_title: Annotated[ - str | None, Field(alias="stepTitle", description="Current step title") + revision_id: Annotated[ + UUID | None, + Field(alias="revisionId", description="Only runs for this revision"), ] = None - step_count: Annotated[ - int, Field(alias="stepCount", description="Known step count for this attempt") - ] - artifacts_uploaded: Annotated[ - int | None, - Field(alias="artifactsUploaded", description="Artifacts already available"), - ] = None - artifacts_expected: Annotated[ - int | None, - Field(alias="artifactsExpected", description="Artifacts expected for this run"), - ] = None - - -class RunMetricsSummaryDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - from_: Annotated[ - AwareDatetime, - Field(alias="from", description="Inclusive start of the enqueue-time window"), - ] - to: Annotated[ - AwareDatetime, Field(description="Inclusive end of the enqueue-time window") - ] - matching_run_count: Annotated[ - int, - Field( - alias="matchingRunCount", - description="Runs matching the complete list filter", - ), - ] - duration_sample_count: Annotated[ - int, - Field( - alias="durationSampleCount", - description="Finished matching runs with a measured execution duration", - ), - ] - p95_duration_ms: Annotated[ - float | None, + monitor_type: Annotated[ + str | None, Field( - alias="p95DurationMs", - description="95th percentile execution duration in milliseconds; null when no durations were measured", + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" ), ] = None - evidence_eligible_run_count: Annotated[ - int, - Field( - alias="evidenceEligibleRunCount", - description="Runs with a known capture policy", - ), - ] - evidence_unknown_policy_run_count: Annotated[ - int, - Field( - alias="evidenceUnknownPolicyRunCount", - description="Runs with a missing or incomplete capture policy", - ), - ] - evidence_incomplete_run_count: Annotated[ - int | None, + incident_id: Annotated[ + UUID | None, Field( - alias="evidenceIncompleteRunCount", - description="Eligible runs with required evidence missing, processing, failed, or expired", + alias="incidentId", + description="Runs in the incident window, intersected with from and to", ), ] = None - evidence_processing_run_count: Annotated[ - int | None, - Field( - alias="evidenceProcessingRunCount", - description="Eligible runs with required evidence still processing", - ), + branch: Annotated[ + str | None, Field(description="Exact branch from revision provenance") ] = None - evidence_no_evidence_policy_run_count: Annotated[ - int | None, - Field( - alias="evidenceNoEvidencePolicyRunCount", - description="Eligible runs with no evidence required by their recorded policy", - ), + flaky: Annotated[ + bool | None, + Field(description="Select monitors currently flaky over the last seven days"), ] = None - evidence_complete_run_count: Annotated[ - int | None, - Field( - alias="evidenceCompleteRunCount", - description="Eligible runs with all required evidence available", - ), + session_id: Annotated[ + str | None, + Field(alias="sessionId", description="Caller-provided CI session identifier"), ] = None - available_artifact_count: Annotated[ - int | None, + evaluation_cycle_id: Annotated[ + UUID | None, Field( - alias="availableArtifactCount", - description="Required artifact records with an available unexpired object key", + alias="evaluationCycleId", + description="Only runs in this evaluation cycle, including retries", ), ] = None - processing_artifact_count: Annotated[ - int | None, + exclude_source: Annotated[ + str | None, Field( - alias="processingArtifactCount", - description="Required artifact records still processing", + alias="excludeSource", + description="Exclude this source; omitted preserves all sources", ), ] = None - failed_artifact_count: Annotated[ + sort: Annotated[ + str | None, Field(description="Enqueue order: asc or desc (default: desc)") + ] = None + step: Annotated[ int | None, Field( - alias="failedArtifactCount", - description="Required artifact records with a failed upload", + description="Zero-based failed step index; requires monitor and caseIndex", + ge=0, ), ] = None - expired_artifact_count: Annotated[ + case_index: Annotated[ int | None, Field( - alias="expiredArtifactCount", - description="Required artifact records marked expired or past their expiry", + alias="caseIndex", + description="Zero-based case index qualifying the failed step", + ge=0, ), ] = None - missing_artifact_kind_count: Annotated[ + bucket: Annotated[ + str | None, + Field(description="Histogram width: 30m, 1h or 1d; at most 1000 buckets"), + ] = None + + +class RunLiveDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + step_index: Annotated[ + int | None, Field(alias="stepIndex", description="Current step index") + ] = None + step_title: Annotated[ + str | None, Field(alias="stepTitle", description="Current step title") + ] = None + step_count: Annotated[ + int, Field(alias="stepCount", description="Known step count for this attempt") + ] + artifacts_uploaded: Annotated[ int | None, - Field( - alias="missingArtifactKindCount", - description="Required evidence kinds with no artifact record after the run finished", - ), + Field(alias="artifactsUploaded", description="Artifacts already available"), ] = None - intentional_no_evidence_artifact_count: Annotated[ + artifacts_expected: Annotated[ int | None, - Field( - alias="intentionalNoEvidenceArtifactCount", - description="Required artifact records explicitly suppressed, not reached, or not captured", - ), + Field(alias="artifactsExpected", description="Artifacts expected for this run"), ] = None @@ -6003,6 +6881,25 @@ class RunnerLogLiveEvent(BaseModel): line: Annotated[str, Field(description="One runner-log line", min_length=1)] +class RunnerRegionStatusDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[str, Field(description="Public region identifier")] + status: Annotated[ + str, + Field( + description="ok when both code-monitor types have an active accepting pool; otherwise degraded" + ), + ] + + +class RunnerRegionStatusesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regions: Annotated[ + list[RunnerRegionStatusDto], + Field(description="Acceptance status per public region"), + ] + + class RunNetworkParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) attempt: Annotated[ @@ -6026,6 +6923,94 @@ class RunNetworkParams(BaseModel): ] = None +class RunOutcomeCountDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + outcome: Annotated[str, Field(description="Projected run outcome")] + count: Annotated[int, Field(description="Matching run attempts with this outcome")] + + +class RunSessionContext(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + str, + Field( + description="Caller-provided CI session identifier", + max_length=255, + min_length=0, + ), + ] + label: Annotated[ + str | None, + Field( + description="CI session label, such as CI #4812", + max_length=255, + min_length=0, + ), + ] = None + commit: Annotated[ + str | None, + Field( + description="Commit that started this CI session", + max_length=64, + min_length=0, + ), + ] = None + branch: Annotated[ + str | None, + Field( + description="Branch that started this CI session", + max_length=255, + min_length=0, + ), + ] = None + url: Annotated[ + str | None, + Field( + description="HTTP or HTTPS URL of the CI job", + max_length=2048, + min_length=0, + pattern="^[hH][tT][tT][pP][sS]?://\\S+$", + ), + ] = None + + +class RunSkippedListParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + from_: Annotated[ + AwareDatetime | None, + Field( + alias="from", + description="Inclusive window start; default last 24 hours, clamped to 90 days", + ), + ] = None + to: Annotated[ + AwareDatetime | None, Field(description="Inclusive window end; default now") + ] = None + monitor_id: Annotated[ + UUID | None, + Field(alias="monitorId", description="Only entries for this monitor"), + ] = None + cursor: Annotated[ + str | None, Field(description="Opaque cursor returned by this endpoint") + ] = None + limit: Annotated[ + int, Field(description="Page size (1–100, default 50)", ge=1, le=100) + ] + environment_id: Annotated[ + UUID | None, + Field( + alias="environmentId", + description="Current monitor environment; historical ticks retain their snapshot", + ), + ] = None + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), + ] = None + + class RunStepDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Step identifier")] @@ -6059,7 +7044,7 @@ class RunStepDto(BaseModel): error: Annotated[str | None, Field(description="Error when the step failed")] = None assertion: Annotated[ dict[str, dict[str, Any]] | None, - Field(description="Assertion payload when this step is an assertion"), + Field(description="Assertion or safe wait-result metadata"), ] = None @@ -6134,6 +7119,51 @@ class RuntimeProfileDto(BaseModel): browser: BrowserCapabilityEnvelope | None = None +class RunTraceSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[ + UUID, Field(alias="runId", description="Run this summary belongs to") + ] + failed_actions: Annotated[ + list[str], + Field(alias="failedActions", description="Failed step titles and messages"), + ] + failed_requests: Annotated[ + list[str], Field(alias="failedRequests", description="Failed network requests") + ] + console_errors: Annotated[ + list[str], Field(alias="consoleErrors", description="Console error lines") + ] + text: Annotated[str, Field(description="Plain-text summary, length-capped")] + truncated: Annotated[ + bool, Field(description="Whether any section was cut to the cap") + ] + + +class RunWindowListParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + from_: Annotated[ + AwareDatetime | None, + Field( + alias="from", + description="Inclusive window start; default last 24 hours, clamped to 90 days", + ), + ] = None + to: Annotated[ + AwareDatetime | None, Field(description="Inclusive window end; default now") + ] = None + monitor_id: Annotated[ + UUID | None, + Field(alias="monitorId", description="Only entries for this monitor"), + ] = None + cursor: Annotated[ + str | None, Field(description="Opaque cursor returned by this endpoint") + ] = None + limit: Annotated[ + int, Field(description="Page size (1–100, default 50)", ge=1, le=100) + ] + + class ScheduledMaintenanceDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique maintenance record identifier")] @@ -6198,14 +7228,6 @@ class ScheduledMaintenanceDto(BaseModel): class ScriptMonitorConfig(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - script: Annotated[ - str | None, - Field( - description="Legacy inline script on existing rows", - max_length=65536, - min_length=0, - ), - ] = None timeout_seconds: Annotated[ int | None, Field( @@ -6219,7 +7241,7 @@ class ScriptMonitorConfig(BaseModel): str | None, Field( alias="runtimeId", - description="Runtime pin such as 2026.11; omit to pin the current runtime at create", + description="Runtime pin such as 2026.11; omit to pin the newest runtime that can run", max_length=32, min_length=0, pattern="^$|^[A-Za-z0-9._-]+$", @@ -6227,83 +7249,7 @@ class ScriptMonitorConfig(BaseModel): ] = None -class SecretDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique secret identifier")] - key: Annotated[ - str, Field(description="Secret key name, unique within the workspace") - ] - dek_version: Annotated[ - int, - Field( - alias="dekVersion", description="DEK version at the time of last encryption" - ), - ] - value_hash: Annotated[ - str, - Field( - alias="valueHash", - description="SHA-256 hex digest of the current plaintext; use for change detection", - ), - ] - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="Timestamp when the secret was created"), - ] - updated_at: Annotated[ - AwareDatetime, - Field( - alias="updatedAt", description="Timestamp when the secret was last updated" - ), - ] - used_by_monitors: Annotated[ - list[MonitorReference] | None, - Field( - alias="usedByMonitors", - description="Monitors that reference this secret for authentication", - ), - ] = None - - -class SecretRequestDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - key: Annotated[str, Field(description="Secret key this monitor requires")] - secret: SecretDto | None = None - readiness: Annotated[ - str, Field(description="Whether this key is resolved or missing") - ] - fulfilled_by: Annotated[ - str | None, - Field( - alias="fulfilledBy", - description="Fulfilled from environment variables or a secret", - ), - ] = None - declaring_file: Annotated[ - str | None, - Field( - alias="declaringFile", - description="Declaring file path inside the package zip", - ), - ] = None - declaring_location: Annotated[ - str | None, - Field( - alias="declaringLocation", - description="Call site from package scan, e.g. signIn(…) · line 6", - ), - ] = None - last_resolved_at: Annotated[ - AwareDatetime | None, - Field(alias="lastResolvedAt", description="When a run last resolved this key"), - ] = None - last_resolved_run_id: Annotated[ - UUID | None, - Field(alias="lastResolvedRunId", description="Run that last resolved this key"), - ] = None - - -class SeoMetadataDto(BaseModel): +class SeoMetadataDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) short_description: Annotated[ str | None, @@ -6786,6 +7732,16 @@ class SingleValueResponseApiKeyDto(BaseModel): data: ApiKeyDto +class SingleValueResponseArtifactDownloadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: ArtifactDownloadDto + + +class SingleValueResponseBundleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BundleDto + + class SingleValueResponseDekRotationResultDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: DekRotationResultDto @@ -6796,6 +7752,16 @@ class SingleValueResponseDeployLockDto(BaseModel): data: DeployLockDto +class SingleValueResponseDeviceAuthorizationDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DeviceAuthorizationDto + + +class SingleValueResponseDeviceTokenDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DeviceTokenDto + + class SingleValueResponseEmailDomainDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: EmailDomainDto @@ -6806,14 +7772,14 @@ class SingleValueResponseEmailMessageSourceDto(BaseModel): data: EmailMessageSourceDto -class SingleValueResponseEnvironmentDto(BaseModel): +class SingleValueResponseEntitlementResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: EnvironmentDto + data: EntitlementResponse -class SingleValueResponseIncidentTriggerDto(BaseModel): +class SingleValueResponseEnvironmentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: IncidentTriggerDto + data: EnvironmentDto class SingleValueResponseInjectEmailMessageResponse(BaseModel): @@ -6831,6 +7797,11 @@ class SingleValueResponseListEmailDomainActivityDto(BaseModel): data: list[EmailDomainActivityDto] +class SingleValueResponseListRegionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[RegionDto] + + class SingleValueResponseListUUID(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[UUID] @@ -6856,6 +7827,11 @@ class SingleValueResponseMonitorRunDurationSummaryDto(BaseModel): data: MonitorRunDurationSummaryDto +class SingleValueResponseMonitorScheduleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorScheduleDto + + class SingleValueResponseMonitorSessionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: MonitorSessionDto @@ -6876,6 +7852,11 @@ class SingleValueResponseMonitorUsageProjectionDto(BaseModel): data: MonitorUsageProjectionDto +class SingleValueResponseMonitorValidationResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorValidationResultDto + + class SingleValueResponseNotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: NotificationDispatchDto @@ -6891,11 +7872,6 @@ class SingleValueResponseOverviewStepsDto(BaseModel): data: OverviewStepsDto -class SingleValueResponsePackageUploadDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: PackageUploadDto - - class SingleValueResponsePolicySnapshotDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: PolicySnapshotDto @@ -6911,9 +7887,9 @@ class SingleValueResponseResultSummaryDto(BaseModel): data: ResultSummaryDto -class SingleValueResponseRevisionDto(BaseModel): +class SingleValueResponseRevisionFilesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RevisionDto + data: RevisionFilesDto class SingleValueResponseRunConsoleDto(BaseModel): @@ -6921,14 +7897,9 @@ class SingleValueResponseRunConsoleDto(BaseModel): data: RunConsoleDto -class SingleValueResponseRunDiffDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunDiffDto - - -class SingleValueResponseRunMetricsSummaryDto(BaseModel): +class SingleValueResponseRunnerRegionStatusesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunMetricsSummaryDto + data: RunnerRegionStatusesDto class SingleValueResponseRuntimeProfileDto(BaseModel): @@ -6936,9 +7907,9 @@ class SingleValueResponseRuntimeProfileDto(BaseModel): data: RuntimeProfileDto -class SingleValueResponseSecretDto(BaseModel): +class SingleValueResponseRunTraceSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: SecretDto + data: RunTraceSummaryDto class SingleValueResponseServiceDayDetailDto(BaseModel): @@ -6993,6 +7964,14 @@ class SlackChannelConfig(BaseModel): ] = None +class Slot(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start_time: Annotated[ + AwareDatetime, Field(alias="startTime", description="Demo start time in UTC") + ] + token: Annotated[str, Field(description="Token used to confirm this time")] + + class SmsChannelConfig(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) channel_type: Annotated[Literal["sms"], Field(alias="channelType")] = "sms" @@ -7134,6 +8113,39 @@ class StatusEventDto(BaseModel): ] = None +class StatusPageBindingSnapshot(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + name: Annotated[str, Field(description="Component display name", min_length=1)] + description: Annotated[ + str | None, Field(description="Optional component description") + ] = None + group_id: Annotated[ + UUID | None, + Field(alias="groupId", description="Group that contains this component"), + ] = None + show_uptime: Annotated[ + bool, Field(alias="showUptime", description="Whether to show measured uptime") + ] + display_order: Annotated[ + int, + Field(alias="displayOrder", description="Position within the page or group"), + ] + exclude_from_overall: Annotated[ + bool, + Field( + alias="excludeFromOverall", + description="Whether to exclude this component from overall status", + ), + ] + start_date: Annotated[ + date_aliased | None, + Field( + alias="startDate", + description="Optional start date for published uptime history", + ), + ] = None + + class StatusPageBoundComponentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) component_id: Annotated[ @@ -7585,6 +8597,10 @@ class StatusPageSubscriberDto(BaseModel): ] +class StreamingResponseBody(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + + class Summary(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7660,6 +8676,25 @@ class SyntheticsFamilyMetricsDto(BaseModel): ] +class SyntheticsUsagePeriodDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + period_start: Annotated[ + AwareDatetime, + Field(alias="periodStart", description="Start of the usage period"), + ] + period_end: Annotated[ + AwareDatetime, Field(alias="periodEnd", description="End of the usage period") + ] + browser: Meter + api: Meter + monitors: Annotated[ + list[MonitorUsage], + Field( + description="Usage grouped by monitor and meter, including deleted monitors" + ), + ] + + class TableValueResultAlertChannelDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[AlertChannelDto] @@ -7777,27 +8812,27 @@ class TableValueResultMemberDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationDispatchDto(BaseModel): +class TableValueResultMonitorSessionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationDispatchDto] + data: list[MonitorSessionDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationDto(BaseModel): +class TableValueResultNotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationDto] + data: list[NotificationDispatchDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRevisionDto(BaseModel): +class TableValueResultNotificationDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RevisionDto] + data: list[NotificationDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -7831,15 +8866,6 @@ class TableValueResultScheduledMaintenanceDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultSecretDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[SecretDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - class TableValueResultServiceComponentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[ServiceComponentDto] @@ -8259,6 +9285,40 @@ class TraceNearbyAction(BaseModel): ] +class To(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + +class TransferMonitorRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + to: Annotated[ + To, Field(description="New owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + reason: Annotated[ + str, + Field( + description="Why ownership is moving (recorded in the audit log)", + max_length=280, + min_length=0, + ), + ] + project: Annotated[ + str | None, + Field( + description="Project the new owner declares for this monitor; null clears it", + max_length=255, + min_length=0, + ), + ] = None + owner_declaration: Annotated[ + OwnerDeclaration | None, Field(alias="ownerDeclaration") + ] = None + + class Type4(StrEnum): consecutive_failures = "consecutive_failures" failures_in_window = "failures_in_window" @@ -8324,6 +9384,52 @@ class TriggerRule(BaseModel): ] = None +class TriggerRunRef(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Run identifier")] + region: Annotated[str, Field(description="Probe region for this run", min_length=1)] + phase: Annotated[str, Field(description="Current run phase")] + url: Annotated[str, Field(description="API path for this run", min_length=1)] + + +class TriggerRunRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + regions: Annotated[ + list[str] | None, + Field( + description="Regions to run; empty or omitted runs every configured region" + ), + ] = None + signal: Annotated[ + bool | None, + Field( + description="Count these runs toward health and incidents (default: false)" + ), + ] = None + session: RunSessionContext | None = None + + +class TriggerRunsResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + trigger_id: Annotated[ + UUID, + Field( + alias="triggerId", + description="Groups every run started by this trigger; scheduled runs group by evaluation cycle instead", + ), + ] + billed_runs: Annotated[ + int, + Field( + alias="billedRuns", + description="Runs billed for this trigger, one per region", + ), + ] + runs: Annotated[ + list[TriggerRunRef], Field(description="Queued runs, one per region") + ] + + class UpdateAlertSensitivityRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) alert_sensitivity: Annotated[ @@ -8692,6 +9798,17 @@ class UpdateMonitorAuthRequest(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig +class SecretKey1(RootModel[str]): + root: Annotated[ + str, + Field( + description="Replace attached secret keys; null preserves current", + max_length=255, + min_length=0, + ), + ] + + class UpdateOpsGenieChannelConfig(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( @@ -9617,6 +10734,28 @@ class UserDto(BaseModel): ] +class Value(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + value: Annotated[ + str, Field(description="Exact filter value; steps use caseIndex:step") + ] + count: Annotated[int, Field(description="Matching run attempts for this value")] + failed_count: Annotated[ + int | None, + Field( + alias="failedCount", + description="Failed attempt count; populated for region facets", + ), + ] = None + outcome_counts: Annotated[ + list[RunOutcomeCountDto] | None, + Field( + alias="outcomeCounts", + description="Per-outcome attempt counts; populated for region facets", + ), + ] = None + + class VoiceLanguageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) code: Annotated[ @@ -10020,6 +11159,16 @@ class AcknowledgeAllIncidentsResponse(BaseModel): ] +class ActorDisplayDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + identity: Annotated[str, Field(description="Stable actor identity")] + user: UserDto | None = None + key_name: Annotated[ + str | None, + Field(alias="keyName", description="API key display name; never the key value"), + ] = None + + class AddMonitorTagsRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) tag_ids: Annotated[ @@ -10059,9 +11208,19 @@ class ArtifactTraceMeta(BaseModel): ] = None -class AuditMetadata(RootModel[MemberRoleChangedMetadata | None]): +class AuditMetadata( + RootModel[ + MemberRoleChangedMetadata + | EvidencePurgedMetadata + | MonitorOwnershipMetadata + | None + ] +): root: Annotated[ - MemberRoleChangedMetadata | None, + MemberRoleChangedMetadata + | EvidencePurgedMetadata + | MonitorOwnershipMetadata + | None, Field( description="Typed metadata payload attached to an audit event; null for actions that carry no extra context.", discriminator="kind", @@ -10106,6 +11265,16 @@ class BulkMonitorActionRequest(BaseModel): description="New tags to create and attach (only for ADD_TAG)", ), ] = None + frequency_seconds: Annotated[ + int | None, + Field( + alias="frequencySeconds", + description="New check frequency in seconds (10–86400), required for UPDATE_SCHEDULE", + ge=10, + le=86400, + ), + ] = None + overlay: MonitorOverlayRequest | None = None class BulkMonitorActionResult(BaseModel): @@ -10121,6 +11290,13 @@ class BulkMonitorActionResult(BaseModel): ] +class BundleCheckResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + findings: Annotated[ + list[Finding], Field(description="Problems found in the supplied source files") + ] + + class CaptureCompareDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) this_artifact_id: Annotated[ @@ -10191,6 +11367,23 @@ class Code(BaseModel): ] = None +class CodeTestTargetRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + environment_id: Annotated[ + UUID | None, + Field( + alias="environmentId", + description="Environment to test against; null uses the monitor's environment", + ), + ] = None + region: Annotated[ + str | None, + Field(description="Region for this test; null uses the monitor's first region"), + ] = None + code: MonitorCodeSpec | None = None + session: RunSessionContext | None = None + + class ComponentUptimeDayDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) date: Annotated[ @@ -10332,6 +11525,11 @@ class CreateAssertionRequest(BaseModel): ] = None +class CreateDraftRevisionRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + code: MonitorCodeSpec + + class CreateMonitorRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -10378,6 +11576,22 @@ class CreateMonitorRequest(BaseModel): description="Source that created this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API", ), ] = None + owner_enforced: Annotated[ + bool | None, + Field( + alias="ownerEnforced", + description="Only the managedBy tool may change configuration (default: false)", + ), + ] = None + owner_project: Annotated[ + str | None, + Field( + alias="ownerProject", + description="Project the owning tool declares for this monitor, e.g. acme/web", + max_length=255, + min_length=0, + ), + ] = None environment_id: Annotated[ UUID | None, Field( @@ -10425,7 +11639,19 @@ class CreateMonitorRequest(BaseModel): description="Existing definition to reuse for a sibling monitor", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None + owner_declaration: Annotated[ + OwnerDeclaration | None, Field(alias="ownerDeclaration") + ] = None + secret_keys: Annotated[ + list[SecretKey] | None, + Field( + alias="secretKeys", + description="Secret keys to attach; null starts with the scanned set", + max_length=256, + min_length=0, + ), + ] = None class CreateResourceGroupRequest(BaseModel): @@ -10659,6 +11885,26 @@ class CreditPolicy(BaseModel): ] = None +class CursorPageMonitorHistoryEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[ + list[MonitorHistoryEntryDto], Field(description="Items on this page") + ] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + class CursorPageNotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[ @@ -10757,24 +12003,9 @@ class DashboardOverviewDto(BaseModel): incidents: IncidentsSummaryDto -class DefinitionHeadDto(BaseModel): +class DemoAvailabilityDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - definition_id: Annotated[ - UUID, Field(alias="definitionId", description="Definition this Head belongs to") - ] - environment: EnvironmentDto - revision: RevisionDto - activated_at: Annotated[ - AwareDatetime, - Field(alias="activatedAt", description="When this Head last activated"), - ] - activated_by: Annotated[ - str | None, - Field(alias="activatedBy", description="Who last activated this Head"), - ] = None - reason: Annotated[ - str | None, Field(description="Rollback reason when this Head was restored") - ] = None + slots: Annotated[list[Slot], Field(description="Available demo times in UTC")] class EmailMessageDto(BaseModel): @@ -11157,6 +12388,13 @@ class IncidentDto(BaseModel): 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.", ), ] = None + triggering_run_id: Annotated[ + UUID | None, + Field( + alias="triggeringRunId", + description="Code-monitor run whose failing tick confirmed this incident; null for uptime", + ), + ] = None triggered_by_rule_snapshot_hash_hex: Annotated[ str | None, Field( @@ -11422,226 +12660,182 @@ class MonitorAssertionDto(BaseModel): severity: str -class MonitorDriftDto(BaseModel): +class MonitorBatchHistoryItemDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - fields: Annotated[ - list[MonitorDriftFieldDto], + id: Annotated[UUID, Field(description="Monitor identifier")] + availability: Annotated[ + float | None, Field( - description="Fields whose live overlay differs from the declared baseline" + description="Share of checks that passed, 0–100; null when no checks ran" + ), + ] = None + p95: Annotated[ + float | None, + Field( + description="95th percentile response time in milliseconds; null when none recorded" ), + ] = None + ticks: Annotated[ + list[MonitorHistoryTickDto], + Field(description="Outcome per time bucket, oldest first"), ] + display_ticks: Annotated[ + list[MonitorDisplayTickDto] | None, + Field( + alias="displayTicks", + description="48 display buckets; present only when density=48", + ), + ] = None -class MonitorDto(BaseModel): - """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" - +class MonitorDriftSettingDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique monitor identifier")] - organization_id: Annotated[ - int, - Field( - alias="organizationId", description="Organization this monitor belongs to" - ), - ] - name: Annotated[ - str, Field(description="Human-readable name for this monitor", min_length=1) + field: Annotated[ + str, Field(description="Setting name: frequency or regions", min_length=1) ] - type: str - config: ( - DnsMonitorConfig - | HeartbeatMonitorConfig - | HttpMonitorConfig - | IcmpMonitorConfig - | McpServerMonitorConfig - | ScriptMonitorConfig - | TcpMonitorConfig - ) - frequency_seconds: Annotated[ - int, + live: Annotated[ + str, Field( - alias="frequencySeconds", - description="Check frequency in seconds (30–86400)", + description="Live value: seconds for frequency, comma-separated ids for regions", + min_length=1, ), ] - enabled: Annotated[bool, Field(description="Whether the monitor is active")] - regions: Annotated[ - list[str], Field(description="Probe regions where checks are executed") - ] - managed_by: Annotated[ + git: Annotated[ str, Field( - alias="managedBy", - description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", + description="Value last applied from Git, in the same format as live", + min_length=1, ), ] - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="Timestamp when the monitor was created"), + changed_at: Annotated[ + AwareDatetime | None, + Field(alias="changedAt", description="When this setting was last changed"), + ] = None + changed_by: Annotated[UserDto | None, Field(alias="changedBy")] = None + reason: Annotated[ + str | None, Field(description="Recorded reason; null when no reason was stored") + ] = None + + +class MonitorFacetDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[ + str, Field(description="Facet field: type, environment, region, tag, or owner") ] - updated_at: Annotated[ + values: Annotated[ + list[MonitorFacetValueDto], + Field(description="Values with at least one monitor, largest first"), + ] + + +class MonitorFleetSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + window: Annotated[str, Field(description="Window: 24h, 7d, or 30d")] + from_: Annotated[ AwareDatetime, - Field( - alias="updatedAt", description="Timestamp when the monitor was last updated" - ), + Field(alias="from", description="Inclusive start of the history window"), ] - assertions: Annotated[ - list[MonitorAssertionDto] | None, + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the history window") + ] + uptime_percent: Annotated[ + float | None, Field( - description="Assertions evaluated against each check result; null on list responses" + alias="uptimePercent", + description="Passed target checks divided by measured target checks, 0–100", ), ] = None - tags: Annotated[ - list[TagDto] | None, Field(description="Tags applied to this monitor") - ] = None - ping_url: Annotated[ - str | None, + last_failure_bucket_at: Annotated[ + AwareDatetime | None, Field( - alias="pingUrl", - description="Heartbeat ping URL; populated for HEARTBEAT monitors only", + alias="lastFailureBucketAt", + description="Start of the most recent failing display bucket", ), ] = None - environment: Summary | None = None - auth: MonitorAuthConfig | None = None - incident_policy: Annotated[ - IncidentPolicyDto | None, Field(alias="incidentPolicy") - ] = None - alert_channel_ids: Annotated[ - list[UUID] | None, + open_incident_count: Annotated[ + int, Field( - alias="alertChannelIds", - description="Alert channel IDs linked to this monitor; populated on single-monitor responses", + alias="openIncidentCount", description="Open confirmed monitor incidents" ), - ] = None - bound_status_page_components: Annotated[ - list[StatusPageBoundComponentDto] | None, + ] + groups: Annotated[ + list[MonitorListGroupDto], + Field(description="Current monitor group counts, independent of list filters"), + ] + ticks: Annotated[ + list[MonitorDisplayTickDto], Field( - alias="boundStatusPageComponents", - description="Status-page components that represent this monitor; omitted when none", + description="48 display buckets showing the worst observed monitor outcome" ), + ] + + +class MonitorListFacetsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + groups: Annotated[ + list[MonitorListGroupDto], Field(description="Count per list group") + ] + facets: Annotated[ + list[MonitorFacetDto], Field(description="Values and counts per facet field") + ] + sources: Annotated[ + list[MonitorSourceSummaryDto] | None, + Field(description="Matching monitors per owning tool and project"), ] = None - current_status: Annotated[ - str | None, + + +class MonitorRunDurationBatchDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the enqueue-time window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the enqueue-time window") + ] + monitors: Annotated[ + list[MonitorRunDurationMetricDto], + Field(description="Measured duration results for requested code monitors"), + ] + + +class MonitorRunSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + window: Annotated[str, Field(description="Requested chart window")] + from_: Annotated[ + AwareDatetime, Field(alias="from", description="Inclusive start of the chart") + ] + to: Annotated[AwareDatetime, Field(description="Exclusive end of the chart")] + uptime_percent: Annotated[ + float | None, Field( - alias="currentStatus", - description="Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", + alias="uptimePercent", + description="Passed final target outcomes as a percent of passed and failed", ), ] = None - display_health: Annotated[ - str | None, + previous_uptime_percent: Annotated[ + float | None, Field( - alias="displayHealth", - description="List and header chip health; not currentStatus and not evaluation state", + alias="previousUptimePercent", + description="Target uptime in the previous equal-length period", ), ] = None - binding_readiness: Annotated[ - str | None, - Field( - alias="bindingReadiness", - description="Secret binding state: ready, blocked, or not_applicable", - ), + buckets: Annotated[ + list[Bucket], Field(description="Buckets across every selected region") + ] + regions: Annotated[ + list[Region], Field(description="Buckets for each selected region") + ] + points: Annotated[ + list[Point] | None, + Field(description="Latest execution points for 24h; null for longer windows"), ] = None - needs_attention: Annotated[ - bool | None, + points_truncated: Annotated[ + bool, Field( - alias="needsAttention", - description="True when the monitor needs operator attention", + alias="pointsTruncated", + description="More 24h points exist than the returned 2000-point limit", ), - ] = None - open_incident: Annotated[ - UUID | None, - Field(alias="openIncident", description="Open confirmed incident id"), - ] = None - last_run_at: Annotated[ - AwareDatetime | None, - Field(alias="lastRunAt", description="When the latest code run was enqueued"), - ] = None - last_run_id: Annotated[ - UUID | None, Field(alias="lastRunId", description="Latest code run id") - ] = None - definition_id: Annotated[ - UUID | None, - Field( - alias="definitionId", - description="Definition id for a browser or multi-step monitor. Null on probe monitors", - ), - ] = None - capture_policy: Annotated[CapturePolicy | None, Field(alias="capturePolicy")] = None - fast_retry_max_attempts: Annotated[ - int | None, - Field( - alias="fastRetryMaxAttempts", - description="Fast-retry max attempts; null/0 = off", - ), - ] = None - run_parallel: Annotated[ - bool | None, - Field( - alias="runParallel", - description="When multiple locations are set, run all of them each interval. False rotates one location per interval", - ), - ] = None - muted: Annotated[bool, Field(description="Whether alert delivery is muted")] - muted_until: Annotated[ - AwareDatetime | None, - Field( - alias="mutedUntil", - description="Mute expiry; null means indefinite while muted", - ), - ] = None - mute_reason: Annotated[ - str | None, Field(alias="muteReason", description="Optional mute reason") - ] = None - paused_at: Annotated[ - AwareDatetime | None, - Field(alias="pausedAt", description="When the monitor was paused"), - ] = None - pause_reason: Annotated[ - str | None, Field(alias="pauseReason", description="Optional pause reason") - ] = None - pause_expires_at: Annotated[ - AwareDatetime | None, Field(alias="pauseExpiresAt", description="Pause expiry") - ] = None - quarantine_owner_id: Annotated[ - str | None, - Field(alias="quarantineOwnerId", description="Quarantine person owner id"), - ] = None - quarantine_until: Annotated[ - AwareDatetime | None, - Field( - alias="quarantineUntil", - description="Quarantine expiry; non-null means quarantined", - ), - ] = None - quarantine_reason: Annotated[ - str | None, Field(alias="quarantineReason", description="Quarantine reason") - ] = None - upload: PackageUploadDto | None = None - usage_projection: Annotated[ - MonitorUsageProjectionDto | None, Field(alias="usageProjection") - ] = None - - -class MonitorRunDurationBatchDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - from_: Annotated[ - AwareDatetime, - Field(alias="from", description="Inclusive start of the enqueue-time window"), - ] - to: Annotated[ - AwareDatetime, Field(description="Exclusive end of the enqueue-time window") - ] - monitors: Annotated[ - list[MonitorRunDurationMetricDto], - Field(description="Measured duration results for requested code monitors"), - ] - - -class MonitorSecretRequestsDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - environment: EnvironmentDto - requests: Annotated[ - list[SecretRequestDto], - Field(description="Secret keys this monitor requires and their resolve state"), ] @@ -11668,42 +12862,8 @@ class MonitorTestRequest(BaseModel): description="Environment to test against; null uses the monitor environment", ), ] = None - - -class MonitorVersionDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique version record identifier")] - monitor_id: Annotated[ - UUID, Field(alias="monitorId", description="Monitor this version belongs to") - ] - version: Annotated[ - int, Field(description="Monotonically increasing version number") - ] - snapshot: MonitorDto - changed_by_id: Annotated[ - int | None, - Field( - alias="changedById", - description="User ID who made the change; null for automated changes", - ), - ] = None - changed_via: Annotated[ - str, - Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), - ] - change_summary: Annotated[ - str | None, - Field( - alias="changeSummary", - description="Human-readable description of what changed", - ), - ] = None - created_at: Annotated[ - AwareDatetime, - Field( - alias="createdAt", description="Timestamp when this version was recorded" - ), - ] + code: MonitorCodeSpec | None = None + session: RunSessionContext | None = None class NetworkRowDto(BaseModel): @@ -11865,6 +13025,25 @@ class NotificationPolicyDto(BaseModel): ] = None +class RegionResultSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + window: Annotated[str, Field(description="Requested window (24h, 7d, or 30d)")] + bucket_seconds: Annotated[ + int, Field(alias="bucketSeconds", description="Chart bucket width in seconds") + ] + previous_uptime_percent: Annotated[ + float | None, + Field( + alias="previousUptimePercent", + description="Uptime percent for the previous equal-length window", + ), + ] = None + regions: Annotated[ + list[RegionSeriesDto], + Field(description="Per-region series covering the requested window"), + ] + + class RelatedIncidentsResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[ @@ -12009,27 +13188,86 @@ class ResourceGroupMemberDto(BaseModel): ] = None -class RevisionDiffDto(BaseModel): +class RevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - left: RevisionDto - right: RevisionDto - hunks: Annotated[ - list[RevisionDiffHunkDto], - Field(description="File and field-level hunks (bounded)"), + id: Annotated[UUID, Field(description="Revision identifier")] + definition_id: Annotated[ + UUID, Field(alias="definitionId", description="Parent definition") ] - - -class RollbackPreviewDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - target: RevisionDto - current: DefinitionHeadDto | None = None - affected_monitors: Annotated[ - list[MonitorDto], + number: Annotated[ + int, Field(description="Monotonic revision number within the definition") + ] + digest: Annotated[ + str, Field( - alias="affectedMonitors", - description="Monitors sharing this definition and environment", + description="Closure digest from POST /bundles (sha256:)", min_length=1 + ), + ] + entrypoint: Annotated[ + str, Field(description="Entrypoint file that runs", min_length=1) + ] + files: Annotated[list[str], Field(description="Paths present in the zip")] + keys: Annotated[list[str], Field(description="Secret key names the code demands")] + download_until: Annotated[ + AwareDatetime | None, + Field( + alias="downloadUntil", description="When package bytes expire for download" ), + ] = None + purged_at: Annotated[ + AwareDatetime | None, + Field(alias="purgedAt", description="When package bytes were purged"), + ] = None + git_sha: Annotated[ + str | None, + Field(alias="gitSha", description="Git commit SHA when sourced from Git"), + ] = None + git_message: Annotated[ + str | None, Field(alias="gitMessage", description="Git commit message") + ] = None + git_file: Annotated[ + str | None, Field(alias="gitFile", description="Declaring Git file path") + ] = None + authored_by: Annotated[ + str | None, Field(alias="authoredBy", description="Who authored this package") + ] = None + source: CodeSource | None = None + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="When the revision was minted"), ] + state: Annotated[ + str | None, + Field( + description="draft, tested_passed, tested_failed, live, previous, or discarded" + ), + ] = None + test_run_id: Annotated[ + UUID | None, + Field(alias="testRunId", description="Latest validation run for this revision"), + ] = None + test_outcome: Annotated[ + str | None, + Field( + alias="testOutcome", + description="Latest test outcome; absent until a test finishes", + ), + ] = None + live_stats: Annotated[RevisionLiveStatsDto | None, Field(alias="liveStats")] = None + expires_at: Annotated[ + AwareDatetime | None, + Field( + alias="expiresAt", + description="When this draft expires; preserved after discard", + ), + ] = None + created_by_kind: Annotated[ + str | None, + Field(alias="createdByKind", description="Tool that created this draft"), + ] = None + base_revision: Annotated[ + RevisionReferenceDto | None, Field(alias="baseRevision") + ] = None class RunArtifactDto(BaseModel): @@ -12168,60 +13406,257 @@ class RunExecutionDto(BaseModel): ] -class RunNetworkDto(BaseModel): +class RunFacetDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: Annotated[ - list[NetworkRowDto], Field(description="Waterfall rows on this page") - ] - case_duration_ms: Annotated[ - int | None, - Field( - alias="caseDurationMs", description="Case wall time for waterfall bar scale" - ), - ] = None - next_cursor: Annotated[ - str | None, - Field(alias="nextCursor", description="Opaque cursor for the next page"), - ] = None - has_more: Annotated[ - bool, - Field(alias="hasMore", description="Whether more rows exist beyond this page"), + field: Annotated[str, Field(description="Filter field these values describe")] + values: Annotated[ + list[Value], Field(description="Values selected by the other filters") ] -class SecretAuditDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - updated_at: Annotated[ - AwareDatetime | None, - Field(alias="updatedAt", description="When this secret was last updated"), - ] = None - updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = None - - -class SecretUsageDto(BaseModel): +class RunHistogramBucketDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - monitors: Annotated[ - list[MonitorDto], Field(description="Monitors that reference this secret") + start: Annotated[ + AwareDatetime, Field(description="Inclusive UTC start of this bucket") + ] + counts: Annotated[ + list[RunOutcomeCountDto], Field(description="Health-voting run attempt counts") ] -class ServiceIncidentDetailDto(BaseModel): +class RunMetricsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - title: str - status: str - impact: str | None = None - started_at: Annotated[AwareDatetime | None, Field(alias="startedAt")] = None - resolved_at: Annotated[AwareDatetime | None, Field(alias="resolvedAt")] = None - detected_at: Annotated[AwareDatetime | None, Field(alias="detectedAt")] = None - shortlink: str | None = None - affected_components: Annotated[ - list[str] | None, Field(alias="affectedComponents") - ] = None - affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None - updates: list[ServiceIncidentUpdateDto] - - + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the enqueue-time window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Inclusive end of the enqueue-time window") + ] + matching_run_count: Annotated[ + int, + Field( + alias="matchingRunCount", + description="Runs matching the complete list filter", + ), + ] + duration_sample_count: Annotated[ + int, + Field( + alias="durationSampleCount", + description="Finished matching runs with a measured execution duration", + ), + ] + p95_duration_ms: Annotated[ + float | None, + Field( + alias="p95DurationMs", + description="95th percentile execution duration in milliseconds; null when no durations were measured", + ), + ] = None + evidence_eligible_run_count: Annotated[ + int, + Field( + alias="evidenceEligibleRunCount", + description="Runs with a known capture policy", + ), + ] + evidence_unknown_policy_run_count: Annotated[ + int, + Field( + alias="evidenceUnknownPolicyRunCount", + description="Runs with a missing or incomplete capture policy", + ), + ] + evidence_incomplete_run_count: Annotated[ + int | None, + Field( + alias="evidenceIncompleteRunCount", + description="Eligible runs with required evidence missing, processing, failed, or expired", + ), + ] = None + evidence_processing_run_count: Annotated[ + int | None, + Field( + alias="evidenceProcessingRunCount", + description="Eligible runs with required evidence still processing", + ), + ] = None + evidence_no_evidence_policy_run_count: Annotated[ + int | None, + Field( + alias="evidenceNoEvidencePolicyRunCount", + description="Eligible runs with no evidence required by their recorded policy", + ), + ] = None + evidence_complete_run_count: Annotated[ + int | None, + Field( + alias="evidenceCompleteRunCount", + description="Eligible runs with all required evidence available", + ), + ] = None + available_artifact_count: Annotated[ + int | None, + Field( + alias="availableArtifactCount", + description="Required artifact records with an available unexpired object key", + ), + ] = None + processing_artifact_count: Annotated[ + int | None, + Field( + alias="processingArtifactCount", + description="Required artifact records still processing", + ), + ] = None + failed_artifact_count: Annotated[ + int | None, + Field( + alias="failedArtifactCount", + description="Required artifact records with a failed upload", + ), + ] = None + expired_artifact_count: Annotated[ + int | None, + Field( + alias="expiredArtifactCount", + description="Required artifact records marked expired or past their expiry", + ), + ] = None + missing_artifact_kind_count: Annotated[ + int | None, + Field( + alias="missingArtifactKindCount", + description="Required evidence kinds with no artifact record after the run finished", + ), + ] = None + intentional_no_evidence_artifact_count: Annotated[ + int | None, + Field( + alias="intentionalNoEvidenceArtifactCount", + description="Required artifact records explicitly suppressed, not reached, or not captured", + ), + ] = None + outcome_counts: Annotated[ + list[RunOutcomeCountDto] | None, + Field( + alias="outcomeCounts", + description="Health-voting run attempts by projected outcome", + ), + ] = None + excluded_run_count: Annotated[ + int | None, + Field( + alias="excludedRunCount", + description="Matching attempts that do not vote on health", + ), + ] = None + cycle_count: Annotated[ + int | None, + Field( + alias="cycleCount", + description="Distinct scheduled cycle identities in the filtered population", + ), + ] = None + failed_cycle_count: Annotated[ + int | None, + Field( + alias="failedCycleCount", + description="Recorded complete cycles with a final failed or timed-out region; display count", + ), + ] = None + display_group_count: Annotated[ + int | None, + Field( + alias="displayGroupCount", + description="Cycle and manual-trigger groups in the filtered population", + ), + ] = None + health_voting_p95_duration_ms: Annotated[ + float | None, + Field( + alias="healthVotingP95DurationMs", + description="95th-percentile duration of health-voting run attempts", + ), + ] = None + session_last_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="sessionLastRunAt", + description="Latest session enqueue within retention, independent of the window", + ), + ] = None + buckets: Annotated[ + list[RunHistogramBucketDto] | None, + Field(description="UTC time buckets of health-voting run attempts"), + ] = None + facets: Annotated[ + list[RunFacetDto] | None, + Field(description="Run facets respecting the other active filters"), + ] = None + + +class RunNetworkDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[ + list[NetworkRowDto], Field(description="Waterfall rows on this page") + ] + case_duration_ms: Annotated[ + int | None, + Field( + alias="caseDurationMs", description="Case wall time for waterfall bar scale" + ), + ] = None + next_cursor: Annotated[ + str | None, + Field(alias="nextCursor", description="Opaque cursor for the next page"), + ] = None + has_more: Annotated[ + bool, + Field(alias="hasMore", description="Whether more rows exist beyond this page"), + ] + + +class SecretAuditDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + updated_at: Annotated[ + AwareDatetime | None, + Field(alias="updatedAt", description="When this secret was last updated"), + ] = None + updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = None + + +class SecretValueStampDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + environment: Summary + updated_at: Annotated[ + AwareDatetime | None, + Field( + alias="updatedAt", + description="When this environment value was last written", + ), + ] = None + updated_by: Annotated[ActorDisplayDto | None, Field(alias="updatedBy")] = None + + +class ServiceIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: UUID + title: str + status: str + impact: str | None = None + started_at: Annotated[AwareDatetime | None, Field(alias="startedAt")] = None + resolved_at: Annotated[AwareDatetime | None, Field(alias="resolvedAt")] = None + detected_at: Annotated[AwareDatetime | None, Field(alias="detectedAt")] = None + shortlink: str | None = None + affected_components: Annotated[ + list[str] | None, Field(alias="affectedComponents") + ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None + updates: list[ServiceIncidentUpdateDto] + + class ServiceSubscriptionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) subscription_id: Annotated[ @@ -12323,6 +13758,11 @@ class SingleValueResponseBulkMonitorActionResult(BaseModel): data: BulkMonitorActionResult +class SingleValueResponseBundleCheckResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BundleCheckResultDto + + class SingleValueResponseCaptureCompareDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: CaptureCompareDto @@ -12333,11 +13773,6 @@ class SingleValueResponseDashboardOverviewDto(BaseModel): data: DashboardOverviewDto -class SingleValueResponseDefinitionHeadDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionHeadDto - - class SingleValueResponseEmailMessageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: EmailMessageDto @@ -12368,14 +13803,14 @@ class SingleValueResponseMonitorAssertionDto(BaseModel): data: MonitorAssertionDto -class SingleValueResponseMonitorDriftDto(BaseModel): +class SingleValueResponseMonitorFleetSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorDriftDto + data: MonitorFleetSummaryDto -class SingleValueResponseMonitorDto(BaseModel): +class SingleValueResponseMonitorListFacetsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorDto + data: MonitorListFacetsDto class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): @@ -12383,14 +13818,9 @@ class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): data: MonitorRunDurationBatchDto -class SingleValueResponseMonitorSecretRequestsDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorSecretRequestsDto - - -class SingleValueResponseMonitorVersionDto(BaseModel): +class SingleValueResponseMonitorRunSeriesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorVersionDto + data: MonitorRunSeriesDto class SingleValueResponseNetworkRowDto(BaseModel): @@ -12403,19 +13833,24 @@ class SingleValueResponseNotificationPolicyDto(BaseModel): data: NotificationPolicyDto +class SingleValueResponseRegionResultSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RegionResultSeriesDto + + class SingleValueResponseResourceGroupMemberDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ResourceGroupMemberDto -class SingleValueResponseRevisionDiffDto(BaseModel): +class SingleValueResponseRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RevisionDiffDto + data: RevisionDto -class SingleValueResponseRollbackPreviewDto(BaseModel): +class SingleValueResponseRunMetricsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RollbackPreviewDto + data: RunMetricsSummaryDto class SingleValueResponseSecretAuditDto(BaseModel): @@ -12423,11 +13858,6 @@ class SingleValueResponseSecretAuditDto(BaseModel): data: SecretAuditDto -class SingleValueResponseSecretUsageDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: SecretUsageDto - - class SingleValueResponseServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceIncidentDetailDto @@ -12478,6 +13908,11 @@ class SingleValueResponseSyntheticsFamilyMetricsDto(BaseModel): data: SyntheticsFamilyMetricsDto +class SingleValueResponseSyntheticsUsagePeriodDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SyntheticsUsagePeriodDto + + class SingleValueResponseTagDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: TagDto @@ -12493,6 +13928,11 @@ class SingleValueResponseTestMatchResult(BaseModel): data: TestMatchResult +class SingleValueResponseTriggerRunsResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: TriggerRunsResponse + + class SingleValueResponseUptimeDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: UptimeDto @@ -12696,43 +14136,34 @@ class TableValueResultIntegrationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultMonitorDto(BaseModel): +class TableValueResultNotificationPolicyDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorDto] + data: list[NotificationPolicyDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultMonitorVersionDto(BaseModel): +class TableValueResultRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorVersionDto] + data: list[RevisionDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationPolicyDto(BaseModel): +class TableValueResultRunArtifactDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationPolicyDto] + data: list[RunArtifactDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRunArtifactDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RunArtifactDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - -class TableValueResultRunCaseDto(BaseModel): +class TableValueResultRunCaseDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[RunCaseDto] has_next: Annotated[bool, Field(alias="hasNext")] @@ -12958,6 +14389,22 @@ class UpdateMonitorRequest(BaseModel): description="New ownership source for probe monitors. Null preserves current. Code monitors use takeover", ), ] = None + owner_enforced: Annotated[ + bool | None, + Field( + alias="ownerEnforced", + description="Only the managedBy tool may change configuration. Null preserves current", + ), + ] = None + owner_project: Annotated[ + str | None, + Field( + alias="ownerProject", + description="Project the owning tool declares; null preserves current", + max_length=255, + min_length=0, + ), + ] = None environment_id: Annotated[ UUID | None, Field( @@ -13008,10 +14455,33 @@ class UpdateMonitorRequest(BaseModel): description="Run every location each interval; false rotates one. Null preserves current", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None + acknowledge_rollback: Annotated[ + str | None, + Field( + alias="acknowledgeRollback", + description="Rolled-back digest this code publish re-applies on purpose", + ), + ] = None status: Annotated[ str | None, Field(description="Not writable; use pause or resume") ] = None + expected_updated_at: Annotated[ + AwareDatetime | None, + Field( + alias="expectedUpdatedAt", + description="Last updatedAt this edit was based on; null skips the check", + ), + ] = None + secret_keys: Annotated[ + list[SecretKey1] | None, + Field( + alias="secretKeys", + description="Replace attached secret keys; null preserves current", + max_length=256, + min_length=0, + ), + ] = None class UpdateNotificationPolicyRequest(BaseModel): @@ -13052,6 +14522,18 @@ class UpdateNotificationPolicyRequest(BaseModel): ] = None +class ValidateMonitorsRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + monitors: Annotated[ + list[CreateMonitorRequest], + Field( + description="Monitors to check as create payloads, before anything is saved", + max_length=100, + min_length=1, + ), + ] + + class WaitEmailMessageResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) message: EmailMessageDto @@ -13076,7 +14558,7 @@ class AuditEventDto(BaseModel): str | None, Field( alias="actorEmail", - description="Email of the actor; null for system actions", + description="User email, api-key:{id} for API keys, or system for automated actions", ), ] = None action: Annotated[ @@ -13105,6 +14587,10 @@ class AuditEventDto(BaseModel): AwareDatetime, Field(alias="createdAt", description="Timestamp when the action was performed"), ] + changes: Annotated[ + list[MonitorFieldChange] | None, + Field(description="Non-secret settings changed by this action"), + ] = None class BatchComponentUptimeDto(BaseModel): @@ -13150,6 +14636,12 @@ class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer | Code]) ] +class CreateDraftRevisionResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + revision: RevisionDto + evicted: RevisionDto | None = None + + class CreateNotificationPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -13225,22 +14717,86 @@ class CursorPageIncidentActivityEventDto(BaseModel): ] -class DefinitionDetailDto(BaseModel): +class DefinitionHeadDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - definition: DefinitionDto - heads: Annotated[ - list[DefinitionHeadDto], Field(description="Active Heads per environment") + definition_id: Annotated[ + UUID, Field(alias="definitionId", description="Definition this Head belongs to") + ] + environment: EnvironmentDto + revision: RevisionDto + activated_at: Annotated[ + AwareDatetime, + Field(alias="activatedAt", description="When this Head last activated"), + ] + activated_by: Annotated[ + str | None, + Field(alias="activatedBy", description="Who last activated this Head"), + ] = None + reason: Annotated[ + str | None, Field(description="Rollback reason when this Head was restored") + ] = None + rolled_back_digest: Annotated[ + str | None, + Field( + alias="rolledBackDigest", + description="Digest the last rollback replaced; cleared by the next publish", + ), + ] = None + linked_incidents: Annotated[ + list[LinkedIncidentDto] | None, + Field(alias="linkedIncidents", description="Open incidents on this monitor"), + ] = None + note: Annotated[str | None, Field(description="Note from the latest publish")] = ( + None + ) + activated_by_actor: Annotated[ + ActorDisplayDto | None, Field(alias="activatedByActor") + ] = None + + +class MonitorBatchHistoryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitors: Annotated[ + list[MonitorBatchHistoryItemDto], + Field( + description="One entry per requested monitor that exists in the workspace" + ), ] -class IncidentDetailDto(BaseModel): +class MonitorDriftDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - incident: IncidentDto - updates: list[IncidentUpdateDto] - status_page_incidents: Annotated[ - list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + fields: Annotated[ + list[MonitorDriftFieldDto], + Field( + description="Fields whose live overlay differs from the declared baseline" + ), + ] + code: MonitorDriftCodeDto | None = None + settings: Annotated[ + list[MonitorDriftSettingDto] | None, + Field( + description="Settings that differ from the last values applied from Git; null without a settings baseline" + ), ] = None - trigger: IncidentTriggerDto | None = None + + +class PickerItem(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[UUID, Field(alias="runId", description="Finished run identifier")] + revision_id: Annotated[ + UUID, Field(alias="revisionId", description="Revision that run executed") + ] + finished_at: Annotated[ + AwareDatetime, Field(alias="finishedAt", description="When that run finished") + ] + region: Annotated[str | None, Field(description="Region of this finished run")] = ( + None + ) + outcome: Annotated[ + str | None, Field(description="Outcome of this finished run") + ] = None + revision: RevisionDto | None = None class ResourceGroupDto(BaseModel): @@ -13360,6 +14916,51 @@ class ResourceGroupDto(BaseModel): ] +class RestorableBinding(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + status_page: Annotated[StatusPageDto, Field(alias="statusPage")] + component: StatusPageBindingSnapshot + + +class RevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + left: RevisionDto + right: RevisionDto + hunks: Annotated[ + list[RevisionDiffHunkDto], + Field(description="File and field-level hunks (bounded)"), + ] + + +class RunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + baseline_run_id: Annotated[ + UUID | None, + Field( + alias="baselineRunId", description="Baseline run; null when no prior pass" + ), + ] = None + baseline_kind: Annotated[ + str, Field(alias="baselineKind", description="How the baseline was chosen") + ] + reads_as: Annotated[ + str, + Field( + alias="readsAs", + description="Human-readable baseline sentence", + min_length=1, + ), + ] + rows: Annotated[list[Row], Field(description="One row per step on this run")] + picker: Annotated[ + list[PickerItem], + Field(description="Other finished runs of this monitor for the picker"), + ] + nearest_other_region: Annotated[ + NearestOtherRegion | None, Field(alias="nearestOtherRegion") + ] = None + + class RunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique run identifier")] @@ -13390,6 +14991,7 @@ class RunDto(BaseModel): revision_id: Annotated[ UUID, Field(alias="revisionId", description="Revision this run executed") ] + revision: RevisionDto | None = None region: Annotated[str, Field(description="Probe region for this run", min_length=1)] source: Annotated[str, Field(description="What triggered this run")] counts_toward_health: Annotated[ @@ -13403,6 +15005,10 @@ class RunDto(BaseModel): AwareDatetime, Field(alias="enqueuedAt", description="When this run was enqueued"), ] + start_deadline_at: Annotated[ + AwareDatetime | None, + Field(alias="startDeadlineAt", description="When this queued run must start"), + ] = None evaluation_cycle_id: Annotated[ UUID | None, Field( @@ -13464,6 +15070,14 @@ class RunDto(BaseModel): AwareDatetime | None, Field(alias="artifactsExpiredAt", description="When artifact bytes expired"), ] = None + pinned_at: Annotated[ + AwareDatetime | None, + Field(alias="pinnedAt", description="When this run was pinned past retention"), + ] = None + purged_at: Annotated[ + AwareDatetime | None, + Field(alias="purgedAt", description="When stored evidence was purged"), + ] = None capture_policy_snapshot: Annotated[ dict[str, dict[str, Any]], Field( @@ -13526,76 +15140,209 @@ class RunDto(BaseModel): alias="executionAttempts", description="Persisted worker execution attempts" ), ] + url: Annotated[str | None, Field(description="Dashboard URL for this run")] = None + trigger_id: Annotated[ + UUID | None, + Field( + alias="triggerId", + description="Groups runs started by one manual trigger; null for other runs", + ), + ] = None + session: RunSessionContext | None = None + runtime_id: Annotated[ + str | None, + Field(alias="runtimeId", description="Runtime profile that executed this run"), + ] = None + cause: Annotated[ + str | None, + Field( + description="Platform cause for an execution error, inconclusive finish, or network failure" + ), + ] = None + billable: Annotated[ + bool, + Field( + description="Whether a finished run counts against the included run pool" + ), + ] + failure: RunFailureDto | None = None + artifacts_expire_at: Annotated[ + AwareDatetime | None, + Field(alias="artifactsExpireAt", description="When artifact bytes will expire"), + ] = None -class ServiceDetailDto(BaseModel): +class SecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - slug: str - name: str - category: str | None = None - official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None - developer_context: Annotated[str | None, Field(alias="developerContext")] = None - logo_url: Annotated[str | None, Field(alias="logoUrl")] = None - adapter_type: Annotated[str, Field(alias="adapterType")] - polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] - lifecycle_status: Annotated[ - str, + id: Annotated[UUID, Field(description="Unique secret identifier")] + key: Annotated[ + str, Field(description="Secret key name, unique within the workspace") + ] + dek_version: Annotated[ + int, Field( - alias="lifecycleStatus", - description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + alias="dekVersion", description="DEK version at the time of last encryption" ), ] - enabled: bool - created_at: Annotated[AwareDatetime, Field(alias="createdAt")] - updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] - current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( - None - ) - recent_incidents: Annotated[ - list[ServiceIncidentDto], Field(alias="recentIncidents") + value_hash: Annotated[ + str, + Field( + alias="valueHash", + description="SHA-256 hex digest of the current plaintext; use for change detection", + ), ] - components: list[ServiceComponentDto] - components_summary: Annotated[ - ComponentsSummaryDto | None, Field(alias="componentsSummary") - ] = None - uptime: ComponentUptimeSummaryDto | None = None - active_maintenances: Annotated[ - list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the secret was created"), ] - data_completeness: Annotated[str, Field(alias="dataCompleteness")] - sla_published: Annotated[ - bool, + updated_at: Annotated[ + AwareDatetime, Field( - alias="slaPublished", - description="Whether the service's SLA page is publicly visible", + alias="updatedAt", description="Timestamp when the secret was last updated" ), ] - seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None - sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None - related_services: Annotated[ - list[ServiceCatalogDto] | None, Field(alias="relatedServices") + used_by_monitors: Annotated[ + list[MonitorReference] | None, + Field( + alias="usedByMonitors", + description="Monitors that reference this secret in code, authentication, or sessions", + ), ] = None + values_at: Annotated[ + list[Summary] | None, + Field( + alias="valuesAt", + description="Environments in which this secret has a value", + ), + ] = None + value_stamp: Annotated[SecretValueStampDto | None, Field(alias="valueStamp")] = None -class SingleValueResponseBatchComponentUptimeDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: BatchComponentUptimeDto - - -class SingleValueResponseCheckTraceDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: CheckTraceDto - - -class SingleValueResponseDefinitionDetailDto(BaseModel): +class SecretRequestDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionDetailDto - - -class SingleValueResponseIncidentDetailDto(BaseModel): + key: Annotated[str, Field(description="Secret key this monitor requires")] + secret: SecretDto | None = None + readiness: Annotated[ + str, Field(description="Whether this key is resolved or missing") + ] + fulfilled_by: Annotated[ + str | None, + Field( + alias="fulfilledBy", + description="Fulfilled from environment variables or a secret", + ), + ] = None + declaring_file: Annotated[ + str | None, + Field( + alias="declaringFile", + description="Declaring file path inside the package zip", + ), + ] = None + declaring_location: Annotated[ + str | None, + Field( + alias="declaringLocation", + description="Call site from package scan, e.g. signIn(…) · line 6", + ), + ] = None + last_resolved_at: Annotated[ + AwareDatetime | None, + Field(alias="lastResolvedAt", description="When a run last resolved this key"), + ] = None + last_resolved_run_id: Annotated[ + UUID | None, + Field(alias="lastResolvedRunId", description="Run that last resolved this key"), + ] = None + demanded: Annotated[ + bool | None, + Field(description="Whether the selected revision statically declares this key"), + ] = None + attached: Annotated[ + bool | None, + Field(description="Whether this key is attached for vault resolution"), + ] = None + value_stamp: Annotated[SecretValueStampDto | None, Field(alias="valueStamp")] = None + + +class ServiceDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: IncidentDetailDto + id: UUID + slug: str + name: str + category: str | None = None + official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None + developer_context: Annotated[str | None, Field(alias="developerContext")] = None + logo_url: Annotated[str | None, Field(alias="logoUrl")] = None + adapter_type: Annotated[str, Field(alias="adapterType")] + polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] + lifecycle_status: Annotated[ + str, + Field( + alias="lifecycleStatus", + description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + ), + ] + enabled: bool + created_at: Annotated[AwareDatetime, Field(alias="createdAt")] + updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] + current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( + None + ) + recent_incidents: Annotated[ + list[ServiceIncidentDto], Field(alias="recentIncidents") + ] + components: list[ServiceComponentDto] + components_summary: Annotated[ + ComponentsSummaryDto | None, Field(alias="componentsSummary") + ] = None + uptime: ComponentUptimeSummaryDto | None = None + active_maintenances: Annotated[ + list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + ] + data_completeness: Annotated[str, Field(alias="dataCompleteness")] + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] + seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None + sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None + related_services: Annotated[ + list[ServiceCatalogDto] | None, Field(alias="relatedServices") + ] = None + + +class SingleValueResponseBatchComponentUptimeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BatchComponentUptimeDto + + +class SingleValueResponseCheckTraceDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: CheckTraceDto + + +class SingleValueResponseCreateDraftRevisionResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: CreateDraftRevisionResponse + + +class SingleValueResponseDefinitionHeadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DefinitionHeadDto + + +class SingleValueResponseMonitorBatchHistoryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorBatchHistoryDto + + +class SingleValueResponseMonitorDriftDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDriftDto class SingleValueResponseResourceGroupDto(BaseModel): @@ -13603,11 +15350,26 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto +class SingleValueResponseRevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RevisionDiffDto + + +class SingleValueResponseRunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunDiffDto + + class SingleValueResponseRunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: RunDto +class SingleValueResponseSecretDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SecretDto + + class SingleValueResponseServiceDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceDetailDto @@ -13646,9 +15408,9 @@ class TableValueResultResourceGroupDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRunDto(BaseModel): +class TableValueResultSecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RunDto] + data: list[SecretDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -13788,3 +15550,737 @@ class CursorPageRunDto(BaseModel): alias="hasMore", description="Whether more results exist beyond this page" ), ] + + +class DefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + definition: DefinitionDto + heads: Annotated[ + list[DefinitionHeadDto], Field(description="Active Heads per environment") + ] + + +class IncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + rule_type: Annotated[ + str | None, + Field( + alias="ruleType", + description="Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", + ), + ] = None + rule_index: Annotated[ + int | None, + Field( + alias="ruleIndex", + description="0-based index into the policy trigger_rules array; null when unknown", + ), + ] = None + count: Annotated[ + int | None, + Field( + description="Observed failing_streak or failures_in_window from forensics; null when unavailable" + ), + ] = None + threshold: Annotated[ + int | None, + Field( + description="Rule required count or threshold_ms from forensics; null when unavailable" + ), + ] = None + last_error: Annotated[ + str | None, + Field( + alias="lastError", + description="failure_reason from the triggering check result; null when unavailable", + ), + ] = None + first_failed_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="firstFailedCheckAt", + description="Earliest failing check timestamp in the confirm window when computable; null otherwise", + ), + ] = None + triggering_run: Annotated[RunDto | None, Field(alias="triggeringRun")] = None + source: Annotated[ + str, + Field( + description="Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", + min_length=1, + ), + ] + + +class MonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regional_display_health: Annotated[ + str | None, + Field( + alias="regionalDisplayHealth", + description="Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + ), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Cycle used for the regional presentation", + ), + ] = None + regions: Annotated[ + list[Region], + Field(description="Latest health-voting execution for each configured region"), + ] + last_failure: Annotated[RunDto | None, Field(alias="lastFailure")] = None + failing_cycle_count: Annotated[ + int | None, + Field( + alias="failingCycleCount", + description="Failing cycles since evaluation changed; null outside retained history", + ), + ] = None + + +class MonitorSecretRequestsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + environment: EnvironmentDto + requests: Annotated[ + list[SecretRequestDto], + Field(description="Secret keys this monitor requires and their resolve state"), + ] + undemanded: Annotated[ + list[SecretRequestDto] | None, + Field(description="Keys retained outside the selected revision scanned demand"), + ] = None + + +class MonitorTriageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + last_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastCheckAt", description="When the latest completed check finished" + ), + ] = None + latest_run: Annotated[RunDto | None, Field(alias="latestRun")] = None + latest_health_run: Annotated[RunDto | None, Field(alias="latestHealthRun")] = None + incident: IncidentDto | None = None + paused_by: Annotated[UserDto | None, Field(alias="pausedBy")] = None + flakiness: Flakiness | None = None + restore_blockers: Annotated[ + list[str], + Field( + alias="restoreBlockers", + description="Reasons this trashed monitor cannot currently be restored", + ), + ] + deleted_bindings: Annotated[ + list[RestorableBinding], + Field( + alias="deletedBindings", + description="Status-page bindings retained for restoration", + ), + ] + + +class SingleValueResponseDefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DefinitionDetailDto + + +class SingleValueResponseIncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentTriggerDto + + +class SingleValueResponseMonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorRegionalHealthDto + + +class SingleValueResponseMonitorSecretRequestsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorSecretRequestsDto + + +class IncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + incident: IncidentDto + updates: list[IncidentUpdateDto] + status_page_incidents: Annotated[ + list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + ] = None + trigger: IncidentTriggerDto | None = None + + +class MonitorDto(BaseModel): + """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" + + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique monitor identifier")] + organization_id: Annotated[ + int, + Field( + alias="organizationId", description="Organization this monitor belongs to" + ), + ] + name: Annotated[ + str, Field(description="Human-readable name for this monitor", min_length=1) + ] + type: str + config: ( + DnsMonitorConfig + | HeartbeatMonitorConfig + | HttpMonitorConfig + | IcmpMonitorConfig + | McpServerMonitorConfig + | ScriptMonitorConfig + | TcpMonitorConfig + ) + frequency_seconds: Annotated[ + int, + Field( + alias="frequencySeconds", + description="Check frequency in seconds (30–86400)", + ), + ] + enabled: Annotated[bool, Field(description="Whether the monitor is active")] + regions: Annotated[ + list[str], Field(description="Probe regions where checks are executed") + ] + managed_by: Annotated[ + str, + Field( + alias="managedBy", + description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", + ), + ] + owner_enforced: Annotated[ + bool, + Field( + alias="ownerEnforced", + description="Whether only the managedBy tool may change this monitor's configuration", + ), + ] + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the monitor was created"), + ] + updated_at: Annotated[ + AwareDatetime, + Field( + alias="updatedAt", description="Timestamp when the monitor was last updated" + ), + ] + assertions: Annotated[ + list[MonitorAssertionDto] | None, + Field( + description="Assertions evaluated against each check result; null on list responses" + ), + ] = None + tags: Annotated[ + list[TagDto] | None, Field(description="Tags applied to this monitor") + ] = None + ping_url: Annotated[ + str | None, + Field( + alias="pingUrl", + description="Heartbeat ping URL; populated for HEARTBEAT monitors only", + ), + ] = None + environment: Summary | None = None + auth: MonitorAuthConfig | None = None + incident_policy: Annotated[ + IncidentPolicyDto | None, Field(alias="incidentPolicy") + ] = None + alert_channel_ids: Annotated[ + list[UUID] | None, + Field( + alias="alertChannelIds", + description="Alert channel IDs linked to this monitor; populated on single-monitor responses", + ), + ] = None + bound_status_page_components: Annotated[ + list[StatusPageBoundComponentDto] | None, + Field( + alias="boundStatusPageComponents", + description="Status-page components that represent this monitor; omitted when none", + ), + ] = None + current_status: Annotated[ + str | None, + Field( + alias="currentStatus", + description="Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", + ), + ] = None + display_health: Annotated[ + str | None, + Field( + alias="displayHealth", + description="List and header chip health; not currentStatus and not evaluation state", + ), + ] = None + binding_readiness: Annotated[ + str | None, + Field( + alias="bindingReadiness", + description="Secret binding state: ready, blocked, or not_applicable", + ), + ] = None + needs_attention: Annotated[ + bool | None, + Field( + alias="needsAttention", + description="True when the monitor needs operator attention", + ), + ] = None + open_incident: Annotated[ + UUID | None, + Field(alias="openIncident", description="Open confirmed incident id"), + ] = None + last_run_at: Annotated[ + AwareDatetime | None, + Field(alias="lastRunAt", description="When the latest code run was enqueued"), + ] = None + last_run_id: Annotated[ + UUID | None, Field(alias="lastRunId", description="Latest code run id") + ] = None + resumes_at: Annotated[ + AwareDatetime | None, + Field(alias="resumesAt", description="When a capped monitor resumes"), + ] = None + capped: MonitorCappedDto | None = None + missing_keys: Annotated[ + list[str] | None, + Field( + alias="missingKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + blocked_keys: Annotated[ + list[str] | None, + Field( + alias="blockedKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + owner: MonitorOwnerDto | None = None + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + ), + ] = None + flaky_since: Annotated[ + AwareDatetime | None, + Field( + alias="flakySince", + description="When the first retry-passed cycle in the last 7 days finished", + ), + ] = None + flaky_severity: Annotated[ + str | None, + Field( + alias="flakySeverity", + description="How flaky the monitor is: LOW, MEDIUM, or HIGH", + ), + ] = None + last_check_outcome: Annotated[ + str | None, + Field( + alias="lastCheckOutcome", + description="Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + ), + ] = None + last_check_region: Annotated[ + str | None, + Field(alias="lastCheckRegion", description="Region of the most recent check"), + ] = None + last_failure_summary: Annotated[ + str | None, + Field( + alias="lastFailureSummary", + description="Why the latest failing region failed", + ), + ] = None + last_state_change_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastStateChangeAt", + description="When the monitor last changed state: paused, evaluation change, or incident open or resolve", + ), + ] = None + region_health: Annotated[ + list[MonitorRegionHealthDto] | None, + Field( + alias="regionHealth", + description="Latest verdict per region the monitor runs from; null while paused", + ), + ] = None + definition_id: Annotated[ + UUID | None, + Field( + alias="definitionId", + description="Definition id for a browser or multi-step monitor. Null on probe monitors", + ), + ] = None + capture_policy: Annotated[CapturePolicy | None, Field(alias="capturePolicy")] = None + secret_keys: Annotated[ + list[str] | None, + Field( + alias="secretKeys", + description="Explicit attached secret keys; null uses scanned demand", + ), + ] = None + fast_retry_max_attempts: Annotated[ + int | None, + Field( + alias="fastRetryMaxAttempts", + description="Fast-retry max attempts; null/0 = off", + ), + ] = None + run_parallel: Annotated[ + bool | None, + Field( + alias="runParallel", + description="When multiple locations are set, run all of them each interval. False rotates one location per interval", + ), + ] = None + muted: Annotated[bool, Field(description="Whether alert delivery is muted")] + muted_until: Annotated[ + AwareDatetime | None, + Field( + alias="mutedUntil", + description="Mute expiry; null means indefinite while muted", + ), + ] = None + mute_reason: Annotated[ + str | None, Field(alias="muteReason", description="Optional mute reason") + ] = None + paused_at: Annotated[ + AwareDatetime | None, + Field(alias="pausedAt", description="When the monitor was paused"), + ] = None + pause_reason: Annotated[ + str | None, Field(alias="pauseReason", description="Optional pause reason") + ] = None + pause_expires_at: Annotated[ + AwareDatetime | None, Field(alias="pauseExpiresAt", description="Pause expiry") + ] = None + quarantine_owner_id: Annotated[ + str | None, + Field(alias="quarantineOwnerId", description="Quarantine person owner id"), + ] = None + quarantine_until: Annotated[ + AwareDatetime | None, + Field( + alias="quarantineUntil", + description="Quarantine expiry; non-null means quarantined", + ), + ] = None + quarantine_reason: Annotated[ + str | None, Field(alias="quarantineReason", description="Quarantine reason") + ] = None + usage_projection: Annotated[ + MonitorUsageProjectionDto | None, Field(alias="usageProjection") + ] = None + live_revision_id: Annotated[ + UUID | None, + Field(alias="liveRevisionId", description="Revision scheduled runs execute"), + ] = None + live_revision_digest: Annotated[ + str | None, + Field( + alias="liveRevisionDigest", + description="Closure digest of the revision scheduled runs execute", + ), + ] = None + triage: MonitorTriageDto | None = None + deleted_at: Annotated[ + AwareDatetime | None, + Field(alias="deletedAt", description="When the monitor was moved to Trash"), + ] = None + deleted_by: Annotated[UserDto | None, Field(alias="deletedBy")] = None + created_via: Annotated[ + str | None, + Field( + alias="createdVia", description="Client that originally created the monitor" + ), + ] = None + + +class MonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique version record identifier")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this version belongs to") + ] + version: Annotated[ + int, Field(description="Monotonically increasing version number") + ] + snapshot: MonitorDto + changed_by_id: Annotated[ + int | None, + Field( + alias="changedById", + description="User ID who made the change; null for automated changes", + ), + ] = None + changed_via: Annotated[ + str, + Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), + ] + change_summary: Annotated[ + str | None, + Field( + alias="changeSummary", + description="Human-readable description of what changed", + ), + ] = None + created_at: Annotated[ + AwareDatetime, + Field( + alias="createdAt", description="Timestamp when this version was recorded" + ), + ] + + +class RollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + target: RevisionDto + current: DefinitionHeadDto | None = None + affected_monitors: Annotated[ + list[MonitorDto], + Field( + alias="affectedMonitors", + description="Monitors sharing this definition and environment", + ), + ] + + +class RunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + revision: RevisionDto + activated_at: Annotated[ + AwareDatetime, + Field( + alias="activatedAt", + description="Latest recorded activation of this revision in the monitor environment", + ), + ] + + +class RunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + UUID | None, + Field( + description="Persisted skipped row identity; absent for a plan-disabled interval" + ), + ] = None + kind: Annotated[ + str, + Field( + description="not_run for recorded ticks; plan_disabled for a current plan pause" + ), + ] + monitor: MonitorDto | None = None + reason: Annotated[ + str, Field(description="Cause: quota, blocked, spend_cap, or plan_limit") + ] + region: Annotated[ + str | None, + Field(description="Region; absent when ticks cover multiple regions"), + ] = None + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Beginning of the recorded interval"), + ] + to: Annotated[ + AwareDatetime, + Field( + description="End of the interval; current plan pauses end at the query snapshot" + ), + ] + count: Annotated[ + int | None, + Field( + description="Recorded ticks in the whole folded row; absent for a plan pause" + ), + ] = None + missing_keys: Annotated[ + list[str], + Field(alias="missingKeys", description="Secret keys recorded as missing"), + ] + environment: Annotated[ + str | None, Field(description="Environment recorded when ticks were skipped") + ] = None + + +class SecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitors: Annotated[ + list[MonitorDto], Field(description="Monitors that reference this secret") + ] + + +class SingleValueResponseIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentDetailDto + + +class SingleValueResponseMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDto + + +class SingleValueResponseMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorVersionDto + + +class SingleValueResponseRollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RollbackPreviewDto + + +class SingleValueResponseSecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SecretUsageDto + + +class TableValueResultMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class TableValueResultMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorVersionDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class CursorPageRunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunRevisionMarkerDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class CursorPageRunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunSkippedEntryDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class Item(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + bucket: Annotated[ + str, Field(description="Display bucket: failing, flaky, or healthy") + ] + worst_region: Annotated[ + str | None, + Field( + alias="worstRegion", + description="Region deciding this cycle display verdict", + ), + ] = None + streak_started_at: Annotated[ + AwareDatetime | None, + Field( + alias="streakStartedAt", + description="Earliest recorded failure after the last retained passing group", + ), + ] = None + streak_truncated: Annotated[ + bool, + Field( + alias="streakTruncated", + description="True when retention prevents proving the failure streak start", + ), + ] + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Current seven-day fraction of retry-saved cycles", + ), + ] = None + + +class RunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + failing_count: Annotated[ + int, + Field( + alias="failingCount", + description="Monitors whose latest window group is complete with a failed or timed-out region", + ), + ] + flaky_count: Annotated[ + int, + Field( + alias="flakyCount", + description="Passing monitors with current seven-day flakiness", + ), + ] + healthy_count: Annotated[ + int, + Field( + alias="healthyCount", + description="Monitors whose latest window group passed without current flakiness", + ), + ] + unclassified_count: Annotated[ + int, + Field( + alias="unclassifiedCount", + description="Monitors whose latest voting group is pending or has no passing/failing verdict", + ), + ] + monitors: Annotated[ + list[Item], + Field( + description="At most 100 monitor chips; counts cover the complete population" + ), + ] + + +class SingleValueResponseRunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunMonitorStripDto