diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 7ba8f4e..bde4171 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,4714 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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/integrations/voice-languages": { + "get": { + "tags": [ + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" + } + } + } + }, + "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/invites": { + "get": { + "tags": [ + "Invites" + ], + "summary": "List invites", + "operationId": "list_11", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultInviteDto" + } + } + } + }, + "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": [ + "Invites" + ], + "summary": "Create invite", + "operationId": "create_12", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateInviteRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseInviteDto" + } + } + } + }, + "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/invites/{inviteId}/resend": { + "post": { + "tags": [ + "Invites" + ], + "summary": "Resend invite", + "operationId": "resend_1", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseInviteDto" + } + } + } + }, + "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/invites/{inviteId}/revoke": { + "post": { + "tags": [ + "Invites" + ], + "summary": "Revoke invite", + "operationId": "revoke", + "parameters": [ + { + "name": "inviteId", + "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/maintenance-windows": { + "get": { + "tags": [ + "Maintenance Windows" + ], + "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": "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + } + } + } + }, + "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": [ + "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/CreateMaintenanceWindowRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "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/maintenance-windows/{id}": { + "get": { + "tags": [ + "Maintenance Windows" + ], + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "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": [ + "Maintenance Windows" + ], + "summary": "Update a maintenance window", + "operationId": "update_12", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "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": [ + "Maintenance Windows" + ], + "summary": "Delete a maintenance window", + "operationId": "delete_8", + "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/members": { + "get": { + "tags": [ + "Members" + ], + "summary": "List organization members", + "operationId": "list_21", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMemberDto" + } + } + } + }, + "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/members/{userId}": { + "delete": { + "tags": [ + "Members" + ], + "summary": "Remove member from organization", + "operationId": "remove_2", + "parameters": [ + { + "name": "userId", + "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/members/{userId}/role": { + "put": { + "tags": [ + "Members" + ], + "summary": "Change member role", + "operationId": "changeRole", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeRoleRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/members/{userId}/status": { + "put": { + "tags": [ + "Members" + ], + "summary": "Change member status", + "operationId": "changeStatus", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "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": { + "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/monitors": { + "get": { + "tags": [ + "Monitors" + ], + "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": "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", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "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": [ + "Monitors" + ], + "summary": "Create a new monitor", + "operationId": "create_10", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "Get a single monitor by id", + "operationId": "get_6", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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": [ + "Monitors" + ], + "summary": "Update a monitor", + "operationId": "update_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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": [ + "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", + "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/monitors/{id}/drift": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "IaC-declared baseline vs live overlays", + "operationId": "drift", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + } + } + } + }, + "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/monitors/{id}/history": { + "get": { + "tags": [ + "Monitor History" + ], + "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", + "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 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageMonitorHistoryEntryDto" + } + } + } + }, + "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/monitors/{id}/mute": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}/overview/steps": { + "get": { + "tags": [ + "Check Results" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "window", + "in": "query", + "description": "Time window for step aggregates", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" + } + } + } + }, + "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/monitors/{id}/pause": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Pause a monitor", + "operationId": "pause", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}/publish": { + "post": { + "tags": [ + "Monitor definitions" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + } + } + } + }, + "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/monitors/{id}/quarantine": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Quarantine a monitor", + "operationId": "quarantine", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuarantineMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}/release-quarantine": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Release quarantine", + "operationId": "releaseQuarantine", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}/restore": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Restore a deleted monitor", + "description": "Restores the monitor, its status-page components and its schedule. Counts against the plan's monitor limit.", + "operationId": "restore", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "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/monitors/{id}/results": { + "get": { + "tags": [ + "Check Results" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "from", + "in": "query", + "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1–200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Paginated check results", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "400": { + "description": "Invalid query parameters", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "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": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "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/monitors/{id}/results/by-region": { + "get": { + "tags": [ + "Check Results" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "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" + ] + } + }, + { + "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": "Per-region chart series", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/RegionResultSeriesDto" + } + } + } + }, + "400": { + "description": "Invalid window or region parameter", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "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": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "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/monitors/{id}/results/summary": { + "get": { + "tags": [ + "Check Results" + ], + "summary": "Get results summary", + "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", + "operationId": "getSummary", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "chartWindow", + "in": "query", + "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], + "responses": { + "200": { + "description": "Results summary", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ResultSummaryDto" + } + } + } + }, + "400": { + "description": "Invalid chartWindow parameter", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "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": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "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": { @@ -10471,27 +17390,34 @@ } } }, - "/api/v1/members/{userId}": { - "delete": { + "/api/v1/monitors/{id}/resume": { + "post": { "tags": [ - "Members" + "Monitors" ], - "summary": "Remove member from organization", - "operationId": "remove_2", + "summary": "Resume a paused monitor", + "operationId": "resume", "parameters": [ { - "name": "userId", + "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/SingleValueResponseMonitorDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10513,6 +17439,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +17479,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +17532,188 @@ } } }, - "/api/v1/members/{userId}/role": { - "put": { + "/api/v1/monitors/{id}/revisions": { + "get": { "tags": [ - "Members" + "Monitor definitions" ], - "summary": "Change member role", - "operationId": "changeRole", + "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": "userId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRevisionDto" + } + } + } + }, + "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": [ + "Monitor definitions" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "X-DevHelm-Client", + "in": "header", + "required": false, + "schema": { + "type": "string" } } ], @@ -10598,18 +17721,179 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" + "$ref": "#/components/schemas/CreateDraftRevisionRequest" } } }, "required": true }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseCreateDraftRevisionResponse" + } + } + } + }, + "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/monitors/{id}/revisions/{revisionId}": { + "delete": { + "tags": [ + "Monitor definitions" + ], + "summary": "Discard a draft revision", + "operationId": "discardDraft", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "204": { "description": "No Content" }, - "400": { - "description": "Bad request — the payload failed validation", + "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": { @@ -10618,8 +17902,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -10658,6 +17942,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10691,21 +17995,31 @@ } } }, - "/api/v1/members/{userId}/status": { - "put": { + "/api/v1/monitors/{id}/revisions/{revisionId}/test": { + "post": { "tags": [ - "Members" + "Monitor definitions" ], - "summary": "Change member status", - "operationId": "changeStatus", + "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": "userId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -10713,15 +18027,21 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "$ref": "#/components/schemas/CodeTestTargetRequest" } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10743,6 +18063,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18103,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,170 +18156,42 @@ } } }, - "/api/v1/monitors": { - "get": { + "/api/v1/monitors/{id}/rollback": { + "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "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": "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": "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, + "name": "id", + "in": "path", + "required": true, "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", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RollbackRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -10994,6 +18216,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18256,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +18307,43 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/rollback-preview": { + "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to preview; null previews the previous live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" } } } @@ -11103,6 +18368,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11133,6 +18408,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +18461,14 @@ } } }, - "/api/v1/monitors/{id}": { - "get": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ "Monitors" ], - "summary": "Get a single monitor by id", - "operationId": "get_6", + "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", @@ -11215,6 +18511,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18551,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11276,13 +18602,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/runs": { + "get": { "tags": [ - "Monitors" + "Monitor Runs" ], - "summary": "Update a monitor", - "operationId": "update_11", + "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", @@ -11292,25 +18621,23 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorRunListParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -11335,6 +18662,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11365,6 +18702,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11397,13 +18754,13 @@ } } }, - "delete": { + "post": { "tags": [ - "Monitors" + "Monitor Runs" ], - "summary": "Soft-delete a monitor", - "description": "Also deletes status-page components that represent this monitor. The parent status page stays.", - "operationId": "delete_7", + "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", @@ -11413,11 +18770,26 @@ "type": "string", "format": "uuid" } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { - "204": { - "description": "No Content" + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -11439,6 +18811,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11469,6 +18851,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11502,13 +18904,14 @@ } } }, - "/api/v1/monitors/{id}/drift": { + "/api/v1/monitors/{id}/runs/summary": { "get": { "tags": [ - "Monitors" + "Monitor Runs" ], - "summary": "IaC-declared baseline vs live overlays", - "operationId": "drift", + "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", @@ -11526,7 +18929,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" } } } @@ -11551,6 +18954,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18994,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11614,13 +19047,13 @@ } } }, - "/api/v1/monitors/{id}/mute": { - "post": { + "/api/v1/monitors/{id}/secret-requests": { + "get": { "tags": [ - "Monitors" + "Monitor secret requests" ], - "summary": "Mute alert delivery without flipping enabled", - "operationId": "mute", + "summary": "List secret requests for a monitor", + "operationId": "list_20", "parameters": [ { "name": "id", @@ -11632,22 +19065,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -11672,6 +19096,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19136,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11735,14 +19189,13 @@ } } }, - "/api/v1/monitors/{id}/overview/steps": { - "get": { + "/api/v1/monitors/{id}/secret-requests/{key}": { + "put": { "tags": [ - "Check Results" + "Monitor secret requests" ], - "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": "Attach or clear a remapped secret for a key", + "operationId": "remap", "parameters": [ { "name": "id", @@ -11754,28 +19207,31 @@ } }, { - "name": "window", - "in": "query", - "description": "Time window for step aggregates", - "required": false, + "name": "key", + "in": "path", + "required": true, "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemapSecretRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -11800,6 +19256,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -11830,6 +19296,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +19349,13 @@ } } }, - "/api/v1/monitors/{id}/pause": { + "/api/v1/monitors/{id}/secret-requests/rescan": { "post": { "tags": [ - "Monitors" + "Monitor secret requests" ], - "summary": "Pause a monitor", - "operationId": "pause", + "summary": "Rescan secret requests from the active package", + "operationId": "rescan", "parameters": [ { "name": "id", @@ -11881,22 +19367,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -11921,6 +19398,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19438,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +19491,13 @@ } } }, - "/api/v1/monitors/{id}/publish": { - "post": { + "/api/v1/monitors/{id}/session": { + "get": { "tags": [ - "Monitor definitions" + "Monitor session" ], - "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": "Get the monitor session", + "operationId": "getSession", "parameters": [ { "name": "id", @@ -12003,23 +19509,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishRevisionRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -12044,6 +19540,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12074,6 +19580,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12105,15 +19631,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/quarantine": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Monitor session" ], - "summary": "Quarantine a monitor", - "operationId": "quarantine", + "summary": "Create or update the monitor session", + "operationId": "putSession", "parameters": [ { "name": "id", @@ -12129,7 +19653,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QuarantineMonitorRequest" + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" } } }, @@ -12141,7 +19665,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -12166,6 +19690,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12196,6 +19730,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +19783,13 @@ } } }, - "/api/v1/monitors/{id}/release-quarantine": { + "/api/v1/monitors/{id}/session/renew": { "post": { "tags": [ - "Monitors" + "Monitor session" ], - "summary": "Release quarantine", - "operationId": "releaseQuarantine", + "summary": "Renew the monitor session", + "operationId": "renewSession", "parameters": [ { "name": "id", @@ -12248,12 +19802,12 @@ } ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -12278,6 +19832,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19872,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +19925,13 @@ } } }, - "/api/v1/monitors/{id}/results": { - "get": { + "/api/v1/monitors/{id}/session/revoke": { + "post": { "tags": [ - "Check Results" + "Monitor session" ], - "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": "Revoke the monitor session", + "operationId": "revokeSession", "parameters": [ { "name": "id", @@ -12358,84 +19941,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "from", - "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response for pagination", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Maximum results per page (1–200)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 - }, - { - "name": "region", - "in": "query", - "description": "Filter by region (e.g. us-east)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "passed", - "in": "query", - "description": "Filter by pass/fail status", - "required": false, - "schema": { - "type": "boolean" - } } ], "responses": { "200": { - "description": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } }, "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 +19974,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 +20014,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12513,14 +20067,13 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { + "/api/v1/monitors/{id}/settings/preview": { "get": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", + "summary": "Projected run volume and meter headroom", + "operationId": "settingsPreview", "parameters": [ { "name": "id", @@ -12530,40 +20083,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "chartWindow", - "in": "query", - "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], "responses": { "200": { - "description": "Results summary", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" } } } }, "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 +20116,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 +20156,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20209,14 @@ } } }, - "/api/v1/monitors/{id}/resume": { - "post": { + "/api/v1/monitors/{id}/status-pages": { + "get": { "tags": [ "Monitors" ], - "summary": "Resume a paused monitor", - "operationId": "resume", + "summary": "List status pages that contain this monitor as a component", + "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", + "operationId": "listStatusPagesForMonitor", "parameters": [ { "name": "id", @@ -12665,7 +20234,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -12690,6 +20259,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12720,6 +20299,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12753,14 +20352,13 @@ } } }, - "/api/v1/monitors/{id}/revisions": { + "/api/v1/monitors/{id}/tags": { "get": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "List revisions published in this monitor's environment", - "description": "Omits drafts never published here. Page size default 25.", - "operationId": "listRevisions", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { "name": "id", @@ -12770,14 +20368,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -12786,7 +20376,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -12811,6 +20401,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20441,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20492,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/revisions/{revisionId}/test": { + }, "post": { "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": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { "name": "id", @@ -12891,33 +20508,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "revisionId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" + "$ref": "#/components/schemas/AddMonitorTagsRequest" } } - } + }, + "required": true }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -12942,6 +20551,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12972,6 +20591,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13003,16 +20642,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/rollback": { - "post": { + }, + "delete": { "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": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { "name": "id", @@ -13028,25 +20664,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RollbackRevisionRequest" + "$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/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13055,8 +20694,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13095,6 +20734,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20787,13 @@ } } }, - "/api/v1/monitors/{id}/rollback-preview": { - "get": { + "/api/v1/monitors/{id}/takeover": { + "post": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "Preview rollback consequences for this environment", - "operationId": "rollbackPreview", + "summary": "Claim a field for dashboard ownership or reset an overlay", + "operationId": "takeover", "parameters": [ { "name": "id", @@ -13144,24 +20803,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "revisionId", - "in": "query", - "required": true, - "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/SingleValueResponseRollbackPreviewDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13186,6 +20846,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20886,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20939,14 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { + "/api/v1/monitors/{id}/test": { "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": "Test an existing monitor", + "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", + "operationId": "testExisting", "parameters": [ { "name": "id", @@ -13268,13 +20958,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/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -13299,6 +21008,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21048,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21101,14 @@ } } }, - "/api/v1/monitors/{id}/runs": { - "get": { + "/api/v1/monitors/{id}/test-notifications": { + "post": { "tags": [ - "Monitor Runs" + "Monitors" ], - "summary": "List runs for a code monitor", - "description": "Cursor page of runs from the last 90 days. Default limit 25.", - "operationId": "listMonitorRuns", + "summary": "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", @@ -13379,23 +21118,25 @@ "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/CursorPageRunDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -13420,6 +21161,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21201,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21252,16 @@ } } } - }, + } + }, + "/api/v1/monitors/{id}/transfer": { "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": "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", @@ -13500,13 +21273,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferMonitorRequest" + } + } + }, + "required": true + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13531,6 +21314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21407,14 @@ } } }, - "/api/v1/monitors/{id}/runs/summary": { - "get": { + "/api/v1/monitors/{id}/triggers": { + "post": { "tags": [ "Monitor Runs" ], - "summary": "Summarize one monitor's execution durations", - "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", - "operationId": "summarizeMonitorRuns", + "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", @@ -13611,15 +21424,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/SingleValueResponseMonitorRunDurationSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseTriggerRunsResponse" } } } @@ -13644,6 +21474,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21514,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21567,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests": { - "get": { + "/api/v1/monitors/{id}/unmute": { + "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "List secret requests for a monitor", - "operationId": "list_19", + "summary": "Clear mute overlay", + "operationId": "unmute", "parameters": [ { "name": "id", @@ -13731,7 +21591,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13756,6 +21616,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21656,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21709,14 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/{key}": { - "put": { + "/api/v1/monitors/{id}/uptime": { + "get": { "tags": [ - "Monitor secret requests" + "Check Results" ], - "summary": "Attach or clear a remapped secret for a key", - "operationId": "remap", + "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", @@ -13837,41 +21728,38 @@ } }, { - "name": "key", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window for uptime calculation", + "required": false, "schema": { - "type": "string" + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemapSecretRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "OK", + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$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" } } } @@ -13886,8 +21774,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": { @@ -13896,12 +21784,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" } } } @@ -13916,6 +21814,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +21867,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/rescan": { + "/api/v1/monitors/{id}/usage-preview": { "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "Rescan secret requests from the active package", - "operationId": "rescan", + "summary": "Project monthly usage for an update payload", + "operationId": "previewUsage", "parameters": [ { "name": "id", @@ -13967,13 +21885,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -13998,6 +21926,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21966,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22019,14 @@ } } }, - "/api/v1/monitors/{id}/session": { + "/api/v1/monitors/{id}/versions": { "get": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Get the monitor session", - "operationId": "getSession", + "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", @@ -14077,6 +22036,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -14085,7 +22052,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" } } } @@ -14110,6 +22077,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14140,6 +22117,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22168,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/versions/{version}": { + "get": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Create or update the monitor session", - "operationId": "putSession", + "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", @@ -14187,25 +22187,24 @@ "type": "string", "format": "uuid" } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertMonitorSessionRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } @@ -14230,6 +22229,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14260,6 +22269,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +22322,16 @@ } } }, - "/api/v1/monitors/{id}/session/renew": { - "post": { + "/api/v1/monitors/{monitorId}/alert-channels": { + "put": { "tags": [ - "Monitor session" + "Monitor Alert Channels" ], - "summary": "Renew the monitor session", - "operationId": "renewSession", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -14311,13 +22340,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetAlertChannelsRequest" + } + } + }, + "required": true + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } @@ -14342,6 +22381,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14372,6 +22421,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +22474,16 @@ } } }, - "/api/v1/monitors/{id}/session/revoke": { + "/api/v1/monitors/{monitorId}/assertions": { "post": { "tags": [ - "Monitor session" + "Monitor Assertions" ], - "summary": "Revoke the monitor session", - "operationId": "revokeSession", + "summary": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -14423,13 +22492,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -14454,6 +22533,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22573,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +22626,25 @@ } } }, - "/api/v1/monitors/{id}/settings/preview": { - "get": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Monitors" + "Monitor Assertions" ], - "summary": "Projected run volume and meter headroom", - "operationId": "settingsPreview", + "summary": "Update an assertion on a monitor", + "operationId": "update_10", "parameters": [ { - "name": "id", + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", "in": "path", "required": true, "schema": { @@ -14535,13 +22653,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -14566,6 +22694,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22734,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,19 +22785,25 @@ } } } - } - }, - "/api/v1/monitors/{id}/status-pages": { - "get": { + }, + "delete": { "tags": [ - "Monitors" + "Monitor Assertions" ], - "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": "Remove an assertion from a monitor", + "operationId": "remove_1", "parameters": [ { - "name": "id", + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", "in": "path", "required": true, "schema": { @@ -14649,18 +22813,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -14669,8 +22836,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14709,6 +22876,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +22929,16 @@ } } }, - "/api/v1/monitors/{id}/tags": { - "get": { + "/api/v1/monitors/{monitorId}/auth": { + "put": { "tags": [ - "Monitors" + "Monitor Auth" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -14760,13 +22947,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -14791,6 +22988,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14821,6 +23028,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14855,13 +23082,13 @@ }, "post": { "tags": [ - "Monitors" + "Monitor Auth" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "summary": "Set authentication config for a monitor", + "operationId": "set", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -14874,19 +23101,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/SetMonitorAuthRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -14911,6 +23138,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23178,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14975,13 +23232,13 @@ }, "delete": { "tags": [ - "Monitors" + "Monitor Auth" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "summary": "Remove authentication config from a monitor", + "operationId": "remove", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -14990,16 +23247,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" @@ -15024,6 +23271,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23311,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +23364,19 @@ } } }, - "/api/v1/monitors/{id}/takeover": { - "post": { + "/api/v1/monitors/{monitorId}/policy": { + "get": { "tags": [ - "Monitors" + "Incident Policies" ], - "summary": "Claim a field for dashboard ownership or reset an overlay", - "operationId": "takeover", + "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": "id", + "name": "monitorId", "in": "path", + "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -15105,23 +23384,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TakeoverMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "OK", + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } @@ -15146,8 +23415,38 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Monitor or policy not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -15156,8 +23455,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -15166,8 +23465,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": { @@ -15207,20 +23506,19 @@ } } } - } - }, - "/api/v1/monitors/{id}/test": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Incident Policies" ], - "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": "Update incident policy for a monitor", + "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", + "operationId": "update_8", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", + "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -15232,34 +23530,35 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" } } - } + }, + "required": true }, "responses": { "200": { - "description": "Probe result for an uptime monitor", + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } }, - "202": { - "description": "Queued validation run for a browser or multi-step API monitor", + "400": { + "description": "Validation error in JSONB shape", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15268,8 +23567,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15289,11 +23588,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" } } } @@ -15308,6 +23607,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,42 +23660,45 @@ } } }, - "/api/v1/monitors/{id}/test-notifications": { - "post": { + "/api/v1/monitors/batch-history": { + "get": { "tags": [ "Monitors" ], - "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": "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" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + "type": "array", + "items": { + "type": "string", + "format": "uuid" } } }, - "required": true - }, + { + "name": "window", + "in": "query", + "description": "History window: 24h (default), 7d or 30d", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorBatchHistoryDto" } } } @@ -15401,6 +23723,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23763,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15464,31 +23816,31 @@ } } }, - "/api/v1/monitors/{id}/unmute": { + "/api/v1/monitors/bulk": { "post": { "tags": [ "Monitors" ], - "summary": "Clear mute overlay", - "operationId": "unmute", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG, UPDATE_SCHEDULE, or RUN to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", + "operationId": "bulkAction", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkMonitorActionRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -15513,6 +23865,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23905,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,57 +23958,172 @@ } } }, - "/api/v1/monitors/{id}/uptime": { + "/api/v1/monitors/facets": { "get": { "tags": [ - "Check Results" + "Monitors" ], - "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": "Count monitors per list group and facet value", + "description": "Takes the same filters as the monitor list. Groups: failing, not_running, flaky, passing, running, paused. Facet fields: type, environment, region, tag, owner.", + "operationId": "facets", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] } }, { - "name": "window", + "name": "types", "in": "query", - "description": "Time window for uptime calculation", + "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": [ - "24h", - "7d", - "30d", - "90d" + "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" + } } ], "responses": { "200": { - "description": "Uptime statistics", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorListFacetsDto" } } } }, "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 +24138,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 +24178,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,29 +24231,19 @@ } } }, - "/api/v1/monitors/{id}/usage-preview": { + "/api/v1/monitors/test": { "post": { "tags": [ "Monitors" ], - "summary": "Project monthly usage for an update payload", - "operationId": "previewUsage", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "Ad-hoc monitor test", + "description": "Uptime monitors run once from an inline config and return a probe result (200). Browser and multi-step API monitors with code admit a queued validation run (202) when that bundle is already saved on a monitor. Inline code without a bundle is refused.", + "operationId": "testAdHoc", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" + "$ref": "#/components/schemas/MonitorTestRequest" } } }, @@ -15734,11 +24251,21 @@ }, "responses": { "200": { - "description": "OK", + "description": "Probe result for an uptime monitor", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API bundle", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -15763,6 +24290,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24330,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,24 +24383,14 @@ } } }, - "/api/v1/monitors/{id}/versions": { + "/api/v1/monitors/trash": { "get": { "tags": [ "Monitors" ], - "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": "List deleted monitors that can still be restored", + "operationId": "listTrash", "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, { "name": "pageable", "in": "query", @@ -15859,7 +24406,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -15884,6 +24431,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24471,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +24524,30 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { - "get": { + "/api/v1/monitors/usage-preview": { + "post": { "tags": [ "Monitors" ], - "summary": "Get a specific version snapshot for a monitor", - "description": "Returns the full monitor config snapshot captured at the given version number.", - "operationId": "getVersion", - "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" + } } }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -16006,6 +24572,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24612,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,29 +24665,18 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/validate": { + "post": { "tags": [ - "Monitor Alert Channels" - ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Monitors" ], + "summary": "Dry-run plan, secret, and runtime checks", + "operationId": "validateMonitors", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" + "$ref": "#/components/schemas/ValidateMonitorsRequest" } } }, @@ -16103,7 +24688,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/SingleValueResponseMonitorValidationResultDto" } } } @@ -16128,6 +24713,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24753,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +24806,19 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions": { - "post": { + "/api/v1/notification-dispatches": { + "get": { "tags": [ - "Monitor Assertions" + "Notification Dispatches" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "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": "monitorId", - "in": "path", + "name": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", "required": true, "schema": { "type": "string", @@ -16209,23 +24826,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } @@ -16250,6 +24857,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24897,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +24950,17 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + "/api/v1/notification-dispatches/{id}": { + "get": { "tags": [ - "Monitor Assertions" + "Notification Dispatches" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "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": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16340,23 +24969,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/SingleValueResponseNotificationDispatchDto" } } } @@ -16381,6 +25000,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25040,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +25091,19 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Monitor Assertions" + "Notification Dispatches" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "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": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16470,8 +25113,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16493,6 +25143,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25183,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16556,16 +25236,17 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { - "put": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Monitor Auth" + "Notification Dispatches" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "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": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16574,23 +25255,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -16605,8 +25276,18 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "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": { @@ -16645,6 +25326,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16676,41 +25377,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/notification-policies": { + "get": { "tags": [ - "Monitor Auth" - ], - "summary": "Set authentication config for a monitor", - "operationId": "set", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notification Policies" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "required": true - }, + "summary": "List all notification policies for the authenticated org", + "operationId": "list_8", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -16735,6 +25417,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25457,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16797,26 +25509,32 @@ } } }, - "delete": { + "post": { "tags": [ - "Monitor Auth" + "Notification Policies" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", - "parameters": [ - { - "name": "monitorId", - "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": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16838,6 +25556,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25596,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +25649,17 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { + "/api/v1/notification-policies/{id}": { "get": { "tags": [ - "Incident Policies" + "Notification 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", + "summary": "Get a notification policy by ID", + "operationId": "getById_1", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -16923,11 +25669,11 @@ ], "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -16952,6 +25698,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25719,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 +25738,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17016,16 +25792,14 @@ }, "put": { "tags": [ - "Incident Policies" + "Notification 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", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -17037,7 +25811,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" } } }, @@ -17045,21 +25819,21 @@ }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } }, "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 +25848,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25869,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 +25888,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17135,39 +25939,40 @@ } } } - } - }, - "/api/v1/monitors/bulk": { - "post": { + }, + "delete": { "tags": [ - "Monitors" + "Notification Policies" ], - "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": "Delete a notification policy", + "operationId": "delete_6", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "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/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17176,8 +25981,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -17216,6 +26021,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17249,30 +26074,71 @@ } } }, - "/api/v1/monitors/package-uploads": { - "post": { + "/api/v1/notification-policies/{id}/dispatches": { + "get": { "tags": [ - "Monitors" + "Notification Policies" ], - "summary": "Mint a signed package upload URL", - "operationId": "createPackageUpload", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreatePackageUploadRequest" - } + "summary": "List dispatches (firing history) for a notification policy", + "description": "Optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50. Response is CursorPage (hasMore + nextCursor), the same wrapper used by other append-only history endpoints.", + "operationId": "listDispatches", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "since", + "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "until", + "in": "query", + "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous nextCursor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size 1–100 when windowing/paginating (default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePackageUploadDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } @@ -17297,6 +26163,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26203,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17360,23 +26256,32 @@ } } }, - "/api/v1/monitors/test": { + "/api/v1/notification-policies/{id}/test": { "post": { "tags": [ - "Monitors" + "Notification Policies" + ], + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Ad-hoc monitor test", - "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. Inline browser and multi-step API code is refused with MONITOR_TEST_BUNDLE_UNAVAILABLE until a bundle can be uploaded.", - "operationId": "testAdHoc", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" + "$ref": "#/components/schemas/TestNotificationPolicyRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -17384,7 +26289,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" } } } @@ -17409,6 +26314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17439,6 +26354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +26407,51 @@ } } }, - "/api/v1/monitors/usage-preview": { - "post": { + "/api/v1/notifications": { + "get": { "tags": [ - "Monitors" + "Notifications" ], - "summary": "Project monthly usage for a create payload", - "operationId": "previewUsage_1", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "List notifications for the current user", + "operationId": "list_19", + "parameters": [ + { + "name": "unreadOnly", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false } }, - "required": true - }, + { + "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": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/TableValueResultNotificationDto" } } } @@ -17520,6 +26476,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26516,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,39 +26569,40 @@ } } }, - "/api/v1/notification-dispatches": { - "get": { + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Notification Dispatches" + "Notifications" ], - "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": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { - "name": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "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/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17624,8 +26611,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -17664,6 +26651,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,38 +26704,29 @@ } } }, - "/api/v1/notification-dispatches/{id}": { - "get": { + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Notification Dispatches" - ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17737,8 +26735,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -17777,6 +26775,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +26828,20 @@ } } }, - "/api/v1/notification-dispatches/{id}/acknowledge": { - "post": { + "/api/v1/notifications/unread-count": { + "get": { "tags": [ - "Notification Dispatches" - ], - "summary": "Acknowledge a notification dispatch", - "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", - "operationId": "acknowledge", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } @@ -17860,6 +26866,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26906,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +26959,20 @@ } } }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { - "post": { + "/api/v1/org": { + "get": { "tags": [ - "Notification Dispatches" - ], - "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", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Organizations" ], + "summary": "Get the current organization", + "operationId": "get_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -17973,6 +26997,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27037,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18034,22 +27088,30 @@ } } } - } - }, - "/api/v1/notification-policies": { - "get": { + }, + "put": { "tags": [ - "Notification Policies" + "Organizations" ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", + "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/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -18074,6 +27136,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18104,6 +27176,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18135,30 +27227,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/regions": { + "get": { "tags": [ - "Notification Policies" + "Regions" ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" - } - } - }, - "required": true - }, + "summary": "List public regions", + "operationId": "listRegions", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseListRegionDto" } } } @@ -18183,6 +27267,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18213,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": { @@ -18246,31 +27360,20 @@ } } }, - "/api/v1/notification-policies/{id}": { + "/api/v1/resource-groups": { "get": { "tags": [ - "Notification Policies" - ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Resource Groups" ], + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } @@ -18295,6 +27398,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27438,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18357,40 +27490,29 @@ } } }, - "put": { + "post": { "tags": [ - "Notification Policies" - ], - "summary": "Update a notification policy", - "operationId": "update_7", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Resource Groups" ], + "summary": "Create a new resource group", + "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + "$ref": "#/components/schemas/CreateResourceGroupRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -18415,6 +27537,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27577,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +27628,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/resource-groups/{id}": { + "get": { "tags": [ - "Notification Policies" + "Resource Groups" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", + "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": "id", @@ -18492,11 +27647,27 @@ "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", @@ -18518,6 +27689,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27729,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18579,73 +27780,41 @@ } } } - } - }, - "/api/v1/notification-policies/{id}/dispatches": { - "get": { + }, + "put": { "tags": [ - "Notification Policies" + "Resource Groups" ], - "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": "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" - } - }, - { - "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, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -18670,6 +27839,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27879,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18731,15 +27930,14 @@ } } } - } - }, - "/api/v1/notification-policies/{id}/test": { - "post": { + }, + "delete": { "tags": [ - "Notification Policies" + "Resource Groups" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "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", @@ -18751,28 +27949,22 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" - } - } - } - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18781,8 +27973,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -18821,6 +28013,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +28066,22 @@ } } }, - "/api/v1/notifications": { + "/api/v1/resource-groups/{id}/health": { "get": { "tags": [ - "Notifications" + "Resource Groups" ], - "summary": "List notifications for the current user", - "operationId": "list_18", + "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": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -18898,7 +28091,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -18923,6 +28116,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28156,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18986,27 +28209,35 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/resource-groups/{id}/matched-policies": { + "get": { "tags": [ - "Notifications" + "Resource Groups" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "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": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19028,6 +28259,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28299,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +28352,44 @@ } } }, - "/api/v1/notifications/read-all": { - "put": { + "/api/v1/resource-groups/{id}/members": { + "post": { "tags": [ - "Notifications" + "Resource Groups" ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", + "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" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19122,6 +28411,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28451,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19185,26 +28504,49 @@ } } }, - "/api/v1/notifications/unread-count": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Notifications" + "Resource Groups" + ], + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "memberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Get unread notification count", - "operationId": "unreadCount", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19213,8 +28555,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19253,6 +28595,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19286,20 +28648,31 @@ } } }, - "/api/v1/org": { + "/api/v1/revisions/{id}": { "get": { "tags": [ - "Organizations" + "Revisions" + ], + "summary": "Get revision package", + "operationId": "get_13", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Get the current organization", - "operationId": "get_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -19324,6 +28697,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19354,6 +28737,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19385,36 +28788,43 @@ } } } - }, - "put": { + } + }, + "/api/v1/revisions/{id}/bundle": { + "get": { "tags": [ - "Organizations" + "Revisions" ], - "summary": "Update the current organization", - "operationId": "update_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" - } + "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" } - }, - "required": true - }, + } + ], "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19423,8 +28833,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19463,6 +28873,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19496,20 +28926,33 @@ } } }, - "/api/v1/resource-groups": { + "/api/v1/revisions/{id}/bundle/content": { "get": { "tags": [ - "Resource Groups" + "Revisions" + ], + "summary": "Download revision archive", + "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", + "operationId": "bundleContent", + "parameters": [ + { + "name": "id", + "in": "path", + "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", "content": { - "*/*": { + "application/zip": { "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + "type": "string", + "format": "binary" } } } @@ -19534,6 +28977,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19564,6 +29017,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19595,30 +29068,42 @@ } } } - }, - "post": { + } + }, + "/api/v1/revisions/{id}/diff/{other}": { + "get": { "tags": [ - "Resource Groups" + "Revisions" ], - "summary": "Create a new resource group", - "operationId": "create_7", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" - } + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "other", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } @@ -19643,6 +29128,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19673,6 +29168,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +29221,14 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/revisions/{id}/files": { "get": { "tags": [ - "Resource Groups" + "Revisions" ], - "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": "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": "id", @@ -19723,15 +29238,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "includeMetrics", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { @@ -19740,7 +29246,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionFilesDto" } } } @@ -19765,6 +29271,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29311,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19826,13 +29362,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/revisions/{id}/purge": { + "post": { "tags": [ - "Resource Groups" + "Revisions" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "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": "id", @@ -19848,7 +29387,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" + "$ref": "#/components/schemas/EvidencePurgeRequest" } } }, @@ -19860,7 +29399,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -19885,6 +29424,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19915,6 +29464,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19946,28 +29515,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Delete a resource group (cascades to member rows)", - "description": "Also deletes status-page components that represent this group. The parent status page stays.", - "operationId": "delete_5", + "summary": "List 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": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageRunDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19989,6 +29566,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20019,6 +29606,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20052,14 +29659,13 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/runs/{id}": { "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Get the detailed health breakdown for a resource group", - "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", - "operationId": "getHealth", + "summary": "Get a run", + "operationId": "getRun", "parameters": [ { "name": "id", @@ -20077,7 +29683,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -20102,6 +29708,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29748,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +29801,14 @@ } } }, - "/api/v1/resource-groups/{id}/matched-policies": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Resource Groups" + "Runs" ], - "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": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", "parameters": [ { "name": "id", @@ -20190,7 +29826,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } @@ -20215,6 +29851,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29891,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +29944,14 @@ } } }, - "/api/v1/resource-groups/{id}/members": { + "/api/v1/runs/{id}/cancel": { "post": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", "parameters": [ { "name": "id", @@ -20296,23 +29963,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -20337,6 +29994,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30034,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +30087,14 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "Compare a screenshot to the last pass of this step", + "description": "Captures viewer baseline: last pass of this step in this region, any revision.", + "operationId": "compareRunCapture", "parameters": [ { "name": "id", @@ -20418,7 +30106,7 @@ } }, { - "name": "memberId", + "name": "artifactId", "in": "path", "required": true, "schema": { @@ -20428,8 +30116,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20451,6 +30146,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30186,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +30239,13 @@ } } }, - "/api/v1/revisions/{id}": { + "/api/v1/runs/{id}/cases": { "get": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Get revision package", - "operationId": "get_13", + "summary": "List run cases with nested steps", + "operationId": "listRunCases", "parameters": [ { "name": "id", @@ -20530,6 +30255,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunCaseListParams" + } } ], "responses": { @@ -20538,7 +30271,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } @@ -20563,6 +30296,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30336,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +30389,14 @@ } } }, - "/api/v1/revisions/{id}/bundle": { + "/api/v1/runs/{id}/console": { "get": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Redirect to signed package download", - "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", - "operationId": "bundle", + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", "parameters": [ { "name": "id", @@ -20643,11 +30406,31 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunConsoleParams" + } } ], "responses": { "200": { - "description": "OK" + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20669,6 +30452,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30492,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +30545,14 @@ } } }, - "/api/v1/revisions/{id}/bundle/content": { + "/api/v1/runs/{id}/diff": { "get": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Download revision archive", - "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", - "operationId": "bundleContent", + "summary": "Diff this run against a prior pass", + "description": "Default baseline is the last pass of the same revision in this region. Pass baselineRunId to pick another finished run of the same monitor.", + "operationId": "getRunDiff", "parameters": [ { "name": "id", @@ -20749,16 +30562,24 @@ "type": "string", "format": "uuid" } + }, + { + "name": "baselineRunId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { "200": { "description": "OK", "content": { - "application/zip": { + "application/json": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" } } } @@ -20783,6 +30604,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30644,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30697,13 @@ } } }, - "/api/v1/revisions/{id}/diff/{other}": { + "/api/v1/runs/{id}/events": { "get": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Compare two revisions (bounded hunks)", - "operationId": "diff", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "parameters": [ { "name": "id", @@ -20864,22 +30715,29 @@ } }, { - "name": "other", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunEventParams" + } + }, + { + "name": "Last-Event-ID", + "in": "header", + "required": false, + "schema": { + "type": "string" } } ], "responses": { "200": { - "description": "OK", + "description": "Server-sent persist control events", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" + "$ref": "#/components/schemas/RunEventDto" } } } @@ -20904,6 +30762,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30802,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,33 +30855,30 @@ } } }, - "/api/v1/runs": { + "/api/v1/runs/{id}/export": { "get": { "tags": [ "Runs" ], - "summary": "List code runs", - "description": "Org index. Default window last 30 minutes; from clamped to 90 days. Page size 50.", - "operationId": "listRuns", + "summary": "Export run snapshot and available artifacts", + "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", + "operationId": "exportRun", "parameters": [ { - "name": "params", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string", + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", + "description": "Zip of snapshot.json and available artifacts", "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultRunDto" - } - } + "application/zip": {} } }, "400": { @@ -21016,6 +30901,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30941,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30994,14 @@ } } }, - "/api/v1/runs/{id}": { + "/api/v1/runs/{id}/network": { "get": { "tags": [ "Runs" ], - "summary": "Get a run", - "operationId": "getRun", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "parameters": [ { "name": "id", @@ -21095,6 +31011,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunNetworkParams" + } } ], "responses": { @@ -21103,7 +31027,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/RunNetworkDto" } } } @@ -21128,6 +31052,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31092,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +31145,14 @@ } } }, - "/api/v1/runs/{id}/artifacts": { + "/api/v1/runs/{id}/network/{rowId}": { "get": { "tags": [ "Runs" ], - "summary": "List run artifacts", - "description": "Complete persist manifest for this run.", - "operationId": "listRunArtifacts", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { "name": "id", @@ -21208,6 +31162,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "rowId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -21216,7 +31178,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunArtifactDto" + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" } } } @@ -21241,6 +31203,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31243,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21304,14 +31296,14 @@ } } }, - "/api/v1/runs/{id}/cancel": { + "/api/v1/runs/{id}/pin": { "post": { "tags": [ "Runs" ], - "summary": "Request run cancel", - "description": "Sets cancel_requested; phase unchanged.", - "operationId": "cancelRun", + "summary": "Pin a run past retention", + "description": "Keeps the run and its evidence past the retention windows until unpinned.", + "operationId": "pinRun", "parameters": [ { "name": "id", @@ -21354,6 +31346,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31386,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21415,16 +31437,14 @@ } } } - } - }, - "/api/v1/runs/{id}/captures/{artifactId}/compare": { - "get": { + }, + "delete": { "tags": [ "Runs" ], - "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": "Unpin a run", + "description": "Normal retention applies again from the next sweep.", + "operationId": "unpinRun", "parameters": [ { "name": "id", @@ -21434,24 +31454,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/SingleValueResponseRunDto" } } } @@ -21476,6 +31487,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31527,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21539,13 +31580,14 @@ } } }, - "/api/v1/runs/{id}/cases": { - "get": { + "/api/v1/runs/{id}/purge": { + "post": { "tags": [ "Runs" ], - "summary": "List run cases with nested steps", - "operationId": "listRunCases", + "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", @@ -21555,23 +31597,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunCaseListParams" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunCaseDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -21596,6 +31640,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31680,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21659,14 +31733,14 @@ } } }, - "/api/v1/runs/{id}/console": { + "/api/v1/runs/{id}/runner-log": { "get": { "tags": [ "Runs" ], - "summary": "Download raw console log", - "description": "Ungrouped text/plain console lines.", - "operationId": "getRunConsoleRaw", + "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", @@ -21676,26 +31750,18 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunConsoleParams" - } } ], "responses": { "200": { "description": "OK", "content": { - "application/json": { + "text/plain": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + "type": "string" } }, - "text/plain": { + "*/*": { "schema": { "type": "string" } @@ -21722,6 +31788,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -21752,6 +31828,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +31881,14 @@ } } }, - "/api/v1/runs/{id}/diff": { + "/api/v1/runs/{id}/runner-log/live": { "get": { "tags": [ "Runs" ], - "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": "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", @@ -21802,24 +31898,15 @@ "type": "string", "format": "uuid" } - }, - { - "name": "baselineRunId", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { "200": { - "description": "OK", + "description": "Server-sent runner-log lines", "content": { - "application/json": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + "$ref": "#/components/schemas/RunnerLogLiveEvent" } } } @@ -21844,6 +31931,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31971,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32024,14 @@ } } }, - "/api/v1/runs/{id}/events": { + "/api/v1/runs/{id}/trace-summary": { "get": { "tags": [ "Runs" ], - "summary": "Stream run control events", - "operationId": "streamRunEvents", + "summary": "Summarize a failed trace", + "description": "Bounded text of failed actions, failed requests, and console errors.", + "operationId": "getRunTraceSummary", "parameters": [ { "name": "id", @@ -21923,31 +32041,15 @@ "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" - } } ], "responses": { "200": { - "description": "Server-sent persist control events", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunEventDto" + "$ref": "#/components/schemas/SingleValueResponseRunTraceSummaryDto" } } } @@ -21972,38 +32074,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": { @@ -22012,57 +32084,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/runs/{id}/export": { - "get": { - "tags": [ - "Runs" - ], - "summary": "Export run snapshot and available artifacts", - "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", - "operationId": "exportRun", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Zip of snapshot.json and available artifacts", - "content": { - "application/zip": {} - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22071,8 +32094,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22081,8 +32104,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": { @@ -22091,8 +32114,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -22101,8 +32124,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": { @@ -22144,30 +32167,21 @@ } } }, - "/api/v1/runs/{id}/network": { + "/api/v1/runs/export": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "List run network rows", - "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", - "operationId": "listRunNetwork", + "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": "params", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/RunNetworkParams" + "$ref": "#/components/schemas/RunListParams" } } ], @@ -22175,9 +32189,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/RunNetworkDto" + "type": "string" } } } @@ -22202,6 +32216,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22232,6 +32256,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +32309,21 @@ } } }, - "/api/v1/runs/{id}/network/{rowId}": { + "/api/v1/runs/monitors": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Get one network row", - "description": "Includes redacted headers, bodies, and copy-as-cURL.", - "operationId": "getRunNetworkRow", + "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": "rowId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -22298,7 +32333,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" + "$ref": "#/components/schemas/SingleValueResponseRunMonitorStripDto" } } } @@ -22323,6 +32358,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22353,6 +32398,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +32451,21 @@ } } }, - "/api/v1/runs/{id}/runner-log": { + "/api/v1/runs/revisions": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Snapshot in-flight runner log", - "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail — poll this endpoint or use GET /runner-log/live (SSE). After finish, the cold file is the runner_log artifact (GET /artifacts/{id}/content). Empty while no lines have been pushed.", - "operationId": "getRunRunnerLog", + "summary": "List the latest recorded activation of each revision in the window", + "description": "Publication rows are mutable. Repeated activations of the same revision are not an immutable event history.", + "operationId": "listRunRevisionMarkers", "parameters": [ { - "name": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -22409,14 +32473,9 @@ "200": { "description": "OK", "content": { - "text/plain": { - "schema": { - "type": "string" - } - }, "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/CursorPageRunRevisionMarkerDto" } } } @@ -22441,6 +32500,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32540,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +32593,30 @@ } } }, - "/api/v1/runs/{id}/runner-log/live": { + "/api/v1/runs/skipped": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Live tail runner log", - "description": "SSE live tail of in-flight Loki lines. Same ACL as the snapshot (runs.get). Each event data is JSON {ts,line} (ts is Loki nanoseconds, line is one log line). Loki stays internal. Closes on client disconnect, idle/run-finished, or the same SSE timeout as GET /events. Cold file after finish is the runner_log artifact.", - "operationId": "streamRunRunnerLog", + "summary": "List recorded skipped ticks and current plan-disabled intervals", + "operationId": "listSkippedRuns", "parameters": [ { - "name": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunSkippedListParams" } } ], "responses": { "200": { - "description": "Server-sent runner-log lines", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunnerLogLiveEvent" + "$ref": "#/components/schemas/CursorPageRunSkippedEntryDto" } } } @@ -22554,6 +32641,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32681,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22666,6 +32783,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32823,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22735,7 +32882,7 @@ "Secrets" ], "summary": "List organization secrets", - "operationId": "list_5", + "operationId": "list_6", "responses": { "200": { "description": "OK", @@ -22767,6 +32914,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32954,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22834,7 +33011,7 @@ "Secrets" ], "summary": "Create secret", - "operationId": "create_6", + "operationId": "create_7", "requestBody": { "content": { "application/json": { @@ -22876,6 +33053,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33093,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22997,6 +33204,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33244,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23099,6 +33336,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33376,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23210,6 +33477,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33517,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23333,6 +33630,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33670,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23444,6 +33771,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33811,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23513,7 +33870,7 @@ "Service Subscriptions" ], "summary": "List all service subscriptions for the organization", - "operationId": "list_17", + "operationId": "list_18", "responses": { "200": { "description": "OK", @@ -23545,6 +33902,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33942,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23657,6 +34044,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34084,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23761,6 +34178,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34218,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23884,6 +34331,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34371,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24005,6 +34482,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24035,6 +34522,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24182,6 +34689,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34729,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24314,6 +34851,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34891,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24465,6 +35032,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35072,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24621,6 +35218,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35258,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24781,6 +35408,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35448,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24903,6 +35560,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35600,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25045,6 +35732,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35772,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25165,6 +35882,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35922,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25277,6 +36024,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36064,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25400,6 +36177,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36217,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25531,6 +36338,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36378,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25656,6 +36493,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36533,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25831,6 +36698,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36738,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25975,6 +36872,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36912,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26124,6 +37051,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37091,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26238,6 +37195,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37235,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26307,7 +37294,7 @@ "Status Pages" ], "summary": "List status pages for the workspace", - "operationId": "list_4", + "operationId": "list_5", "responses": { "200": { "description": "OK", @@ -26339,6 +37326,155 @@ } } }, + "402": { + "description": "Payment required — the plan or 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": "Create a status page", + "operationId": "create_6", + "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" + } + } + } + }, + "402": { + "description": "Payment required — the plan or 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 +37505,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 +37515,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": { @@ -26560,6 +37607,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37647,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26680,6 +37757,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37797,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26783,6 +37890,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37930,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26895,6 +38032,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38072,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27015,6 +38182,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38222,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27146,6 +38343,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38383,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27258,6 +38485,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38525,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27390,6 +38647,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38687,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27522,6 +38809,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38849,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27641,6 +38958,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38998,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27773,6 +39120,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39160,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27888,6 +39265,158 @@ } } }, + "402": { + "description": "Payment required — the plan or 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}/domains": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List custom domains", + "operationId": "listDomains", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + } + } + } + }, + "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": { @@ -27918,6 +39447,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27949,15 +39498,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/domains": { - "get": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -27969,13 +39516,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -28000,48 +39557,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -28050,58 +39567,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Add a custom domain", - "operationId": "addDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -28110,8 +39577,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -28120,8 +39587,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": { @@ -28130,8 +39597,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -28140,8 +39607,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": { @@ -28234,6 +39701,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39741,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28355,6 +39852,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39892,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28476,6 +40003,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40043,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28588,6 +40145,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40185,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28708,6 +40295,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40335,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28839,6 +40456,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28869,6 +40496,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28951,6 +40598,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40638,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29088,6 +40765,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40805,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29208,6 +40915,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40955,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29329,6 +41066,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41106,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29458,6 +41225,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,6 +41265,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29570,6 +41367,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41407,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29684,6 +41511,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41551,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29814,6 +41671,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41711,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29945,6 +41832,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41872,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30085,6 +42002,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42042,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30200,6 +42147,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42187,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30337,6 +42314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,6 +42354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30457,6 +42464,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42504,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30578,6 +42615,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42655,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30707,6 +42774,158 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Cancel a maintenance window", + "operationId": "deleteMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -30737,6 +42956,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +43007,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "post": { "tags": [ "Status Pages" ], - "summary": "Cancel a maintenance window", - "operationId": "deleteMaintenance", + "summary": "Dismiss a draft maintenance window", + "operationId": "dismissMaintenance", "parameters": [ { "name": "id", @@ -30819,6 +43060,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43100,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30882,13 +43153,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { "post": { "tags": [ "Status Pages" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", "parameters": [ { "name": "id", @@ -30909,9 +43180,25 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30933,6 +43220,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43260,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +43313,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { "post": { "tags": [ "Status Pages" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "summary": "Post a maintenance window timeline update", + "operationId": "postMaintenanceUpdate", "parameters": [ { "name": "id", @@ -31027,14 +43344,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { @@ -31063,6 +43381,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43421,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +43474,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { "tags": [ "Status Pages" ], - "summary": "Post a maintenance window timeline update", - "operationId": "postMaintenanceUpdate", + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", "parameters": [ { "name": "id", @@ -31151,25 +43499,34 @@ "type": "string", "format": "uuid" } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -31194,6 +43551,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43591,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31257,13 +43644,14 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { "tags": [ "Status Pages" ], - "summary": "Edit an existing maintenance timeline update body", - "operationId": "patchMaintenanceUpdate", + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", "parameters": [ { "name": "id", @@ -31275,41 +43663,36 @@ } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "incidentId", + "in": "query", + "required": false, "schema": { "type": "string", "format": "uuid" } }, { - "name": "updateId", - "in": "path", - "required": true, + "name": "eventType", + "in": "query", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "SUBSCRIPTION_CONFIRMATION", + "INCIDENT_CREATED", + "INCIDENT_UPDATED", + "INCIDENT_RESOLVED" + ] } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" } } } @@ -31334,6 +43717,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43757,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +43810,13 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { "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 notification delivery receipt", + "operationId": "getNotificationDelivery", "parameters": [ { "name": "id", @@ -31416,27 +43828,13 @@ } }, { - "name": "incidentId", - "in": "query", - "required": false, + "name": "deliveryId", + "in": "path", + "required": true, "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 +43843,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" } } } @@ -31470,48 +43868,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -31520,59 +43878,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "deliveryId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -31581,8 +43888,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -31591,8 +43898,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": { @@ -31601,8 +43908,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -31611,8 +43918,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": { @@ -31713,6 +44020,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44060,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31833,6 +44170,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44210,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31953,6 +44320,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44360,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32067,6 +44464,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32097,6 +44504,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32169,6 +44596,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32199,6 +44636,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32285,6 +44742,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44782,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32353,7 +44840,7 @@ "tags": [ "synthetics-runtime-profile-controller" ], - "operationId": "list_16", + "operationId": "list_17", "responses": { "200": { "description": "OK", @@ -32385,6 +44872,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44912,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32495,6 +45012,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45052,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32564,7 +45111,7 @@ "Tags" ], "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "operationId": "list_4", "parameters": [ { "name": "pageable", @@ -32606,6 +45153,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45193,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32673,7 +45250,7 @@ "Tags" ], "summary": "Create a new tag", - "operationId": "create_4", + "operationId": "create_5", "requestBody": { "content": { "application/json": { @@ -32715,6 +45292,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45332,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32827,6 +45434,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45474,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32947,6 +45584,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45624,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33050,6 +45717,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45757,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33152,6 +45849,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33182,6 +45889,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33272,6 +45999,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46039,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33381,6 +46138,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46178,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33493,6 +46280,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46320,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33596,6 +46413,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46453,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33716,6 +46563,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46603,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33871,6 +46748,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33901,6 +46788,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33974,6 +46881,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46921,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34095,6 +47032,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47072,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34207,6 +47174,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47214,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34328,6 +47325,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47365,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34449,6 +47476,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34489,6 +47526,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34575,6 +47632,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34605,6 +47672,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34644,7 +47731,7 @@ "Webhooks" ], "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "operationId": "list_3", "parameters": [ { "name": "pageable", @@ -34686,6 +47773,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,6 +47813,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34753,7 +47870,7 @@ "Webhooks" ], "summary": "Register a new webhook endpoint", - "operationId": "create_3", + "operationId": "create_4", "requestBody": { "content": { "application/json": { @@ -34795,6 +47912,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47952,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34907,6 +48054,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48094,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35027,6 +48204,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35057,6 +48244,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35130,6 +48337,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48377,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35252,6 +48489,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48529,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35373,6 +48640,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48680,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35475,6 +48772,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48812,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35576,6 +48903,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35606,6 +48943,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35677,6 +49034,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49074,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35746,7 +49133,7 @@ "Workspaces" ], "summary": "List workspaces", - "operationId": "list_1", + "operationId": "list_2", "parameters": [ { "name": "pageable", @@ -35788,6 +49175,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49215,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35855,7 +49272,7 @@ "Workspaces" ], "summary": "Create workspace", - "operationId": "create_2", + "operationId": "create_3", "requestBody": { "content": { "application/json": { @@ -35897,6 +49314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36009,6 +49456,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49496,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36129,6 +49606,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49646,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36232,6 +49739,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49779,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36354,6 +49891,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49931,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36990,6 +50557,7 @@ "createdAt", "key", "name", + "scopes", "id" ], "type": "object", @@ -37019,6 +50587,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 +50616,7 @@ "createdAt", "key", "name", + "scopes", "updatedAt", "id" ], @@ -37075,10 +50664,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 +50918,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": { @@ -37333,12 +50961,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" } ] }, @@ -37520,7 +51156,9 @@ "RESUME", "DELETE", "ADD_TAG", - "REMOVE_TAG" + "REMOVE_TAG", + "UPDATE_SCHEDULE", + "RUN" ] }, "tagIds": { @@ -37540,6 +51178,14 @@ "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 } }, "description": "Request body for performing a bulk action on multiple monitors" @@ -37570,6 +51216,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 +51736,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 +51783,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 +52298,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 +52475,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 +52811,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 +52898,11 @@ "format": "uuid", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" } ] } @@ -39101,20 +52955,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 +53732,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 +53810,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 +54187,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 +54338,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 +54370,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 +55283,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 +55456,6 @@ }, "ErrorNext": { "type": "object", - "description": "Command and documentation that fix this error", "properties": { "command": { "type": "string", @@ -41405,16 +55469,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 +55604,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 +55620,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 +55645,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 +55715,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,6 +55766,11 @@ "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" @@ -42875,6 +56983,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 +57569,14 @@ "format": "date-time", "nullable": true }, + "triggeringRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, "source": { "minLength": 1, "type": "string", @@ -43772,6 +57894,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 +58019,7 @@ "required": [ "createdAt", "name", + "scopes", "id" ], "type": "object", @@ -43887,6 +58049,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 +58092,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 +59095,124 @@ } } }, + "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" + } + } + }, + "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" + }, + "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 +59225,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 +59271,32 @@ }, "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" + } + }, + "description": "One setting where the live value differs from Git" + }, "MonitorDto": { "required": [ "config", @@ -44944,6 +59310,7 @@ "organizationId", "frequencySeconds", "enabled", + "ownerEnforced", "muted" ], "type": "object", @@ -45029,6 +59396,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 +59497,7 @@ "infra", "flaky", "blocked", + "capped", "paused", "never_run", "confirming" @@ -45164,6 +59536,102 @@ "format": "uuid", "nullable": true }, + "resumesAt": { + "type": "string", + "description": "When a capped monitor resumes", + "format": "date-time", + "nullable": true + }, + "capped": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCappedDto" + } + ] + }, + "missingKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "blockedKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "owner": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOwnerDto" + } + ] + }, + "flakyRate": { + "type": "number", + "description": "Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + "format": "double", + "nullable": true + }, + "flakySince": { + "type": "string", + "description": "When the first retry-passed cycle in the last 7 days finished", + "format": "date-time", + "nullable": true + }, + "flakySeverity": { + "type": "string", + "description": "How flaky the monitor is: LOW, MEDIUM, or HIGH", + "nullable": true, + "enum": [ + "low", + "medium", + "high" + ] + }, + "lastCheckOutcome": { + "type": "string", + "description": "Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + "nullable": true, + "enum": [ + "passed", + "degraded", + "failed" + ] + }, + "lastCheckRegion": { + "type": "string", + "description": "Region of the most recent check", + "nullable": true + }, + "lastFailureSummary": { + "type": "string", + "description": "Why the latest failing region failed", + "nullable": true + }, + "lastStateChangeAt": { + "type": "string", + "description": "When the monitor last changed state: paused, evaluation change, or incident open or resolve", + "format": "date-time", + "nullable": true + }, + "regionHealth": { + "type": "array", + "description": "Latest verdict per region the monitor runs from; null while paused", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorRegionHealthDto" + } + }, "definitionId": { "type": "string", "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", @@ -45237,14 +59705,6 @@ "description": "Quarantine reason", "nullable": true }, - "upload": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PackageUploadDto" - } - ] - }, "usageProjection": { "nullable": true, "allOf": [ @@ -45252,113 +59712,309 @@ "$ref": "#/components/schemas/MonitorUsageProjectionDto" } ] + }, + "liveRevisionId": { + "type": "string", + "description": "Revision scheduled runs execute", + "format": "uuid", + "nullable": true + }, + "liveRevisionDigest": { + "type": "string", + "description": "Closure digest of the revision scheduled runs execute", + "nullable": true } }, "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)", - "nullable": true + "description": "Facet field: type, environment, region, tag, or owner", + "enum": [ + "type", + "environment", + "region", + "tag", + "owner" + ] }, - "expiresAt": { + "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": "When this overlay expires", - "format": "date-time", - "nullable": true + "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" + ] } - } + }, + "description": "One value of a facet field" }, - "MonitorPackageSpec": { + "MonitorHistoryEntryDto": { "required": [ - "digest", - "entrypoint", - "files" + "from", + "kind", + "monitorId", + "reason", + "to", + "count" ], "type": "object", "properties": { - "digest": { - "maxLength": 64, - "minLength": 64, + "kind": { "type": "string", - "description": "SHA-256 hex digest of the package zip (64 characters)" + "description": "Row kind: not_run" }, - "entrypoint": { - "maxLength": 512, - "minLength": 0, + "monitorId": { "type": "string", - "description": "Entrypoint path inside the zip, e.g. tests/login.spec.ts" + "description": "Monitor this row belongs to", + "format": "uuid" }, - "files": { - "maxItems": 256, - "minItems": 0, + "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": "Relative file paths included in the zip", + "description": "Secret keys recorded as missing for this interval", + "nullable": true, "items": { - "maxLength": 512, - "minLength": 0, "type": "string", - "description": "Relative file paths included in the zip" + "description": "Secret keys recorded as missing for this interval" } }, - "keys": { - "maxItems": 64, - "minItems": 0, + "environment": { + "type": "string", + "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" + }, + "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": "Secret names the zip demanded. PUT: null preserves, [] clears", - "nullable": true, + "description": "Count per list group", "items": { - "maxLength": 255, - "minLength": 0, - "type": "string", - "description": "Secret names the zip demanded. PUT: null preserves, [] clears" + "$ref": "#/components/schemas/MonitorListGroupDto" } }, - "gitSha": { - "maxLength": 64, - "minLength": 0, + "facets": { + "type": "array", + "description": "Values and counts per facet field", + "items": { + "$ref": "#/components/schemas/MonitorFacetDto" + } + } + }, + "description": "Group and facet counts for the monitors a list filter selects" + }, + "MonitorListGroupDto": { + "required": [ + "key", + "count" + ], + "type": "object", + "properties": { + "key": { "type": "string", - "description": "Commit SHA from the repo that produced this zip. Client-supplied provenance only", - "nullable": true + "description": "Group: failing, not_running, flaky, passing, running, or paused", + "enum": [ + "failing", + "not_running", + "flaky", + "passing", + "running", + "paused" + ] }, - "gitMessage": { - "maxLength": 1024, + "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 +60035,32 @@ }, "description": "Monitors that reference this secret for authentication" }, + "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 +60157,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 +60181,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,6 +60204,62 @@ "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": [ @@ -45768,6 +60518,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,7 +60601,8 @@ "type": "array", "nullable": true, "items": { - "type": "string" + "type": "string", + "nullable": true } } } @@ -45898,6 +60665,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 +60847,7 @@ }, "NearestOtherRegion": { "required": [ - "artifactId", + "finishedAt", "region", "runId" ], @@ -45966,20 +60855,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": [ @@ -46848,35 +61738,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 +61882,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" @@ -47188,8 +62076,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 +62366,134 @@ } } }, + "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", @@ -48277,7 +63314,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 +63343,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 +63369,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 +63493,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 +64044,8 @@ "last_pass_same_revision_region", "last_pass_any_revision", "attempts_in_run", - "none" + "none", + "selected_run" ] }, "readsAs": { @@ -48925,6 +64066,14 @@ "items": { "$ref": "#/components/schemas/PickerItem" } + }, + "nearestOtherRegion": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NearestOtherRegion" + } + ] } }, "description": "Step duration diff against a prior pass" @@ -48950,7 +64099,8 @@ "cancelRequested", "stream", "attempt", - "attemptOf" + "attemptOf", + "billable" ], "type": "object", "properties": { @@ -49010,6 +64160,14 @@ "description": "Revision this run executed", "format": "uuid" }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + }, "region": { "minLength": 1, "type": "string", @@ -49037,6 +64195,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 +64304,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 +64415,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 +64704,93 @@ }, "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 + } + }, + "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 +64801,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 +64822,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 +64837,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 +65070,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", @@ -49777,6 +65265,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 +65567,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 +65693,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 +65865,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 +65878,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 +67175,17 @@ } } }, + "SingleValueResponseArtifactDownloadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ArtifactDownloadDto" + } + } + }, "SingleValueResponseAuthMeResponse": { "required": [ "data" @@ -51436,6 +67219,17 @@ } } }, + "SingleValueResponseBundleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleDto" + } + } + }, "SingleValueResponseCaptureCompareDto": { "required": [ "data" @@ -51458,6 +67252,17 @@ } } }, + "SingleValueResponseCreateDraftRevisionResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateDraftRevisionResponse" + } + } + }, "SingleValueResponseDashboardOverviewDto": { "required": [ "data" @@ -51513,6 +67318,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 +67373,17 @@ } } }, + "SingleValueResponseEntitlementResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EntitlementResponse" + } + } + }, "SingleValueResponseEnvironmentDto": { "required": [ "data" @@ -51648,6 +67486,20 @@ } } }, + "SingleValueResponseListRegionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegionDto" + } + } + } + }, "SingleValueResponseListUUID": { "required": [ "data" @@ -51722,6 +67574,17 @@ } } }, + "SingleValueResponseMonitorBatchHistoryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorBatchHistoryDto" + } + } + }, "SingleValueResponseMonitorDriftDto": { "required": [ "data" @@ -51744,6 +67607,17 @@ } } }, + "SingleValueResponseMonitorListFacetsDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorListFacetsDto" + } + } + }, "SingleValueResponseMonitorRunDurationBatchDto": { "required": [ "data" @@ -51821,6 +67695,17 @@ } } }, + "SingleValueResponseMonitorValidationResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorValidationResultDto" + } + } + }, "SingleValueResponseMonitorVersionDto": { "required": [ "data" @@ -51887,25 +67772,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 +67860,17 @@ } } }, + "SingleValueResponseRevisionFilesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionFilesDto" + } + } + }, "SingleValueResponseRollbackPreviewDto": { "required": [ "data" @@ -52030,6 +67926,17 @@ } } }, + "SingleValueResponseRunMonitorStripDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunMonitorStripDto" + } + } + }, "SingleValueResponseRuntimeProfileDto": { "required": [ "data" @@ -52041,6 +67948,17 @@ } } }, + "SingleValueResponseRunTraceSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunTraceSummaryDto" + } + } + }, "SingleValueResponseSecretAuditDto": { "required": [ "data" @@ -52316,6 +68234,17 @@ } } }, + "SingleValueResponseTriggerRunsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerRunsResponse" + } + } + }, "SingleValueResponseUptimeDto": { "required": [ "data" @@ -53762,6 +69691,9 @@ } } }, + "StreamingResponseBody": { + "type": "object" + }, "Summary": { "required": [ "id", @@ -54749,38 +70681,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 +71940,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 +72039,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 +72892,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,14 +72983,19 @@ "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", @@ -58131,6 +74175,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..acbc8ec 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): @@ -560,6 +589,32 @@ class Action(StrEnum): delete = "DELETE" add_tag = "ADD_TAG" remove_tag = "REMOVE_TAG" + update_schedule = "UPDATE_SCHEDULE" + run = "RUN" + + +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 +744,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 +1011,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 +1036,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 +1058,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 +1260,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 +1800,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 +1824,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 +2284,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 +2539,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 +2591,38 @@ 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 GitLabChannelConfig(BaseModel): @@ -3195,58 +3435,7 @@ 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): +class IncidentUpdateDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID incident_id: Annotated[UUID, Field(alias="incidentId")] @@ -3407,6 +3596,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 +3618,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,6 +4049,59 @@ class MonitorAuthDto(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig +class MonitorCappedDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + resumes_at: Annotated[ + AwareDatetime | None, + Field(alias="resumesAt", description="When runs resume; null when unknown"), + ] = None + + +class MonitorCodeSpec(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + bundle: Annotated[ + str, + Field( + description="Closure digest from POST /bundles (sha256:)", + max_length=80, + min_length=0, + pattern="^sha256:[a-f0-9]{64}$", + ), + ] + entrypoint: Annotated[ + str, + Field( + description="File that runs, relative to the bundle root", + max_length=512, + min_length=0, + ), + ] + source: CodeSource | None = None + + +class MonitorDriftCodeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + live_digest: Annotated[ + str, + Field( + alias="liveDigest", + description="Digest of the code revision running now", + min_length=1, + ), + ] + git_digest: Annotated[ + str, + Field( + alias="gitDigest", + description="Digest of the code revision last applied from Git", + min_length=1, + ), + ] + drifted: Annotated[ + bool, Field(description="Whether the live digest differs from the Git digest") + ] + + class MonitorDriftFieldDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) field: Annotated[ @@ -3861,123 +4117,145 @@ class MonitorDriftFieldDto(BaseModel): ] -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[ - AwareDatetime | None, - Field(alias="expiresAt", description="When this overlay expires"), - ] = None - - -class File(RootModel[str]): - root: Annotated[ +class MonitorDriftSettingDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[ + str, Field(description="Setting name: frequency or regions", min_length=1) + ] + live: Annotated[ str, Field( - description="Relative file paths included in the zip", - max_length=512, - min_length=0, + description="Live value: seconds for frequency, comma-separated ids for regions", + min_length=1, ), ] - - -class Key(RootModel[str]): - root: Annotated[ + git: Annotated[ str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=255, - min_length=0, + description="Value last applied from Git, in the same format as live", + min_length=1, ), ] -class MonitorPackageSpec(BaseModel): +class MonitorFacetValueDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - digest: Annotated[ + value: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip (64 characters)", - max_length=64, - min_length=64, + description="Value as the list filter takes it: type name, environment id, region, tag name, or owner", + min_length=1, ), ] - entrypoint: Annotated[ + count: Annotated[int, Field(description="Monitors with this value")] + worst_state: Annotated[ str, Field( - description="Entrypoint path inside the zip, e.g. tests/login.spec.ts", - max_length=512, - min_length=0, + alias="worstState", + description="Most severe displayHealth among the monitors with this value", ), ] - files: Annotated[ - list[File], + + +class MonitorHistoryEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Row kind: not_run")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this row belongs to") + ] + region: Annotated[ + str | None, Field( - description="Relative file paths included in the zip", - max_length=256, - min_length=0, + 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"), ] - keys: Annotated[ - list[Key] | 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( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=64, - min_length=0, + alias="missingKeys", + description="Secret keys recorded as missing for this interval", ), ] = None - git_sha: Annotated[ + environment: Annotated[ str | None, + Field(description="Environment recorded when these ticks were skipped"), + ] = None + + +class MonitorHistoryTickDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + at: Annotated[AwareDatetime, Field(description="Start of the bucket")] + outcome: Annotated[ + str, Field( - alias="gitSha", - description="Commit SHA from the repo that produced this zip. Client-supplied provenance only", - max_length=64, - min_length=0, + description="PASSED when every check passed, FAILED when none did, otherwise DEGRADED" ), - ] = None - git_message: Annotated[ - str | None, + ] + + +class MonitorListGroupDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + key: Annotated[ + str, Field( - alias="gitMessage", - description="Commit message from the repo that produced this zip", - max_length=1024, - min_length=0, + description="Group: failing, not_running, flaky, passing, running, or paused" ), - ] = None - git_file: Annotated[ + ] + count: Annotated[int, Field(description="Monitors in the group")] + + +class MonitorOverlayRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[ str | None, Field( - alias="gitFile", - description="Path of the declaring file in that repo", - max_length=512, + description="Optional human-readable reason (max 280)", + max_length=280, min_length=0, ), ] = None - authored_by: Annotated[ + expires_at: Annotated[ + AwareDatetime | None, + Field(alias="expiresAt", description="When this overlay expires"), + ] = None + + +class MonitorOwnerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + type: Annotated[ + str, Field(description="Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + project: Annotated[ str | None, Field( - alias="authoredBy", - description="Author attribution supplied with the package", - max_length=255, - min_length=0, + description="Project the owning tool declares; null when it declares none" ), ] = None - key_locations: Annotated[ - list[DemandedKeyLocation] | None, - Field( - alias="keyLocations", - description="Per-key declaring file and location from package scan", - max_length=64, - min_length=0, - ), + + +class MonitorOwnershipMetadata(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Literal["monitor_ownership"] = "monitor_ownership" + from_owner: Annotated[ + str | None, + Field(alias="fromOwner", description="Owning tool before the change"), ] = None + to_owner: Annotated[ + str | None, Field(alias="toOwner", description="Owning tool after the change") + ] = None + reason: Annotated[str | None, Field(description="Reason the caller gave")] = None class MonitorReference(BaseModel): @@ -3986,6 +4264,17 @@ class MonitorReference(BaseModel): name: Annotated[str, Field(description="Monitor name")] +class MonitorRegionHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Probe region", min_length=1)] + verdict: Annotated[ + str, + Field( + description="Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check" + ), + ] + + class MonitorRunDurationMetricDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitor_id: Annotated[ @@ -4040,7 +4329,7 @@ class MonitorRunListParams(BaseModel): outcome: Annotated[ str | None, Field( - description="Filter by outcome; not_passed also includes passed-on-retry runs" + description="Outcomes, repeated or comma-separated; not_passed includes retries" ), ] = None region: Annotated[str | None, Field(description="Filter by probe region")] = None @@ -4052,6 +4341,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 +4361,62 @@ 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 MonitorSessionDto(BaseModel): @@ -4260,23 +4616,87 @@ class MonitorUsageProjectionDto(BaseModel): ] = None -class NearestOtherRegion(BaseModel): +class MonitorValidationFindingDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - run_id: Annotated[ - UUID, Field(alias="runId", description="Run that holds the other-region shot") + severity: Annotated[ + str, Field(description="error blocks a write; warning does not") ] - region: Annotated[str, Field(description="Region of that run")] - artifact_id: Annotated[ - UUID, Field(alias="artifactId", description="Screenshot on that run") + code: Annotated[ + str, + Field( + description="Stable problem code, such as MONITOR_FREQUENCY_BELOW_PLAN_MIN" + ), ] - - -class NetworkTimingDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - dns_ms: Annotated[ - int | None, Field(alias="dnsMs", description="DNS lookup time in milliseconds") + message: Annotated[str, Field(description="What is wrong")] + field: Annotated[ + str | None, Field(description="Request field this finding refers to") ] = None - connect_ms: Annotated[ + 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"), + ] + + +class NetworkTimingDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + dns_ms: Annotated[ + int | None, Field(alias="dnsMs", description="DNS lookup time in milliseconds") + ] = None + connect_ms: Annotated[ int | None, Field(alias="connectMs", description="TCP connect time in milliseconds"), ] = None @@ -4714,29 +5134,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 +5222,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")] @@ -4959,9 +5345,36 @@ 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): @@ -5145,6 +5558,50 @@ class RegexBodyAssertion(BaseModel): ] +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"])] @@ -5465,57 +5922,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 +5953,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 +6157,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 +6230,29 @@ 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 + + class RunListParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) phase: Annotated[ @@ -5826,7 +6262,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 +6280,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 +6290,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 +6386,120 @@ 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, - 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", - ), + ts: Annotated[str, Field(description="Loki timestamp in nanoseconds")] + line: Annotated[str, Field(description="One runner-log line", min_length=1)] + + +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 +6536,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 +6611,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 +6720,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 +6733,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 +7300,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 +7320,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 +7340,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 +7365,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] @@ -6876,6 +7415,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 +7435,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 +7450,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 +7460,14 @@ class SingleValueResponseRunConsoleDto(BaseModel): data: RunConsoleDto -class SingleValueResponseRunDiffDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunDiffDto - - -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): @@ -7585,6 +8119,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 +8333,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,8 +8788,39 @@ class TraceNearbyAction(BaseModel): ] -class Type4(StrEnum): - consecutive_failures = "consecutive_failures" +class To(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + +class TransferMonitorRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + to: Annotated[ + To, Field(description="New owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + reason: Annotated[ + str, + Field( + description="Why ownership is moving (recorded in the audit log)", + max_length=280, + min_length=0, + ), + ] + project: Annotated[ + str | None, + Field( + description="Project the new owner declares for this monitor; null clears it", + max_length=255, + min_length=0, + ), + ] = None + + +class Type4(StrEnum): + consecutive_failures = "consecutive_failures" failures_in_window = "failures_in_window" response_time = "response_time" @@ -8324,6 +8884,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 +10223,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 +10687,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 +10744,15 @@ 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 class BulkMonitorActionResult(BaseModel): @@ -10191,6 +10838,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 +10996,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 +11047,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 +11110,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 +11344,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 +11462,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 +11842,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,6 +12114,27 @@ class MonitorAssertionDto(BaseModel): severity: str +class MonitorBatchHistoryItemDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Monitor identifier")] + availability: Annotated[ + float | None, + Field( + 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"), + ] + + class MonitorDriftDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) fields: Annotated[ @@ -11430,6 +12143,13 @@ class MonitorDriftDto(BaseModel): 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 class MonitorDto(BaseModel): @@ -11474,6 +12194,13 @@ class MonitorDto(BaseModel): 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"), @@ -11558,6 +12285,79 @@ class MonitorDto(BaseModel): 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( @@ -11615,10 +12415,41 @@ class MonitorDto(BaseModel): quarantine_reason: Annotated[ str | None, Field(alias="quarantineReason", description="Quarantine reason") ] = None - upload: PackageUploadDto | None = None usage_projection: Annotated[ MonitorUsageProjectionDto | None, Field(alias="usageProjection") ] = None + 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 + + +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") + ] + values: Annotated[ + list[MonitorFacetValueDto], + Field(description="Values with at least one monitor, largest first"), + ] + + +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") + ] class MonitorRunDurationBatchDto(BaseModel): @@ -11668,6 +12499,8 @@ class MonitorTestRequest(BaseModel): description="Environment to test against; null uses the monitor environment", ), ] = None + code: MonitorCodeSpec | None = None + session: RunSessionContext | None = None class MonitorVersionDto(BaseModel): @@ -11865,6 +12698,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 +12861,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], - Field( - alias="affectedMonitors", - description="Monitors sharing this definition and environment", + number: Annotated[ + int, Field(description="Monotonic revision number within the definition") + ] + digest: Annotated[ + str, + Field( + 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,6 +13065,197 @@ class RunExecutionDto(BaseModel): ] +class RunFacetDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[str, Field(description="Filter field these values describe")] + values: Annotated[ + list[Value], Field(description="Values selected by the other filters") + ] + + +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[ @@ -12189,6 +13277,66 @@ class RunNetworkDto(BaseModel): ] +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 SecretAuditDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) updated_at: Annotated[ @@ -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 @@ -12378,6 +13521,11 @@ class SingleValueResponseMonitorDto(BaseModel): data: MonitorDto +class SingleValueResponseMonitorListFacetsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorListFacetsDto + + class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: MonitorRunDurationBatchDto @@ -12403,19 +13551,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): @@ -12493,6 +13646,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 @@ -12723,6 +13881,15 @@ class TableValueResultNotificationPolicyDto(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 TableValueResultRunArtifactDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[RunArtifactDto] @@ -12958,6 +14125,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,7 +14191,14 @@ 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 @@ -13052,6 +14242,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 +14278,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[ @@ -13150,6 +14352,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[ @@ -13210,37 +14418,150 @@ class CursorPageIncidentActivityEventDto(BaseModel): data: Annotated[ list[IncidentActivityEventDto], Field(description="Items on this page") ] - next_cursor: Annotated[ + 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 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 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 + 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 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="nextCursor", - description="Opaque cursor for the next page; null when there are no more results", + alias="worstRegion", + description="Region deciding this cycle display verdict", ), ] = None - has_more: Annotated[ + 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="hasMore", description="Whether more results exist beyond this page" + 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 DefinitionDetailDto(BaseModel): +class MonitorBatchHistoryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - definition: DefinitionDto - heads: Annotated[ - list[DefinitionHeadDto], Field(description="Active Heads per environment") + monitors: Annotated[ + list[MonitorBatchHistoryItemDto], + Field( + description="One entry per requested monitor that exists in the workspace" + ), ] -class IncidentDetailDto(BaseModel): +class PickerItem(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") + 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 - trigger: IncidentTriggerDto | None = None + revision: RevisionDto | None = None class ResourceGroupDto(BaseModel): @@ -13360,6 +14681,58 @@ class ResourceGroupDto(BaseModel): ] +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 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 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 +14763,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 +14777,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 +14842,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 +14912,74 @@ 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 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 ServiceDetailDto(BaseModel): @@ -13588,14 +15042,19 @@ 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 SingleValueResponseResourceGroupDto(BaseModel): @@ -13603,11 +15062,31 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto +class SingleValueResponseRevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RevisionDiffDto + + +class SingleValueResponseRollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RollbackPreviewDto + + +class SingleValueResponseRunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunDiffDto + + class SingleValueResponseRunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: RunDto +class SingleValueResponseRunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunMonitorStripDto + + class SingleValueResponseServiceDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceDetailDto @@ -13646,15 +15125,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 +15258,88 @@ 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 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 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 SingleValueResponseIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentDetailDto