diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 7ba8f4e..42660fb 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,39 +3938,32 @@ } } }, - "/api/v1/email/{localpart}/wait": { - "post": { + "/api/v1/categories": { + "get": { "tags": [ - "Email Testing" + "Status Data" ], - "summary": "Wait for the oldest matching captured email at a local-part", - "operationId": "waitForEmailByLocalpart", + "summary": "List categories with service counts", + "operationId": "listCategories", "parameters": [ { - "name": "localpart", - "in": "path", - "required": true, + "name": "publishedOnly", + "in": "query", + "description": "Count only published services (curated public pSEO set); default false", + "required": false, "schema": { - "type": "string" + "type": "boolean", + "default": false } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WaitEmailMessageRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageResponse" + "$ref": "#/components/schemas/TableValueResultCategoryDto" } } } @@ -3554,6 +3988,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 +4018,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 +4028,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,39 +4081,21 @@ } } }, - "/api/v1/email/domains": { + "/api/v1/dashboard/overview": { "get": { "tags": [ - "Email Testing" - ], - "summary": "List email testing domains for the workspace", - "operationId": "listEmailDomains", - "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" - } - } + "Dashboard" ], + "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", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEmailDomainDto" + "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" } } } @@ -3684,6 +4120,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 +4160,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +4211,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/definitions": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Create an assigned or custom email testing domain", - "operationId": "createEmailDomain", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEmailDomainRequest" - } - } - } - }, + "summary": "List definitions", + "operationId": "list_23", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultDefinitionDto" } } } @@ -3792,6 +4251,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 +4291,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,20 +4344,21 @@ } } }, - "/api/v1/email/domains/{domain}": { + "/api/v1/definitions/{id}": { "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Get an email testing domain including derived DNS records", - "operationId": "getEmailDomain", + "summary": "Get definition with Heads", + "operationId": "get_14", "parameters": [ { - "name": "domain", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -3878,7 +4368,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" } } } @@ -3903,6 +4393,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 +4433,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +4484,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/definitions/{id}/revisions": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", - "operationId": "deleteEmailDomain", + "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" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRevisionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4005,6 +4535,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 +4575,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +4626,23 @@ } } } - }, - "patch": { + } + }, + "/api/v1/deploy/lock": { + "get": { "tags": [ - "Email Testing" - ], - "summary": "Patch an email testing domain", - "operationId": "updateEmailDomain", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Deploy Lock" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEmailDomainRequest" - } - } - }, - "required": true - }, + "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/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" } } } @@ -4124,6 +4667,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 +4707,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4185,36 +4758,34 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/inboxes/{inbox}": { - "delete": { + }, + "post": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Delete every message for one local-part", - "operationId": "deleteEmailInbox", - "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": "inbox", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4236,6 +4807,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 +4847,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,81 +4900,41 @@ } } }, - "/api/v1/email/domains/{domain}/messages": { - "get": { + "/api/v1/deploy/lock/{lockId}": { + "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Super-inbox: list messages newest-first", - "operationId": "listEmailMessages", + "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", + "name": "lockId", "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": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageEmailMessageDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4382,8 +4943,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -4422,6 +4983,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,45 +5036,43 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}": { - "get": { + "/api/v1/deploy/lock/force": { + "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Get one captured message", - "operationId": "getEmailMessage", + "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/SingleValueResponseEmailMessageDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -4502,8 +5081,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -4542,6 +5121,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,35 +5172,44 @@ } } } - }, - "delete": { + } + }, + "/api/v1/email/{localpart}/wait": { + "post": { "tags": [ "Email Testing" ], - "summary": "Delete one captured message", - "operationId": "deleteEmailMessage", + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WaitEmailMessageResponse" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4623,6 +5231,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": { @@ -4643,6 +5261,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": { @@ -4653,6 +5281,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,38 +5334,29 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { + "/api/v1/email/domains": { "get": { "tags": [ "Email Testing" ], - "summary": "Signed URL for one attachment", - "operationId": "getEmailMessageAttachment", + "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": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "attId", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -4727,7 +5366,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/TableValueResultEmailDomainDto" } } } @@ -4752,6 +5391,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 +5431,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +5482,29 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/links": { - "get": { + }, + "post": { "tags": [ "Email Testing" ], - "summary": "Extracted links on the message", - "operationId": "listEmailMessageLinks", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "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": { - "$ref": "#/components/schemas/TableValueResultInboundEmailLink" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -4872,6 +5529,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 +5569,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +5622,13 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { + "/api/v1/email/domains/{domain}": { "get": { "tags": [ "Email Testing" ], - "summary": "Extracted one-time codes on the message", - "operationId": "listEmailMessageOtp", + "summary": "Get an email testing domain including derived DNS records", + "operationId": "getEmailDomain", "parameters": [ { "name": "domain", @@ -4950,15 +5637,6 @@ "schema": { "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -4967,7 +5645,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInboundOtpCode" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -4992,6 +5670,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": { @@ -5022,6 +5710,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5053,15 +5761,13 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { - "get": { + }, + "delete": { "tags": [ "Email Testing" ], - "summary": "Signed URL for the raw RFC822 object", - "operationId": "getEmailMessageRaw", + "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", + "operationId": "deleteEmailDomain", "parameters": [ { "name": "domain", @@ -5070,27 +5776,11 @@ "schema": { "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -5112,6 +5802,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": { @@ -5142,6 +5842,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5173,15 +5893,13 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/source": { - "get": { + }, + "patch": { "tags": [ "Email Testing" ], - "summary": "Original message source as text", - "operationId": "getEmailMessageSource", + "summary": "Patch an email testing domain", + "operationId": "updateEmailDomain", "parameters": [ { "name": "domain", @@ -5190,24 +5908,25 @@ "schema": { "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEmailDomainRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailMessageSourceDto" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -5232,6 +5951,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": { @@ -5262,6 +5991,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +6044,13 @@ } } }, - "/api/v1/email/domains/{domain}/messages/inject": { - "post": { + "/api/v1/email/domains/{domain}/inboxes/{inbox}": { + "delete": { "tags": [ "Email Testing" ], - "summary": "Inject a JSON message onto the same durable path as SMTP", - "operationId": "injectEmailMessage", + "summary": "Delete every message for one local-part", + "operationId": "deleteEmailInbox", "parameters": [ { "name": "domain", @@ -5310,31 +6059,32 @@ "schema": { "type": "string" } + }, + { + "name": "inbox", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InjectEmailMessageRequest" - } - } - }, - "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/SingleValueResponseInjectEmailMessageResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5343,8 +6093,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5383,6 +6133,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5416,13 +6186,13 @@ } } }, - "/api/v1/email/domains/{domain}/verify": { - "post": { + "/api/v1/email/domains/{domain}/messages": { + "get": { "tags": [ "Email Testing" ], - "summary": "Re-check TXT and MX for a custom domain", - "operationId": "verifyEmailDomain", + "summary": "Super-inbox: list messages newest-first", + "operationId": "listEmailMessages", "parameters": [ { "name": "domain", @@ -5431,6 +6201,51 @@ "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": { @@ -5439,7 +6254,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/CursorPageEmailMessageDto" } } } @@ -5464,6 +6279,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 +6319,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6372,29 @@ } } }, - "/api/v1/email/domains/activity": { + "/api/v1/email/domains/{domain}/messages/{messageId}": { "get": { "tags": [ "Email Testing" ], - "summary": "Last-24h received-message activity for email domains", - "operationId": "listEmailDomainActivity", + "summary": "Get one captured message", + "operationId": "getEmailMessage", "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" + } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -5555,7 +6404,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" + "$ref": "#/components/schemas/SingleValueResponseEmailMessageDto" } } } @@ -5580,6 +6429,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 +6469,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6520,48 @@ } } } - } - }, - "/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 one captured message", + "operationId": "deleteEmailMessage", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" } }, - "required": true - }, + { + "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/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 +6570,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 +6600,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 +6610,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": { @@ -5764,20 +6663,48 @@ } } }, - "/api/v1/environments": { + "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { "get": { "tags": [ - "Environments" + "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" + } + } ], - "summary": "List environments", - "operationId": "list_12", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" } } } @@ -5802,6 +6729,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 +6769,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +6820,41 @@ } } } - }, - "post": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/links": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Create environment", - "operationId": "create_13", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEnvironmentRequest" - } + "summary": "Extracted links on the message", + "operationId": "listEmailMessageLinks", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/TableValueResultInboundEmailLink" } } } @@ -5911,6 +6879,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": { @@ -5941,6 +6919,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6972,30 @@ } } }, - "/api/v1/environments/{slug}": { + "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Get environment by slug", - "operationId": "get_7", + "summary": "Extracted one-time codes on the message", + "operationId": "listEmailMessageOtp", "parameters": [ { - "name": "slug", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -5997,7 +7004,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/TableValueResultInboundOtpCode" } } } @@ -6022,6 +7029,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,8 +7069,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": { @@ -6062,7 +7079,27 @@ } } }, - "502": { + "429": { + "description": "Too many requests — retry 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": { @@ -6083,40 +7120,41 @@ } } } - }, - "put": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Update environment", - "operationId": "update_13", + "summary": "Signed URL for the raw RFC822 object", + "operationId": "getEmailMessageRaw", "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/SingleValueResponseSignedDownload" } } } @@ -6141,6 +7179,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 +7219,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6202,26 +7270,44 @@ } } } - }, - "delete": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/source": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Delete environment", - "operationId": "delete_9", + "summary": "Original message source as text", + "operationId": "getEmailMessageSource", "parameters": [ { - "name": "slug", + "name": "domain", "in": "path", "required": true, "schema": { "type": "string" } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseEmailMessageSourceDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -6243,6 +7329,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 +7369,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +7422,40 @@ } } }, - "/api/v1/forensics/incidents/{id}/timeline": { - "get": { + "/api/v1/email/domains/{domain}/messages/inject": { + "post": { "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": "Inject a JSON message onto the same durable path as SMTP", + "operationId": "injectEmailMessage", "parameters": [ { - "name": "id", + "name": "domain", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "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/SingleValueResponseIncidentTimelineDto" + "$ref": "#/components/schemas/SingleValueResponseInjectEmailMessageResponse" } } } @@ -6356,6 +7480,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 +7520,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,73 +7573,21 @@ } } }, - "/api/v1/forensics/monitors/{id}/rule-evaluations": { - "get": { + "/api/v1/email/domains/{domain}/verify": { + "post": { "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": "Re-check TXT and MX for a custom domain", + "operationId": "verifyEmailDomain", "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", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -6494,7 +7596,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -6519,6 +7621,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": { @@ -6549,6 +7661,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +7714,25 @@ } } }, - "/api/v1/forensics/monitors/{id}/transitions": { + "/api/v1/email/domains/activity": { "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": "Last-24h received-message activity for email domains", + "operationId": "listEmailDomainActivity", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", + "name": "domainIds", "in": "query", + "description": "Comma-separated domain ids (1–100)", "required": false, "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -6633,7 +7742,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" + "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" } } } @@ -6658,6 +7767,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 +7807,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +7860,30 @@ } } }, - "/api/v1/forensics/policy-snapshots/{hashHex}": { - "get": { + "/api/v1/email/wait": { + "post": { "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", - "parameters": [ - { - "name": "hashHex", - "in": "path", - "required": true, - "schema": { - "type": "string" + "summary": "Wait for the oldest matching captured email at a full address", + "operationId": "waitForEmail", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaitEmailMessageRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" + "$ref": "#/components/schemas/WaitEmailMessageResponse" } } } @@ -6770,6 +7908,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": { @@ -6790,6 +7938,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": { @@ -6800,6 +7958,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +8011,20 @@ } } }, - "/api/v1/forensics/traces/{checkId}": { + "/api/v1/entitlements": { "get": { "tags": [ - "Forensics" - ], - "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": "checkId", - "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/SingleValueResponseCheckTraceDto" + "$ref": "#/components/schemas/SingleValueResponseEntitlementResponse" } } } @@ -6883,6 +8049,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 +8089,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +8142,20 @@ } } }, - "/api/v1/heartbeat/{token}": { + "/api/v1/environments": { "get": { "tags": [ - "Heartbeat" - ], - "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": "token", - "in": "path", - "description": "Ping endpoint token for the heartbeat monitor", - "required": true, - "schema": { - "type": "string" - } - } + "Environments" ], + "summary": "List environments", + "operationId": "list_13", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/HeartbeatPingResponse" + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" } } } @@ -6996,6 +8180,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,8 +8220,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": { @@ -7036,8 +8230,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": { @@ -7046,8 +8240,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -7055,53 +8249,52 @@ } } } - } - } - }, - "post": { - "tags": [ - "Heartbeat" - ], - "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": "token", - "in": "path", - "description": "Ping endpoint token for the heartbeat monitor", - "required": true, - "schema": { - "type": "string" + }, + "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": [ + "Environments" ], + "summary": "Create environment", + "operationId": "create_14", "requestBody": { "content": { "application/json": { "schema": { - "type": "string" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - }, - "*/*": { - "schema": { - "type": "string" + "$ref": "#/components/schemas/CreateEnvironmentRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/HeartbeatPingResponse" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7126,6 +8319,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 +8359,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +8412,20 @@ } } }, - "/api/v1/incidents": { + "/api/v1/environments/{slug}": { "get": { "tags": [ - "Incidents" + "Environments" ], - "summary": "List incidents for the authenticated org", - "operationId": "list_11", + "summary": "Get environment by slug", + "operationId": "get_7", "parameters": [ { - "name": "params", - "in": "query", + "name": "slug", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/IncidentFilterParams" + "type": "string" } } ], @@ -7212,7 +8435,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7237,6 +8460,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 +8500,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7299,29 +8552,39 @@ } } }, - "post": { + "put": { "tags": [ - "Incidents" + "Environments" + ], + "summary": "Update environment", + "operationId": "update_13", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Create a manual incident", - "operationId": "create_12", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateManualIncidentRequest" + "$ref": "#/components/schemas/UpdateEnvironmentRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7346,6 +8609,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": { @@ -7376,6 +8649,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7407,40 +8700,39 @@ } } } - } - }, - "/api/v1/incidents/{id}": { - "get": { + }, + "delete": { "tags": [ - "Incidents" + "Environments" ], - "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", + "summary": "Delete environment", + "operationId": "delete_9", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "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": { @@ -7449,8 +8741,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -7489,6 +8781,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +8832,16 @@ } } } - }, - "patch": { + } + }, + "/api/v1/forensics/incidents/{id}/timeline": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Update incident title and/or severity", - "operationId": "update_15", + "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", @@ -7538,23 +8853,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" } } } @@ -7579,6 +8884,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 +8924,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7642,14 +8977,14 @@ } } }, - "/api/v1/incidents/{id}/acknowledge": { - "post": { + "/api/v1/forensics/monitors/{id}/rule-evaluations": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "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", + "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", @@ -7659,6 +8994,56 @@ "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", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -7667,7 +9052,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" + "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" } } } @@ -7692,6 +9077,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 +9117,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +9170,14 @@ } } }, - "/api/v1/incidents/{id}/events": { + "/api/v1/forensics/monitors/{id}/transitions": { "get": { "tags": [ - "Incidents" + "Forensics" ], - "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": "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": "id", @@ -7774,21 +9189,29 @@ } }, { - "name": "cursor", + "name": "from", "in": "query", "required": false, "schema": { - "type": "string" + "type": "string", + "format": "date-time" } }, { - "name": "limit", + "name": "to", "in": "query", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "string", + "format": "date-time" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -7798,7 +9221,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" + "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" } } } @@ -7823,6 +9246,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 +9286,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7886,42 +9339,21 @@ } } }, - "/api/v1/incidents/{id}/related": { + "/api/v1/forensics/policy-snapshots/{hashHex}": { "get": { "tags": [ - "Incidents" + "Forensics" ], - "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": "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": "id", + "name": "hashHex", "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" } } ], @@ -7931,7 +9363,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RelatedIncidentsResponse" + "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" } } } @@ -7956,6 +9388,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 +9428,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8019,16 +9481,17 @@ } } }, - "/api/v1/incidents/{id}/resolve": { - "post": { + "/api/v1/forensics/traces/{checkId}": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Resolve an incident", - "operationId": "resolve", + "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": "id", + "name": "checkId", "in": "path", "required": true, "schema": { @@ -8037,22 +9500,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseCheckTraceDto" } } } @@ -8077,6 +9531,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": { @@ -8107,6 +9571,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +9624,22 @@ } } }, - "/api/v1/incidents/{id}/trigger": { + "/api/v1/heartbeat/{token}": { "get": { "tags": [ - "Incidents" + "Heartbeat" ], - "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": "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": "id", + "name": "token", "in": "path", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -8165,7 +9649,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8190,6 +9674,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 +9714,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8251,23 +9765,22 @@ } } } - } - }, - "/api/v1/incidents/{id}/updates": { + }, "post": { "tags": [ - "Incidents" + "Heartbeat" ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", + "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": "id", + "name": "token", "in": "path", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -8275,19 +9788,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" + "type": "string" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + }, + "*/*": { + "schema": { + "type": "string" } } - }, - "required": true + } }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8312,6 +9834,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 +9874,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +9927,20 @@ } } }, - "/api/v1/ingest/{publicToken}": { + "/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", + "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" } } ], @@ -8400,8 +9950,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/TableValueResultIncidentDto" } } } @@ -8426,6 +9975,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 +10015,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8488,32 +10067,29 @@ } } }, - "put": { + "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_2", - "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" } } } @@ -8538,6 +10114,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 +10154,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10205,24 @@ } } } - }, - "post": { + } + }, + "/api/v1/incidents/{id}": { + "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_1", + "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": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -8624,8 +10232,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -8650,6 +10257,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,6 +10297,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8712,32 +10349,40 @@ } } }, - "delete": { + "patch": { "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_3", + "summary": "Update incident title and/or severity", + "operationId": "update_16", "parameters": [ { - "name": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -8762,6 +10407,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 +10447,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8823,22 +10498,24 @@ } } } - }, - "options": { + } + }, + "/api/v1/incidents/{id}/acknowledge": { + "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_6", + "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": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -8848,8 +10525,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" } } } @@ -8874,6 +10550,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 +10590,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,23 +10641,43 @@ } } } - }, - "head": { + } + }, + "/api/v1/incidents/{id}/events": { + "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 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": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "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": { @@ -8960,8 +10686,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" } } } @@ -8986,6 +10711,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 +10751,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9047,22 +10802,44 @@ } } } - }, - "patch": { + } + }, + "/api/v1/incidents/{id}/related": { + "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_4", + "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": "publicToken", + "name": "id", "in": "path", - "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string" + "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 } } ], @@ -9072,8 +10849,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/RelatedIncidentsResponse" } } } @@ -9098,6 +10874,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 +10914,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10967,40 @@ } } }, - "/api/v1/integrations": { - "get": { + "/api/v1/incidents/{id}/resolve": { + "post": { "tags": [ - "Integrations" + "Incidents" ], - "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", + "summary": "Resolve an incident", + "operationId": "resolve", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResolveIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9200,6 +11025,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 +11065,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9263,21 +11118,50 @@ } } }, - "/api/v1/integrations/voice-languages": { + "/api/v1/incidents/{id}/runs": { "get": { "tags": [ - "Integrations" + "Incidents" + ], + "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": "id", + "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": 25 + } + } ], - "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/TableValueResultVoiceLanguageDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -9302,6 +11186,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 +11226,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11279,32 @@ } } }, - "/api/v1/invites": { + "/api/v1/incidents/{id}/trigger": { "get": { "tags": [ - "Invites" + "Incidents" + ], + "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", + "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/SingleValueResponseIncidentTriggerDto" } } } @@ -9403,6 +11329,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 +11369,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,18 +11420,31 @@ } } } - }, + } + }, + "/api/v1/incidents/{id}/updates": { "post": { "tags": [ - "Invites" + "Incidents" + ], + "summary": "Add an update to an incident (optionally change status)", + "operationId": "addUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create invite", - "operationId": "create_11", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" + "$ref": "#/components/schemas/AddIncidentUpdateRequest" } } }, @@ -9487,7 +11456,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9512,6 +11481,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 +11521,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11574,22 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { - "post": { + "/api/v1/ingest/{publicToken}": { + "get": { "tags": [ - "Invites" + "Webhook Testing" ], - "summary": "Resend invite", - "operationId": "resend_1", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest", "parameters": [ { - "name": "inviteId", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], @@ -9599,7 +11599,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "type": "string", + "format": "byte" } } } @@ -9624,6 +11625,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": { @@ -9654,6 +11665,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9685,29 +11716,36 @@ } } } - } - }, - "/api/v1/invites/{inviteId}/revoke": { - "post": { + }, + "put": { "tags": [ - "Invites" + "Webhook Testing" ], - "summary": "Revoke invite", - "operationId": "revoke", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_2", "parameters": [ { - "name": "inviteId", + "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", @@ -9729,6 +11767,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,8 +11807,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": { @@ -9769,8 +11817,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": { @@ -9779,8 +11827,28 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "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": { @@ -9790,32 +11858,20 @@ } } } - } - }, - "/api/v1/maintenance-windows": { - "get": { + }, + "post": { "tags": [ - "Maintenance Windows" + "Webhook Testing" ], - "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": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_1", "parameters": [ { - "name": "monitorId", - "in": "query", - "description": "Filter by monitor UUID", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "filter", - "in": "query", - "description": "Filter by status: 'active' or 'upcoming'", - "required": false, + "name": "publicToken", + "in": "path", + "description": "Public token that identifies the inbox", + "required": true, "schema": { "type": "string" } @@ -9827,7 +11883,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -9852,6 +11909,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": { @@ -9882,6 +11949,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9914,30 +12001,32 @@ } } }, - "post": { + "delete": { "tags": [ - "Maintenance Windows" + "Webhook Testing" ], - "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" - } + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_3", + "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/SingleValueResponseMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -9962,6 +12051,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": { @@ -9992,6 +12091,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10023,23 +12142,22 @@ } } } - } - }, - "/api/v1/maintenance-windows/{id}": { - "get": { + }, + "options": { "tags": [ - "Maintenance Windows" + "Webhook Testing" ], - "summary": "Get a single maintenance window by ID", - "operationId": "getById_2", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_6", "parameters": [ { - "name": "id", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -10049,7 +12167,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -10074,6 +12193,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 +12233,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10136,40 +12285,32 @@ } } }, - "put": { + "head": { "tags": [ - "Maintenance Windows" + "Webhook Testing" ], - "summary": "Update a maintenance window", - "operationId": "update_12", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_5", "parameters": [ { - "name": "id", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -10194,6 +12335,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 +12375,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10256,26 +12427,35 @@ } } }, - "delete": { + "patch": { "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_4", "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 +12477,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 +12517,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10360,30 +12570,21 @@ } } }, - "/api/v1/members": { + "/api/v1/integrations": { "get": { "tags": [ - "Members" - ], - "summary": "List organization members", - "operationId": "list_20", - "parameters": [ - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } + "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/TableValueResultMemberDto" + "$ref": "#/components/schemas/TableValueResultIntegrationDto" } } } @@ -10408,6 +12609,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 +12649,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10471,27 +12702,24 @@ } } }, - "/api/v1/members/{userId}": { - "delete": { + "/api/v1/integrations/voice-languages": { + "get": { "tags": [ - "Members" - ], - "summary": "Remove member from organization", - "operationId": "remove_2", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } + "Integrations" ], + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10513,6 +12741,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 +12781,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10576,38 +12834,24 @@ } } }, - "/api/v1/members/{userId}/role": { - "put": { + "/api/v1/invites": { + "get": { "tags": [ - "Members" - ], - "summary": "Change member role", - "operationId": "changeRole", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } + "Invites" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" + "summary": "List invites", + "operationId": "list_11", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultInviteDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -10628,6 +12872,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 +12912,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,39 +12963,33 @@ } } } - } - }, - "/api/v1/members/{userId}/status": { - "put": { + }, + "post": { "tags": [ - "Members" - ], - "summary": "Change member status", - "operationId": "changeStatus", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } + "Invites" ], + "summary": "Create invite", + "operationId": "create_12", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "$ref": "#/components/schemas/CreateInviteRequest" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseInviteDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10743,6 +13011,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 +13051,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10806,160 +13104,21 @@ } } }, - "/api/v1/monitors": { - "get": { + "/api/v1/invites/{inviteId}/resend": { + "post": { "tags": [ - "Monitors" + "Invites" ], - "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": "Resend invite", + "operationId": "resend_1", "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": "inviteId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32" } } ], @@ -10969,7 +13128,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -10994,6 +13153,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 +13193,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11055,36 +13244,42 @@ } } } - }, + } + }, + "/api/v1/invites/{inviteId}/revoke": { "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "Revoke invite", + "operationId": "revoke", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "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": { @@ -11093,8 +13288,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -11133,6 +13328,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +13381,33 @@ } } }, - "/api/v1/monitors/{id}": { + "/api/v1/maintenance-windows": { "get": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Get a single monitor by id", - "operationId": "get_6", + "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" } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -11190,7 +13416,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" } } } @@ -11215,6 +13441,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 +13481,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11277,40 +13533,30 @@ } } }, - "put": { + "post": { "tags": [ - "Monitors" - ], - "summary": "Update a monitor", - "operationId": "update_11", - "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/UpdateMonitorRequest" + "$ref": "#/components/schemas/CreateMaintenanceWindowRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11335,38 +13581,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": { @@ -11375,52 +13591,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" - } - } - } - } - } - }, - "delete": { - "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" - } - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11429,8 +13601,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -11439,8 +13611,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": { @@ -11449,8 +13621,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -11459,8 +13631,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": { @@ -11502,13 +13674,13 @@ } } }, - "/api/v1/monitors/{id}/drift": { + "/api/v1/maintenance-windows/{id}": { "get": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "IaC-declared baseline vs live overlays", - "operationId": "drift", + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", "parameters": [ { "name": "id", @@ -11526,7 +13698,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11551,6 +13723,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 +13763,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11612,15 +13814,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/mute": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Mute alert delivery without flipping enabled", - "operationId": "mute", + "summary": "Update a maintenance window", + "operationId": "update_12", "parameters": [ { "name": "id", @@ -11636,10 +13836,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -11647,7 +13848,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11672,6 +13873,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 +13913,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11733,16 +13964,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/overview/steps": { - "get": { + }, + "delete": { "tags": [ - "Check Results" + "Maintenance Windows" ], - "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": "Delete a maintenance window", + "operationId": "delete_8", "parameters": [ { "name": "id", @@ -11752,36 +13980,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "window", - "in": "query", - "description": "Time window for step aggregates", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], "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 +14006,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 +14046,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +14099,30 @@ } } }, - "/api/v1/monitors/{id}/pause": { - "post": { + "/api/v1/members": { + "get": { "tags": [ - "Monitors" + "Members" ], - "summary": "Pause a monitor", - "operationId": "pause", + "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" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMemberDto" } } } @@ -11921,6 +14147,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 +14187,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11984,48 +14240,40 @@ } } }, - "/api/v1/monitors/{id}/publish": { - "post": { + "/api/v1/members/{userId}": { + "delete": { "tags": [ - "Monitor definitions" + "Members" ], - "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", + "summary": "Remove member from organization", + "operationId": "remove_2", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishRevisionRequest" - } - } - }, - "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": { @@ -12034,8 +14282,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12074,6 +14322,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +14375,21 @@ } } }, - "/api/v1/monitors/{id}/quarantine": { - "post": { + "/api/v1/members/{userId}/role": { + "put": { "tags": [ - "Monitors" + "Members" ], - "summary": "Quarantine a monitor", - "operationId": "quarantine", + "summary": "Change member role", + "operationId": "changeRole", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], @@ -12129,25 +14397,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QuarantineMonitorRequest" + "$ref": "#/components/schemas/ChangeRoleRequest" } } }, "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/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12156,8 +14427,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12196,6 +14467,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12229,35 +14520,38 @@ } } }, - "/api/v1/monitors/{id}/release-quarantine": { - "post": { + "/api/v1/members/{userId}/status": { + "put": { "tags": [ - "Monitors" + "Members" ], - "summary": "Release quarantine", - "operationId": "releaseQuarantine", + "summary": "Change member status", + "operationId": "changeStatus", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeStatusRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -12278,6 +14572,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 +14612,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12341,101 +14665,188 @@ } } }, - "/api/v1/monitors/{id}/results": { + "/api/v1/monitors": { "get": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "List raw check results", - "description": "Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.", - "operationId": "getResults", + "summary": "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": "from", + "name": "status", "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "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", - "format": "date-time" + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] } }, { - "name": "to", + "name": "types", "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", + "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", - "format": "date-time" + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] } }, { - "name": "cursor", + "name": "tags", "in": "query", - "description": "Opaque cursor from a previous response for pagination", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", "required": false, "schema": { "type": "string" } }, { - "name": "limit", + "name": "tag", "in": "query", - "description": "Maximum results per page (1–200)", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 + "type": "string" + } }, { - "name": "region", + "name": "search", "in": "query", - "description": "Filter by region (e.g. us-east)", + "description": "Case-insensitive name search", "required": false, "schema": { "type": "string" } }, { - "name": "passed", + "name": "environmentId", "in": "query", - "description": "Filter by pass/fail status", + "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": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } }, "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,22 +14861,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/CursorPageCheckResultDto" + "$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/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12480,6 +14901,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12511,59 +14952,40 @@ } } } - } - }, - "/api/v1/monitors/{id}/results/summary": { - "get": { + }, + "post": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", - "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" + } } }, - { - "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" - ] - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "Results summary", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid chartWindow parameter", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12578,22 +15000,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/SingleValueResponseResultSummaryDto" + "$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/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12608,6 +15040,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12641,13 +15093,13 @@ } } }, - "/api/v1/monitors/{id}/resume": { - "post": { + "/api/v1/monitors/{id}": { + "get": { "tags": [ "Monitors" ], - "summary": "Resume a paused monitor", - "operationId": "resume", + "summary": "Get a single monitor by id", + "operationId": "get_6", "parameters": [ { "name": "id", @@ -12690,6 +15142,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,8 +15182,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": { @@ -12730,8 +15192,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": { @@ -12740,8 +15202,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -12749,18 +15211,35 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/revisions": { - "get": { - "tags": [ - "Monitor definitions" + }, + "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": [ + "Monitors" ], - "summary": "List revisions published in this monitor's environment", - "description": "Omits drafts never published here. Page size default 25.", - "operationId": "listRevisions", + "summary": "Update a monitor", + "operationId": "update_11", "parameters": [ { "name": "id", @@ -12770,23 +15249,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -12811,6 +15292,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": { @@ -12841,6 +15332,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12872,16 +15383,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/revisions/{revisionId}/test": { - "post": { + }, + "delete": { "tags": [ - "Monitor definitions" + "Monitors" ], - "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": "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", @@ -12891,39 +15400,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "revisionId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } - } - } - }, "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 +15426,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 +15466,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +15519,13 @@ } } }, - "/api/v1/monitors/{id}/rollback": { - "post": { + "/api/v1/monitors/{id}/drift": { + "get": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "Roll back Head to a prior revision", - "description": "Same Head UPDATE as publish; stores reason on the Head.", - "operationId": "rollback", + "summary": "IaC-declared baseline vs live overlays", + "operationId": "drift", "parameters": [ { "name": "id", @@ -13024,23 +15537,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RollbackRevisionRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" } } } @@ -13065,6 +15568,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": { @@ -13095,6 +15608,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +15661,14 @@ } } }, - "/api/v1/monitors/{id}/rollback-preview": { + "/api/v1/monitors/{id}/history": { "get": { "tags": [ - "Monitor definitions" + "Monitor History" ], - "summary": "Preview rollback consequences for this environment", - "operationId": "rollbackPreview", + "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", @@ -13146,12 +15680,21 @@ } }, { - "name": "revisionId", + "name": "cursor", "in": "query", - "required": true, + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 } } ], @@ -13161,7 +15704,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" + "$ref": "#/components/schemas/CursorPageMonitorHistoryEntryDto" } } } @@ -13186,6 +15729,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 +15769,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13249,14 +15822,13 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { + "/api/v1/monitors/{id}/mute": { "post": { "tags": [ "Monitors" ], - "summary": "Rotate the ping token for a heartbeat monitor", - "description": "Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.", - "operationId": "rotateToken", + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", "parameters": [ { "name": "id", @@ -13268,6 +15840,15 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { "description": "OK", @@ -13299,6 +15880,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 +15920,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +15973,14 @@ } } }, - "/api/v1/monitors/{id}/runs": { + "/api/v1/monitors/{id}/overview/steps": { "get": { "tags": [ - "Monitor Runs" + "Check Results" ], - "summary": "List runs for a code monitor", - "description": "Cursor page of runs from the last 90 days. Default limit 25.", - "operationId": "listMonitorRuns", + "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", @@ -13381,11 +15992,38 @@ } }, { - "name": "params", + "name": "window", "in": "query", - "required": true, + "description": "Time window for step aggregates", + "required": false, "schema": { - "$ref": "#/components/schemas/MonitorRunListParams" + "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" } } ], @@ -13395,7 +16033,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageRunDto" + "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" } } } @@ -13420,6 +16058,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 +16098,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13481,14 +16149,15 @@ } } } - }, + } + }, + "/api/v1/monitors/{id}/pause": { "post": { "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": "Pause a monitor", + "operationId": "pause", "parameters": [ { "name": "id", @@ -13500,13 +16169,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13531,6 +16209,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 +16249,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13594,14 +16302,14 @@ } } }, - "/api/v1/monitors/{id}/runs/summary": { - "get": { + "/api/v1/monitors/{id}/publish": { + "post": { "tags": [ - "Monitor Runs" + "Monitor definitions" ], - "summary": "Summarize one monitor's execution durations", - "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", - "operationId": "summarizeMonitorRuns", + "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", @@ -13613,13 +16321,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -13644,6 +16362,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": { @@ -13674,6 +16402,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16455,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests": { - "get": { + "/api/v1/monitors/{id}/quarantine": { + "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "List secret requests for a monitor", - "operationId": "list_19", + "summary": "Quarantine a monitor", + "operationId": "quarantine", "parameters": [ { "name": "id", @@ -13725,13 +16473,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuarantineMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13756,6 +16514,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 +16554,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16607,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/{key}": { - "put": { + "/api/v1/monitors/{id}/release-quarantine": { + "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "Attach or clear a remapped secret for a key", - "operationId": "remap", + "summary": "Release quarantine", + "operationId": "releaseQuarantine", "parameters": [ { "name": "id", @@ -13835,33 +16623,15 @@ "type": "string", "format": "uuid" } - }, - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemapSecretRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13886,6 +16656,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 +16696,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16749,14 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/rescan": { + "/api/v1/monitors/{id}/restore": { "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "Rescan secret requests from the active package", - "operationId": "rescan", + "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", @@ -13967,13 +16768,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreMonitorRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13998,6 +16808,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 +16848,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16901,14 @@ } } }, - "/api/v1/monitors/{id}/session": { + "/api/v1/monitors/{id}/results": { "get": { "tags": [ - "Monitor session" + "Check Results" ], - "summary": "Get the monitor session", - "operationId": "getSession", + "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", @@ -14077,25 +16918,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/SingleValueResponseMonitorSessionDto" + "$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" } } } @@ -14110,8 +17010,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": { @@ -14120,12 +17020,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" } } } @@ -14140,6 +17050,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +17101,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/results/by-region": { + "get": { "tags": [ - "Monitor session" + "Check Results" ], - "summary": "Create or update the monitor session", - "operationId": "putSession", + "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", @@ -14187,35 +17120,48 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertMonitorSessionRequest" - } + }, + { + "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/SingleValueResponseMonitorSessionDto" + "$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" } } } @@ -14230,8 +17176,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": { @@ -14240,12 +17186,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" } } } @@ -14260,6 +17216,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +17269,14 @@ } } }, - "/api/v1/monitors/{id}/session/renew": { - "post": { + "/api/v1/monitors/{id}/results/summary": { + "get": { "tags": [ - "Monitor session" + "Check Results" ], - "summary": "Renew the monitor session", - "operationId": "renewSession", + "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", @@ -14309,25 +17286,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" + ] + } } ], "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "Results summary", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/ResultSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -14342,8 +17334,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": { @@ -14352,12 +17344,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" } } } @@ -14372,6 +17374,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +17427,13 @@ } } }, - "/api/v1/monitors/{id}/session/revoke": { + "/api/v1/monitors/{id}/resume": { "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Revoke the monitor session", - "operationId": "revokeSession", + "summary": "Resume a paused monitor", + "operationId": "resume", "parameters": [ { "name": "id", @@ -14429,7 +17451,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14454,6 +17476,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 +17516,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +17569,14 @@ } } }, - "/api/v1/monitors/{id}/settings/preview": { + "/api/v1/monitors/{id}/revisions": { "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Projected run volume and meter headroom", - "operationId": "settingsPreview", + "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", @@ -14533,6 +17586,23 @@ "type": "string", "format": "uuid" } + }, + { + "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": { @@ -14541,7 +17611,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + "$ref": "#/components/schemas/TableValueResultRevisionDto" } } } @@ -14566,6 +17636,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 +17676,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14627,16 +17727,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/status-pages": { - "get": { + }, + "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "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": "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", @@ -14646,15 +17744,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "X-DevHelm-Client", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDraftRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseCreateDraftRevisionResponse" } } } @@ -14679,6 +17795,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 +17835,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +17888,13 @@ } } }, - "/api/v1/monitors/{id}/tags": { - "get": { + "/api/v1/monitors/{id}/revisions/{revisionId}": { + "delete": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "Discard a draft revision", + "operationId": "discardDraft", "parameters": [ { "name": "id", @@ -14758,21 +17904,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/TableValueResultTagDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14781,8 +17939,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14821,8 +17979,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": { @@ -14831,8 +17989,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": { @@ -14841,8 +17999,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -14850,15 +18008,38 @@ } } } - } - } - }, + }, + "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/{id}/revisions/{revisionId}/test": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "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", @@ -14868,25 +18049,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/CodeTestTargetRequest" } } - }, - "required": true + } }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -14911,6 +18100,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": { @@ -14941,6 +18140,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +18191,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/rollback": { + "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "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", @@ -14994,15 +18216,22 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "$ref": "#/components/schemas/RollbackRevisionRequest" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -15024,6 +18253,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": { @@ -15054,6 +18293,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +18346,13 @@ } } }, - "/api/v1/monitors/{id}/takeover": { - "post": { + "/api/v1/monitors/{id}/rollback-preview": { + "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Claim a field for dashboard ownership or reset an overlay", - "operationId": "takeover", + "summary": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", "parameters": [ { "name": "id", @@ -15103,25 +18362,25 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to preview; null previews the previous live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TakeoverMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" } } } @@ -15146,6 +18405,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 +18445,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +18498,14 @@ } } }, - "/api/v1/monitors/{id}/test": { + "/api/v1/monitors/{id}/rotate-token": { "post": { "tags": [ "Monitors" ], - "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": "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", @@ -15228,38 +18517,29 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } - } - } - }, "responses": { "200": { - "description": "Probe result for an uptime monitor", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, - "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 +18548,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 +18588,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15341,14 +18641,14 @@ } } }, - "/api/v1/monitors/{id}/test-notifications": { - "post": { + "/api/v1/monitors/{id}/runs": { + "get": { "tags": [ - "Monitors" + "Monitor Runs" ], - "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": "List runs for a code monitor", + "description": "Cursor page of runs from the last 90 days. Default limit 25.", + "operationId": "listMonitorRuns", "parameters": [ { "name": "id", @@ -15358,25 +18658,23 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorRunListParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -15401,6 +18699,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 +18739,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15462,15 +18790,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/unmute": { + }, "post": { "tags": [ - "Monitors" + "Monitor Runs" ], - "summary": "Clear mute overlay", - "operationId": "unmute", + "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": "id", @@ -15480,15 +18807,23 @@ "type": "string", "format": "uuid" } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -15513,6 +18848,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": { @@ -15543,6 +18888,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +18941,13 @@ } } }, - "/api/v1/monitors/{id}/uptime": { + "/api/v1/monitors/{id}/runs/regional-health": { "get": { "tags": [ - "Check Results" + "monitor-run-diagnostics-controller" ], - "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": "Get regional run health without changing incident evaluation", + "operationId": "health", "parameters": [ { "name": "id", @@ -15593,40 +18957,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], "responses": { "200": { - "description": "Uptime statistics", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRegionalHealthDto" } } } }, "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 +18990,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 +19030,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19083,13 @@ } } }, - "/api/v1/monitors/{id}/usage-preview": { - "post": { + "/api/v1/monitors/{id}/runs/schedule": { + "get": { "tags": [ - "Monitors" + "monitor-run-diagnostics-controller" ], - "summary": "Project monthly usage for an update payload", - "operationId": "previewUsage", + "summary": "Get the next actual scheduler admission time", + "operationId": "schedule", "parameters": [ { "name": "id", @@ -15722,23 +19101,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorScheduleDto" } } } @@ -15763,6 +19132,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 +19172,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19225,13 @@ } } }, - "/api/v1/monitors/{id}/versions": { + "/api/v1/monitors/{id}/runs/series": { "get": { "tags": [ - "Monitors" + "monitor-run-diagnostics-controller" ], - "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": "Get execution-duration and regional target-health chart buckets", + "operationId": "series", "parameters": [ { "name": "id", @@ -15845,11 +19243,32 @@ } }, { - "name": "pageable", + "name": "window", "in": "query", - "required": true, + "description": "Chart window: 24h, 7d, or 30d", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "default": "24h" + } + }, + { + "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" } } ], @@ -15859,7 +19278,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunSeriesDto" } } } @@ -15884,6 +19303,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 +19343,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19396,14 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { + "/api/v1/monitors/{id}/runs/summary": { "get": { "tags": [ - "Monitors" + "Monitor Runs" ], - "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": "Summarize one monitor's execution durations", + "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", + "operationId": "summarizeMonitorRuns", "parameters": [ { "name": "id", @@ -15964,15 +19413,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -15981,7 +19421,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" } } } @@ -16006,6 +19446,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 +19486,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19539,16 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/{id}/secret-requests": { + "get": { "tags": [ - "Monitor Alert Channels" + "Monitor secret requests" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "List secret requests for a monitor", + "operationId": "list_20", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16087,23 +19557,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/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -16128,6 +19588,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 +19628,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19681,49 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions": { - "post": { + "/api/v1/monitors/{id}/secret-requests/{key}": { + "put": { "tags": [ - "Monitor Assertions" + "Monitor secret requests" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "Attach or clear a remapped secret for a key", + "operationId": "remap", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" + "$ref": "#/components/schemas/RemapSecretRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -16250,6 +19748,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 +19788,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16313,25 +19841,16 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + "/api/v1/monitors/{id}/secret-requests/rescan": { + "post": { "tags": [ - "Monitor Assertions" + "Monitor secret requests" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "summary": "Rescan secret requests from the active package", + "operationId": "rescan", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16340,23 +19859,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -16381,6 +19890,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 +19930,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19981,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/session": { + "get": { "tags": [ - "Monitor Assertions" + "Monitor session" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Get the monitor session", + "operationId": "getSession", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16470,8 +20002,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16493,6 +20032,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 +20072,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16554,18 +20123,16 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/auth": { + }, "put": { "tags": [ - "Monitor Auth" + "Monitor session" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "Create or update the monitor session", + "operationId": "putSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16578,7 +20145,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" } } }, @@ -16590,7 +20157,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -16615,6 +20182,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 +20222,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +20273,18 @@ } } } - }, + } + }, + "/api/v1/monitors/{id}/session/renew": { "post": { "tags": [ - "Monitor Auth" + "Monitor session" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Renew the monitor session", + "operationId": "renewSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16694,23 +20293,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -16735,6 +20324,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 +20364,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20415,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/session/revoke": { + "post": { "tags": [ - "Monitor Auth" + "Monitor session" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", + "summary": "Revoke the monitor session", + "operationId": "revokeSession", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16815,8 +20436,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16838,6 +20466,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 +20506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,19 +20559,17 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { + "/api/v1/monitors/{id}/settings/preview": { "get": { "tags": [ - "Incident Policies" + "Monitors" ], - "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": "Projected run volume and meter headroom", + "operationId": "settingsPreview", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -16923,11 +20579,11 @@ ], "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" } } } @@ -16952,6 +20608,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 +20629,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 +20648,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,19 +20699,20 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/status-pages": { + "get": { "tags": [ - "Incident Policies" + "Monitors" ], - "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": "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": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -17033,33 +20720,23 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } }, "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 +20751,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 +20772,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 +20791,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20844,31 @@ } } }, - "/api/v1/monitors/bulk": { - "post": { + "/api/v1/monitors/{id}/tags": { + "get": { "tags": [ "Monitors" ], - "summary": "Bulk action on monitors", - "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", - "operationId": "bulkAction", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" - } + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -17186,6 +20893,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 +20933,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17247,32 +20984,41 @@ } } } - } - }, - "/api/v1/monitors/package-uploads": { + }, "post": { "tags": [ "Monitors" ], - "summary": "Mint a signed package upload URL", - "operationId": "createPackageUpload", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePackageUploadRequest" + "$ref": "#/components/schemas/AddMonitorTagsRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePackageUploadDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -17297,6 +21043,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 +21083,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,39 +21134,50 @@ } } } - } - }, - "/api/v1/monitors/test": { - "post": { + }, + "delete": { "tags": [ "Monitors" ], - "summary": "Ad-hoc monitor test", - "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. Inline browser and multi-step API code is refused with MONITOR_TEST_BUNDLE_UNAVAILABLE until a bundle can be uploaded.", - "operationId": "testAdHoc", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, "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/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17399,8 +21186,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -17439,6 +21226,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17472,18 +21279,29 @@ } } }, - "/api/v1/monitors/usage-preview": { + "/api/v1/monitors/{id}/takeover": { "post": { "tags": [ "Monitors" ], - "summary": "Project monthly usage for a create payload", - "operationId": "previewUsage_1", + "summary": "Claim a field for dashboard ownership or reset an overlay", + "operationId": "takeover", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" + "$ref": "#/components/schemas/TakeoverMonitorRequest" } } }, @@ -17495,7 +21313,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -17520,6 +21338,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": { @@ -17550,6 +21378,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17583,19 +21431,18 @@ } } }, - "/api/v1/notification-dispatches": { - "get": { + "/api/v1/monitors/{id}/test": { + "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "List all dispatches for an incident", - "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", - "operationId": "listByIncident", + "summary": "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": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { "type": "string", @@ -17603,13 +21450,32 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeTestTargetRequest" + } + } + } + }, "responses": { "200": { - "description": "OK", + "description": "Probe result for an uptime monitor", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -17634,6 +21500,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 +21540,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21593,14 @@ } } }, - "/api/v1/notification-dispatches/{id}": { - "get": { + "/api/v1/monitors/{id}/test-notifications": { + "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "Get a single dispatch with full escalation and delivery history", - "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", - "operationId": "getById_3", + "summary": "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", @@ -17716,13 +21612,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -17747,6 +21653,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 +21693,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21746,14 @@ } } }, - "/api/v1/notification-dispatches/{id}/acknowledge": { + "/api/v1/monitors/{id}/transfer": { "post": { "tags": [ - "Notification Dispatches" + "Monitors" ], - "summary": "Acknowledge a notification dispatch", - "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", - "operationId": "acknowledge", + "summary": "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", @@ -17829,13 +21765,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -17860,6 +21806,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 +21846,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17923,14 +21899,14 @@ } } }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { + "/api/v1/monitors/{id}/triggers": { "post": { "tags": [ - "Notification Dispatches" + "Monitor Runs" ], - "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": "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", @@ -17940,15 +21916,32 @@ "type": "string", "format": "uuid" } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerRunRequest" + } + } + } + }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseTriggerRunsResponse" } } } @@ -17973,6 +21966,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 +22006,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22059,31 @@ } } }, - "/api/v1/notification-policies": { - "get": { + "/api/v1/monitors/{id}/unmute": { + "post": { "tags": [ - "Notification Policies" + "Monitors" + ], + "summary": "Clear mute overlay", + "operationId": "unmute", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -18074,6 +22108,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": { @@ -18104,6 +22148,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18135,40 +22199,59 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/uptime": { + "get": { "tags": [ - "Notification Policies" + "Check Results" ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" - } + "summary": "Get uptime statistics", + "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows. Daily windows fall back to hourly when the daily rollup reports fewer checks.", + "operationId": "getUptime", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "window", + "in": "query", + "description": "Time window for uptime calculation", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/UptimeDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid window parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -18183,8 +22266,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": { @@ -18193,12 +22276,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" } } } @@ -18213,6 +22306,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18246,13 +22359,13 @@ } } }, - "/api/v1/notification-policies/{id}": { - "get": { + "/api/v1/monitors/{id}/usage-preview": { + "post": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "Project monthly usage for an update payload", + "operationId": "previewUsage", "parameters": [ { "name": "id", @@ -18264,13 +22377,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -18295,6 +22418,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 +22458,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22509,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/versions": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "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", @@ -18372,25 +22528,23 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" } } } @@ -18415,6 +22569,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 +22609,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22660,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/versions/{version}": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", + "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", @@ -18492,11 +22679,27 @@ "type": "string", "format": "uuid" } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -18518,6 +22721,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 +22761,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,71 +22814,41 @@ } } }, - "/api/v1/notification-policies/{id}/dispatches": { - "get": { + "/api/v1/monitors/{monitorId}/alert-channels": { + "put": { "tags": [ - "Notification Policies" + "Monitor Alert Channels" ], - "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": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "since", - "in": "query", - "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "until", - "in": "query", - "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous nextCursor", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size 1–100 when windowing/paginating (default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetAlertChannelsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } @@ -18670,6 +22873,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 +22913,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18733,16 +22966,16 @@ } } }, - "/api/v1/notification-policies/{id}/test": { + "/api/v1/monitors/{monitorId}/assertions": { "post": { "tags": [ - "Notification Policies" + "Monitor Assertions" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -18755,18 +22988,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" + "$ref": "#/components/schemas/CreateAssertionRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -18791,6 +23025,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 +23065,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18854,51 +23118,50 @@ } } }, - "/api/v1/notifications": { - "get": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Notifications" + "Monitor Assertions" ], - "summary": "List notifications for the current user", - "operationId": "list_18", + "summary": "Update an assertion on a monitor", + "operationId": "update_10", "parameters": [ { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, + "name": "monitorId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "type": "string", + "format": "uuid" } }, { - "name": "size", - "in": "query", - "required": false, + "name": "assertionId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -18923,6 +23186,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 +23226,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18984,23 +23277,30 @@ } } } - } - }, - "/api/v1/notifications/{id}/read": { - "put": { + }, + "delete": { "tags": [ - "Notifications" + "Monitor Assertions" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Remove an assertion from a monitor", + "operationId": "remove_1", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -19028,6 +23328,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 +23368,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +23421,44 @@ } } }, - "/api/v1/notifications/read-all": { + "/api/v1/monitors/{monitorId}/auth": { "put": { "tags": [ - "Notifications" + "Monitor Auth" ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19122,6 +23480,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 +23520,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19183,22 +23571,41 @@ } } } - } - }, - "/api/v1/notifications/unread-count": { - "get": { + }, + "post": { "tags": [ - "Notifications" + "Monitor Auth" ], - "summary": "Get unread notification count", - "operationId": "unreadCount", + "summary": "Set authentication config for a monitor", + "operationId": "set", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -19223,6 +23630,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,28 +23670,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", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -19282,30 +23679,9 @@ } } } - } - } - } - }, - "/api/v1/org": { - "get": { - "tags": [ - "Organizations" - ], - "summary": "Get the current organization", - "operationId": "get_4", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -19314,8 +23690,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -19324,8 +23700,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -19334,8 +23710,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "503": { + "description": "Service unavailable — try again shortly", "content": { "application/json": { "schema": { @@ -19343,19 +23719,32 @@ } } } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + } + }, + "delete": { + "tags": [ + "Monitor Auth" + ], + "summary": "Remove authentication config from a monitor", + "operationId": "remove", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, - "500": { - "description": "Internal server error — see the message field for details", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -19364,8 +23753,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19374,8 +23763,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19383,38 +23772,9 @@ } } } - } - } - }, - "put": { - "tags": [ - "Organizations" - ], - "summary": "Update the current organization", - "operationId": "update_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19423,8 +23783,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19433,8 +23793,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": { @@ -19443,8 +23803,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -19453,8 +23813,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": { @@ -19496,20 +23856,33 @@ } } }, - "/api/v1/resource-groups": { + "/api/v1/monitors/{monitorId}/policy": { "get": { "tags": [ - "Resource Groups" + "Incident Policies" + ], + "summary": "Get incident policy for a monitor", + "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", + "operationId": "get_5", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", "responses": { "200": { - "description": "OK", + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } @@ -19534,6 +23907,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": { @@ -19545,11 +23928,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" } } } @@ -19564,6 +23947,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19596,39 +23999,52 @@ } } }, - "post": { + "put": { "tags": [ - "Resource Groups" + "Incident Policies" + ], + "summary": "Update incident policy for a monitor", + "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", + "operationId": "update_8", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create a new resource group", - "operationId": "create_7", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$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" } } } @@ -19643,6 +24059,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": { @@ -19654,11 +24080,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" } } } @@ -19673,6 +24099,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19706,31 +24152,45 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/monitors/batch-history": { "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "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": "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": "includeMetrics", + "name": "window", "in": "query", + "description": "History window: 24h (default), 7d or 30d", "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string" + } + }, + { + "name": "density", + "in": "query", + "description": "Return 48 display-only history buckets", + "required": false, + "schema": { + "type": "integer", + "format": "int32" } } ], @@ -19740,7 +24200,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorBatchHistoryDto" } } } @@ -19765,6 +24225,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": { @@ -19795,6 +24265,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,29 +24316,21 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/bulk": { + "post": { "tags": [ - "Resource Groups" - ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Monitors" ], + "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/UpdateResourceGroupRequest" + "$ref": "#/components/schemas/BulkMonitorActionRequest" } } }, @@ -19860,7 +24342,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -19885,58 +24367,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": { @@ -19944,33 +24376,9 @@ } } } - } - } - }, - "delete": { - "tags": [ - "Resource Groups" - ], - "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": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -19979,8 +24387,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19989,8 +24397,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": { @@ -19999,8 +24407,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -20009,8 +24417,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": { @@ -20052,22 +24460,24 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/monitors/export.csv": { "get": { "tags": [ - "Resource Groups" + "monitor-export-controller" ], - "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": "Export up to 200 explicitly selected monitors as CSV", + "operationId": "csv", "parameters": [ { - "name": "id", - "in": "path", + "name": "ids", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -20075,9 +24485,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "type": "string", + "format": "byte" } } } @@ -20102,6 +24513,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 +24553,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,34 +24606,172 @@ } } }, - "/api/v1/resource-groups/{id}/matched-policies": { + "/api/v1/monitors/facets": { "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "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": "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": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" - } - } + "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": "triage", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorTriageParams" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorListFacetsDto" + } + } } }, "400": { @@ -20215,6 +24794,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 +24834,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +24887,41 @@ } } }, - "/api/v1/resource-groups/{id}/members": { + "/api/v1/monitors/test": { "post": { "tags": [ - "Resource Groups" - ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Monitors" ], + "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/AddResourceGroupMemberRequest" + "$ref": "#/components/schemas/MonitorTestRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "Probe result for an uptime monitor", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API bundle", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -20337,6 +24946,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 +24986,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,36 +25039,33 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/monitors/trash": { + "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "List deleted monitors that can still be restored", + "operationId": "listTrash", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "memberId", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20451,6 +25087,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 +25127,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20514,31 +25180,30 @@ } } }, - "/api/v1/revisions/{id}": { - "get": { + "/api/v1/monitors/usage-preview": { + "post": { "tags": [ - "Revisions" + "Monitors" ], - "summary": "Get revision package", - "operationId": "get_13", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "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/SingleValueResponseRevisionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -20563,6 +25228,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": { @@ -20593,6 +25268,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,28 +25321,33 @@ } } }, - "/api/v1/revisions/{id}/bundle": { - "get": { + "/api/v1/monitors/validate": { + "post": { "tags": [ - "Revisions" + "Monitors" ], - "summary": "Redirect to signed package download", - "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", - "operationId": "bundle", - "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": "OK" + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorValidationResultDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20669,6 +25369,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 +25409,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20732,18 +25462,19 @@ } } }, - "/api/v1/revisions/{id}/bundle/content": { + "/api/v1/notification-dispatches": { "get": { "tags": [ - "Revisions" + "Notification Dispatches" ], - "summary": "Download revision archive", - "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", - "operationId": "bundleContent", + "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", @@ -20755,10 +25486,9 @@ "200": { "description": "OK", "content": { - "application/zip": { + "*/*": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } @@ -20783,6 +25513,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 +25553,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20846,13 +25606,14 @@ } } }, - "/api/v1/revisions/{id}/diff/{other}": { + "/api/v1/notification-dispatches/{id}": { "get": { "tags": [ - "Revisions" + "Notification Dispatches" ], - "summary": "Compare two revisions (bounded hunks)", - "operationId": "diff", + "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", @@ -20862,15 +25623,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "other", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -20879,7 +25631,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -20904,6 +25656,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": { @@ -20934,6 +25696,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +25749,22 @@ } } }, - "/api/v1/runs": { - "get": { + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "List code runs", - "description": "Org index. Default window last 30 minutes; from clamped to 90 days. Page size 50.", - "operationId": "listRuns", + "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": "params", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string", + "format": "uuid" } } ], @@ -20991,7 +25774,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -21016,6 +25799,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": { @@ -21046,6 +25839,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21079,13 +25892,14 @@ } } }, - "/api/v1/runs/{id}": { - "get": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Get a run", - "operationId": "getRun", + "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", @@ -21103,7 +25917,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -21128,6 +25942,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": { @@ -21158,6 +25982,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +26035,20 @@ } } }, - "/api/v1/runs/{id}/artifacts": { + "/api/v1/notification-policies": { "get": { "tags": [ - "Runs" - ], - "summary": "List run artifacts", - "description": "Complete persist manifest for this run.", - "operationId": "listRunArtifacts", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notification Policies" ], + "summary": "List all notification policies for the authenticated org", + "operationId": "list_8", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunArtifactDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -21241,6 +26073,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 +26113,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21302,34 +26164,30 @@ } } } - } - }, - "/api/v1/runs/{id}/cancel": { + }, "post": { "tags": [ - "Runs" + "Notification Policies" ], - "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": "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/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -21354,6 +26212,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 +26252,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +26305,13 @@ } } }, - "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "/api/v1/notification-policies/{id}": { "get": { "tags": [ - "Runs" + "Notification Policies" ], - "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": "Get a notification policy by ID", + "operationId": "getById_1", "parameters": [ { "name": "id", @@ -21434,24 +26321,15 @@ "type": "string", "format": "uuid" } - }, - { - "name": "artifactId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -21476,6 +26354,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 +26394,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21537,15 +26445,13 @@ } } } - } - }, - "/api/v1/runs/{id}/cases": { - "get": { + }, + "put": { "tags": [ - "Runs" + "Notification Policies" ], - "summary": "List run cases with nested steps", - "operationId": "listRunCases", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { "name": "id", @@ -21555,23 +26461,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunCaseListParams" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunCaseDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -21596,6 +26504,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 +26544,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21657,16 +26595,13 @@ } } } - } - }, - "/api/v1/runs/{id}/console": { - "get": { + }, + "delete": { "tags": [ - "Runs" + "Notification Policies" ], - "summary": "Download raw console log", - "description": "Ungrouped text/plain console lines.", - "operationId": "getRunConsoleRaw", + "summary": "Delete a notification policy", + "operationId": "delete_6", "parameters": [ { "name": "id", @@ -21676,34 +26611,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunConsoleParams" - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" - } - }, - "text/plain": { - "schema": { - "type": "string" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -21712,8 +26637,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -21752,6 +26677,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +26730,14 @@ } } }, - "/api/v1/runs/{id}/diff": { + "/api/v1/notification-policies/{id}/dispatches": { "get": { "tags": [ - "Runs" + "Notification Policies" ], - "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 dispatches (firing history) for a notification policy", + "description": "Optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50. Response is CursorPage (hasMore + nextCursor), the same wrapper used by other append-only history endpoints.", + "operationId": "listDispatches", "parameters": [ { "name": "id", @@ -21804,12 +26749,42 @@ } }, { - "name": "baselineRunId", + "name": "since", "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", "required": false, "schema": { "type": "string", - "format": "uuid" + "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" } } ], @@ -21817,9 +26792,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } @@ -21844,6 +26819,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 +26859,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +26912,13 @@ } } }, - "/api/v1/runs/{id}/events": { - "get": { + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Runs" + "Notification Policies" ], - "summary": "Stream run control events", - "operationId": "streamRunEvents", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { "name": "id", @@ -21923,31 +26928,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunEventParams" - } - }, - { - "name": "Last-Event-ID", - "in": "header", - "required": false, - "schema": { - "type": "string" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestNotificationPolicyRequest" + } + } + } + }, "responses": { "200": { - "description": "Server-sent persist control events", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunEventDto" + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" } } } @@ -21972,6 +26970,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 +27010,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +27063,53 @@ } } }, - "/api/v1/runs/{id}/export": { + "/api/v1/notifications": { "get": { "tags": [ - "Runs" + "Notifications" ], - "summary": "Export run snapshot and available artifacts", - "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", - "operationId": "exportRun", + "summary": "List notifications for the current user", + "operationId": "list_19", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "unreadOnly", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], "responses": { "200": { - "description": "Zip of snapshot.json and available artifacts", + "description": "OK", "content": { - "application/zip": {} + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDto" + } + } } }, "400": { @@ -22081,6 +27132,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 +27172,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,46 +27225,40 @@ } } }, - "/api/v1/runs/{id}/network": { - "get": { + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Runs" + "Notifications" ], - "summary": "List run network rows", - "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", - "operationId": "listRunNetwork", + "summary": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunNetworkParams" + "type": "integer", + "format": "int64" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/RunNetworkDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22192,8 +27267,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -22232,6 +27307,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,46 +27360,29 @@ } } }, - "/api/v1/runs/{id}/network/{rowId}": { - "get": { + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Runs" - ], - "summary": "Get one network row", - "description": "Includes redacted headers, bodies, and copy-as-cURL.", - "operationId": "getRunNetworkRow", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "rowId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "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/SingleValueResponseNetworkRowDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22313,8 +27391,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -22353,6 +27431,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,37 +27484,20 @@ } } }, - "/api/v1/runs/{id}/runner-log": { + "/api/v1/notifications/unread-count": { "get": { "tags": [ - "Runs" - ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { "description": "OK", "content": { - "text/plain": { - "schema": { - "type": "string" - } - }, "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } @@ -22441,6 +27522,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 +27562,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +27615,20 @@ } } }, - "/api/v1/runs/{id}/runner-log/live": { + "/api/v1/org": { "get": { "tags": [ - "Runs" - ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Organizations" ], + "summary": "Get the current organization", + "operationId": "get_4", "responses": { "200": { - "description": "Server-sent runner-log lines", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunnerLogLiveEvent" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -22554,6 +27653,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 +27693,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22615,33 +27744,30 @@ } } } - } - }, - "/api/v1/runs/summary": { - "get": { + }, + "put": { "tags": [ - "Runs" + "Organizations" ], - "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" + "summary": "Update the current organization", + "operationId": "update_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -22666,6 +27792,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 +27832,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22729,20 +27885,20 @@ } } }, - "/api/v1/secrets": { + "/api/v1/regions": { "get": { "tags": [ - "Secrets" + "Regions" ], - "summary": "List organization secrets", - "operationId": "list_5", + "summary": "List public regions", + "operationId": "listRegions", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" + "$ref": "#/components/schemas/SingleValueResponseListRegionDto" } } } @@ -22767,6 +27923,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 +27963,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +28014,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/resource-groups": { + "get": { "tags": [ - "Secrets" + "Resource Groups" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } - } - }, - "required": true - }, + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_7", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } @@ -22876,6 +28054,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 +28094,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,42 +28145,30 @@ } } } - } - }, - "/api/v1/secrets/{key}": { - "put": { + }, + "post": { "tags": [ - "Secrets" - ], - "summary": "Update secret", - "operationId": "update_4", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Resource Groups" ], + "summary": "Create a new resource group", + "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + "$ref": "#/components/schemas/CreateResourceGroupRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -22997,6 +28193,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 +28233,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23058,26 +28284,46 @@ } } } - }, - "delete": { + } + }, + "/api/v1/resource-groups/{id}": { + "get": { "tags": [ - "Secrets" + "Resource Groups" ], - "summary": "Delete secret", - "operationId": "delete_4", + "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": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "includeMetrics", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -23099,6 +28345,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 +28385,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23160,32 +28436,41 @@ } } } - } - }, - "/api/v1/secrets/{key}/audit": { - "get": { + }, + "put": { "tags": [ - "Secrets" + "Resource Groups" ], - "summary": "Last update metadata for a secret", - "operationId": "audit", + "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -23210,6 +28495,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 +28535,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23271,26 +28586,17 @@ } } } - } - }, - "/api/v1/secrets/{key}/environments/{environmentId}": { - "put": { + }, + "delete": { "tags": [ - "Secrets" + "Resource Groups" ], - "summary": "Write a secret value for one environment", - "operationId": "writeEnvironmentValue", + "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": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -23299,16 +28605,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" @@ -23333,6 +28629,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 +28669,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +28722,22 @@ } } }, - "/api/v1/secrets/{key}/usage": { + "/api/v1/resource-groups/{id}/health": { "get": { "tags": [ - "Secrets" + "Resource Groups" ], - "summary": "Secret usage across monitors", - "operationId": "usage", + "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": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -23419,7 +28747,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -23444,6 +28772,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 +28812,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,20 +28865,32 @@ } } }, - "/api/v1/service-subscriptions": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Service Subscriptions" + "Resource Groups" + ], + "summary": "List notification policies that match this resource group", + "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", + "operationId": "listMatchedPolicies", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_17", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -23545,6 +28915,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": { @@ -23575,6 +28955,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +29008,13 @@ } } }, - "/api/v1/service-subscriptions/{id}": { - "get": { + "/api/v1/resource-groups/{id}/members": { + "post": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "Get a subscription by its ID", - "operationId": "get_12", + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", "parameters": [ { "name": "id", @@ -23626,13 +29026,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } @@ -23657,6 +29067,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": { @@ -23687,6 +29107,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +29158,15 @@ } } } - }, + } + }, + "/api/v1/resource-groups/{id}/members/{memberId}": { "delete": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "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", + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", "parameters": [ { "name": "id", @@ -23735,6 +29176,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "memberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -23761,6 +29211,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 +29251,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +29304,13 @@ } } }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { + "/api/v1/revisions/{id}": { + "get": { "tags": [ - "Service Subscriptions" + "Revisions" ], - "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", + "summary": "Get revision package", + "operationId": "get_13", "parameters": [ { "name": "id", @@ -23843,23 +29322,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -23884,6 +29353,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 +29393,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23947,46 +29446,41 @@ } } }, - "/api/v1/service-subscriptions/{slug}": { - "post": { + "/api/v1/revisions/{id}/bundle": { + "get": { "tags": [ - "Service Subscriptions" + "Revisions" ], - "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", + "summary": "Redirect to signed package download", + "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", + "operationId": "bundle", "parameters": [ { - "name": "slug", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" - } - } - } - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK" + }, + "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": { @@ -23995,8 +29489,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -24035,6 +29529,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,86 +29582,22 @@ } } }, - "/api/v1/services": { + "/api/v1/revisions/{id}/bundle/content": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", + "summary": "Download revision archive", + "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", + "operationId": "bundleContent", "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, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -24155,9 +29605,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/zip": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "type": "string", + "format": "binary" } } } @@ -24182,6 +29633,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 +29673,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +29726,30 @@ } } }, - "/api/v1/services/{slugOrId}": { + "/api/v1/revisions/{id}/diff/{other}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "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", + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", "parameters": [ { - "name": "slugOrId", + "name": "id", "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 + "type": "string", + "format": "uuid" } }, { - "name": "publishedOnly", - "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", - "required": false, + "name": "other", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -24289,7 +29759,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } @@ -24314,6 +29784,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 +29824,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24377,61 +29877,23 @@ } } }, - "/api/v1/services/{slugOrId}/components": { + "/api/v1/revisions/{id}/files": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", - "operationId": "getComponents", + "summary": "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": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "groupId", - "in": "query", - "description": "Restrict result to direct children of this group component id", - "required": false, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on component name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "Zero-based page index", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "size", - "in": "query", - "description": "Page size (default 25, max 100)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -24440,7 +29902,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionFilesDto" } } } @@ -24465,6 +29927,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 +29967,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,75 +30020,42 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { - "get": { + "/api/v1/revisions/{id}/purge": { + "post": { "tags": [ - "Status Data" + "Revisions" ], - "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": "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": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "componentId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -24621,6 +30080,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 +30120,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24684,69 +30173,21 @@ } } }, - "/api/v1/services/{slugOrId}/components/uptime": { + "/api/v1/runs": { "get": { "tags": [ - "Status Data" + "Runs" ], - "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": "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": "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", - "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", + "name": "params", "in": "query", - "description": "Component ids to include (max 100); omit for every component", - "required": false, + "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "$ref": "#/components/schemas/RunListParams" } } ], @@ -24756,7 +30197,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -24781,6 +30222,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 +30262,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24844,31 +30315,21 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { + "/api/v1/runs/{id}": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", - "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", - "operationId": "getServiceDayDetail", + "summary": "Get a run", + "operationId": "getRun", "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" } } ], @@ -24878,7 +30339,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -24903,6 +30364,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": { @@ -24933,6 +30404,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30457,22 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "summary": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "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 +30482,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } @@ -25045,6 +30507,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 +30547,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30600,17 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { - "get": { + "/api/v1/runs/{id}/cancel": { + "post": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "incidentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -25140,7 +30625,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -25165,6 +30650,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 +30690,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +30743,31 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/runs/{id}/captures/{artifactId}/compare": { "get": { "tags": [ - "Status Data" + "Runs" ], - "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": "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": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "artifactId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -25250,9 +30775,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" } } } @@ -25277,6 +30802,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 +30842,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +30895,29 @@ } } }, - "/api/v1/services/{slugOrId}/maintenances": { + "/api/v1/runs/{id}/cases": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "List run cases with nested steps", + "operationId": "listRunCases", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "status", + "name": "params", "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, + "required": true, "schema": { - "type": "array", - "items": { - "type": "string" - } + "$ref": "#/components/schemas/RunCaseListParams" } } ], @@ -25375,7 +30927,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } @@ -25400,6 +30952,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 +30992,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +31045,30 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/runs/{id}/console": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "limit", + "name": "params", "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "$ref": "#/components/schemas/RunConsoleParams" } } ], @@ -25504,9 +31076,14 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" } } } @@ -25531,6 +31108,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 +31148,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,34 +31201,31 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { + "/api/v1/runs/{id}/diff": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "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": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "window", + "name": "baselineRunId", "in": "query", - "description": "Time window", "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "format": "uuid" } } ], @@ -25629,9 +31233,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" } } } @@ -25656,6 +31260,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": { @@ -25686,6 +31300,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,94 +31353,47 @@ } } }, - "/api/v1/services/{slugOrId}/status-events": { + "/api/v1/runs/{id}/events": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List curated vendor status events for a service", - "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", - "operationId": "listStatusEvents", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "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" + "format": "uuid" } }, { - "name": "to", + "name": "params", "in": "query", - "description": "Explicit upper bound (ISO 8601); default now", - "required": false, + "required": true, "schema": { - "type": "string", - "format": "date-time" + "$ref": "#/components/schemas/RunEventParams" } }, { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", + "name": "Last-Event-ID", + "in": "header", "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 - } } ], "responses": { "200": { - "description": "OK", + "description": "Server-sent persist control events", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/CursorPageStatusEventDto" + "$ref": "#/components/schemas/RunEventDto" } } } @@ -25831,6 +31418,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 +31458,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,65 +31511,30 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/runs/{id}/export": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "Export run snapshot and available artifacts", + "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", + "operationId": "exportRun", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] - } - }, - { - "name": "granularity", - "in": "query", - "description": "Bucket granularity", - "required": false, - "schema": { - "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", + "description": "Zip of snapshot.json and available artifacts", "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" - } - } + "application/zip": {} } }, "400": { @@ -25975,6 +31557,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 +31597,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +31647,33 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] + } } }, - "/api/v1/services/incidents": { + "/api/v1/runs/{id}/network": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "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, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "active", - "resolved" - ] - } - }, - { - "name": "category", - "in": "query", - "description": "Filter by service category", - "required": false, - "schema": { - "type": "string" + "format": "uuid" } }, { - "name": "pageable", + "name": "params", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "$ref": "#/components/schemas/RunNetworkParams" } } ], @@ -26099,7 +31683,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/RunNetworkDto" } } } @@ -26124,6 +31708,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 +31748,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,23 +31801,30 @@ } } }, - "/api/v1/services/summary": { + "/api/v1/runs/{id}/network/{rowId}": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Global status summary across all services", - "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", - "operationId": "getGlobalStatusSummary", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { - "name": "publishedOnly", - "in": "query", - "description": "Aggregate only published services (curated public pSEO set); default false", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" + } + }, + { + "name": "rowId", + "in": "path", + "required": true, + "schema": { + "type": "string" } } ], @@ -26213,7 +31834,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" } } } @@ -26238,6 +31859,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 +31899,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +31952,32 @@ } } }, - "/api/v1/status-pages": { - "get": { + "/api/v1/runs/{id}/pin": { + "post": { "tags": [ - "Status Pages" + "Runs" + ], + "summary": "Pin a run past retention", + "description": "Keeps the run and its evidence past the retention windows until unpinned.", + "operationId": "pinRun", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List status pages for the workspace", - "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26339,6 +32002,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,97 +32042,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" - } - } - } - } - } - }, - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Create a status page", - "operationId": "create_5", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" - } - } - } - }, - "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": { @@ -26468,8 +32052,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": { @@ -26509,15 +32093,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}": { - "get": { + }, + "delete": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get a status page", - "operationId": "get_2", + "summary": "Unpin a run", + "description": "Normal retention applies again from the next sweep.", + "operationId": "unpinRun", "parameters": [ { "name": "id", @@ -26535,7 +32118,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26560,6 +32143,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 +32183,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32234,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}/purge": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a status page", - "operationId": "update_3", + "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", @@ -26643,7 +32259,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" + "$ref": "#/components/schemas/EvidencePurgeRequest" } } }, @@ -26655,7 +32271,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26680,6 +32296,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 +32336,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32387,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/runner-log": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "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", @@ -26760,8 +32409,20 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + }, + "*/*": { + "schema": { + "type": "string" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -26783,6 +32444,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 +32484,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32537,14 @@ } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/runs/{id}/runner-log/live": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List all components", - "operationId": "listComponents", + "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", @@ -26866,11 +32558,11 @@ ], "responses": { "200": { - "description": "OK", + "description": "Server-sent runner-log lines", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/RunnerLogLiveEvent" } } } @@ -26895,6 +32587,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 +32627,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32678,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/trace-summary": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "summary": "Summarize a failed trace", + "description": "Bounded text of failed actions, failed requests, and console errors.", + "operationId": "getRunTraceSummary", "parameters": [ { "name": "id", @@ -26974,23 +32699,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunTraceSummaryDto" } } } @@ -27015,6 +32730,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 +32770,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,50 +32823,31 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + "/api/v1/runs/export": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Update a component", - "operationId": "updateComponent", + "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": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "type": "string" } } } @@ -27146,6 +32872,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 +32912,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,36 +32963,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/monitors": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "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", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunMonitorStripDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -27258,6 +33014,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 +33054,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +33107,21 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + "/api/v1/runs/revisions": { "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "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": "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", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", + "name": "params", "in": "query", - "required": false, + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 90 + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -27365,7 +33131,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" + "$ref": "#/components/schemas/CursorPageRunRevisionMarkerDto" } } } @@ -27390,6 +33156,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 +33196,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,51 +33249,30 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/override": { - "put": { + "/api/v1/runs/skipped": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "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 recorded skipped ticks and current plan-disabled intervals", + "operationId": "listSkippedRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "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/SetStatusPageComponentOverrideRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/CursorPageRunSkippedEntryDto" } } } @@ -27522,6 +33297,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 +33337,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +33388,23 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/summary": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Clear a timed human status override on a component", - "operationId": "clearComponentOverride", + "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": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], @@ -27616,7 +33414,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" } } } @@ -27641,6 +33439,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 +33479,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,51 +33532,20 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "/api/v1/secrets": { "get": { "tags": [ - "Status Pages" - ], - "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": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 90 - } - } + "Secrets" ], + "summary": "List organization secrets", + "operationId": "list_6", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } @@ -27773,6 +33570,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 +33610,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,39 +33661,33 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + }, + "post": { "tags": [ - "Status Pages" - ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", - "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/ReorderComponentsRequest" + "$ref": "#/components/schemas/CreateSecretRequest" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -27888,6 +33709,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 +33749,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +33802,40 @@ } } }, - "/api/v1/status-pages/{id}/domains": { - "get": { + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "id", + "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/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -28000,6 +33860,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 +33900,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28062,46 +33952,38 @@ } } }, - "post": { + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -28110,8 +33992,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -28150,6 +34032,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,36 +34085,33 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/secrets/{key}/audit": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", + "summary": "Last update metadata for a secret", + "operationId": "audit", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", + "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", @@ -28234,6 +34133,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 +34173,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,25 +34226,24 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { - "post": { + "/api/v1/secrets/{key}/environments/{environmentId}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", + "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": "domainId", + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -28324,17 +34252,20 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -28355,6 +34286,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 +34326,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +34379,20 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { + "/api/v1/secrets/{key}/usage": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", + "summary": "Secret usage across monitors", + "operationId": "usage", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -28451,7 +34402,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" } } } @@ -28476,6 +34427,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 +34467,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +34520,20 @@ } } }, - "/api/v1/status-pages/{id}/groups": { + "/api/v1/service-subscriptions": { "get": { "tags": [ - "Status Pages" - ], - "summary": "List component groups with nested components", - "operationId": "listGroups", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Service Subscriptions" ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_18", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" } } } @@ -28588,6 +34558,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 +34598,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +34649,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/service-subscriptions/{id}": { + "get": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "Get a subscription by its ID", + "operationId": "get_12", "parameters": [ { "name": "id", @@ -28667,23 +34669,13 @@ } } ], - "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/SingleValueResponseServiceSubscriptionDto" } } } @@ -28708,6 +34700,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 +34740,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28769,15 +34791,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + }, + "delete": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Update a component group", - "operationId": "updateGroup", + "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", @@ -28787,40 +34808,24 @@ "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", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -28829,8 +34834,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -28869,6 +34874,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +34925,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "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", @@ -28916,20 +34944,28 @@ "type": "string", "format": "uuid" } - }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28951,6 +34987,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 +35027,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,56 +35080,40 @@ } } }, - "/api/v1/status-pages/{id}/incidents": { - "get": { + "/api/v1/service-subscriptions/{slug}": { + "post": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "List incidents for this status page (paginated)", - "operationId": "listIncidents", + "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", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } - }, - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceSubscribeRequest" } } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } - ], + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -29088,6 +35138,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 +35178,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29149,41 +35229,98 @@ } } } - }, - "post": { + } + }, + "/api/v1/services": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", + "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" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" - } + }, + { + "name": "status", + "in": "query", + "description": "Filter by current overall_status (exact match)", + "required": false, + "schema": { + "type": "string" } }, - "required": true - }, + { + "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 + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } @@ -29208,6 +35345,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 +35385,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +35438,41 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "/api/v1/services/{slugOrId}": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "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": "incidentId", - "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 } } ], @@ -29304,7 +35482,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" } } } @@ -29329,6 +35507,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 +35547,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29390,50 +35598,72 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/components": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "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": "incidentId", - "in": "path", - "required": true, + "name": "groupId", + "in": "query", + "description": "Restrict result to direct children of this group component id", + "required": false, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" } }, - "required": true - }, + { + "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/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" } } } @@ -29458,6 +35688,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": { @@ -29488,8 +35728,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": { @@ -29498,8 +35738,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": { @@ -29508,8 +35748,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -29517,38 +35757,102 @@ } } } - } + }, + "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/services/{slugOrId}/components/{componentId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Get daily uptime data for a component", + "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", + "operationId": "getComponentUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] + } + }, + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29570,6 +35874,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 +35914,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,36 +35967,82 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", - "operationId": "dismissIncident", + "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": "incidentId", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29684,6 +36064,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 +36104,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29747,49 +36157,41 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/services/{slugOrId}/days/{date}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "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", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "date", "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "uuid" + "format": "date" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" } } } @@ -29814,6 +36216,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": { @@ -29844,6 +36256,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +36309,61 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + "/api/v1/services/{slugOrId}/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "incidentId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], - "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/TableValueResultServiceIncidentDto" } } } @@ -29945,6 +36388,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 +36428,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +36481,20 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { - "patch": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Edit an existing incident timeline update body", - "operationId": "patchIncidentUpdate", + "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" } }, { @@ -30033,34 +36505,15 @@ "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" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -30085,6 +36538,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 +36578,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,38 +36631,35 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/services/{slugOrId}/live-status": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "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", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -30200,6 +36680,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 +36720,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30263,47 +36773,33 @@ } } }, - "/api/v1/status-pages/{id}/maintenance": { + "/api/v1/services/{slugOrId}/maintenances": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List maintenance windows for this status page (paginated)", - "operationId": "listMaintenance", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { "name": "status", "in": "query", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", "required": false, "schema": { "type": "array", "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + "type": "string" } } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -30312,7 +36808,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -30337,6 +36833,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": { @@ -30367,7 +36873,27 @@ } } }, - "500": { + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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": { @@ -30398,41 +36924,52 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/poll-results": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Schedule a maintenance window", - "operationId": "createMaintenance", + "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/CreateStatusPageMaintenanceRequest" - } + }, + { + "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/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } @@ -30457,6 +36994,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 +37034,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +37087,34 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "/api/v1/services/{slugOrId}/poll-summary": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a maintenance window with timeline", - "operationId": "getMaintenance", + "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": "windowId", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d" + ] } } ], @@ -30553,7 +37124,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } @@ -30578,6 +37149,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 +37189,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +37240,96 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/status-events": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a maintenance window", - "operationId": "updateMaintenance", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "types", + "in": "query", + "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d" + ] } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Explicit lower bound (ISO 8601); overrides period", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } + }, + { + "name": "to", + "in": "query", + "description": "Explicit upper bound (ISO 8601); default now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } }, - "required": true - }, + { + "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 + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } @@ -30707,6 +37354,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 +37394,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +37445,68 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Cancel a maintenance window", - "operationId": "deleteMaintenance", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "granularity", + "in": "query", + "description": "Bucket granularity", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "hourly", + "daily", + "monthly" + ] } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30819,6 +37528,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 +37568,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30879,39 +37618,74 @@ } } } - } + }, + "security": [ + { + "BearerAuth": [] + } + ] } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { - "post": { + "/api/v1/services/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "category", + "in": "query", + "description": "Filter by service category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30933,6 +37707,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": { @@ -30963,6 +37747,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +37800,33 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { - "post": { + "/api/v1/services/summary": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "summary": "Global status summary across all services", + "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", + "operationId": "getGlobalStatusSummary", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "windowId", - "in": "path", - "required": true, + "name": "publishedOnly", + "in": "query", + "description": "Aggregate only published services (curated public pSEO set); default false", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } @@ -31063,6 +37851,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 +37891,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +37944,20 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + "/api/v1/status-pages": { + "get": { "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 - }, + "summary": "List status pages for the workspace", + "operationId": "list_5", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -31194,6 +37982,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 +38022,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31255,61 +38073,30 @@ } } } - } - }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + }, + "post": { "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" - } - } - ], + "summary": "Create a status page", + "operationId": "create_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + "$ref": "#/components/schemas/CreateStatusPageRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -31334,6 +38121,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 +38161,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +38214,13 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { + "/api/v1/status-pages/{id}": { "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", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", @@ -31414,29 +38230,6 @@ "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": { @@ -31445,7 +38238,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -31470,6 +38263,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 +38303,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31531,15 +38354,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { - "get": { + }, + "put": { "tags": [ "Status Pages" ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { "name": "id", @@ -31549,24 +38370,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "deliveryId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -31591,6 +38413,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 +38453,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31652,16 +38504,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { - "post": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Retry a failed notification delivery", - "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", - "operationId": "retryNotificationDelivery", + "summary": "Delete a status page", + "operationId": "delete_3", "parameters": [ { "name": "id", @@ -31671,27 +38520,11 @@ "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" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -31713,6 +38546,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 +38586,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +38639,13 @@ } } }, - "/api/v1/status-pages/{id}/subscribers": { + "/api/v1/status-pages/{id}/components": { "get": { "tags": [ "Status Pages" ], - "summary": "List subscribers including awaiting confirmation (paginated)", - "operationId": "listSubscribers", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { "name": "id", @@ -31792,14 +38655,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -31808,7 +38663,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" } } } @@ -31833,6 +38688,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 +38728,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31899,8 +38784,8 @@ "tags": [ "Status Pages" ], - "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", - "operationId": "addSubscriber", + "summary": "Add a component to the status page", + "operationId": "createComponent", "parameters": [ { "name": "id", @@ -31916,7 +38801,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, @@ -31928,7 +38813,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -31953,6 +38838,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 +38878,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +38931,13 @@ } } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/status-pages/{id}/components/{componentId}": { + "put": { "tags": [ "Status Pages" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { "name": "id", @@ -32034,7 +38949,7 @@ } }, { - "name": "subscriberId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -32043,52 +38958,29 @@ } } ], - "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" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -32097,8 +38989,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -32107,8 +38999,8 @@ } } }, - "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": { @@ -32117,40 +39009,8 @@ } } }, - "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", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -32159,8 +39019,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -32169,8 +39029,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": { @@ -32179,8 +39039,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -32189,8 +39049,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": { @@ -32230,40 +39090,36 @@ } } } - } - }, - "/api/v1/synthetics/metrics/run-durations": { - "get": { + }, + "delete": { "tags": [ - "Synthetics metrics" + "Status Pages" ], - "summary": "Get code-monitor duration percentiles", - "description": "Returns exact per-monitor p50 execution durations for the rolling 30-day window.", - "operationId": "getSyntheticsRunDurations", + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { - "name": "monitorIds", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -32285,6 +39141,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 +39181,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32348,19 +39234,51 @@ } } }, - "/api/v1/synthetics/runtime-profiles": { + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { "get": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Pages" + ], + "summary": "Get measured (check-based) component uptime history", + "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", + "operationId": "componentMeasuredUptime", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 + } + } ], - "operationId": "list_16", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuntimeProfileDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } @@ -32385,6 +39303,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 +39343,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,29 +39396,51 @@ } } }, - "/api/v1/synthetics/runtime-profiles/{id}": { - "get": { + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Pages" ], - "operationId": "get_11", + "summary": "Set a timed human status override on a component", + "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", + "operationId": "setComponentOverride", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRuntimeProfileDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -32495,6 +39465,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 +39505,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32556,22 +39556,30 @@ } } } - } - }, - "/api/v1/tags": { - "get": { + }, + "delete": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -32581,7 +39589,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -32606,6 +39614,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 +39654,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32667,30 +39705,53 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Create a new tag", - "operationId": "create_4", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTagRequest" - } + "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": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "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": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -32715,6 +39776,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 +39816,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +39869,13 @@ } } }, - "/api/v1/tags/{id}": { - "get": { + "/api/v1/status-pages/{id}/components/reorder": { + "put": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Get a tag by ID", - "operationId": "getById", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { "name": "id", @@ -32796,17 +39887,20 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderComponentsRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -32827,6 +39921,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 +39961,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32888,13 +40012,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/domains": { + "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { "name": "id", @@ -32906,23 +40032,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" } } } @@ -32947,6 +40063,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 +40103,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33009,12 +40155,12 @@ } } }, - "delete": { + "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -33026,9 +40172,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33050,6 +40213,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": { @@ -33080,6 +40253,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33113,27 +40306,49 @@ } } }, - "/api/v1/vaults/rotate": { - "post": { + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ - "Vault" + "Status Pages" + ], + "summary": "Remove a custom domain", + "operationId": "removeDomain", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "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", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -33142,8 +40357,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33182,6 +40397,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33215,29 +40450,30 @@ } } }, - "/api/v1/webhook/inboxes": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List webhook testing inboxes for the workspace", - "operationId": "listWebhookInboxes", + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", "parameters": [ { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "pageable", - "in": "query", + "name": "domainId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -33247,7 +40483,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -33272,6 +40508,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 +40548,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33333,30 +40599,42 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Create a webhook testing inbox", - "operationId": "createWebhookInbox", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWebhookInboxRequest" - } + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -33381,6 +40659,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 +40699,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +40752,16 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}": { + "/api/v1/status-pages/{id}/groups": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get a webhook testing inbox", - "operationId": "getWebhookInbox", + "summary": "List component groups with nested components", + "operationId": "listGroups", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33468,7 +40776,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" } } } @@ -33493,6 +40801,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 +40841,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33555,15 +40893,15 @@ } } }, - "delete": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete a webhook testing inbox and cascade events", - "operationId": "deleteWebhookInbox", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33572,9 +40910,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33596,6 +40951,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": { @@ -33626,6 +40991,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33657,16 +41042,27 @@ } } } - }, - "patch": { + } + }, + "/api/v1/status-pages/{id}/groups/{groupId}": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Patch a webhook testing inbox", - "operationId": "updateWebhookInbox", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { - "name": "inboxId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "groupId", "in": "path", "required": true, "schema": { @@ -33679,7 +41075,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookInboxRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" } } }, @@ -33691,7 +41087,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -33716,6 +41112,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": { @@ -33746,6 +41152,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33777,18 +41203,16 @@ } } } - } - }, - "/api/v1/webhook/inboxes/{inboxId}/events": { - "get": { + }, + "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List captured HTTP events newest-first", - "operationId": "listWebhookEvents", + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33797,62 +41221,31 @@ } }, { - "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": "groupId", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageWebhookEventDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -33861,8 +41254,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33901,6 +41294,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33932,27 +41345,61 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/incidents": { + "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete every captured event on this inbox", - "operationId": "deleteWebhookEvents", + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", "parameters": [ { - "name": "inboxId", + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33974,6 +41421,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": { @@ -34004,6 +41461,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34035,27 +41512,16 @@ } } } - } - }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}": { - "get": { + }, + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get one captured HTTP event", - "operationId": "getWebhookEvent", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { - "name": "inboxId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "eventId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34064,13 +41530,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEventDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -34095,6 +41571,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 +41611,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34156,16 +41662,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete one captured event", - "operationId": "deleteWebhookEvent", + "summary": "Get incident details with timeline", + "operationId": "getIncident", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34174,7 +41682,7 @@ } }, { - "name": "eventId", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -34184,8 +41692,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -34207,6 +41722,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 +41762,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34268,18 +41813,16 @@ } } } - } - }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}/raw": { - "get": { + }, + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Signed URL for the raw captured request", - "operationId": "getWebhookEventRaw", + "summary": "Update an incident", + "operationId": "updateIncident", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34288,7 +41831,7 @@ } }, { - "name": "eventId", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -34297,13 +41840,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -34328,6 +41881,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 +41921,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34389,48 +41972,49 @@ } } } - } - }, - "/api/v1/webhook/inboxes/{inboxId}/wait": { - "post": { + }, + "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Wait for the oldest matching captured HTTP event", - "operationId": "waitForWebhookEvent", + "summary": "Delete an incident", + "operationId": "deleteIncident", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WaitWebhookEventRequest" - } + }, + { + "name": "incidentId", + "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/WaitWebhookEventResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -34439,8 +42023,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34469,8 +42053,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 +42063,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,41 +42116,49 @@ } } }, - "/api/v1/webhook/inboxes/activity": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Last-24h received-request activity for webhook inboxes", - "operationId": "listWebhookInboxActivity", + "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", + "operationId": "dismissIncident", "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" + } + }, + { + "name": "incidentId", + "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/SingleValueResponseListWebhookInboxActivityDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -34565,8 +42167,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34605,6 +42207,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34638,30 +42260,49 @@ } } }, - "/api/v1/webhooks": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -34686,6 +42327,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": { @@ -34716,8 +42367,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": { @@ -34726,7 +42377,27 @@ } } }, - "502": { + "429": { + "description": "Too many requests — retry 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": { @@ -34747,18 +42418,40 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { "post": { "tags": [ - "Webhooks" + "Status Pages" + ], + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } }, @@ -34770,7 +42463,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -34795,6 +42488,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 +42528,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +42581,13 @@ } } }, - "/api/v1/webhooks/{id}": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", "parameters": [ { "name": "id", @@ -34874,15 +42597,43 @@ "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/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -34907,6 +42658,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": { @@ -34937,6 +42698,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +42749,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/layout/reorder": { "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", "parameters": [ { "name": "id", @@ -34990,25 +42773,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + "$ref": "#/components/schemas/ReorderPageLayoutRequest" } } }, "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/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -35017,8 +42803,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35057,6 +42843,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +42894,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/maintenance": { + "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", "parameters": [ { "name": "id", @@ -35104,11 +42912,43 @@ "type": "string", "format": "uuid" } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -35130,6 +42970,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 +43010,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35191,15 +43061,13 @@ } } } - } - }, - "/api/v1/webhooks/{id}/deliveries": { - "get": { + }, + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", "parameters": [ { "name": "id", @@ -35209,25 +43077,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35252,6 +43120,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 +43160,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35315,13 +43213,13 @@ } } }, - "/api/v1/webhooks/{id}/test": { - "post": { + "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Send a test delivery to a webhook endpoint", - "operationId": "test", + "summary": "Get a maintenance window with timeline", + "operationId": "getMaintenance", "parameters": [ { "name": "id", @@ -35331,24 +43229,24 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" - } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35373,6 +43271,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": { @@ -35403,6 +43311,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35434,23 +43362,50 @@ } } } - } - }, - "/api/v1/webhooks/events": { - "get": { + }, + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List all available webhook event types", - "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", - "operationId": "listEvents", + "summary": "Update 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/WebhookEventCatalogResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35475,6 +43430,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": { @@ -35505,6 +43470,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35536,28 +43521,49 @@ } } } - } - }, - "/api/v1/webhooks/signing-secret": { - "get": { + }, + "delete": { "tags": [ - "Webhooks" + "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" + } + } ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -35566,8 +43572,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35606,8 +43612,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": { @@ -35616,8 +43622,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": { @@ -35626,8 +43632,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -35635,27 +43641,60 @@ } } } - } - } - } - }, - "/api/v1/webhooks/signing-secret/rotate": { - "post": { - "tags": [ - "Webhooks" - ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseString" + "$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", @@ -35677,6 +43716,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": { @@ -35707,6 +43756,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +43809,49 @@ } } }, - "/api/v1/workspaces": { - "get": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "post": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "List workspaces", - "operationId": "list_1", + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "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/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35788,6 +43876,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 +43916,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35849,18 +43967,40 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { "post": { "tags": [ - "Workspaces" + "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" + } + } ], - "summary": "Create workspace", - "operationId": "create_2", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWorkspaceRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } }, @@ -35872,7 +44012,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35897,6 +44037,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 +44077,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +44130,59 @@ } } }, - "/api/v1/workspaces/{workspaceId}": { - "get": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Get workspace by ID", - "operationId": "get", + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "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/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -36009,6 +44207,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 +44247,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36070,41 +44298,57 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Update workspace", - "operationId": "update", + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRequest" - } + }, + { + "name": "incidentId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "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/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" } } } @@ -36129,6 +44373,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 +44413,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36190,27 +44464,45 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Delete workspace", - "operationId": "delete", + "summary": "Get a notification delivery receipt", + "operationId": "getNotificationDelivery", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -36232,6 +44524,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 +44564,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36295,41 +44617,41 @@ } } }, - "/api/v1/workspaces/{workspaceId}/runtime-profile": { - "put": { + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + "post": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Set workspace execution environment", - "operationId": "updateRuntime", + "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": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRuntimeRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" } } } @@ -36354,6 +44676,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 +44716,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36416,25 +44768,6168 @@ } } } - } - }, - "components": { - "schemas": { - "AcknowledgeAllIncidentsResponse": { - "required": [ - "acknowledged", - "skipped" + }, + "/api/v1/status-pages/{id}/subscribers": { + "get": { + "tags": [ + "Status Pages" ], - "type": "object", - "properties": { - "acknowledged": { - "type": "array", - "description": "Dispatches successfully acknowledged in this request", - "items": { - "$ref": "#/components/schemas/NotificationDispatchDto" + "summary": "List subscribers including awaiting confirmation (paginated)", + "operationId": "listSubscribers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "skipped": { + { + "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/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": { + "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": [ + "Workspaces" + ], + "summary": "Delete workspace", + "operationId": "delete", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — 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}/runtime-profile": { + "put": { + "tags": [ + "Workspaces" + ], + "summary": "Set workspace execution environment", + "operationId": "updateRuntime", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkspaceRuntimeRequest" + } + } + }, + "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": { + "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" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AcknowledgeAllIncidentsResponse": { + "required": [ + "acknowledged", + "skipped" + ], + "type": "object", + "properties": { + "acknowledged": { + "type": "array", + "description": "Dispatches successfully acknowledged in this request", + "items": { + "$ref": "#/components/schemas/NotificationDispatchDto" + } + }, + "skipped": { "type": "array", "description": "Dispatches skipped (already acked or not in an acknowledgeable state)", "items": { @@ -36990,6 +51485,7 @@ "createdAt", "key", "name", + "scopes", "id" ], "type": "object", @@ -37019,6 +51515,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 +51544,7 @@ "createdAt", "key", "name", + "scopes", "updatedAt", "id" ], @@ -37075,10 +51592,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 +51846,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 +51880,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 +51897,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 +52066,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 +52154,12 @@ "RESUME", "DELETE", "ADD_TAG", - "REMOVE_TAG" + "REMOVE_TAG", + "UPDATE_SCHEDULE", + "RUN", + "MUTE", + "UNMUTE", + "ACKNOWLEDGE" ] }, "tagIds": { @@ -37540,6 +52179,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 +52225,49 @@ }, "description": "Result of a bulk monitor action, including partial-success details" }, + "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", @@ -38047,6 +52745,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 +52792,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 +53307,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 +53484,83 @@ }, "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 + } + } + }, + "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 +53820,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,11 +53907,11 @@ "format": "uuid", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" } ] } @@ -39101,20 +53964,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 +54741,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 +54819,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 +55196,19 @@ "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" + } } }, "description": "Active Head for a definition in one environment" @@ -40407,35 +55347,6 @@ }, "description": "Single delivery attempt with request/response audit data" }, - "DemandedKeyLocation": { - "required": [ - "key" - ], - "type": "object", - "properties": { - "key": { - "maxLength": 255, - "minLength": 0, - "type": "string", - "description": "Secret name the code reads" - }, - "declaringFile": { - "maxLength": 512, - "minLength": 0, - "type": "string", - "description": "Declaring file path inside the zip", - "nullable": true - }, - "declaringLocation": { - "maxLength": 255, - "minLength": 0, - "type": "string", - "description": "Call site from package scan, e.g. signIn(…) · line 6", - "nullable": true - } - }, - "description": "Per-key declaring file and location from package scan" - }, "DeployLockDto": { "required": [ "expiresAt", @@ -40468,6 +55379,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 +56292,67 @@ }, "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" + } + }, + "description": "Full entitlement state for an organization: resolved limits, usage, and trial info" + }, "EnvironmentDto": { "required": [ "createdAt", @@ -41391,7 +56465,6 @@ }, "ErrorNext": { "type": "object", - "description": "Command and documentation that fix this error", "properties": { "command": { "type": "string", @@ -41405,16 +56478,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 +56613,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 +56629,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 +56654,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 +56724,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 +56775,47 @@ "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" }, + "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 +58024,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 +58610,14 @@ "format": "date-time", "nullable": true }, + "triggeringRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, "source": { "minLength": 1, "type": "string", @@ -43772,6 +58935,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 +59060,7 @@ "required": [ "createdAt", "name", + "scopes", "id" ], "type": "object", @@ -43887,6 +59090,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 +59133,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", @@ -44889,6 +60136,172 @@ } } }, + "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 + } + }, + "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 +60314,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 +60360,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 +60418,7 @@ "organizationId", "frequencySeconds", "enabled", + "ownerEnforced", "muted" ], "type": "object", @@ -45029,6 +60504,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,6 +60605,7 @@ "infra", "flaky", "blocked", + "capped", "paused", "never_run", "confirming" @@ -45152,18 +60632,114 @@ "format": "uuid", "nullable": true }, - "lastRunAt": { + "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": "When the latest code run was enqueued", - "format": "date-time", + "description": "Why the latest failing region failed", "nullable": true }, - "lastRunId": { + "lastStateChangeAt": { "type": "string", - "description": "Latest code run id", - "format": "uuid", + "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", @@ -45237,128 +60813,465 @@ "description": "Quarantine reason", "nullable": true }, - "upload": { + "usageProjection": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/PackageUploadDto" + "$ref": "#/components/schemas/MonitorUsageProjectionDto" } ] }, - "usageProjection": { + "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/MonitorUsageProjectionDto" + "$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" }, - "MonitorOverlayRequest": { + "MonitorFacetDto": { + "required": [ + "field", + "values" + ], "type": "object", "properties": { - "reason": { - "maxLength": 280, - "minLength": 0, + "field": { "type": "string", - "description": "Optional human-readable reason (max 280)", + "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" + ] + }, + "failing": { + "type": "integer", + "description": "Matching monitors currently failing", + "format": "int64", "nullable": true }, - "expiresAt": { + "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": "When this overlay expires", - "format": "date-time", + "description": "Owning tool for a project facet value", + "nullable": true, + "enum": [ + "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" + }, + "from": { + "type": "string", + "description": "Previous setting value", + "nullable": true + }, + "to": { + "type": "string", + "description": "New setting value", "nullable": true } - } + }, + "description": "One non-secret setting changed by a monitor action" }, - "MonitorPackageSpec": { + "MonitorFleetSummaryDto": { "required": [ - "digest", - "entrypoint", - "files" + "from", + "groups", + "ticks", + "to", + "window", + "openIncidentCount" ], "type": "object", "properties": { - "digest": { - "maxLength": 64, - "minLength": 64, + "window": { "type": "string", - "description": "SHA-256 hex digest of the package zip (64 characters)" + "description": "Window: 24h, 7d, or 30d" }, - "entrypoint": { - "maxLength": 512, - "minLength": 0, + "from": { "type": "string", - "description": "Entrypoint path inside the zip, e.g. tests/login.spec.ts" + "description": "Inclusive start of the history window", + "format": "date-time" }, - "files": { - "maxItems": 256, - "minItems": 0, + "to": { + "type": "string", + "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 + }, + "lastFailureBucketAt": { + "type": "string", + "description": "Start of the most recent failing display bucket", + "format": "date-time", + "nullable": true + }, + "openIncidentCount": { + "type": "integer", + "description": "Open confirmed monitor incidents", + "format": "int64" + }, + "groups": { "type": "array", - "description": "Relative file paths included in the zip", + "description": "Current monitor group counts, independent of list filters", "items": { - "maxLength": 512, - "minLength": 0, - "type": "string", - "description": "Relative file paths included in the zip" + "$ref": "#/components/schemas/MonitorListGroupDto" } }, - "keys": { - "maxItems": 64, - "minItems": 0, + "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": "Row kind: not_run" + }, + "monitorId": { + "type": "string", + "description": "Monitor this row belongs to", + "format": "uuid" + }, + "region": { + "type": "string", + "description": "Region of the skipped ticks; null when they span several regions", + "nullable": true + }, + "reason": { + "type": "string", + "description": "Why the ticks were skipped: quota, blocked, or plan_limit" + }, + "from": { + "type": "string", + "description": "First skipped tick in this collapsed row", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Latest skipped tick in this collapsed row", + "format": "date-time" + }, + "count": { + "type": "integer", + "description": "Skipped ticks collapsed into this row", + "format": "int32" + }, + "missingKeys": { "type": "array", - "description": "Secret names the zip demanded. PUT: null preserves, [] clears", + "description": "Secret keys recorded as missing for this interval", "nullable": true, "items": { - "maxLength": 255, - "minLength": 0, "type": "string", - "description": "Secret names the zip demanded. PUT: null preserves, [] clears" + "description": "Secret keys recorded as missing for this interval" } }, - "gitSha": { - "maxLength": 64, - "minLength": 0, + "environment": { "type": "string", - "description": "Commit SHA from the repo that produced this zip. Client-supplied provenance only", + "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" }, - "gitMessage": { - "maxLength": 1024, + "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" + } + }, + "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, + "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": "Number of monitors in one list group" + }, + "MonitorOverlayRequest": { + "type": "object", + "properties": { + "reason": { + "maxLength": 280, "minLength": 0, "type": "string", - "description": "Commit message from the repo that produced this zip", + "description": "Optional human-readable reason (max 280)", "nullable": true }, - "gitFile": { - "maxLength": 512, - "minLength": 0, + "expiresAt": { "type": "string", - "description": "Path of the declaring file in that repo", + "description": "When this overlay expires", + "format": "date-time", "nullable": true + } + } + }, + "MonitorOwnerDto": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] }, - "authoredBy": { - "maxLength": 255, - "minLength": 0, + "project": { "type": "string", - "description": "Author attribution supplied with the package", + "description": "Project the owning tool declares; null when it declares none", "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" + ] }, - "keyLocations": { - "maxItems": 64, - "minItems": 0, - "type": "array", - "description": "Per-key declaring file and location from package scan", + "fromOwner": { + "type": "string", + "description": "Owning tool before the change", "nullable": true, - "items": { - "$ref": "#/components/schemas/DemandedKeyLocation" - } + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "toOwner": { + "type": "string", + "description": "Owning tool after the change", + "nullable": true, + "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": [ @@ -45379,6 +61292,86 @@ }, "description": "Monitors that reference this secret for authentication" }, + "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": [ "from", @@ -45475,7 +61468,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 +61492,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 +61515,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", @@ -45659,6 +61798,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 +61925,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 +62008,134 @@ "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 + } + } + }, "MonitorUsageProjectionDto": { "type": "object", "properties": { @@ -45898,6 +62194,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 +62376,7 @@ }, "NearestOtherRegion": { "required": [ - "artifactId", + "finishedAt", "region", "runId" ], @@ -45966,20 +62384,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 +63193,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,35 +63273,6 @@ }, "description": "Overview step catalog joined to run-step aggregates" }, - "PackageUploadDto": { - "required": [ - "expiresAt", - "putUrl", - "requiredHeaders" - ], - "type": "object", - "properties": { - "putUrl": { - "minLength": 1, - "type": "string", - "description": "Presigned PUT URL for the zip bytes" - }, - "expiresAt": { - "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": "Signed package upload target" - }, "Pageable": { "type": "object", "properties": { @@ -47021,6 +63417,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 +63503,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 +63647,29 @@ "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 } } }, @@ -47457,6 +63937,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 +64742,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 +64939,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 +64968,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 +64994,100 @@ "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" + } + ] } }, "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" + ] + }, "RollbackPreviewDto": { "required": [ "affectedMonitors", @@ -48364,21 +65118,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": "Set true for an emergency rollback", + "nullable": true + }, + "expectedLiveRevisionId": { + "type": "string", + "description": "Live revision this rollback replaces; null skips the check", + "format": "uuid", + "nullable": true } } }, @@ -48904,7 +65669,8 @@ "last_pass_same_revision_region", "last_pass_any_revision", "attempts_in_run", - "none" + "none", + "selected_run" ] }, "readsAs": { @@ -48925,6 +65691,14 @@ "items": { "$ref": "#/components/schemas/PickerItem" } + }, + "nearestOtherRegion": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NearestOtherRegion" + } + ] } }, "description": "Step duration diff against a prior pass" @@ -48950,7 +65724,8 @@ "cancelRequested", "stream", "attempt", - "attemptOf" + "attemptOf", + "billable" ], "type": "object", "properties": { @@ -49010,6 +65785,14 @@ "description": "Revision this run executed", "format": "uuid" }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + }, "region": { "minLength": 1, "type": "string", @@ -49037,6 +65820,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 +65929,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 +66040,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 +66329,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 +66432,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 +66453,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 +66468,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 +66701,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 +66823,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 +66930,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 +67232,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 +67358,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 +67530,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 +67543,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 } } @@ -51403,6 +68840,17 @@ } } }, + "SingleValueResponseArtifactDownloadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ArtifactDownloadDto" + } + } + }, "SingleValueResponseAuthMeResponse": { "required": [ "data" @@ -51436,6 +68884,17 @@ } } }, + "SingleValueResponseBundleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleDto" + } + } + }, "SingleValueResponseCaptureCompareDto": { "required": [ "data" @@ -51458,6 +68917,17 @@ } } }, + "SingleValueResponseCreateDraftRevisionResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateDraftRevisionResponse" + } + } + }, "SingleValueResponseDashboardOverviewDto": { "required": [ "data" @@ -51513,6 +68983,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 +69038,17 @@ } } }, + "SingleValueResponseEntitlementResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EntitlementResponse" + } + } + }, "SingleValueResponseEnvironmentDto": { "required": [ "data" @@ -51648,6 +69151,20 @@ } } }, + "SingleValueResponseListRegionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegionDto" + } + } + } + }, "SingleValueResponseListUUID": { "required": [ "data" @@ -51722,6 +69239,17 @@ } } }, + "SingleValueResponseMonitorBatchHistoryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorBatchHistoryDto" + } + } + }, "SingleValueResponseMonitorDriftDto": { "required": [ "data" @@ -51744,6 +69272,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 +69327,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 +69404,17 @@ } } }, + "SingleValueResponseMonitorValidationResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorValidationResultDto" + } + } + }, "SingleValueResponseMonitorVersionDto": { "required": [ "data" @@ -51887,25 +69481,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 +69569,17 @@ } } }, + "SingleValueResponseRevisionFilesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionFilesDto" + } + } + }, "SingleValueResponseRollbackPreviewDto": { "required": [ "data" @@ -52030,6 +69635,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 +69668,17 @@ } } }, + "SingleValueResponseRunTraceSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunTraceSummaryDto" + } + } + }, "SingleValueResponseSecretAuditDto": { "required": [ "data" @@ -52316,6 +69954,17 @@ } } }, + "SingleValueResponseTriggerRunsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerRunsResponse" + } + } + }, "SingleValueResponseUptimeDto": { "required": [ "data" @@ -52753,6 +70402,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 +71458,9 @@ } } }, + "StreamingResponseBody": { + "type": "object" + }, "Summary": { "required": [ "id", @@ -54749,38 +72448,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 +73707,39 @@ }, "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 + } + } + }, "TriggerRule": { "required": [ "scope", @@ -56106,6 +73806,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 +74659,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 +74750,29 @@ "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 } } }, @@ -58131,6 +75948,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..fe28d9f 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): @@ -689,18 +801,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 +1068,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 +1093,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 +1115,44 @@ 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 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,18 +1317,6 @@ class Type(StrEnum): multi_step_api = "MULTI_STEP_API" -class CreatePackageUploadRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - digest: Annotated[ - str, - Field( - description="SHA-256 hex digest of the package zip to upload (64 chars)", - max_length=64, - min_length=64, - ), - ] - - class HealthThresholdType(StrEnum): count = "COUNT" # type: ignore[assignment] percentage = "PERCENTAGE" @@ -1679,32 +1857,6 @@ class DeliveryAttemptDto(BaseModel): attempted_at: Annotated[AwareDatetime, Field(alias="attemptedAt")] -class DemandedKeyLocation(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), - ] - declaring_file: Annotated[ - str | None, - Field( - alias="declaringFile", - description="Declaring file path inside the zip", - max_length=512, - min_length=0, - ), - ] = None - declaring_location: Annotated[ - str | None, - Field( - alias="declaringLocation", - description="Call site from package scan, e.g. signIn(…) · line 6", - max_length=255, - min_length=0, - ), - ] = None - - class DeployLockDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique lock identifier")] @@ -1729,6 +1881,86 @@ class DeployLockDto(BaseModel): ] +class DeviceAuthorizationDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + device_code: Annotated[ + str, + Field( + alias="deviceCode", + description="Secret code the CLI sends when polling for the API key", + min_length=1, + ), + ] + user_code: Annotated[ + str, + Field( + alias="userCode", + description="Short code the user confirms in the dashboard, e.g. ABCD-EFGH", + min_length=1, + ), + ] + 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 DeviceTokenDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + 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" @@ -2109,6 +2341,47 @@ 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" + ), + ] + + class EnvironmentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique environment identifier")] @@ -2323,11 +2596,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 +2648,60 @@ 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 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 +3514,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 +3675,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 +3697,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[ @@ -3846,201 +4128,319 @@ 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 -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, ), - ] = None - git_message: Annotated[ - str | None, + ] + 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( - alias="gitMessage", - description="Commit message from the repo that produced this zip", - max_length=1024, - min_length=0, + description="Field name: enabled, muted, quarantine, or managedBy", + min_length=1, ), - ] = None - git_file: Annotated[ - str | None, + ] + 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( - alias="gitFile", - description="Path of the declaring file in that repo", - max_length=512, - min_length=0, + description="Value as the list filter takes it: type name, environment id, region, tag name, or owner", + min_length=1, ), - ] = None - authored_by: Annotated[ - str | None, + ] + count: Annotated[int, Field(description="Monitors with this value")] + worst_state: Annotated[ + str, Field( - alias="authoredBy", - description="Author attribution supplied with the package", - max_length=255, - min_length=0, + alias="worstState", + description="Most severe displayHealth among the monitors with this value", ), + ] + failing: Annotated[ + int | None, Field(description="Matching monitors currently failing") ] = None - key_locations: Annotated[ - list[DemandedKeyLocation] | None, + not_running: Annotated[ + int | None, Field( - alias="keyLocations", - description="Per-key declaring file and location from package scan", - max_length=64, - min_length=0, + alias="notRunning", description="Matching monitors currently unable to run" ), ] = None + 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 MonitorReference(BaseModel): +class MonitorFieldChange(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Monitor identifier")] - name: Annotated[str, Field(description="Monitor name")] + 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 MonitorRunDurationMetricDto(BaseModel): +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 identifier") + UUID, Field(alias="monitorId", description="Monitor this row belongs to") ] - sample_count: Annotated[ - int, + region: Annotated[ + str | None, Field( - alias="sampleCount", description="Finished runs with a measured duration" + description="Region of the skipped ticks; null when they span several regions" ), + ] = None + reason: Annotated[ + str, + Field(description="Why the ticks were skipped: quota, blocked, or plan_limit"), ] - p50_duration_ms: Annotated[ - float | None, + 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="p50DurationMs", - description="Median execution duration in milliseconds", + 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 MonitorRunDurationSummaryDto(BaseModel): +class MonitorHistoryTickDto(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") - ] - sample_count: Annotated[ - int, + at: Annotated[AwareDatetime, Field(description="Start of the bucket")] + outcome: Annotated[ + str, Field( - alias="sampleCount", - description="Number of finished runs with a measured execution duration", + description="PASSED when every check passed, FAILED when none did, otherwise DEGRADED" ), ] - p50_duration_ms: Annotated[ - float | None, + + +class MonitorListGroupDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + key: Annotated[ + str, Field( - alias="p50DurationMs", - description="Median execution duration in milliseconds; null when no durations were measured", + description="Group: failing, not_running, flaky, passing, running, or paused" ), - ] = None + ] + count: Annotated[int, Field(description="Monitors in the group")] -class MonitorRunListParams(BaseModel): +class MonitorOverlayRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - phase: Annotated[ + reason: Annotated[ + str | None, + Field( + description="Optional human-readable reason (max 280)", + max_length=280, + min_length=0, + ), + ] = 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( + description="Project the owning tool declares; null when it declares none" + ), + ] = 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): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Monitor identifier")] + 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[ + UUID, Field(alias="monitorId", description="Monitor identifier") + ] + sample_count: Annotated[ + int, + Field( + alias="sampleCount", description="Finished runs with a measured duration" + ), + ] + p50_duration_ms: Annotated[ + float | None, + Field( + alias="p50DurationMs", + description="Median execution duration in milliseconds", + ), + ] = None + + +class MonitorRunDurationSummaryDto(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") + ] + sample_count: Annotated[ + int, + Field( + alias="sampleCount", + description="Number of finished runs with a measured execution duration", + ), + ] + p50_duration_ms: Annotated[ + float | None, + Field( + alias="p50DurationMs", + description="Median execution duration in milliseconds; null when no durations were measured", + ), + ] = None + + +class MonitorRunListParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + phase: Annotated[ str | None, Field(description="Filter by run phase; not_finished excludes finished runs"), ] = None 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 +4452,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 +4472,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): @@ -4138,6 +4616,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 +4681,49 @@ 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 MonitorUsageProjectionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) meter: Annotated[ @@ -4260,14 +4787,78 @@ 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" + ), + ] + message: Annotated[str, Field(description="What is wrong")] + field: Annotated[ + str | None, Field(description="Request field this finding refers to") + ] = None + 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 + environment: Annotated[ + str | None, Field(description="Destination environment slug or id") + ] = None + 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"), ] @@ -4658,6 +5249,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,29 +5312,6 @@ class OverviewStepsDto(BaseModel): ] -class PackageUploadDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - put_url: Annotated[ - str, - Field( - alias="putUrl", - description="Presigned PUT URL for the zip bytes", - min_length=1, - ), - ] - expires_at: Annotated[ - AwareDatetime, - Field(alias="expiresAt", description="When the signed URL expires"), - ] - required_headers: Annotated[ - dict[str, str], - Field( - alias="requiredHeaders", - description="Must send Content-Type: application/zip and If-None-Match: *", - ), - ] - - class Pageable(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) page: Annotated[int, Field(ge=0)] @@ -4825,17 +5400,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 +5429,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,18 +5535,45 @@ 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 + + +class Status7(StrEnum): + investigating = "INVESTIGATING" + identified = "IDENTIFIED" + monitoring = "MONITORING" + resolved = "RESOLVED" + - -class Status7(StrEnum): - investigating = "INVESTIGATING" - identified = "IDENTIFIED" - monitoring = "MONITORING" - resolved = "RESOLVED" - - class PublishStatusPageIncidentRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) title: Annotated[ @@ -5145,6 +5748,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 +6044,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 +6133,29 @@ 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 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 +6164,16 @@ class RollbackRevisionRequest(BaseModel): min_length=0, ), ] + emergency: Annotated[ + bool | None, Field(description="Set true for an emergency rollback") + ] = 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 +6368,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 +6441,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 +6476,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 +6494,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,10 +6504,79 @@ 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)] + monitor_id: Annotated[ + UUID | None, Field(alias="monitorId", description="Only runs for this monitor") + ] = None + revision_id: Annotated[ + UUID | None, + Field(alias="revisionId", description="Only runs for this revision"), + ] = None + 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 + bucket: Annotated[ + str | None, + Field(description="Histogram width: 30m, 1h or 1d; at most 1000 buckets"), + ] = None class RunLiveDto(BaseModel): @@ -5881,148 +6600,139 @@ class RunLiveDto(BaseModel): ] = None -class RunMetricsSummaryDto(BaseModel): +class RunnerLogLiveEvent(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, + ts: Annotated[str, Field(description="Loki timestamp in nanoseconds")] + 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( - alias="matchingRunCount", - description="Runs matching the complete list filter", + description="ok when both code-monitor types have an active accepting pool; otherwise degraded" ), ] - duration_sample_count: Annotated[ - int, - Field( - alias="durationSampleCount", - description="Finished matching runs with a measured execution duration", - ), + + +class RunnerRegionStatusesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regions: Annotated[ + list[RunnerRegionStatusDto], + Field(description="Acceptance status per public region"), ] - p95_duration_ms: Annotated[ - float | None, - Field( - alias="p95DurationMs", - description="95th percentile execution duration in milliseconds; null when no durations were measured", - ), + + +class RunNetworkParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + attempt: Annotated[ + int | None, Field(description="In-check attempt (default selected attempt)") ] = 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", - ), + failed: Annotated[ + bool | None, Field(description="Only rows with status >= 400 or a failure") ] = None - evidence_processing_run_count: Annotated[ - int | None, - Field( - alias="evidenceProcessingRunCount", - description="Eligible runs with required evidence still processing", - ), + slow: Annotated[ + bool | None, Field(description="Only rows with durationMs >= 1000") ] = None - evidence_no_evidence_policy_run_count: Annotated[ - int | None, - Field( - alias="evidenceNoEvidencePolicyRunCount", - description="Eligible runs with no evidence required by their recorded policy", - ), + step_id: Annotated[ + str | None, Field(alias="stepId", description="Only rows for this step") ] = None - evidence_complete_run_count: Annotated[ - int | None, - Field( - alias="evidenceCompleteRunCount", - description="Eligible runs with all required evidence available", - ), + xhr: Annotated[ + bool | None, Field(description="Only xhr, fetch, and api resource types") ] = None - available_artifact_count: Annotated[ - int | None, - Field( - alias="availableArtifactCount", - description="Required artifact records with an available unexpired object key", - ), + source: Annotated[str | None, Field(description="page or request")] = None + cursor: Annotated[ + str | None, Field(description="Opaque cursor from the previous page") ] = None - processing_artifact_count: Annotated[ - int | 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( - alias="processingArtifactCount", - description="Required artifact records still processing", + description="Caller-provided CI session identifier", + max_length=255, + min_length=0, ), - ] = None - failed_artifact_count: Annotated[ - int | None, + ] + label: Annotated[ + str | None, Field( - alias="failedArtifactCount", - description="Required artifact records with a failed upload", + description="CI session label, such as CI #4812", + max_length=255, + min_length=0, ), ] = None - expired_artifact_count: Annotated[ - int | None, + commit: Annotated[ + str | None, Field( - alias="expiredArtifactCount", - description="Required artifact records marked expired or past their expiry", + description="Commit that started this CI session", + max_length=64, + min_length=0, ), ] = None - missing_artifact_kind_count: Annotated[ - int | None, + branch: Annotated[ + str | None, Field( - alias="missingArtifactKindCount", - description="Required evidence kinds with no artifact record after the run finished", + description="Branch that started this CI session", + max_length=255, + min_length=0, ), ] = None - intentional_no_evidence_artifact_count: Annotated[ - int | None, + url: Annotated[ + str | None, Field( - alias="intentionalNoEvidenceArtifactCount", - description="Required artifact records explicitly suppressed, not reached, or not captured", + description="HTTP or HTTPS URL of the CI job", + max_length=2048, + min_length=0, + pattern="^[hH][tT][tT][pP][sS]?://\\S+$", ), ] = None -class RunnerLogLiveEvent(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - ts: Annotated[str, Field(description="Loki timestamp in nanoseconds")] - line: Annotated[str, Field(description="One runner-log line", min_length=1)] - - -class RunNetworkParams(BaseModel): +class RunSkippedListParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - attempt: Annotated[ - int | None, Field(description="In-check attempt (default selected attempt)") + from_: Annotated[ + AwareDatetime | None, + Field( + alias="from", + description="Inclusive window start; default last 24 hours, clamped to 90 days", + ), ] = None - failed: Annotated[ - bool | None, Field(description="Only rows with status >= 400 or a failure") + to: Annotated[ + AwareDatetime | None, Field(description="Inclusive window end; default now") ] = None - slow: Annotated[ - bool | None, Field(description="Only rows with durationMs >= 1000") + monitor_id: Annotated[ + UUID | None, + Field(alias="monitorId", description="Only entries for this monitor"), ] = None - step_id: Annotated[ - str | None, Field(alias="stepId", description="Only rows for this step") + cursor: Annotated[ + str | None, Field(description="Opaque cursor returned by this endpoint") ] = None - xhr: Annotated[ - bool | None, Field(description="Only xhr, fetch, and api resource types") + 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 - source: Annotated[str | None, Field(description="page or request")] = None - cursor: Annotated[ - str | None, Field(description="Opaque cursor from the previous page") + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), ] = None @@ -6059,7 +6769,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 +6844,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 +6953,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 +6966,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._-]+$", @@ -6786,6 +7533,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 +7553,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 +7573,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 +7598,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 +7628,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 +7653,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 +7673,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 +7688,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,19 +7698,19 @@ class SingleValueResponseRunConsoleDto(BaseModel): data: RunConsoleDto -class SingleValueResponseRunDiffDto(BaseModel): +class SingleValueResponseRunnerRegionStatusesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunDiffDto + data: RunnerRegionStatusesDto -class SingleValueResponseRunMetricsSummaryDto(BaseModel): +class SingleValueResponseRuntimeProfileDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunMetricsSummaryDto + data: RuntimeProfileDto -class SingleValueResponseRuntimeProfileDto(BaseModel): +class SingleValueResponseRunTraceSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RuntimeProfileDto + data: RunTraceSummaryDto class SingleValueResponseSecretDto(BaseModel): @@ -7134,6 +7911,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 +8395,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 @@ -7795,15 +8609,6 @@ class TableValueResultNotificationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRevisionDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - 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 TableValueResultRuleEvaluationDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[RuleEvaluationDto] @@ -8259,14 +9064,45 @@ class TraceNearbyAction(BaseModel): ] -class Type4(StrEnum): - consecutive_failures = "consecutive_failures" - failures_in_window = "failures_in_window" - response_time = "response_time" +class To(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" -class Scope(StrEnum): - per_region = "per_region" +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 + + +class Type4(StrEnum): + consecutive_failures = "consecutive_failures" + failures_in_window = "failures_in_window" + response_time = "response_time" + + +class Scope(StrEnum): + per_region = "per_region" any_region = "any_region" @@ -8324,6 +9160,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[ @@ -9617,6 +10499,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[ @@ -10059,9 +10963,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 +11020,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): @@ -10191,6 +11115,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 +11273,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 +11324,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 +11387,7 @@ class CreateMonitorRequest(BaseModel): description="Existing definition to reuse for a sibling monitor", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None class CreateResourceGroupRequest(BaseModel): @@ -10659,6 +11621,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,26 +11739,6 @@ class DashboardOverviewDto(BaseModel): incidents: IncidentsSummaryDto -class DefinitionHeadDto(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 - - class EmailMessageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Message id")] @@ -11157,6 +12119,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,202 +12391,127 @@ 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" ), - ] = 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 - 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") + ] + + +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 @@ -11636,6 +12530,46 @@ class MonitorRunDurationBatchDto(BaseModel): ] +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="uptimePercent", + description="Passed final target outcomes as a percent of passed and failed", + ), + ] = None + previous_uptime_percent: Annotated[ + float | None, + Field( + alias="previousUptimePercent", + description="Target uptime in the previous equal-length period", + ), + ] = None + 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 + points_truncated: Annotated[ + bool, + Field( + alias="pointsTruncated", + description="More 24h points exist than the returned 2000-point limit", + ), + ] + + class MonitorSecretRequestsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) environment: EnvironmentDto @@ -11668,42 +12602,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 +12765,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 +12928,72 @@ 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 class RunArtifactDto(BaseModel): @@ -12168,23 +13132,214 @@ 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") + field: Annotated[str, Field(description="Filter field these values describe")] + values: Annotated[ + list[Value], Field(description="Values selected by the other filters") ] - 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, + + +class RunHistogramBucketDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start: Annotated[ + AwareDatetime, Field(description="Inclusive UTC start of this bucket") + ] + counts: Annotated[ + list[RunOutcomeCountDto], Field(description="Health-voting run attempt counts") + ] + + +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, + 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"), ] @@ -12198,13 +13353,6 @@ class SecretAuditDto(BaseModel): updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = 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 ServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -12333,11 +13481,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 +13511,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 +13526,14 @@ class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): data: MonitorRunDurationBatchDto -class SingleValueResponseMonitorSecretRequestsDto(BaseModel): +class SingleValueResponseMonitorRunSeriesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorSecretRequestsDto + data: MonitorRunSeriesDto -class SingleValueResponseMonitorVersionDto(BaseModel): +class SingleValueResponseMonitorSecretRequestsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorVersionDto + data: MonitorSecretRequestsDto class SingleValueResponseNetworkRowDto(BaseModel): @@ -12403,19 +13546,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 +13571,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 @@ -12493,6 +13636,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,27 +13844,18 @@ class TableValueResultIntegrationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -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): +class TableValueResultNotificationPolicyDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorVersionDto] + 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 TableValueResultNotificationPolicyDto(BaseModel): +class TableValueResultRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationPolicyDto] + 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 @@ -12958,6 +14097,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 +14163,24 @@ 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 class UpdateNotificationPolicyRequest(BaseModel): @@ -13052,6 +14221,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 +14257,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 +14286,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 +14335,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 +14416,80 @@ 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 -class IncidentDetailDto(BaseModel): +class MonitorBatchHistoryDto(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") + monitors: Annotated[ + list[MonitorBatchHistoryItemDto], + Field( + description="One entry per requested monitor that exists in the workspace" + ), + ] + + +class MonitorDriftDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + 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 +14609,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 +14684,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 +14698,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 +14763,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,6 +14833,36 @@ 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): @@ -13588,14 +14925,24 @@ class SingleValueResponseCheckTraceDto(BaseModel): data: CheckTraceDto -class SingleValueResponseDefinitionDetailDto(BaseModel): +class SingleValueResponseCreateDraftRevisionResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionDetailDto + data: CreateDraftRevisionResponse -class SingleValueResponseIncidentDetailDto(BaseModel): +class SingleValueResponseDefinitionHeadDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: IncidentDetailDto + 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,6 +14950,16 @@ 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 @@ -13646,15 +15003,6 @@ class TableValueResultResourceGroupDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRunDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RunDto] - 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 CheckResultDetailsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) status_code: Annotated[ @@ -13788,3 +15136,712 @@ 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 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 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 + 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