From 3c7fff699ca322241d4201e097cf215efe6b759f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Oct 2026 09:10:17 +0000 Subject: [PATCH] chore: update generated API types from latest spec --- docs/openapi/monitoring-api.json | 33051 +++++++++++++++++++++++------ src/devhelm/_generated.py | 4286 +++- 2 files changed, 29626 insertions(+), 7711 deletions(-) diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 7ba8f4e..6aab246 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -46,6 +46,10 @@ "name": "Audit Log", "description": "Organization audit trail" }, + { + "name": "Bundles", + "description": "Upload code for browser and multi-step checks" + }, { "name": "Check Results", "description": "Query raw check results, uptime statistics, and summary data" @@ -62,10 +66,22 @@ "name": "Deploy Lock", "description": "Mutex for CLI deploy operations" }, + { + "name": "Device Login", + "description": "Device-code login that gives the CLI a named, revocable API key" + }, + { + "name": "Device Login", + "description": "Dashboard approval for CLI device-code logins" + }, { "name": "Email Testing", "description": "Receive domains, captured mail, and JSON inject" }, + { + "name": "Entitlements", + "description": "Plan entitlements and usage limits" + }, { "name": "Environments", "description": "Variable namespace management for monitors" @@ -118,6 +134,10 @@ "name": "Monitor definitions", "description": "Publish, rollback, and revision history for code monitors" }, + { + "name": "Monitor History", + "description": "Scheduled ticks that did not run" + }, { "name": "Monitor Runs", "description": "Per-monitor code run history and run-now" @@ -150,6 +170,10 @@ "name": "Organizations", "description": "Organization management" }, + { + "name": "Regions", + "description": "Public regions" + }, { "name": "Resource Groups", "description": "Resource group CRUD and member management" @@ -211,7 +235,7 @@ ], "summary": "List active alert channels for the authenticated org", "description": "Supports filtering by `type` (channel integration), `managedBy` (creating surface), and `search` (case-insensitive contains on name). Unrecognised query parameters are silently ignored — pin to the documented set above.", - "operationId": "list_14", + "operationId": "list_15", "parameters": [ { "name": "type", @@ -311,6 +335,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -341,6 +375,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -378,7 +432,7 @@ "Alert Channels" ], "summary": "Create a new alert channel with encrypted config", - "operationId": "create_15", + "operationId": "create_16", "requestBody": { "content": { "application/json": { @@ -420,38 +474,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -460,60 +484,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/alert-channels/{id}": { - "get": { - "tags": [ - "Alert Channels" - ], - "summary": "Get a single alert channel by id", - "operationId": "get_8", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -522,8 +494,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -532,8 +504,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -542,8 +514,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -552,8 +524,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -593,13 +565,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/alert-channels/{id}": { + "get": { "tags": [ "Alert Channels" ], - "summary": "Update an alert channel's name and re-encrypt config", - "operationId": "update_14", + "summary": "Get a single alert channel by id", + "operationId": "get_8", "parameters": [ { "name": "id", @@ -611,16 +585,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertChannelRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -652,8 +616,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -662,88 +626,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "delete": { - "tags": [ - "Alert Channels" - ], - "summary": "Soft-delete an alert channel and return affected policy summary", - "operationId": "delete_10", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/DeleteChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -752,8 +636,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -762,8 +646,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -772,8 +656,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -782,8 +666,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -823,15 +707,13 @@ } } } - } - }, - "/api/v1/alert-channels/{id}/deliveries": { - "get": { + }, + "put": { "tags": [ "Alert Channels" ], - "summary": "List delivery history for an alert channel", - "operationId": "listDeliveries_1", + "summary": "Update an alert channel's name and re-encrypt config", + "operationId": "update_14", "parameters": [ { "name": "id", @@ -843,13 +725,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertChannelRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } @@ -874,6 +766,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -904,6 +806,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -935,15 +857,13 @@ } } } - } - }, - "/api/v1/alert-channels/{id}/enabled": { - "patch": { + }, + "delete": { "tags": [ "Alert Channels" ], - "summary": "Enable or disable an alert channel without re-uploading config", - "operationId": "setEnabled", + "summary": "Soft-delete an alert channel and return affected policy summary", + "operationId": "delete_10", "parameters": [ { "name": "id", @@ -955,23 +875,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetEnabledRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + "$ref": "#/components/schemas/DeleteChannelResult" } } } @@ -996,6 +906,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1026,6 +946,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1059,13 +999,13 @@ } } }, - "/api/v1/alert-channels/{id}/test": { - "post": { + "/api/v1/alert-channels/{id}/deliveries": { + "get": { "tags": [ "Alert Channels" ], - "summary": "Test a saved alert channel's connectivity", - "operationId": "test_2", + "summary": "List delivery history for an alert channel", + "operationId": "listDeliveries_1", "parameters": [ { "name": "id", @@ -1083,7 +1023,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" } } } @@ -1108,18 +1048,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -1128,79 +1058,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/alert-channels/test": { - "post": { - "tags": [ - "Alert Channels" - ], - "summary": "Test alert channel connectivity using raw config (no saved channel required)", - "operationId": "testConfig", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestAlertChannelRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1209,8 +1068,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1219,8 +1078,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1229,8 +1088,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -1239,8 +1098,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -1282,14 +1141,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/attempts": { - "get": { + "/api/v1/alert-channels/{id}/enabled": { + "patch": { "tags": [ - "Alert Deliveries" + "Alert Channels" ], - "summary": "List delivery attempts for a specific alert delivery", - "description": "Returns the ordered list of delivery attempts (request/response audit data) for the given delivery ID.", - "operationId": "listAttempts", + "summary": "Enable or disable an alert channel without re-uploading config", + "operationId": "setEnabled", "parameters": [ { "name": "id", @@ -1301,13 +1159,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetEnabledRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } @@ -1332,6 +1200,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1362,6 +1240,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1395,14 +1293,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/retry": { + "/api/v1/alert-channels/{id}/test": { "post": { "tags": [ - "Alert Deliveries" + "Alert Channels" ], - "summary": "Retry a failed delivery", - "description": "Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.", - "operationId": "retry", + "summary": "Test a saved alert channel's connectivity", + "operationId": "test_2", "parameters": [ { "name": "id", @@ -1420,7 +1317,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1445,8 +1342,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -1455,79 +1352,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/api-keys": { - "get": { - "tags": [ - "API Keys" - ], - "summary": "List API keys", - "operationId": "list_13", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultApiKeyDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -1536,8 +1362,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -1546,8 +1372,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -1556,8 +1382,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -1566,8 +1392,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -1607,30 +1433,32 @@ } } } - }, + } + }, + "/api/v1/alert-channels/test": { "post": { "tags": [ - "API Keys" + "Alert Channels" ], - "summary": "Create API key", - "operationId": "create_14", + "summary": "Test alert channel connectivity using raw config (no saved channel required)", + "operationId": "testConfig", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateApiKeyRequest" + "$ref": "#/components/schemas/TestAlertChannelRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1655,6 +1483,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1685,6 +1523,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1718,27 +1576,35 @@ } } }, - "/api/v1/api-keys/{id}": { - "delete": { + "/api/v1/alert-deliveries/{id}/attempts": { + "get": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Delete API key", - "operationId": "delete_11", + "summary": "List delivery attempts for a specific alert delivery", + "description": "Returns the ordered list of delivery attempts (request/response audit data) for the given delivery ID.", + "operationId": "listAttempts", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -1760,6 +1626,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1790,6 +1666,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1821,41 +1717,34 @@ } } } - }, - "patch": { + } + }, + "/api/v1/alert-deliveries/{id}/retry": { + "post": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Update API key", - "operationId": "update_16", + "summary": "Retry a failed delivery", + "description": "Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.", + "operationId": "retry", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateApiKeyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" } } } @@ -1880,6 +1769,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -1910,6 +1809,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -1943,31 +1862,20 @@ } } }, - "/api/v1/api-keys/{id}/regenerate": { - "post": { + "/api/v1/api-keys": { + "get": { "tags": [ "API Keys" ], - "summary": "Regenerate API key", - "operationId": "regenerate", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "summary": "List API keys", + "operationId": "list_14", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/TableValueResultApiKeyDto" } } } @@ -1992,6 +1900,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2022,6 +1940,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2053,33 +1991,30 @@ } } } - } - }, - "/api/v1/api-keys/{id}/revoke": { + }, "post": { "tags": [ "API Keys" ], - "summary": "Revoke API key", - "operationId": "revoke_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + "summary": "Create API key", + "operationId": "create_15", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateApiKeyRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -2104,6 +2039,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2134,6 +2079,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2167,28 +2132,27 @@ } } }, - "/api/v1/artifacts/{id}/content": { - "get": { + "/api/v1/api-keys/{id}": { + "delete": { "tags": [ - "Artifacts" + "API Keys" ], - "summary": "Redirect to signed artifact download", - "description": "Returns 302 Location with a signed GET URL. 410 after the 14-day file clock.", - "operationId": "getArtifactContent", + "summary": "Delete API key", + "operationId": "delete_12", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], "responses": { - "302": { - "description": "Signed download Location" + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -2210,6 +2174,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2241,7 +2215,24 @@ } }, "410": { - "description": "Artifact bytes expired" + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "500": { "description": "Internal server error — see the message field for details", @@ -2274,87 +2265,41 @@ } } } - } - }, - "/api/v1/audit-log": { - "get": { + }, + "patch": { "tags": [ - "Audit Log" + "API Keys" ], - "summary": "List audit events for the current organization", - "operationId": "list_23", + "summary": "Update API key", + "operationId": "update_17", "parameters": [ { - "name": "action", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "actorId", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "integer", "format": "int32" } - }, - { - "name": "resourceType", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateApiKeyRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAuditEventDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2379,6 +2324,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2409,6 +2364,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2442,21 +2417,31 @@ } } }, - "/api/v1/auth/me": { - "get": { + "/api/v1/api-keys/{id}/regenerate": { + "post": { "tags": [ - "API Auth" + "API Keys" + ], + "summary": "Regenerate API key", + "operationId": "regenerate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } ], - "summary": "Get current API key identity", - "description": "Returns the authenticated API key's metadata, organization, billing plan, entitlements with usage, and current rate-limit quota. Only available for API key authentication (Bearer dh_live_...).", - "operationId": "me_1", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -2481,6 +2466,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2511,6 +2506,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2544,22 +2559,21 @@ } } }, - "/api/v1/categories": { - "get": { + "/api/v1/api-keys/{id}/revoke": { + "post": { "tags": [ - "Status Data" + "API Keys" ], - "summary": "List categories with service counts", - "operationId": "listCategories", + "summary": "Revoke API key", + "operationId": "revoke_1", "parameters": [ { - "name": "publishedOnly", - "in": "query", - "description": "Count only published services (curated public pSEO set); default false", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "integer", + "format": "int32" } } ], @@ -2569,7 +2583,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultCategoryDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2594,6 +2608,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2624,6 +2648,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2657,27 +2701,41 @@ } } }, - "/api/v1/dashboard/overview": { + "/api/v1/artifacts/{id}/content": { "get": { "tags": [ - "Dashboard" + "Artifacts" + ], + "summary": "Redirect to signed artifact download", + "description": "Returns 302 Location with a signed GET URL. 410 after the 14-day file clock.", + "operationId": "getArtifactContent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Dashboard overview", - "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", - "operationId": "overview", "responses": { - "200": { - "description": "OK", + "302": { + "description": "Signed download Location" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2686,8 +2744,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -2726,6 +2784,19 @@ } } }, + "410": { + "description": "Artifact bytes expired" + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2759,26 +2830,38 @@ } } }, - "/api/v1/definitions": { + "/api/v1/artifacts/{id}/download": { "get": { "tags": [ - "Definitions" + "Artifacts" + ], + "summary": "Get a signed artifact download link", + "description": "Returns the signed GET URL as JSON for browsers that cannot read a redirect. 410 after the 14-day file clock.", + "operationId": "getArtifactDownload", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List definitions", - "operationId": "list_22", "responses": { - "200": { - "description": "OK", + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultDefinitionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -2787,8 +2870,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -2827,6 +2910,26 @@ } } }, + "410": { + "description": "Artifact bytes expired", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseArtifactDownloadDto" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2860,21 +2963,84 @@ } } }, - "/api/v1/definitions/{id}": { + "/api/v1/audit-log": { "get": { "tags": [ - "Definitions" + "Audit Log" ], - "summary": "Get definition with Heads", - "operationId": "get_14", + "summary": "List audit events for the current organization", + "operationId": "list_24", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "action", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "resourceType", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "query", + "description": "Only events on this resource id, e.g. a monitor id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -2884,7 +3050,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" + "$ref": "#/components/schemas/TableValueResultAuditEventDto" } } } @@ -2909,6 +3075,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -2939,6 +3115,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -2972,37 +3168,92 @@ } } }, - "/api/v1/definitions/{id}/revisions": { + "/api/v1/audit-log/export": { "get": { "tags": [ - "Definitions" + "Audit Log" ], - "summary": "List all revisions for a definition", - "operationId": "listRevisions_1", + "summary": "Export audit events as CSV", + "description": "Same filters as the list. Newest first, up to 10,000 rows. from defaults to 30 days ago", + "operationId": "exportAuditLog", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "action", + "in": "query", + "description": "Only events with this action, e.g. monitor.paused", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "description": "Only events performed by this user", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "resourceType", + "in": "query", + "description": "Only events on this resource type, e.g. monitor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "query", + "description": "Only events on this resource id, e.g. a monitor id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest event time (default: 30 days ago)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "Latest event time", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } } ], "responses": { "200": { - "description": "OK", + "description": "CSV with a header row", "content": { - "*/*": { + "text/csv": {} + } + }, + "400": { + "description": "More than 10,000 events match; narrow the filters", + "content": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/StreamingResponseBody" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -3011,8 +3262,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -3051,6 +3302,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3084,21 +3355,31 @@ } } }, - "/api/v1/deploy/lock": { - "get": { + "/api/v1/auth/device": { + "post": { "tags": [ - "Deploy Lock" + "Device Login" ], - "summary": "Get current deploy lock", - "description": "Returns the active deploy lock for the current workspace, if any.", - "operationId": "current", + "summary": "Start a device-code login", + "description": "Returns a device code for the CLI to poll and a short user code for an admin to approve.", + "operationId": "start_1", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDeviceAuthorizationRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/SingleValueResponseDeviceAuthorizationDto" } } } @@ -3123,6 +3404,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3153,6 +3444,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3183,32 +3494,35 @@ } } } - } - }, + }, + "security": [] + } + }, + "/api/v1/auth/device/token": { "post": { "tags": [ - "Deploy Lock" + "Device Login" ], - "summary": "Acquire deploy lock", - "description": "Acquires an exclusive deploy lock for the current workspace. Returns 409 Conflict if the workspace is already locked by another session.", - "operationId": "acquire", + "summary": "Poll a device-code login", + "description": "Returns authorization_pending, slow_down, expired, denied, or complete. The API key is returned once, with complete.", + "operationId": "token", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AcquireDeployLockRequest" + "$ref": "#/components/schemas/DeviceTokenRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/SingleValueResponseDeviceTokenDto" } } } @@ -3233,6 +3547,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3263,6 +3587,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3293,31 +3637,28 @@ } } } - } + }, + "security": [] } }, - "/api/v1/deploy/lock/{lockId}": { - "delete": { + "/api/v1/auth/me": { + "get": { "tags": [ - "Deploy Lock" - ], - "summary": "Release deploy lock", - "description": "Releases a deploy lock by ID. Only the lock holder should call this.", - "operationId": "release", - "parameters": [ - { - "name": "lockId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "API Auth" ], + "summary": "Get current API key identity", + "description": "Returns the authenticated API key's metadata, organization, billing plan, entitlements with usage, and current rate-limit quota. Only available for API key authentication (Bearer dh_live_...).", + "operationId": "me_1", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -3339,6 +3680,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3369,6 +3720,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3402,17 +3773,57 @@ } } }, - "/api/v1/deploy/lock/force": { - "delete": { + "/api/v1/bundles": { + "post": { "tags": [ - "Deploy Lock" + "Bundles" ], - "summary": "Force-release deploy lock", - "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", - "operationId": "forceRelease", + "summary": "Upload a code bundle as a JSON file map", + "operationId": "uploadZip", + "parameters": [ + { + "name": "entrypoint", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "runtimeId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/zip": { + "schema": { + "type": "string", + "format": "byte" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBundleRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBundleDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -3434,6 +3845,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3464,6 +3885,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3497,31 +3938,22 @@ } } }, - "/api/v1/email/{localpart}/wait": { + "/api/v1/bundles/check": { "post": { "tags": [ - "Email Testing" - ], - "summary": "Wait for the oldest matching captured email at a local-part", - "operationId": "waitForEmailByLocalpart", - "parameters": [ - { - "name": "localpart", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Bundles" ], + "summary": "Check every import without storing a bundle", + "operationId": "check", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageRequest" + "$ref": "#/components/schemas/CreateBundleRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -3529,7 +3961,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageResponse" + "$ref": "#/components/schemas/SingleValueResponseBundleCheckResultDto" } } } @@ -3554,6 +3986,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3574,8 +4016,8 @@ } } }, - "408": { - "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -3584,8 +4026,18 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -3627,29 +4079,22 @@ } } }, - "/api/v1/email/domains": { + "/api/v1/categories": { "get": { "tags": [ - "Email Testing" + "Status Data" ], - "summary": "List email testing domains for the workspace", - "operationId": "listEmailDomains", + "summary": "List categories with service counts", + "operationId": "listCategories", "parameters": [ { - "name": "search", + "name": "publishedOnly", "in": "query", - "description": "Case-insensitive name search", + "description": "Count only published services (curated public pSEO set); default false", "required": false, "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "boolean", + "default": false } } ], @@ -3659,7 +4104,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultCategoryDto" } } } @@ -3684,6 +4129,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3714,6 +4169,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3745,29 +4220,23 @@ } } } - }, - "post": { + } + }, + "/api/v1/dashboard/overview": { + "get": { "tags": [ - "Email Testing" + "Dashboard" ], - "summary": "Create an assigned or custom email testing domain", - "operationId": "createEmailDomain", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEmailDomainRequest" - } - } - } - }, + "summary": "Dashboard overview", + "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", + "operationId": "overview", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" } } } @@ -3792,6 +4261,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3822,6 +4301,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3855,30 +4354,20 @@ } } }, - "/api/v1/email/domains/{domain}": { + "/api/v1/definitions": { "get": { "tags": [ - "Email Testing" - ], - "summary": "Get an email testing domain including derived DNS records", - "operationId": "getEmailDomain", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Definitions" ], + "summary": "List definitions", + "operationId": "list_23", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultDefinitionDto" } } } @@ -3903,6 +4392,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -3933,6 +4432,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -3964,26 +4483,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/definitions/{id}": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", - "operationId": "deleteEmailDomain", + "summary": "Get definition with Heads", + "operationId": "get_14", "parameters": [ { - "name": "domain", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4005,6 +4534,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4035,6 +4574,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4066,40 +4625,33 @@ } } } - }, - "patch": { + } + }, + "/api/v1/definitions/{id}/revisions": { + "get": { "tags": [ - "Email Testing" + "Definitions" ], - "summary": "Patch an email testing domain", - "operationId": "updateEmailDomain", + "summary": "List all revisions for a definition", + "operationId": "listRevisions_1", "parameters": [ { - "name": "domain", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEmailDomainRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/TableValueResultRevisionDto" } } } @@ -4124,6 +4676,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4154,6 +4716,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4187,34 +4769,24 @@ } } }, - "/api/v1/email/domains/{domain}/inboxes/{inbox}": { - "delete": { + "/api/v1/deploy/lock": { + "get": { "tags": [ - "Email Testing" - ], - "summary": "Delete every message for one local-part", - "operationId": "deleteEmailInbox", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "inbox", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Deploy Lock" ], + "summary": "Get current deploy lock", + "description": "Returns the active deploy lock for the current workspace, if any.", + "operationId": "current", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -4236,6 +4808,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +4848,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4297,77 +4899,31 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages": { - "get": { + }, + "post": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Super-inbox: list messages newest-first", - "operationId": "listEmailMessages", - "parameters": [ - { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "inbox", - "in": "query", - "description": "Only messages to this local-part, exact match", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "q", - "in": "query", - "description": "Case-insensitive match on subject, sender, or recipient local-part", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "after", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" + "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": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageEmailMessageDto" + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" } } } @@ -4392,6 +4948,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4422,6 +4988,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4455,24 +5041,17 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}": { - "get": { + "/api/v1/deploy/lock/{lockId}": { + "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Get one captured message", - "operationId": "getEmailMessage", + "summary": "Release deploy lock", + "description": "Releases a deploy lock by ID. Only the actor that acquired it can release it.", + "operationId": "release", "parameters": [ { - "name": "domain", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "messageId", + "name": "lockId", "in": "path", "required": true, "schema": { @@ -4482,18 +5061,21 @@ } ], "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 +5084,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 +5124,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +5175,27 @@ } } } - }, + } + }, + "/api/v1/deploy/lock/force": { "delete": { "tags": [ - "Email Testing" + "Deploy Lock" ], - "summary": "Delete one captured message", - "operationId": "deleteEmailMessage", + "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": { @@ -4623,6 +5222,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4653,6 +5262,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4686,48 +5315,39 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { - "get": { + "/api/v1/email/{localpart}/wait": { + "post": { "tags": [ "Email Testing" ], - "summary": "Signed URL for one attachment", - "operationId": "getEmailMessageAttachment", + "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" - } - }, - { - "name": "attId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaitEmailMessageRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/WaitEmailMessageResponse" } } } @@ -4752,6 +5372,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4772,6 +5402,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": { @@ -4782,6 +5422,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4815,29 +5475,29 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/links": { + "/api/v1/email/domains": { "get": { "tags": [ "Email Testing" ], - "summary": "Extracted links on the message", - "operationId": "listEmailMessageLinks", + "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", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -4847,7 +5507,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInboundEmailLink" + "$ref": "#/components/schemas/TableValueResultEmailDomainDto" } } } @@ -4872,6 +5532,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -4902,6 +5572,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -4933,41 +5623,29 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { - "get": { + }, + "post": { "tags": [ "Email Testing" ], - "summary": "Extracted one-time codes on the message", - "operationId": "listEmailMessageOtp", - "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/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": { @@ -5055,13 +5763,13 @@ } } }, - "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { + "/api/v1/email/domains/{domain}": { "get": { "tags": [ "Email Testing" ], - "summary": "Signed URL for the raw RFC822 object", - "operationId": "getEmailMessageRaw", + "summary": "Get an email testing domain including derived DNS records", + "operationId": "getEmailDomain", "parameters": [ { "name": "domain", @@ -5070,15 +5778,6 @@ "schema": { "type": "string" } - }, - { - "name": "messageId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -5087,7 +5786,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -5112,6 +5811,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,7 +5851,27 @@ } } }, - "500": { + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { "description": "Internal server error — see the message field for details", "content": { "application/json": { @@ -5173,15 +5902,13 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/{messageId}/source": { - "get": { + }, + "delete": { "tags": [ "Email Testing" ], - "summary": "Original message source as text", - "operationId": "getEmailMessageSource", + "summary": "Delete a domain, cascade messages, and remove the Redis allowlist entry", + "operationId": "deleteEmailDomain", "parameters": [ { "name": "domain", @@ -5190,30 +5917,24 @@ "schema": { "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/SingleValueResponseEmailMessageSourceDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5222,8 +5943,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5262,6 +5983,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5293,15 +6034,13 @@ } } } - } - }, - "/api/v1/email/domains/{domain}/messages/inject": { - "post": { + }, + "patch": { "tags": [ "Email Testing" ], - "summary": "Inject a JSON message onto the same durable path as SMTP", - "operationId": "injectEmailMessage", + "summary": "Patch an email testing domain", + "operationId": "updateEmailDomain", "parameters": [ { "name": "domain", @@ -5316,19 +6055,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InjectEmailMessageRequest" + "$ref": "#/components/schemas/UpdateEmailDomainRequest" } } }, "required": true }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInjectEmailMessageResponse" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -5353,6 +6092,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -5383,6 +6132,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6185,13 @@ } } }, - "/api/v1/email/domains/{domain}/verify": { - "post": { + "/api/v1/email/domains/{domain}/inboxes/{inbox}": { + "delete": { "tags": [ "Email Testing" ], - "summary": "Re-check TXT and MX for a custom domain", - "operationId": "verifyEmailDomain", + "summary": "Delete every message for one local-part", + "operationId": "deleteEmailInbox", "parameters": [ { "name": "domain", @@ -5431,21 +6200,32 @@ "schema": { "type": "string" } + }, + { + "name": "inbox", + "in": "path", + "required": true, + "schema": { + "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/SingleValueResponseEmailDomainDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5454,8 +6234,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5494,6 +6274,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6327,65 @@ } } }, - "/api/v1/email/domains/activity": { + "/api/v1/email/domains/{domain}/messages": { "get": { "tags": [ "Email Testing" ], - "summary": "Last-24h received-message activity for email domains", - "operationId": "listEmailDomainActivity", + "summary": "Super-inbox: list messages newest-first", + "operationId": "listEmailMessages", "parameters": [ { - "name": "domainIds", + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "inbox", "in": "query", - "description": "Comma-separated domain ids (1–100)", + "description": "Only messages to this local-part, exact match", "required": false, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "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 } } ], @@ -5555,7 +6395,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" + "$ref": "#/components/schemas/CursorPageEmailMessageDto" } } } @@ -5580,6 +6420,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +6460,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -5643,30 +6513,39 @@ } } }, - "/api/v1/email/wait": { - "post": { + "/api/v1/email/domains/{domain}/messages/{messageId}": { + "get": { "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": "Get one captured message", + "operationId": "getEmailMessage", + "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", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WaitEmailMessageResponse" + "$ref": "#/components/schemas/SingleValueResponseEmailMessageDto" } } } @@ -5691,6 +6570,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -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": { @@ -5762,28 +6661,48 @@ } } } - } - }, - "/api/v1/environments": { - "get": { + }, + "delete": { "tags": [ - "Environments" + "Email Testing" + ], + "summary": "Delete one captured message", + "operationId": "deleteEmailMessage", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List environments", - "operationId": "list_12", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -5792,8 +6711,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -5832,6 +6751,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6802,50 @@ } } } - }, - "post": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/attachments/{attId}": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Create environment", - "operationId": "create_13", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEnvironmentRequest" - } + "summary": "Signed URL for one attachment", + "operationId": "getEmailMessageAttachment", + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" } }, - "required": true - }, + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "attId", + "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/SingleValueResponseSignedDownload" } } } @@ -5911,6 +6870,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +6910,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +6963,30 @@ } } }, - "/api/v1/environments/{slug}": { + "/api/v1/email/domains/{domain}/messages/{messageId}/links": { "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Get environment by slug", - "operationId": "get_7", + "summary": "Extracted links on the message", + "operationId": "listEmailMessageLinks", "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 +6995,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/TableValueResultInboundEmailLink" } } } @@ -6022,6 +7020,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -6052,6 +7060,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6083,40 +7111,41 @@ } } } - }, - "put": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/otp": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Update environment", - "operationId": "update_13", + "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" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEnvironmentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/TableValueResultInboundOtpCode" } } } @@ -6141,6 +7170,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +7210,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +7261,44 @@ } } } - }, - "delete": { + } + }, + "/api/v1/email/domains/{domain}/messages/{messageId}/raw": { + "get": { "tags": [ - "Environments" + "Email Testing" ], - "summary": "Delete environment", - "operationId": "delete_9", + "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" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -6243,6 +7320,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +7360,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -6306,17 +7413,24 @@ } } }, - "/api/v1/forensics/incidents/{id}/timeline": { + "/api/v1/email/domains/{domain}/messages/{messageId}/source": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "summary": "Full forensic timeline for an incident", - "description": "Returns every state-machine transition for this incident plus the rule evaluations that caused each transition, plus the policy snapshot that triggered confirmation. Correlate evaluations to transitions via evaluation.triggeringTransitionId == transition.id.", - "operationId": "getTimeline", + "summary": "Original message source as text", + "operationId": "getEmailMessageSource", "parameters": [ { - "name": "id", + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "messageId", "in": "path", "required": true, "schema": { @@ -6331,7 +7445,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" + "$ref": "#/components/schemas/SingleValueResponseEmailMessageSourceDto" } } } @@ -6356,6 +7470,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +7510,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,82 +7563,40 @@ } } }, - "/api/v1/forensics/monitors/{id}/rule-evaluations": { - "get": { + "/api/v1/email/domains/{domain}/messages/inject": { + "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": "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" - } - }, - { - "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" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InjectEmailMessageRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" + "$ref": "#/components/schemas/SingleValueResponseInjectEmailMessageResponse" } } } @@ -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,20 @@ } } }, - "/api/v1/forensics/monitors/{id}/transitions": { - "get": { + "/api/v1/email/domains/{domain}/verify": { + "post": { "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": "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": "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" + "type": "string" } } ], @@ -6633,7 +7737,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" + "$ref": "#/components/schemas/SingleValueResponseEmailDomainDto" } } } @@ -6658,6 +7762,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,8 +7802,28 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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": { @@ -6721,21 +7855,25 @@ } } }, - "/api/v1/forensics/policy-snapshots/{hashHex}": { + "/api/v1/email/domains/activity": { "get": { "tags": [ - "Forensics" + "Email Testing" ], - "summary": "Fetch a policy snapshot by its content hash", - "description": "Hash is SHA-256 over canonical policy JSON, hex-encoded. Access is gated: caller's org must have evaluated against this hash at least once.", - "operationId": "getPolicySnapshot", + "summary": "Last-24h received-message activity for email domains", + "operationId": "listEmailDomainActivity", "parameters": [ { - "name": "hashHex", - "in": "path", - "required": true, + "name": "domainIds", + "in": "query", + "description": "Comma-separated domain ids (1–100)", + "required": false, "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -6745,7 +7883,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" + "$ref": "#/components/schemas/SingleValueResponseListEmailDomainActivityDto" } } } @@ -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": { @@ -6800,6 +7948,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +8001,30 @@ } } }, - "/api/v1/forensics/traces/{checkId}": { - "get": { + "/api/v1/email/wait": { + "post": { "tags": [ - "Forensics" + "Email Testing" ], - "summary": "Replay a single check execution", - "description": "Returns every rule evaluation and state transition emitted for this scheduler-minted check_id (V92), plus the policy snapshot that governed them.", - "operationId": "getTrace", - "parameters": [ - { - "name": "checkId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "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/SingleValueResponseCheckTraceDto" + "$ref": "#/components/schemas/WaitEmailMessageResponse" } } } @@ -6883,28 +8049,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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -6913,28 +8059,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", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -6942,42 +8068,9 @@ } } } - } - } - } - }, - "/api/v1/heartbeat/{token}": { - "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" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/HeartbeatPingResponse" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -6986,8 +8079,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "408": { + "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", "content": { "application/json": { "schema": { @@ -6996,8 +8089,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": { @@ -7006,8 +8099,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -7016,8 +8109,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": { @@ -7057,51 +8150,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/entitlements": { + "get": { "tags": [ - "Heartbeat" + "Entitlements" ], - "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" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "string" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - }, - "*/*": { - "schema": { - "type": "string" - } - } - } - }, + "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/HeartbeatPingResponse" + "$ref": "#/components/schemas/SingleValueResponseEntitlementResponse" } } } @@ -7126,6 +8190,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +8230,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +8283,20 @@ } } }, - "/api/v1/incidents": { + "/api/v1/environments": { "get": { "tags": [ - "Incidents" - ], - "summary": "List incidents for the authenticated org", - "operationId": "list_11", - "parameters": [ - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/IncidentFilterParams" - } - } + "Environments" ], + "summary": "List environments", + "operationId": "list_13", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentDto" + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" } } } @@ -7237,6 +8321,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +8361,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7301,15 +8415,15 @@ }, "post": { "tags": [ - "Incidents" + "Environments" ], - "summary": "Create a manual incident", - "operationId": "create_12", + "summary": "Create environment", + "operationId": "create_14", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateManualIncidentRequest" + "$ref": "#/components/schemas/CreateEnvironmentRequest" } } }, @@ -7321,7 +8435,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7346,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": { @@ -7376,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": { @@ -7409,22 +8553,20 @@ } } }, - "/api/v1/incidents/{id}": { + "/api/v1/environments/{slug}": { "get": { "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": "Get environment by slug", + "operationId": "get_7", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -7434,7 +8576,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7459,6 +8601,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -7489,6 +8641,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7521,20 +8693,19 @@ } } }, - "patch": { + "put": { "tags": [ - "Incidents" + "Environments" ], - "summary": "Update incident title and/or severity", - "operationId": "update_15", + "summary": "Update environment", + "operationId": "update_13", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -7542,7 +8713,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateIncidentRequest" + "$ref": "#/components/schemas/UpdateEnvironmentRequest" } } }, @@ -7554,7 +8725,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" } } } @@ -7579,6 +8750,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +8790,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -7640,40 +8841,39 @@ } } } - } - }, - "/api/v1/incidents/{id}/acknowledge": { - "post": { + }, + "delete": { "tags": [ - "Incidents" + "Environments" ], - "summary": "Acknowledge all open notification dispatches for an incident", - "description": "Atomically acknowledges every DELIVERED or ESCALATING dispatch for the incident. Already-acknowledged and non-acknowledgeable dispatches are returned in skipped (not errors). MEMBER+.", - "operationId": "acknowledgeAll", + "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/SingleValueResponseAcknowledgeAllIncidentsResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -7682,8 +8882,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -7722,6 +8922,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +8975,14 @@ } } }, - "/api/v1/incidents/{id}/events": { + "/api/v1/forensics/incidents/{id}/timeline": { "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": "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", @@ -7772,24 +8992,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "cursor", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], "responses": { @@ -7798,7 +9000,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTimelineDto" } } } @@ -7823,6 +9025,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9065,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +9118,14 @@ } } }, - "/api/v1/incidents/{id}/related": { + "/api/v1/forensics/monitors/{id}/rule-evaluations": { "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": "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", @@ -7905,23 +9137,53 @@ } }, { - "name": "windowDays", + "name": "ruleType", "in": "query", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 30 + "type": "string" } }, { - "name": "limit", + "name": "region", "in": "query", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 3 + "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" } } ], @@ -7931,7 +9193,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RelatedIncidentsResponse" + "$ref": "#/components/schemas/TableValueResultRuleEvaluationDto" } } } @@ -7956,6 +9218,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9258,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +9311,14 @@ } } }, - "/api/v1/incidents/{id}/resolve": { - "post": { + "/api/v1/forensics/monitors/{id}/transitions": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Resolve an incident", - "operationId": "resolve", + "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", @@ -8035,24 +9328,41 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" - } + }, + { + "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": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultIncidentStateTransitionDto" } } } @@ -8077,6 +9387,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9427,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +9480,21 @@ } } }, - "/api/v1/incidents/{id}/trigger": { + "/api/v1/forensics/policy-snapshots/{hashHex}": { "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Get incident trigger enrichment", - "description": "Rule type, count/threshold, last error, and first-failed-check time derived from forensics and check_results. Not required to render the incident shell.", - "operationId": "getTrigger", + "summary": "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" + "type": "string" } } ], @@ -8165,7 +9504,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" + "$ref": "#/components/schemas/SingleValueResponsePolicySnapshotDto" } } } @@ -8190,6 +9529,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9569,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8253,16 +9622,17 @@ } } }, - "/api/v1/incidents/{id}/updates": { - "post": { + "/api/v1/forensics/traces/{checkId}": { + "get": { "tags": [ - "Incidents" + "Forensics" ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", + "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": { @@ -8271,23 +9641,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseCheckTraceDto" } } } @@ -8312,6 +9672,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9712,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,19 +9765,19 @@ } } }, - "/api/v1/ingest/{publicToken}": { + "/api/v1/heartbeat/{token}": { "get": { "tags": [ - "Webhook Testing" + "Heartbeat" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest", + "summary": "Record a heartbeat ping (GET)", + "description": "Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.", + "operationId": "pingGet", "parameters": [ { - "name": "publicToken", + "name": "token", "in": "path", - "description": "Public token that identifies the inbox", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" @@ -8400,8 +9790,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8426,6 +9815,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +9855,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +9907,50 @@ } } }, - "put": { + "post": { "tags": [ - "Webhook Testing" + "Heartbeat" ], - "summary": "Capture an HTTP request sent to an inbox URL", - "description": "The response is that inbox's mock reply", - "operationId": "ingest_2", + "summary": "Record a heartbeat ping (POST)", + "description": "Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.", + "operationId": "pingPost", "parameters": [ { - "name": "publicToken", + "name": "token", "in": "path", - "description": "Public token that identifies the inbox", + "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + }, + "*/*": { + "schema": { + "type": "string" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/HeartbeatPingResponse" } } } @@ -8538,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": { @@ -8568,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": { @@ -8599,22 +10066,22 @@ } } } - }, - "post": { + } + }, + "/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_1", + "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" } } ], @@ -8624,8 +10091,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/TableValueResultIncidentDto" } } } @@ -8650,6 +10116,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10156,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10208,29 @@ } } }, - "delete": { + "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_3", - "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" } } } @@ -8762,6 +10255,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10295,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10346,24 @@ } } } - }, - "options": { + } + }, + "/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_6", + "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" } } ], @@ -8848,8 +10373,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -8874,6 +10398,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10438,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -8936,32 +10490,40 @@ } } }, - "head": { + "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_5", + "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" } } } @@ -8986,6 +10548,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10588,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10639,24 @@ } } } - }, - "patch": { + } + }, + "/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_4", + "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" } } ], @@ -9072,8 +10666,7 @@ "content": { "*/*": { "schema": { - "type": "string", - "format": "byte" + "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" } } } @@ -9098,6 +10691,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10731,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10784,50 @@ } } }, - "/api/v1/integrations": { + "/api/v1/incidents/{id}/events": { "get": { "tags": [ - "Integrations" + "Incidents" + ], + "summary": "List merged activity events for an incident", + "description": "Cursor-paginated unified activity stream merging incident updates, notification dispatches, alert deliveries, forensic state transitions, and linked status-page updates. Ordered by time descending.", + "operationId": "listEvents_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } ], - "summary": "List all supported integration types", - "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", - "operationId": "list_21", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" } } } @@ -9200,6 +10852,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +10892,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +10945,52 @@ } } }, - "/api/v1/integrations/voice-languages": { + "/api/v1/incidents/{id}/related": { "get": { "tags": [ - "Integrations" + "Incidents" + ], + "summary": "List related incidents sharing the same origin", + "description": "Returns same-origin recurrence (monitor, service, or resource group) within the window, excluding the current incident. total is the full count for “Nth outage this month” copy.", + "operationId": "listRelated", + "parameters": [ + { + "name": "id", + "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 + } + } ], - "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/RelatedIncidentsResponse" } } } @@ -9302,6 +11015,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11055,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11108,40 @@ } } }, - "/api/v1/invites": { - "get": { + "/api/v1/incidents/{id}/resolve": { + "post": { "tags": [ - "Invites" + "Incidents" ], - "summary": "List invites", - "operationId": "list_10", + "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/TableValueResultInviteDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -9403,6 +11166,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11206,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9464,30 +11257,52 @@ } } } - }, - "post": { + } + }, + "/api/v1/incidents/{id}/runs": { + "get": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Create invite", - "operationId": "create_11", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" - } + "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" } }, - "required": true - }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -9512,6 +11327,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11367,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11420,22 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { - "post": { + "/api/v1/incidents/{id}/trigger": { + "get": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Resend invite", - "operationId": "resend_1", + "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": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], @@ -9599,7 +11445,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" } } } @@ -9624,6 +11470,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11510,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9687,27 +11563,44 @@ } } }, - "/api/v1/invites/{inviteId}/revoke": { + "/api/v1/incidents/{id}/updates": { "post": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Revoke invite", - "operationId": "revoke", + "summary": "Add an update to an incident (optionally change status)", + "operationId": "addUpdate", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -9729,6 +11622,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -9759,6 +11662,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -9792,30 +11715,20 @@ } } }, - "/api/v1/maintenance-windows": { + "/api/v1/ingest/{publicToken}": { "get": { "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", "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 +11740,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -9852,6 +11766,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11806,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11858,32 @@ } } }, - "post": { + "put": { "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_2", + "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 +11908,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +11948,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +11999,22 @@ } } } - } - }, - "/api/v1/maintenance-windows/{id}": { - "get": { + }, + "post": { "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_1", "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 +12024,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "type": "string", + "format": "byte" } } } @@ -10074,6 +12050,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +12090,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +12142,32 @@ } } }, - "put": { + "delete": { "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_3", "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 +12192,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +12232,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +12284,35 @@ } } }, - "delete": { + "options": { "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_6", "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 +12334,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +12374,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -10358,22 +12425,22 @@ } } } - } - }, - "/api/v1/members": { - "get": { + }, + "head": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "List organization members", - "operationId": "list_20", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_5", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "publicToken", + "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string" } } ], @@ -10383,7 +12450,8 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMemberDto" + "type": "string", + "format": "byte" } } } @@ -10408,38 +12476,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": { @@ -10448,53 +12486,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/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", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -10503,8 +12496,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -10513,8 +12506,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": { @@ -10523,8 +12516,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -10533,8 +12526,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": { @@ -10574,40 +12567,37 @@ } } } - } - }, - "/api/v1/members/{userId}/role": { - "put": { + }, + "patch": { "tags": [ - "Members" + "Webhook Testing" ], - "summary": "Change member role", - "operationId": "changeRole", + "summary": "Capture an HTTP request sent to an inbox URL", + "description": "The response is that inbox's mock reply", + "operationId": "ingest_4", "parameters": [ { - "name": "userId", + "name": "publicToken", "in": "path", + "description": "Public token that identifies the inbox", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -10628,6 +12618,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -10658,6 +12658,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,38 +12711,25 @@ } } }, - "/api/v1/members/{userId}/status": { - "put": { + "/api/v1/integrations": { + "get": { "tags": [ - "Members" - ], - "summary": "Change member status", - "operationId": "changeStatus", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } + "Integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "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/TableValueResultIntegrationDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -10743,6 +12750,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +12790,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +12843,21 @@ } } }, - "/api/v1/monitors": { + "/api/v1/integrations/voice-languages": { "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_8", - "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" - } - } + "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/TableValueResultMonitorDto" + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" } } } @@ -10994,6 +12882,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +12922,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +12973,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/invites": { + "get": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } - } - }, - "required": true - }, + "summary": "List invites", + "operationId": "list_11", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultInviteDto" } } } @@ -11103,6 +13013,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13053,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11164,33 +13104,30 @@ } } } - } - }, - "/api/v1/monitors/{id}": { - "get": { + }, + "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Get a single monitor by id", - "operationId": "get_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create invite", + "operationId": "create_12", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateInviteRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -11215,6 +13152,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13192,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11276,41 +13243,33 @@ } } } - }, - "put": { + } + }, + "/api/v1/invites/{inviteId}/resend": { + "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Update a monitor", - "operationId": "update_11", + "summary": "Resend invite", + "operationId": "resend_1", "parameters": [ { - "name": "id", + "name": "inviteId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -11335,6 +13294,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13334,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11396,22 +13385,23 @@ } } } - }, - "delete": { + } + }, + "/api/v1/invites/{inviteId}/revoke": { + "post": { "tags": [ - "Monitors" + "Invites" ], - "summary": "Soft-delete a monitor", - "description": "Also deletes status-page components that represent this monitor. The parent status page stays.", - "operationId": "delete_7", + "summary": "Revoke invite", + "operationId": "revoke", "parameters": [ { - "name": "id", + "name": "inviteId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], @@ -11439,8 +13429,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": { @@ -11449,8 +13439,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -11459,7 +13449,17 @@ } } }, - "409": { + "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": { @@ -11469,6 +13469,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +13522,33 @@ } } }, - "/api/v1/monitors/{id}/drift": { + "/api/v1/maintenance-windows": { "get": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "IaC-declared baseline vs live overlays", - "operationId": "drift", + "summary": "List maintenance windows for the authenticated org", + "description": "Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).", + "operationId": "list_10", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "monitorId", + "in": "query", + "description": "Filter by monitor UUID", + "required": false, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" + } } ], "responses": { @@ -11526,7 +13557,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" } } } @@ -11551,6 +13582,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13622,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11612,42 +13673,31 @@ } } } - } - }, - "/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" - } - } + "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/MonitorOverlayRequest" + "$ref": "#/components/schemas/CreateMaintenanceWindowRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11672,6 +13722,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13762,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +13815,13 @@ } } }, - "/api/v1/monitors/{id}/overview/steps": { + "/api/v1/maintenance-windows/{id}": { "get": { "tags": [ - "Check Results" + "Maintenance Windows" ], - "summary": "Overview step catalog", - "description": "Step catalog from finished runs of the Head revision in the window, with first-try and flake aggregates. Empty when the monitor has no step catalog.", - "operationId": "getMonitorOverviewSteps", + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", "parameters": [ { "name": "id", @@ -11752,21 +13831,6 @@ "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": { @@ -11775,7 +13839,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11800,6 +13864,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +13904,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11861,15 +13955,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/pause": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "summary": "Pause a monitor", - "operationId": "pause", + "summary": "Update a maintenance window", + "operationId": "update_12", "parameters": [ { "name": "id", @@ -11885,10 +13977,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorOverlayRequest" + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -11896,7 +13989,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -11921,6 +14014,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +14054,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -11982,16 +14105,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/publish": { - "post": { + }, + "delete": { "tags": [ - "Monitor definitions" + "Maintenance Windows" ], - "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": "Delete a maintenance window", + "operationId": "delete_8", "parameters": [ { "name": "id", @@ -12003,26 +14123,9 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishRevisionRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -12044,6 +14147,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12074,6 +14187,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12107,41 +14240,30 @@ } } }, - "/api/v1/monitors/{id}/quarantine": { - "post": { + "/api/v1/members": { + "get": { "tags": [ - "Monitors" + "Members" ], - "summary": "Quarantine a monitor", - "operationId": "quarantine", + "summary": "List organization members", + "operationId": "list_21", "parameters": [ { - "name": "id", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QuarantineMonitorRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMemberDto" } } } @@ -12166,6 +14288,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +14328,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,37 +14381,40 @@ } } }, - "/api/v1/monitors/{id}/release-quarantine": { - "post": { + "/api/v1/members/{userId}": { + "delete": { "tags": [ - "Monitors" + "Members" ], - "summary": "Release quarantine", - "operationId": "releaseQuarantine", + "summary": "Remove member from organization", + "operationId": "remove_2", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -12268,8 +14423,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12308,6 +14463,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12341,101 +14516,44 @@ } } }, - "/api/v1/monitors/{id}/results": { - "get": { + "/api/v1/members/{userId}/role": { + "put": { "tags": [ - "Check Results" + "Members" ], - "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": "Change member role", + "operationId": "changeRole", "parameters": [ { - "name": "id", + "name": "userId", "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" + "format": "int32" } } ], - "responses": { - "200": { - "description": "Paginated check results", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeRoleRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { - "description": "Invalid query parameters", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12450,28 +14568,8 @@ } } }, - "403": { - "description": "Monitor does not belong to the caller's org", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } - } - } - }, - "404": { - "description": "Monitor not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12480,8 +14578,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12490,8 +14588,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12500,8 +14598,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -12509,67 +14607,9 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/results/summary": { - "get": { - "tags": [ - "Check Results" - ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "chartWindow", - "in": "query", - "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } - } - ], - "responses": { - "200": { - "description": "Results summary", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" - } - } - } - }, - "400": { - "description": "Invalid chartWindow parameter", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -12578,28 +14618,8 @@ } } }, - "403": { - "description": "Monitor does not belong to the caller's org", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } - }, - "404": { - "description": "Monitor not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -12641,35 +14661,38 @@ } } }, - "/api/v1/monitors/{id}/resume": { - "post": { + "/api/v1/members/{userId}/status": { + "put": { "tags": [ - "Monitors" + "Members" ], - "summary": "Resume a paused monitor", - "operationId": "resume", + "summary": "Change member status", + "operationId": "changeStatus", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeStatusRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -12690,58 +14713,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -12749,50 +14722,9 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/revisions": { - "get": { - "tags": [ - "Monitor definitions" - ], - "summary": "List revisions published in this monitor's environment", - "description": "Omits drafts never published here. Page size default 25.", - "operationId": "listRevisions", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -12801,8 +14733,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -12811,8 +14743,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": { @@ -12821,8 +14753,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -12831,8 +14763,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": { @@ -12874,50 +14806,178 @@ } } }, - "/api/v1/monitors/{id}/revisions/{revisionId}/test": { - "post": { + "/api/v1/monitors": { + "get": { "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": "List monitors for the authenticated org", + "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type` or `types`, `managedBy`, `tag` / `tags`, `search`, `environmentId`, `displayHealth`, `needsAttention`, and `region`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", + "operationId": "list_9", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean" } }, { - "name": "revisionId", - "in": "path", - "required": true, + "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" + ] } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" + }, + { + "name": "types", + "in": "query", + "description": "Filter by monitor types, comma-separated; matches any listed type", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] } } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "displayHealth", + "in": "query", + "description": "Filter by projected chip health", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "needsAttention", + "in": "query", + "description": "When true, only monitors that need operator attention", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "region", + "in": "query", + "description": "Filter by probe region", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "triage", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorTriageParams" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } - }, + ], "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -12942,6 +15002,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +15042,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,44 +15093,30 @@ } } } - } - }, - "/api/v1/monitors/{id}/rollback": { + }, "post": { "tags": [ - "Monitor definitions" - ], - "summary": "Roll back Head to a prior revision", - "description": "Same Head UPDATE as publish; stores reason on the Head.", - "operationId": "rollback", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Monitors" ], + "summary": "Create a new monitor", + "operationId": "create_10", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RollbackRevisionRequest" + "$ref": "#/components/schemas/CreateMonitorRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13065,6 +15141,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13095,6 +15181,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +15234,13 @@ } } }, - "/api/v1/monitors/{id}/rollback-preview": { + "/api/v1/monitors/{id}": { "get": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "Preview rollback consequences for this environment", - "operationId": "rollbackPreview", + "summary": "Get a single monitor by id", + "operationId": "get_6", "parameters": [ { "name": "id", @@ -13144,15 +15250,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "revisionId", - "in": "query", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -13161,7 +15258,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13186,6 +15283,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +15323,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13247,16 +15374,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/rotate-token": { - "post": { + }, + "put": { "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": "Update a monitor", + "operationId": "update_11", "parameters": [ { "name": "id", @@ -13268,6 +15392,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -13299,6 +15433,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +15473,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13360,16 +15524,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/runs": { - "get": { + }, + "delete": { "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": "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", @@ -13379,29 +15541,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/MonitorRunListParams" - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageRunDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13410,8 +15567,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13450,6 +15607,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +15658,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/drift": { + "get": { "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": "IaC-declared baseline vs live overlays", + "operationId": "drift", "parameters": [ { "name": "id", @@ -13501,12 +15679,12 @@ } ], "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" } } } @@ -13531,6 +15709,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +15749,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +15802,14 @@ } } }, - "/api/v1/monitors/{id}/runs/summary": { + "/api/v1/monitors/{id}/history": { "get": { "tags": [ - "Monitor Runs" + "Monitor History" ], - "summary": "Summarize one monitor's execution durations", - "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", - "operationId": "summarizeMonitorRuns", + "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", @@ -13611,6 +15819,24 @@ "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": { @@ -13619,7 +15845,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + "$ref": "#/components/schemas/CursorPageMonitorHistoryEntryDto" } } } @@ -13644,6 +15870,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +15910,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +15963,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests": { - "get": { + "/api/v1/monitors/{id}/mute": { + "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "List secret requests for a monitor", - "operationId": "list_19", + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", "parameters": [ { "name": "id", @@ -13725,13 +15981,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13756,6 +16021,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,8 +16061,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": { @@ -13796,8 +16071,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": { @@ -13806,8 +16081,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -13815,17 +16090,38 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/secret-requests/{key}": { - "put": { + }, + "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": [ - "Monitor secret requests" + "Check Results" ], - "summary": "Attach or clear a remapped secret for a key", - "operationId": "remap", + "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", @@ -13837,31 +16133,48 @@ } }, { - "name": "key", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window for step aggregates", + "required": false, "schema": { - "type": "string" + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemapSecretRequest" - } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to inspect; defaults to the live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "lastRuns", + "in": "query", + "description": "Latest settled runs, 1–30; ignores the window within retention", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" } } } @@ -13886,6 +16199,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13916,6 +16239,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16292,13 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/rescan": { + "/api/v1/monitors/{id}/pause": { "post": { "tags": [ - "Monitor secret requests" + "Monitors" ], - "summary": "Rescan secret requests from the active package", - "operationId": "rescan", + "summary": "Pause a monitor", + "operationId": "pause", "parameters": [ { "name": "id", @@ -13967,13 +16310,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -13998,6 +16350,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +16390,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16443,14 @@ } } }, - "/api/v1/monitors/{id}/session": { - "get": { + "/api/v1/monitors/{id}/publish": { + "post": { "tags": [ - "Monitor session" + "Monitor definitions" ], - "summary": "Get the monitor session", - "operationId": "getSession", + "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", @@ -14079,13 +16462,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -14110,6 +16503,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +16543,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +16594,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/quarantine": { + "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Create or update the monitor session", - "operationId": "putSession", + "summary": "Quarantine a monitor", + "operationId": "quarantine", "parameters": [ { "name": "id", @@ -14193,7 +16618,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + "$ref": "#/components/schemas/QuarantineMonitorRequest" } } }, @@ -14205,7 +16630,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14230,6 +16655,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +16695,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14293,13 +16748,13 @@ } } }, - "/api/v1/monitors/{id}/session/renew": { + "/api/v1/monitors/{id}/release-quarantine": { "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Renew the monitor session", - "operationId": "renewSession", + "summary": "Release quarantine", + "operationId": "releaseQuarantine", "parameters": [ { "name": "id", @@ -14312,12 +16767,12 @@ } ], "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14342,6 +16797,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +16837,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14405,13 +16890,14 @@ } } }, - "/api/v1/monitors/{id}/session/revoke": { + "/api/v1/monitors/{id}/restore": { "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Revoke the monitor session", - "operationId": "revokeSession", + "summary": "Restore a deleted monitor", + "description": "Restores the monitor, its status-page components and its schedule. Counts against the plan's monitor limit. An optional environmentId selects a code monitor's restore environment.", + "operationId": "restore", "parameters": [ { "name": "id", @@ -14423,13 +16909,22 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreMonitorRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14454,6 +16949,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +16989,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14517,13 +17042,14 @@ } } }, - "/api/v1/monitors/{id}/settings/preview": { + "/api/v1/monitors/{id}/results": { "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Projected run volume and meter headroom", - "operationId": "settingsPreview", + "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", @@ -14533,25 +17059,84 @@ "type": "string", "format": "uuid" } + }, + { + "name": "from", + "in": "query", + "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1–200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } } ], "responses": { "200": { - "description": "OK", + "description": "Paginated check results", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid query parameters", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } @@ -14566,8 +17151,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": { @@ -14576,12 +17161,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } @@ -14596,6 +17191,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14629,14 +17244,14 @@ } } }, - "/api/v1/monitors/{id}/status-pages": { + "/api/v1/monitors/{id}/results/by-region": { "get": { "tags": [ - "Monitors" + "Check Results" ], - "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": "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", @@ -14646,25 +17261,48 @@ "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": "OK", + "description": "Per-region chart series", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/RegionResultSeriesDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid window or region parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" } } } @@ -14679,8 +17317,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": { @@ -14689,12 +17327,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" } } } @@ -14709,6 +17357,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14742,13 +17410,14 @@ } } }, - "/api/v1/monitors/{id}/tags": { + "/api/v1/monitors/{id}/results/summary": { "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "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", @@ -14758,25 +17427,40 @@ "type": "string", "format": "uuid" } + }, + { + "name": "chartWindow", + "in": "query", + "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } } ], "responses": { "200": { - "description": "OK", + "description": "Results summary", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/ResultSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -14791,8 +17475,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14801,12 +17485,22 @@ } } }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -14821,6 +17515,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14852,13 +17566,15 @@ } } } - }, + } + }, + "/api/v1/monitors/{id}/resume": { "post": { "tags": [ "Monitors" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "summary": "Resume a paused monitor", + "operationId": "resume", "parameters": [ { "name": "id", @@ -14870,23 +17586,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -14911,6 +17617,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +17657,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14972,13 +17708,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/revisions": { + "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "summary": "List revisions that were live for this monitor", + "description": "Default is live and previous revisions. Pass state for drafts, or state=all. Page size default 25.", + "operationId": "listRevisions", "parameters": [ { "name": "id", @@ -14988,22 +17727,36 @@ "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" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRevisionDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -15024,6 +17777,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +17817,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15085,15 +17868,14 @@ } } } - } - }, - "/api/v1/monitors/{id}/takeover": { + }, "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Claim a field for dashboard ownership or reset an overlay", - "operationId": "takeover", + "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", @@ -15103,13 +17885,21 @@ "type": "string", "format": "uuid" } + }, + { + "name": "X-DevHelm-Client", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TakeoverMonitorRequest" + "$ref": "#/components/schemas/CreateDraftRevisionRequest" } } }, @@ -15121,7 +17911,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseCreateDraftRevisionResponse" } } } @@ -15146,6 +17936,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15176,6 +17976,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15209,14 +18029,13 @@ } } }, - "/api/v1/monitors/{id}/test": { - "post": { + "/api/v1/monitors/{id}/revisions/{revisionId}": { + "delete": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Test an existing monitor", - "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", - "operationId": "testExisting", + "summary": "Discard a draft revision", + "operationId": "discardDraft", "parameters": [ { "name": "id", @@ -15226,40 +18045,33 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } - }, + ], "responses": { - "200": { - "description": "Probe result for an uptime monitor", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" - } - } - } + "204": { + "description": "No Content" }, - "202": { - "description": "Queued validation run for a browser or multi-step API monitor", + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -15268,8 +18080,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15308,8 +18120,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": { @@ -15318,8 +18130,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": { @@ -15328,111 +18140,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/monitors/{id}/test-notifications": { - "post": { - "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", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -15464,13 +18173,13 @@ } } }, - "/api/v1/monitors/{id}/unmute": { + "/api/v1/monitors/{id}/revisions/{revisionId}/keep": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Clear mute overlay", - "operationId": "unmute", + "summary": "Extend an open draft for another fourteen days", + "operationId": "keepDraft", "parameters": [ { "name": "id", @@ -15480,6 +18189,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -15488,7 +18206,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -15513,6 +18231,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18271,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15576,14 +18324,14 @@ } } }, - "/api/v1/monitors/{id}/uptime": { - "get": { + "/api/v1/monitors/{id}/revisions/{revisionId}/test": { + "post": { "tags": [ - "Check Results" + "Monitor definitions" ], - "summary": "Get uptime statistics", - "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows. Daily windows fall back to hourly when the daily rollup reports fewer checks.", - "operationId": "getUptime", + "summary": "Run remote validation against a revision without moving Head", + "description": "Admits a queued Run with source=remote_validation. Does not vote on health. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", + "operationId": "testRevision", "parameters": [ { "name": "id", @@ -15595,38 +18343,41 @@ } }, { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, + "name": "revisionId", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeTestTargetRequest" + } + } + } + }, "responses": { - "200": { - "description": "Uptime statistics", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } }, "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 +18392,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 +18432,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15704,13 +18485,14 @@ } } }, - "/api/v1/monitors/{id}/usage-preview": { + "/api/v1/monitors/{id}/rollback": { "post": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "Project monthly usage for an update payload", - "operationId": "previewUsage", + "summary": "Roll back Head to a prior live revision", + "description": "revisionId null restores the previous live revision. Returns this monitor's head and its open incidents.", + "operationId": "rollback", "parameters": [ { "name": "id", @@ -15726,7 +18508,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" + "$ref": "#/components/schemas/RollbackRevisionRequest" } } }, @@ -15738,7 +18520,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" } } } @@ -15763,6 +18545,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18585,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15826,14 +18638,13 @@ } } }, - "/api/v1/monitors/{id}/versions": { + "/api/v1/monitors/{id}/rollback-preview": { "get": { "tags": [ - "Monitors" + "Monitor definitions" ], - "summary": "List version history for a monitor", - "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", - "operationId": "listVersions", + "summary": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", "parameters": [ { "name": "id", @@ -15845,11 +18656,13 @@ } }, { - "name": "pageable", + "name": "revisionId", "in": "query", - "required": true, + "description": "Revision to preview; null previews the previous live revision", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -15859,7 +18672,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" } } } @@ -15884,6 +18697,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18737,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15947,14 +18790,14 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { - "get": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ "Monitors" ], - "summary": "Get a specific version snapshot for a monitor", - "description": "Returns the full monitor config snapshot captured at the given version number.", - "operationId": "getVersion", + "summary": "Rotate the ping token for a heartbeat monitor", + "description": "Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.", + "operationId": "rotateToken", "parameters": [ { "name": "id", @@ -15964,15 +18807,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -15981,7 +18815,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -16006,6 +18840,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +18880,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +18933,40 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/{id}/runs": { + "get": { "tags": [ - "Monitor Alert Channels" + "Monitor Runs" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "List runs for a code monitor", + "description": "Cursor page of runs from the last 90 days. Default limit 25.", + "operationId": "listMonitorRuns", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorRunListParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -16128,6 +18991,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19031,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16189,43 +19082,40 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions": { + }, "post": { "tags": [ - "Monitor Assertions" + "Monitor Runs" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "Run a code monitor now", + "description": "Starts one queued run in the monitor's first region. Works on paused monitors and does not affect health.", + "operationId": "runNow", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -16250,6 +19140,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19180,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19233,16 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + "/api/v1/monitors/{id}/runs/regional-health": { + "get": { "tags": [ - "Monitor Assertions" + "monitor-run-diagnostics-controller" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "summary": "Get regional run health without changing incident evaluation", + "operationId": "health", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16340,23 +19251,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/SingleValueResponseMonitorRegionalHealthDto" } } } @@ -16381,6 +19282,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19322,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +19373,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/runs/schedule": { + "get": { "tags": [ - "Monitor Assertions" + "monitor-run-diagnostics-controller" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Get the next actual scheduler admission time", + "operationId": "schedule", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16470,8 +19394,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorScheduleDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16493,6 +19424,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16523,6 +19464,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16556,41 +19517,60 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { - "put": { + "/api/v1/monitors/{id}/runs/series": { + "get": { "tags": [ - "Monitor Auth" + "monitor-run-diagnostics-controller" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "Get execution-duration and regional target-health chart buckets", + "operationId": "series", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" - } + }, + { + "name": "window", + "in": "query", + "description": "Chart window: 24h, 7d, or 30d", + "required": false, + "schema": { + "type": "string", + "default": "24h" } }, - "required": true - }, + { + "name": "revisionId", + "in": "query", + "description": "Limit chart samples to one revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "region", + "in": "query", + "description": "Limit chart samples to one configured region", + "required": false, + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunSeriesDto" } } } @@ -16615,6 +19595,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16645,6 +19635,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16676,16 +19686,19 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/runs/summary": { + "get": { "tags": [ - "Monitor Auth" + "Monitor Runs" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Summarize one monitor's execution durations", + "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", + "operationId": "summarizeMonitorRuns", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16694,23 +19707,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" } } } @@ -16735,6 +19738,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +19778,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16796,27 +19829,46 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/secret-requests": { + "get": { "tags": [ - "Monitor Auth" + "Monitor secret requests" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", + "summary": "List secret requests for a monitor", + "operationId": "list_20", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision whose key demand to preview; null uses live", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16838,6 +19890,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -16868,6 +19930,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16901,33 +19983,49 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { - "get": { + "/api/v1/monitors/{id}/secret-requests/{key}": { + "put": { "tags": [ - "Incident Policies" + "Monitor secret requests" ], - "summary": "Get incident policy for a monitor", - "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", - "operationId": "get_5", + "summary": "Attach or clear a remapped secret for a key", + "operationId": "remap", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemapSecretRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } @@ -16952,6 +20050,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20071,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 +20090,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17013,19 +20141,19 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/secret-requests/rescan": { + "post": { "tags": [ - "Incident Policies" + "Monitor secret requests" ], - "summary": "Update incident policy for a monitor", - "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", - "operationId": "update_8", + "summary": "Rescan secret requests from the active package", + "operationId": "rescan", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -17033,33 +20161,23 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" } } } }, "400": { - "description": "Validation error in JSONB shape", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -17074,6 +20192,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20213,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 +20232,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17137,31 +20285,31 @@ } } }, - "/api/v1/monitors/bulk": { - "post": { + "/api/v1/monitors/{id}/session": { + "get": { "tags": [ - "Monitors" + "Monitor session" ], - "summary": "Bulk action on monitors", - "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", - "operationId": "bulkAction", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" - } + "summary": "Get the monitor session", + "operationId": "getSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17186,6 +20334,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17216,6 +20374,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17247,32 +20425,41 @@ } } } - } - }, - "/api/v1/monitors/package-uploads": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Monitor session" + ], + "summary": "Create or update the monitor session", + "operationId": "putSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Mint a signed package upload URL", - "operationId": "createPackageUpload", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePackageUploadRequest" + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePackageUploadDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17297,6 +20484,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20524,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +20577,31 @@ } } }, - "/api/v1/monitors/test": { + "/api/v1/monitors/{id}/session/renew": { "post": { "tags": [ - "Monitors" + "Monitor session" ], - "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" - } + "summary": "Renew the monitor session", + "operationId": "renewSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -17409,6 +20626,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20666,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +20719,31 @@ } } }, - "/api/v1/monitors/usage-preview": { + "/api/v1/monitors/{id}/session/revoke": { "post": { "tags": [ - "Monitors" + "Monitor session" ], - "summary": "Project monthly usage for a create payload", - "operationId": "previewUsage_1", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "Revoke the monitor session", + "operationId": "revokeSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17520,6 +20768,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +20808,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17583,19 +20861,17 @@ } } }, - "/api/v1/notification-dispatches": { + "/api/v1/monitors/{id}/sessions": { "get": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "summary": "List all dispatches for an incident", - "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", - "operationId": "listByIncident", + "summary": "List sign-in sessions by setup file", + "operationId": "listMonitorSetupSessions", "parameters": [ { - "name": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { "type": "string", @@ -17609,7 +20885,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultMonitorSessionDto" } } } @@ -17634,6 +20910,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17664,6 +20950,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17695,16 +21001,13 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}": { - "get": { + }, + "put": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "summary": "Get a single dispatch with full escalation and delivery history", - "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", - "operationId": "getById_3", + "summary": "Create or update one setup-file session", + "operationId": "upsertMonitorSetupSession", "parameters": [ { "name": "id", @@ -17716,13 +21019,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17747,6 +21060,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -17777,6 +21100,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17810,14 +21153,13 @@ } } }, - "/api/v1/notification-dispatches/{id}/acknowledge": { + "/api/v1/monitors/{id}/sessions/renew": { "post": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "summary": "Acknowledge a notification dispatch", - "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", - "operationId": "acknowledge", + "summary": "Capture a new session for one setup file", + "operationId": "renewMonitorSetupSession", "parameters": [ { "name": "id", @@ -17827,15 +21169,24 @@ "type": "string", "format": "uuid" } + }, + { + "name": "setupFile", + "in": "query", + "description": "Setup file to capture", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -17860,6 +21211,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21251,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17923,14 +21304,13 @@ } } }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { + "/api/v1/monitors/{id}/sessions/revoke": { "post": { "tags": [ - "Notification Dispatches" + "Monitor session" ], - "summary": "Unacknowledge a notification dispatch", - "description": "Reverses a mistaken acknowledgment without reopening the incident. Allowed only from ACKNOWLEDGED. Clears ack fields, stays on the current escalation step, restores nextEscalationAt, and resumes escalation (ESCALATING if more steps remain, else DELIVERED). MEMBER+.", - "operationId": "unacknowledge", + "summary": "Revoke the cache for one setup file", + "operationId": "revokeMonitorSetupSession", "parameters": [ { "name": "id", @@ -17940,6 +21320,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "setupFile", + "in": "query", + "description": "Setup file to revoke", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -17948,7 +21337,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" } } } @@ -17973,28 +21362,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", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -18003,59 +21372,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/notification-policies": { - "get": { - "tags": [ - "Notification Policies" - ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18064,8 +21382,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18074,8 +21392,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": { @@ -18084,8 +21402,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -18094,8 +21412,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": { @@ -18135,30 +21453,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/settings/preview": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" - } + "summary": "Projected run volume and meter headroom", + "operationId": "settingsPreview", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" } } } @@ -18183,6 +21504,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21544,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18246,13 +21597,14 @@ } } }, - "/api/v1/notification-policies/{id}": { + "/api/v1/monitors/{id}/status-pages": { "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "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", @@ -18270,7 +21622,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -18295,6 +21647,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21687,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18356,13 +21738,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/tags": { + "get": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { "name": "id", @@ -18374,23 +21758,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -18415,6 +21789,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21829,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18477,12 +21881,12 @@ } } }, - "delete": { + "post": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { "name": "id", @@ -18494,9 +21898,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddMonitorTagsRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTagDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -18518,6 +21939,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21979,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +22030,13 @@ } } } - } - }, - "/api/v1/notification-policies/{id}/dispatches": { - "get": { + }, + "delete": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "List dispatches (firing history) for a notification policy", - "description": "Optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50. Response is CursorPage (hasMore + nextCursor), the same wrapper used by other append-only history endpoints.", - "operationId": "listDispatches", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { "name": "id", @@ -18598,58 +22046,22 @@ "type": "string", "format": "uuid" } - }, - { - "name": "since", - "in": "query", - "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "until", - "in": "query", - "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous nextCursor", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size 1–100 when windowing/paginating (default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -18670,6 +22082,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22122,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18733,13 +22175,13 @@ } } }, - "/api/v1/notification-policies/{id}/test": { + "/api/v1/monitors/{id}/takeover": { "post": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Claim a field for dashboard ownership or reset an overlay", + "operationId": "takeover", "parameters": [ { "name": "id", @@ -18755,10 +22197,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" + "$ref": "#/components/schemas/TakeoverMonitorRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -18766,7 +22209,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -18791,6 +22234,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18821,6 +22274,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18854,51 +22327,51 @@ } } }, - "/api/v1/notifications": { - "get": { + "/api/v1/monitors/{id}/test": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "List notifications for the current user", - "operationId": "list_18", + "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": "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" } } ], + "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/TableValueResultNotificationDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -18923,6 +22396,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22436,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22489,45 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/monitors/{id}/test-notifications": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Send test notifications through the monitor's alert channels", + "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", + "operationId": "testNotifications", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTestChannelResult" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19028,6 +22549,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22589,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22642,45 @@ } } }, - "/api/v1/notifications/read-all": { - "put": { + "/api/v1/monitors/{id}/transfer": { + "post": { "tags": [ - "Notifications" + "Monitors" ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", + "summary": "Transfer a monitor to another owning tool", + "description": "Changes managedBy in one audited call. Required to change the owner of an owner-enforced or code monitor.", + "operationId": "transfer", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferMonitorRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19122,6 +22702,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +22742,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19185,20 +22795,49 @@ } } }, - "/api/v1/notifications/unread-count": { - "get": { + "/api/v1/monitors/{id}/triggers": { + "post": { "tags": [ - "Notifications" + "Monitor Runs" ], - "summary": "Get unread notification count", - "operationId": "unreadCount", + "summary": "Trigger a code monitor in several regions", + "description": "Starts one queued run per region; every configured region when none are given. Works on paused monitors. Does not affect health unless signal is true.", + "operationId": "triggerMonitorRuns", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerRunRequest" + } + } + } + }, "responses": { - "200": { - "description": "OK", + "202": { + "description": "Accepted", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" + "$ref": "#/components/schemas/SingleValueResponseTriggerRunsResponse" } } } @@ -19223,6 +22862,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19253,6 +22902,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +22955,31 @@ } } }, - "/api/v1/org": { - "get": { + "/api/v1/monitors/{id}/unmute": { + "post": { "tags": [ - "Organizations" + "Monitors" + ], + "summary": "Clear mute overlay", + "operationId": "unmute", + "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/SingleValueResponseMonitorDto" } } } @@ -19324,6 +23004,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23044,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,40 +23095,59 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/{id}/uptime": { + "get": { "tags": [ - "Organizations" + "Check Results" ], - "summary": "Update the current organization", - "operationId": "update_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" - } + "summary": "Get uptime statistics", + "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows. Daily windows fall back to hourly when the daily rollup reports fewer checks.", + "operationId": "getUptime", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "window", + "in": "query", + "description": "Time window for uptime calculation", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], "responses": { "200": { - "description": "OK", + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$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" } } } @@ -19433,8 +23162,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": { @@ -19443,12 +23172,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" } } } @@ -19463,6 +23202,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +23255,41 @@ } } }, - "/api/v1/resource-groups": { - "get": { + "/api/v1/monitors/{id}/usage-preview": { + "post": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", + "summary": "Project monthly usage for an update payload", + "operationId": "previewUsage", + "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/TableValueResultResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -19534,6 +23314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +23405,42 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/versions": { + "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "Create a new resource group", - "operationId": "create_7", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" - } + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" } } } @@ -19643,6 +23465,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23505,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +23558,14 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/monitors/{id}/versions/{version}": { "get": { "tags": [ - "Resource Groups" + "Monitors" ], - "summary": "Get a resource group by id with member statuses and inherited settings", - "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", - "operationId": "get_3", + "summary": "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", @@ -19725,12 +23577,12 @@ } }, { - "name": "includeMetrics", - "in": "query", - "required": false, + "name": "version", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "integer", + "format": "int32" } } ], @@ -19740,7 +23592,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } @@ -19765,6 +23617,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23657,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +23708,18 @@ } } } - }, + } + }, + "/api/v1/monitors/{monitorId}/alert-channels": { "put": { "tags": [ - "Resource Groups" + "Monitor Alert Channels" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -19848,7 +23732,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" + "$ref": "#/components/schemas/SetAlertChannelsRequest" } } }, @@ -19860,7 +23744,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } @@ -19885,6 +23769,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23809,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +23860,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{monitorId}/assertions": { + "post": { "tags": [ - "Resource Groups" + "Monitor Assertions" ], - "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": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -19965,9 +23880,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19989,6 +23921,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23961,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +24014,25 @@ } } }, - "/api/v1/resource-groups/{id}/health": { - "get": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Resource Groups" + "Monitor Assertions" ], - "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": "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": { @@ -20071,13 +24041,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -20102,6 +24082,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24122,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20163,19 +24173,25 @@ } } } - } - }, - "/api/v1/resource-groups/{id}/matched-policies": { - "get": { + }, + "delete": { "tags": [ - "Resource Groups" + "Monitor Assertions" ], - "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": "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": { @@ -20185,18 +24201,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20205,8 +24224,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -20245,6 +24264,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20278,16 +24317,16 @@ } } }, - "/api/v1/resource-groups/{id}/members": { - "post": { + "/api/v1/monitors/{monitorId}/auth": { + "put": { "tags": [ - "Resource Groups" + "Monitor Auth" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20300,19 +24339,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -20337,6 +24376,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24416,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20398,27 +24467,16 @@ } } } - } - }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + }, + "post": { "tags": [ - "Resource Groups" + "Monitor Auth" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "Set authentication config for a monitor", + "operationId": "set", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "memberId", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20427,9 +24485,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20451,6 +24526,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24566,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20512,18 +24617,16 @@ } } } - } - }, - "/api/v1/revisions/{id}": { - "get": { + }, + "delete": { "tags": [ - "Revisions" + "Monitor Auth" ], - "summary": "Get revision package", - "operationId": "get_13", + "summary": "Remove authentication config from a monitor", + "operationId": "remove", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -20533,18 +24636,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -20553,8 +24659,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -20593,6 +24699,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,18 +24752,19 @@ } } }, - "/api/v1/revisions/{id}/bundle": { + "/api/v1/monitors/{monitorId}/policy": { "get": { "tags": [ - "Revisions" + "Incident Policies" ], - "summary": "Redirect to signed package download", - "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", - "operationId": "bundle", + "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", @@ -20647,7 +24774,14 @@ ], "responses": { "200": { - "description": "OK" + "description": "Policy found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/IncidentPolicyDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20669,6 +24803,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20680,11 +24824,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" } } } @@ -20699,6 +24843,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20730,20 +24894,19 @@ } } } - } - }, - "/api/v1/revisions/{id}/bundle/content": { - "get": { + }, + "put": { "tags": [ - "Revisions" + "Incident Policies" ], - "summary": "Download revision archive", - "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", - "operationId": "bundleContent", + "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", @@ -20751,24 +24914,33 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Policy updated", "content": { - "application/zip": { + "*/*": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Validation error in JSONB shape", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } @@ -20783,6 +24955,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20794,11 +24976,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" } } } @@ -20813,6 +24995,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +25048,45 @@ } } }, - "/api/v1/revisions/{id}/diff/{other}": { + "/api/v1/monitors/batch-history": { "get": { "tags": [ - "Revisions" + "Monitors" ], - "summary": "Compare two revisions (bounded hunks)", - "operationId": "diff", + "summary": "Availability, p95 and ticks for several monitors", + "description": "History for up to 100 monitors in one call, so a list page needs no per-monitor request. window is 24h (default), 7d or 30d.", + "operationId": "batchHistory", "parameters": [ { - "name": "id", - "in": "path", + "name": "ids", + "in": "query", + "description": "Monitor ids, comma-separated; at most 100", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } }, { - "name": "other", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "History window: 24h (default), 7d or 30d", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" + } + }, + { + "name": "density", + "in": "query", + "description": "Return 48 display-only history buckets", + "required": false, + "schema": { + "type": "integer", + "format": "int32" } } ], @@ -20879,7 +25096,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorBatchHistoryDto" } } } @@ -20904,6 +25121,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25161,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20967,31 +25214,31 @@ } } }, - "/api/v1/runs": { - "get": { + "/api/v1/monitors/bulk": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "List code runs", - "description": "Org index. Default window last 30 minutes; from clamped to 90 days. Page size 50.", - "operationId": "listRuns", - "parameters": [ - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunListParams" + "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/TableValueResultRunDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -21016,6 +25263,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25303,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +25356,24 @@ } } }, - "/api/v1/runs/{id}": { + "/api/v1/monitors/export.csv": { "get": { "tags": [ - "Runs" + "monitor-export-controller" ], - "summary": "Get a run", - "operationId": "getRun", + "summary": "Export up to 200 explicitly selected monitors as CSV", + "operationId": "csv", "parameters": [ { - "name": "id", - "in": "path", + "name": "ids", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } } } ], @@ -21101,9 +25381,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "type": "string", + "format": "byte" } } } @@ -21128,6 +25409,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25449,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,23 +25502,161 @@ } } }, - "/api/v1/runs/{id}/artifacts": { + "/api/v1/monitors/facets": { "get": { "tags": [ - "Runs" + "Monitors" ], - "summary": "List run artifacts", - "description": "Complete persist manifest for this run.", - "operationId": "listRunArtifacts", + "summary": "Count monitors per list group and facet value", + "description": "Takes the same filters as the monitor list. Groups: failing, not_running, flaky, passing, running, paused. Facet fields: type, environment, region, tag, owner.", + "operationId": "facets", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "types", + "in": "query", + "description": "Filter by monitor types, comma-separated; matches any listed type", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "displayHealth", + "in": "query", + "description": "Filter by projected chip health", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "needsAttention", + "in": "query", + "description": "When true, only monitors that need operator attention", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "region", + "in": "query", + "description": "Filter by probe region", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "triage", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorTriageParams" + } } ], "responses": { @@ -21216,7 +25665,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunArtifactDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorListFacetsDto" } } } @@ -21241,6 +25690,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25730,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,28 +25783,37 @@ } } }, - "/api/v1/runs/{id}/cancel": { + "/api/v1/monitors/test": { "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "Request run cancel", - "description": "Sets cancel_requested; phase unchanged.", - "operationId": "cancelRun", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Ad-hoc monitor test", + "description": "Uptime monitors run once from an inline config and return a probe result (200). Browser and multi-step API monitors with code admit a queued validation run (202) when that bundle is already saved on a monitor. Inline code without a bundle is refused.", + "operationId": "testAdHoc", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorTestRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Probe result for an uptime monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API bundle", "content": { "*/*": { "schema": { @@ -21354,6 +25842,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25882,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21417,31 +25935,20 @@ } } }, - "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "/api/v1/monitors/trash": { "get": { "tags": [ - "Runs" + "Monitors" ], - "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": "List deleted monitors that can still be restored", + "operationId": "listTrash", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "artifactId", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -21449,9 +25956,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -21476,6 +25983,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26023,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,39 +26076,30 @@ } } }, - "/api/v1/runs/{id}/cases": { - "get": { + "/api/v1/monitors/usage-preview": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "List run cases with nested steps", - "operationId": "listRunCases", - "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": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunCaseListParams" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunCaseDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -21596,6 +26124,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26164,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21659,45 +26217,30 @@ } } }, - "/api/v1/runs/{id}/console": { - "get": { + "/api/v1/monitors/validate": { + "post": { "tags": [ - "Runs" + "Monitors" ], - "summary": "Download raw console log", - "description": "Ungrouped text/plain console lines.", - "operationId": "getRunConsoleRaw", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Dry-run plan, secret, and runtime checks", + "operationId": "validateMonitors", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateMonitorsRequest" + } } }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunConsoleParams" - } - } - ], + "required": true + }, "responses": { "200": { "description": "OK", "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" - } - }, - "text/plain": { + "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseMonitorValidationResultDto" } } } @@ -21722,6 +26265,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26305,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,28 +26358,20 @@ } } }, - "/api/v1/runs/{id}/diff": { + "/api/v1/notification-dispatches": { "get": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Diff this run against a prior pass", - "description": "Default baseline is the last pass of the same revision in this region. Pass baselineRunId to pick another finished run of the same monitor.", - "operationId": "getRunDiff", + "summary": "List all dispatches for an incident", + "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", + "operationId": "listByIncident", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "baselineRunId", + "name": "incident_id", "in": "query", - "required": false, + "description": "UUID of the incident to inspect", + "required": true, "schema": { "type": "string", "format": "uuid" @@ -21817,9 +26382,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } @@ -21844,6 +26409,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26449,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +26502,14 @@ } } }, - "/api/v1/runs/{id}/events": { + "/api/v1/notification-dispatches/{id}": { "get": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Stream run control events", - "operationId": "streamRunEvents", + "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", @@ -21923,31 +26519,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/SingleValueResponseNotificationDispatchDto" } } } @@ -21972,6 +26552,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22002,8 +26592,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": { @@ -22012,7 +26602,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": { @@ -22035,14 +26645,14 @@ } } }, - "/api/v1/runs/{id}/export": { - "get": { + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "Export run snapshot and available artifacts", - "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", - "operationId": "exportRun", + "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", @@ -22056,9 +26666,13 @@ ], "responses": { "200": { - "description": "Zip of snapshot.json and available artifacts", + "description": "OK", "content": { - "application/zip": {} + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + } + } } }, "400": { @@ -22081,6 +26695,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22111,6 +26735,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22144,14 +26788,14 @@ } } }, - "/api/v1/runs/{id}/network": { - "get": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Runs" + "Notification Dispatches" ], - "summary": "List run network rows", - "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", - "operationId": "listRunNetwork", + "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", @@ -22161,14 +26805,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunNetworkParams" - } } ], "responses": { @@ -22177,7 +26813,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RunNetworkDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -22202,6 +26838,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26878,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,40 +26931,20 @@ } } }, - "/api/v1/runs/{id}/network/{rowId}": { + "/api/v1/notification-policies": { "get": { "tags": [ - "Runs" - ], - "summary": "Get one network row", - "description": "Includes redacted headers, bodies, and copy-as-cURL.", - "operationId": "getRunNetworkRow", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "rowId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Notification Policies" ], + "summary": "List all notification policies for the authenticated org", + "operationId": "list_8", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -22323,6 +26969,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27009,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22384,39 +27060,30 @@ } } } - } - }, - "/api/v1/runs/{id}/runner-log": { - "get": { + }, + "post": { "tags": [ - "Runs" + "Notification Policies" ], - "summary": "Snapshot in-flight runner log", - "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail — poll this endpoint or use GET /runner-log/live (SSE). After finish, the cold file is the runner_log artifact (GET /artifacts/{id}/content). Empty while no lines have been pushed.", - "operationId": "getRunRunnerLog", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_9", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { - "text/plain": { - "schema": { - "type": "string" - } - }, "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22441,6 +27108,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27148,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22504,14 +27201,13 @@ } } }, - "/api/v1/runs/{id}/runner-log/live": { + "/api/v1/notification-policies/{id}": { "get": { "tags": [ - "Runs" + "Notification Policies" ], - "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": "Get a notification policy by ID", + "operationId": "getById_1", "parameters": [ { "name": "id", @@ -22525,11 +27221,11 @@ ], "responses": { "200": { - "description": "Server-sent runner-log lines", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunnerLogLiveEvent" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22554,6 +27250,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27290,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22615,33 +27341,41 @@ } } } - } - }, - "/api/v1/runs/summary": { - "get": { + }, + "put": { "tags": [ - "Runs" + "Notification Policies" ], - "summary": "Summarize the filtered Runs population", - "description": "Uses the same enqueue-time window and filters as the Runs list; independent of pagination.", - "operationId": "summarizeRuns", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { - "name": "params", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -22666,6 +27400,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27440,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22727,28 +27491,40 @@ } } } - } - }, - "/api/v1/secrets": { - "get": { + }, + "delete": { "tags": [ - "Secrets" + "Notification Policies" + ], + "summary": "Delete a notification policy", + "operationId": "delete_6", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List organization secrets", - "operationId": "list_5", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22757,8 +27533,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -22797,6 +27573,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22828,30 +27624,73 @@ } } } - }, - "post": { + } + }, + "/api/v1/notification-policies/{id}/dispatches": { + "get": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } + "summary": "List dispatches (firing history) for a notification policy", + "description": "Optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50. Response is CursorPage (hasMore + nextCursor), the same wrapper used by other append-only history endpoints.", + "operationId": "listDispatches", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "since", + "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now−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/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } @@ -22876,6 +27715,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27755,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22939,20 +27808,21 @@ } } }, - "/api/v1/secrets/{key}": { - "put": { + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Secrets" + "Notification Policies" ], - "summary": "Update secret", - "operationId": "update_4", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -22960,11 +27830,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + "$ref": "#/components/schemas/TestNotificationPolicyRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -22972,7 +27841,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" } } } @@ -22997,6 +27866,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27906,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23058,26 +27957,56 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notifications": { + "get": { "tags": [ - "Secrets" + "Notifications" ], - "summary": "Delete secret", - "operationId": "delete_4", + "summary": "List notifications for the current user", + "operationId": "list_19", "parameters": [ { - "name": "key", - "in": "path", - "required": true, + "name": "unreadOnly", + "in": "query", + "required": false, "schema": { - "type": "string" + "type": "boolean", + "default": false + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -23099,6 +28028,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28068,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23162,36 +28121,40 @@ } } }, - "/api/v1/secrets/{key}/audit": { - "get": { + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Secrets" + "Notifications" ], - "summary": "Last update metadata for a secret", - "operationId": "audit", + "summary": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "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/SingleValueResponseSecretAuditDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23200,8 +28163,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -23240,6 +28203,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23273,42 +28256,13 @@ } } }, - "/api/v1/secrets/{key}/environments/{environmentId}": { + "/api/v1/notifications/read-all": { "put": { "tags": [ - "Secrets" - ], - "summary": "Write a secret value for one environment", - "operationId": "writeEnvironmentValue", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" - } - } - }, - "required": true - }, + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { "204": { "description": "No Content" @@ -23333,6 +28287,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28327,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23396,30 +28380,20 @@ } } }, - "/api/v1/secrets/{key}/usage": { + "/api/v1/notifications/unread-count": { "get": { "tags": [ - "Secrets" - ], - "summary": "Secret usage across monitors", - "operationId": "usage", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } @@ -23444,6 +28418,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28458,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23507,20 +28511,20 @@ } } }, - "/api/v1/service-subscriptions": { + "/api/v1/org": { "get": { "tags": [ - "Service Subscriptions" + "Organizations" ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_17", + "summary": "Get the current organization", + "operationId": "get_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -23545,6 +28549,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28589,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23606,33 +28640,30 @@ } } } - } - }, - "/api/v1/service-subscriptions/{id}": { - "get": { + }, + "put": { "tags": [ - "Service Subscriptions" + "Organizations" ], - "summary": "Get a subscription by its ID", - "operationId": "get_12", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "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/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -23657,6 +28688,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28728,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23718,28 +28779,25 @@ } } } - }, - "delete": { + } + }, + "/api/v1/regions": { + "get": { "tags": [ - "Service Subscriptions" - ], - "summary": "Remove a subscription by its ID", - "description": "Removes a specific subscription (whole-service or component-level). Also deletes status-page components that represent this dependency. The parent status page stays. No-op if not found.", - "operationId": "unsubscribe_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Regions" ], + "summary": "List public regions", + "operationId": "listRegions", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseListRegionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -23761,6 +28819,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28859,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23824,42 +28912,20 @@ } } }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { + "/api/v1/resource-groups": { + "get": { "tags": [ - "Service Subscriptions" - ], - "summary": "Update alert sensitivity for a subscription", - "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", - "operationId": "updateAlertSensitivity", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Resource Groups" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" - } - } - }, - "required": true - }, + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } @@ -23884,6 +28950,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28990,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23945,34 +29041,22 @@ } } } - } - }, - "/api/v1/service-subscriptions/{slug}": { + }, "post": { "tags": [ - "Service Subscriptions" - ], - "summary": "Subscribe to a service or a component of a service", - "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", - "operationId": "subscribe_1", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Resource Groups" ], + "summary": "Create a new resource group", + "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" + "$ref": "#/components/schemas/CreateResourceGroupRequest" } } - } + }, + "required": true }, "responses": { "201": { @@ -23980,7 +29064,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24005,6 +29089,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29129,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24068,86 +29182,31 @@ } } }, - "/api/v1/services": { + "/api/v1/resource-groups/{id}": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", + "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": "category", - "in": "query", - "description": "Filter by category (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by current overall_status (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "published", - "in": "query", - "description": "Filter by published status for pSEO pages", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "slaPublished", - "in": "query", - "description": "Filter by SLA page publication status", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on service name or slug", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "limit", + "name": "includeMetrics", "in": "query", - "description": "Page size (1–100, default 20)", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "boolean", + "default": false } } ], @@ -24157,7 +29216,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24182,6 +29241,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29281,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24243,53 +29332,41 @@ } } } - } - }, - "/api/v1/services/{slugOrId}": { - "get": { + }, + "put": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", - "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", - "operationId": "getService", + "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "summary", - "in": "query", - "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "publishedOnly", - "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", - "required": false, - "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -24314,6 +29391,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29431,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24375,78 +29482,41 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", - "operationId": "getComponents", + "summary": "Delete a resource group (cascades to member rows)", + "description": "Also deletes status-page components that represent this group. The parent status page stays.", + "operationId": "delete_5", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "groupId", - "in": "query", - "description": "Restrict result to direct children of this group component id", - "required": false, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on component name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "Zero-based page index", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "size", - "in": "query", - "description": "Page size (default 25, max 100)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -24455,8 +29525,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -24495,6 +29565,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24528,66 +29618,23 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "/api/v1/resource-groups/{id}/health": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get daily uptime data for a component", - "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", - "operationId": "getComponentUptime", + "summary": "Get the detailed health breakdown for a resource group", + "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", + "operationId": "getHealth", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "componentId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } } ], "responses": { @@ -24596,7 +29643,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -24621,6 +29668,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29708,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24684,69 +29761,22 @@ } } }, - "/api/v1/services/{slugOrId}/components/uptime": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Batch daily uptime data for leaf components", - "description": "Returns daily uptime keyed by component ID. Pass ``componentIds`` to limit the batch to those components (max 100); omit it for every active component with uptime data. Supports either a preset ``period`` or an explicit ``from``/``to`` window (ISO yyyy-MM-dd, max 730 days). The explicit window wins when both are supplied — this is what powers the sliding 90-day navigator on the public uptime history page.", - "operationId": "getBatchComponentUptime", + "summary": "List notification policies that match this resource group", + "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", + "operationId": "listMatchedPolicies", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, "schema": { "type": "string", - "format": "date" - } - }, - { - "name": "componentIds", - "in": "query", - "description": "Component ids to include (max 100); omit for every component", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "format": "uuid" } } ], @@ -24756,7 +29786,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -24781,6 +29811,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29851,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24844,41 +29904,41 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { - "get": { + "/api/v1/resource-groups/{id}/members": { + "post": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", - "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", - "operationId": "getServiceDayDetail", + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "date", + "name": "id", "in": "path", - "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } @@ -24903,6 +29963,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30003,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24966,67 +30056,49 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, "schema": { "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] + "format": "uuid" } }, { - "name": "pageable", - "in": "query", + "name": "memberId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "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/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -25035,8 +30107,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -25075,6 +30147,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25108,24 +30200,16 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "/api/v1/revisions/{id}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "Get revision package", + "operationId": "get_13", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "incidentId", + "name": "id", "in": "path", "required": true, "schema": { @@ -25140,7 +30224,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -25165,6 +30249,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30289,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25228,37 +30342,41 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/revisions/{id}/bundle": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Lightweight live-status snapshot for polling", - "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", - "operationId": "getServiceLiveStatus", + "summary": "Redirect to signed package download", + "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", + "operationId": "bundle", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], "responses": { "200": { - "description": "OK", + "description": "OK" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -25267,8 +30385,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -25307,6 +30425,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25340,32 +30478,22 @@ } } }, - "/api/v1/services/{slugOrId}/maintenances": { + "/api/v1/revisions/{id}/bundle/content": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "Download revision archive", + "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", + "operationId": "bundleContent", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "format": "uuid" } } ], @@ -25373,9 +30501,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/zip": { "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "type": "string", + "format": "binary" } } } @@ -25400,6 +30529,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30569,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25463,40 +30622,30 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/revisions/{id}/diff/{other}": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, + "name": "other", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "string", + "format": "uuid" } } ], @@ -25506,7 +30655,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } @@ -25531,6 +30680,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30720,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25594,34 +30773,22 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { + "/api/v1/revisions/{id}/files": { "get": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "summary": "Read revision source files", + "description": "Returns the entry file path and source text by path. Returns 404 when the package is unavailable.", + "operationId": "files", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "window", - "in": "query", - "description": "Time window", - "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "format": "uuid" } } ], @@ -25631,7 +30798,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionFilesDto" } } } @@ -25656,6 +30823,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30863,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25719,94 +30916,42 @@ } } }, - "/api/v1/services/{slugOrId}/status-events": { - "get": { + "/api/v1/revisions/{id}/purge": { + "post": { "tags": [ - "Status Data" + "Revisions" ], - "summary": "List curated vendor status events for a service", - "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", - "operationId": "listStatusEvents", + "summary": "Purge revision package bytes", + "description": "Deletes stored package bytes unless another revision shares them. The revision stays; bundle, files and rollback then return 410. 409 while live. Requires an org admin.", + "operationId": "purgeRevision", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "types", - "in": "query", - "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit lower bound (ISO 8601); overrides period", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit upper bound (ISO 8601); default now", - "required": false, "schema": { "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageStatusEventDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -25831,6 +30976,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31016,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25894,53 +31069,21 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/runs": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "List code runs", + "description": "Cursor page of runs across the organization. Default window last 24 hours; from is clamped to 90 days.", + "operationId": "listRuns", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] - } - }, - { - "name": "granularity", + "name": "params", "in": "query", - "description": "Bucket granularity", - "required": false, + "required": true, "schema": { - "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "$ref": "#/components/schemas/RunListParams" } } ], @@ -25950,7 +31093,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -25975,6 +31118,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31158,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26035,61 +31208,24 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] + } } }, - "/api/v1/services/incidents": { + "/api/v1/runs/{id}": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "Get a run", + "operationId": "getRun", "parameters": [ { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] - } - }, - { - "name": "category", - "in": "query", - "description": "Filter by service category", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -26099,7 +31235,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26124,6 +31260,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26154,6 +31300,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26187,23 +31353,22 @@ } } }, - "/api/v1/services/summary": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Status Data" + "Runs" ], - "summary": "Global status summary across all services", - "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", - "operationId": "getGlobalStatusSummary", + "summary": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", "parameters": [ { - "name": "publishedOnly", - "in": "query", - "description": "Aggregate only published services (curated public pSEO set); default false", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -26213,7 +31378,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } @@ -26238,6 +31403,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31443,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26301,20 +31496,32 @@ } } }, - "/api/v1/status-pages": { - "get": { + "/api/v1/runs/{id}/cancel": { + "post": { "tags": [ - "Status Pages" + "Runs" + ], + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List status pages for the workspace", - "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -26339,6 +31546,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26369,6 +31586,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26400,30 +31637,43 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Create a status page", - "operationId": "create_5", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - } + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "artifactId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" } } } @@ -26448,6 +31698,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -26478,6 +31738,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26511,13 +31791,13 @@ } } }, - "/api/v1/status-pages/{id}": { + "/api/v1/runs/{id}/cases": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get a status page", - "operationId": "get_2", + "summary": "List run cases with nested steps", + "operationId": "listRunCases", "parameters": [ { "name": "id", @@ -26527,15 +31807,23 @@ "type": "string", "format": "uuid" } - } - ], - "responses": { - "200": { + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunCaseListParams" + } + } + ], + "responses": { + "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } @@ -26560,6 +31848,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31888,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26621,13 +31939,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}/console": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", "parameters": [ { "name": "id", @@ -26637,25 +31958,28 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunConsoleParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" } } } @@ -26680,6 +32004,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32044,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26741,13 +32095,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/diff": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "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", @@ -26757,11 +32114,27 @@ "type": "string", "format": "uuid" } + }, + { + "name": "baselineRunId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -26783,6 +32156,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32196,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26846,13 +32249,13 @@ } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/runs/{id}/events": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List all components", - "operationId": "listComponents", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "parameters": [ { "name": "id", @@ -26862,15 +32265,31 @@ "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": "OK", + "description": "Server-sent persist control events", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/RunEventDto" } } } @@ -26895,6 +32314,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32354,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26956,13 +32405,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/{id}/export": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "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", @@ -26974,25 +32426,11 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "Zip of snapshot.json and available artifacts", "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" - } - } + "application/zip": {} } }, "400": { @@ -27015,6 +32453,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32493,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27078,13 +32546,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + "/api/v1/runs/{id}/network": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Update a component", - "operationId": "updateComponent", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "parameters": [ { "name": "id", @@ -27096,32 +32565,21 @@ } }, { - "name": "componentId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunNetworkParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/RunNetworkDto" } } } @@ -27146,6 +32604,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32644,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27207,13 +32695,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/network/{rowId}": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { "name": "id", @@ -27225,18 +32716,24 @@ } }, { - "name": "componentId", + "name": "rowId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -27258,6 +32755,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32795,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27321,14 +32848,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { - "get": { + "/api/v1/runs/{id}/pin": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get measured (check-based) component uptime history", - "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", - "operationId": "componentMeasuredUptime", + "summary": "Pin a run past retention", + "description": "Keeps the run and its evidence past the retention windows until unpinned.", + "operationId": "pinRun", "parameters": [ { "name": "id", @@ -27338,25 +32865,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 90 - } } ], "responses": { @@ -27365,7 +32873,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -27390,6 +32898,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -27420,6 +32938,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27451,16 +32989,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}/override": { - "put": { + }, + "delete": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Set a timed human status override on a component", - "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", - "operationId": "setComponentOverride", + "summary": "Unpin a run", + "description": "Normal retention applies again from the next sweep.", + "operationId": "unpinRun", "parameters": [ { "name": "id", @@ -27470,34 +33006,15 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -27522,6 +33039,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33079,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27583,13 +33130,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/purge": { + "post": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Clear a timed human status override on a component", - "operationId": "clearComponentOverride", + "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", @@ -27599,24 +33149,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvidencePurgeRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -27641,6 +33192,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33232,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27704,14 +33285,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "/api/v1/runs/{id}/runner-log": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Get component uptime history from published incident windows", - "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", - "operationId": "componentUptime_1", + "summary": "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", @@ -27721,34 +33302,20 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 90 - } } ], "responses": { "200": { "description": "OK", "content": { + "text/plain": { + "schema": { + "type": "string" + } + }, "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "type": "string" } } } @@ -27773,6 +33340,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33380,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27836,13 +33433,14 @@ } } }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + "/api/v1/runs/{id}/runner-log/live": { + "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", + "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", @@ -27854,20 +33452,17 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" + "responses": { + "200": { + "description": "Server-sent runner-log lines", + "content": { + "text/event-stream": { + "schema": { + "$ref": "#/components/schemas/RunnerLogLiveEvent" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -27888,6 +33483,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33523,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27951,13 +33576,14 @@ } } }, - "/api/v1/status-pages/{id}/domains": { + "/api/v1/runs/{id}/trace-summary": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Summarize a failed trace", + "description": "Bounded text of failed actions, failed requests, and console errors.", + "operationId": "getRunTraceSummary", "parameters": [ { "name": "id", @@ -27975,7 +33601,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseRunTraceSummaryDto" } } } @@ -28000,6 +33626,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28030,6 +33666,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28061,41 +33717,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/runs/export": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "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", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "type": "string" } } } @@ -28120,6 +33768,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28150,6 +33808,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28183,36 +33861,34 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/runs/monitors": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", + "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": "domainId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunMonitorStripDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28234,6 +33910,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33950,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28297,30 +34003,21 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { - "post": { + "/api/v1/runs/revisions": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", + "summary": "List the latest recorded activation of each revision in the window", + "description": "Publication rows are mutable. Repeated activations of the same revision are not an immutable event history.", + "operationId": "listRunRevisionMarkers", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -28330,7 +34027,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/CursorPageRunRevisionMarkerDto" } } } @@ -28355,6 +34052,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34092,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28418,30 +34145,20 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { + "/api/v1/runs/skipped": { + "get": { "tags": [ - "Status Pages" + "run-list-read-controller" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", + "summary": "List recorded skipped ticks and current plan-disabled intervals", + "operationId": "listSkippedRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunSkippedListParams" } } ], @@ -28451,7 +34168,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/CursorPageRunSkippedEntryDto" } } } @@ -28476,6 +34193,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34233,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28539,21 +34286,21 @@ } } }, - "/api/v1/status-pages/{id}/groups": { + "/api/v1/runs/summary": { "get": { "tags": [ - "Status Pages" + "Runs" ], - "summary": "List component groups with nested components", - "operationId": "listGroups", + "summary": "Summarize the filtered Runs population", + "description": "Uses the same enqueue-time window and filters as the Runs list; independent of pagination.", + "operationId": "summarizeRuns", "parameters": [ { - "name": "id", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], @@ -28563,7 +34310,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" } } } @@ -28588,6 +34335,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34375,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28649,41 +34426,34 @@ } } } - }, - "post": { + } + }, + "/api/v1/secrets": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "List organization secrets", + "operationId": "list_6", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "environmentId", + "in": "query", + "description": "Environment whose value metadata to show", + "required": false, "schema": { "type": "string", "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } @@ -28708,6 +34478,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34518,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28769,52 +34569,30 @@ } } } - } - }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + }, + "post": { "tags": [ - "Status Pages" - ], - "summary": "Update a component group", - "operationId": "updateGroup", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Secrets" ], + "summary": "Create secret", + "operationId": "create_7", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + "$ref": "#/components/schemas/CreateSecretRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -28839,6 +34617,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34657,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28900,36 +34708,45 @@ } } } - }, - "delete": { + } + }, + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "groupId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28951,6 +34768,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34808,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29012,64 +34859,39 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents": { - "get": { + }, + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "List incidents for this status page (paginated)", - "operationId": "listIncidents", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "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/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29078,8 +34900,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29118,6 +34940,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29149,41 +34991,32 @@ } } } - }, - "post": { + } + }, + "/api/v1/secrets/{key}/audit": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", + "summary": "Last update metadata for a secret", + "operationId": "audit", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" } } } @@ -29208,6 +35041,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35081,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29271,25 +35134,24 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - "get": { + "/api/v1/secrets/{key}/environments/{environmentId}": { + "put": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "summary": "Write a secret value for one environment", + "operationId": "writeEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -29298,17 +35160,20 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -29329,6 +35194,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35234,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29391,24 +35286,23 @@ } } }, - "put": { + "delete": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "summary": "Remove a secret value from one environment", + "operationId": "deleteEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "incidentId", + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -29417,29 +35311,22 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29448,8 +35335,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29488,6 +35375,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29519,36 +35426,35 @@ } } } - }, - "delete": { + } + }, + "/api/v1/secrets/{key}/usage": { + "get": { "tags": [ - "Status Pages" + "Secrets" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Secret usage across monitors", + "operationId": "usage", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29570,6 +35476,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35516,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29633,36 +35569,23 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + "/api/v1/service-subscriptions": { + "get": { "tags": [ - "Status Pages" - ], - "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", - "operationId": "dismissIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Service Subscriptions" ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_18", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29684,6 +35607,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35647,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29747,13 +35700,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/service-subscriptions/{id}": { + "get": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "Get a subscription by its ID", + "operationId": "get_12", "parameters": [ { "name": "id", @@ -29763,33 +35716,15 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -29814,6 +35749,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35789,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29875,15 +35840,14 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + }, + "delete": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "Remove a subscription by its ID", + "description": "Removes a specific subscription (whole-service or component-level). Also deletes status-page components that represent this dependency. The parent status page stays. No-op if not found.", + "operationId": "unsubscribe_1", "parameters": [ { "name": "id", @@ -29893,40 +35857,24 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29935,8 +35883,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29975,6 +35923,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30008,13 +35976,14 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { "patch": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Edit an existing incident timeline update body", - "operationId": "patchIncidentUpdate", + "summary": "Update alert sensitivity for a subscription", + "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", + "operationId": "updateAlertSensitivity", "parameters": [ { "name": "id", @@ -30024,31 +35993,13 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "updateId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" } } }, @@ -30060,7 +36011,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -30085,6 +36036,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36076,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30148,21 +36129,21 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/service-subscriptions/{slug}": { + "post": { "tags": [ - "Status Pages" + "Service Subscriptions" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "Subscribe to a service or a component of a service", + "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", + "operationId": "subscribe_1", "parameters": [ { - "name": "id", + "name": "slug", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -30170,15 +36151,21 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "$ref": "#/components/schemas/ServiceSubscribeRequest" } } - }, - "required": true + } }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30200,6 +36187,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36227,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30263,46 +36280,86 @@ } } }, - "/api/v1/status-pages/{id}/maintenance": { + "/api/v1/services": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List maintenance windows for this status page (paginated)", - "operationId": "listMaintenance", + "summary": "List all enabled services (cursor-paginated)", + "operationId": "listServices", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "category", + "in": "query", + "description": "Filter by category (exact match)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { "name": "status", "in": "query", + "description": "Filter by current overall_status (exact match)", "required": false, "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } + "type": "string" } }, { - "name": "pageable", + "name": "published", "in": "query", - "required": true, + "description": "Filter by published status for pSEO pages", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "boolean" + } + }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on service name or slug", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], @@ -30312,7 +36369,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } @@ -30337,6 +36394,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36434,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30398,41 +36485,53 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Schedule a maintenance window", - "operationId": "createMaintenance", + "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", + "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", + "operationId": "getService", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" - } + }, + { + "name": "summary", + "in": "query", + "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", + "required": false, + "schema": { + "type": "boolean", + "default": false } }, - "required": true - }, + { + "name": "publishedOnly", + "in": "query", + "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" } } } @@ -30457,6 +36556,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36596,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30520,31 +36649,61 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "/api/v1/services/{slugOrId}/components": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a maintenance window with timeline", - "operationId": "getMaintenance", + "summary": "List active components for a service with current status and inline uptime", + "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", + "operationId": "getComponents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "groupId", + "in": "query", + "description": "Restrict result to direct children of this group component id", + "required": false, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "in": "query", + "description": "Page size (default 25, max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { @@ -30553,7 +36712,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" } } } @@ -30578,6 +36737,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36777,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30639,50 +36828,77 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a maintenance window", - "operationId": "updateMaintenance", + "summary": "Get daily uptime data for a component", + "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", + "operationId": "getComponentUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] } }, - "required": true - }, + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -30707,6 +36923,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36963,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,59 +37014,117 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Cancel a maintenance window", - "operationId": "deleteMaintenance", + "summary": "Batch daily uptime data for leaf components", + "description": "Returns daily uptime keyed by component ID. Pass ``componentIds`` to limit the batch to those components (max 100); omit it for every active component with uptime data. Supports either a preset ``period`` or an explicit ``from``/``to`` window (ISO yyyy-MM-dd, max 730 days). The explicit window wins when both are supplied — this is what powers the sliding 90-day navigator on the public uptime history page.", + "operationId": "getBatchComponentUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] } - } - ], - "responses": { - "204": { - "description": "No Content" }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + { + "name": "componentIds", + "in": "query", + "description": "Component ids to include (max 100); omit for every component", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + } + } + } + }, + "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": { @@ -30849,6 +37153,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,36 +37206,44 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { - "post": { + "/api/v1/services/{slugOrId}/days/{date}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", + "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", + "operationId": "getServiceDayDetail", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", + "name": "date", "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "uuid" + "format": "date" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30933,6 +37265,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37305,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30996,49 +37358,61 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { - "post": { + "/api/v1/services/{slugOrId}/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "windowId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } - }, + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -31063,6 +37437,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37477,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,25 +37530,24 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Post a maintenance window timeline update", - "operationId": "postMaintenanceUpdate", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "windowId", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -31153,23 +37556,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -31194,6 +37587,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37627,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31257,59 +37680,31 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + "/api/v1/services/{slugOrId}/live-status": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Edit an existing maintenance timeline update body", - "operationId": "patchMaintenanceUpdate", + "summary": "Lightweight live-status snapshot for polling", + "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", + "operationId": "getServiceLiveStatus", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "updateId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } @@ -31334,6 +37729,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37769,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,45 +37822,32 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { + "/api/v1/services/{slugOrId}/maintenances": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List notification delivery receipts", - "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", - "operationId": "listNotificationDeliveries", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "eventType", + "name": "status", "in": "query", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", "required": false, "schema": { - "type": "string", - "enum": [ - "SUBSCRIPTION_CONFIRMATION", - "INCIDENT_CREATED", - "INCIDENT_UPDATED", - "INCIDENT_RESOLVED" - ] + "type": "array", + "items": { + "type": "string" + } } } ], @@ -31445,7 +37857,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -31470,6 +37882,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31500,6 +37922,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31533,30 +37975,40 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "/api/v1/services/{slugOrId}/poll-results": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", + "summary": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "deliveryId", - "in": "path", - "required": true, + "name": "cursor", + "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -31566,7 +38018,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } @@ -31591,6 +38043,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31621,6 +38083,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31654,31 +38136,34 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { - "post": { + "/api/v1/services/{slugOrId}/poll-summary": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Retry a failed notification delivery", - "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", - "operationId": "retryNotificationDelivery", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "deliveryId", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d" + ] } } ], @@ -31688,7 +38173,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } @@ -31713,6 +38198,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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,8 +38238,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": { @@ -31753,8 +38248,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": { @@ -31763,8 +38258,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -31772,33 +38267,108 @@ } } } - } - } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } } }, - "/api/v1/status-pages/{id}/subscribers": { + "/api/v1/services/{slugOrId}/status-events": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List subscribers including awaiting confirmation (paginated)", - "operationId": "listSubscribers", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "types", + "in": "query", + "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d" + ] } }, { - "name": "pageable", + "name": "from", "in": "query", - "required": true, + "description": "Explicit lower bound (ISO 8601); overrides period", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit upper bound (ISO 8601); default now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -31808,7 +38378,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } @@ -31833,6 +38403,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38443,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31894,41 +38494,65 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", - "operationId": "addSubscriber", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] + } + }, + { + "name": "granularity", + "in": "query", + "description": "Bucket granularity", + "required": false, + "schema": { + "type": "string", + "enum": [ + "hourly", + "daily", + "monthly" + ] } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" } } } @@ -31953,6 +38577,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38617,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32013,39 +38667,74 @@ } } } - } + }, + "security": [ + { + "BearerAuth": [] + } + ] } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/services/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } }, { - "name": "subscriberId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "category", + "in": "query", + "description": "Filter by service category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -32067,6 +38756,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38796,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32130,21 +38849,33 @@ } } }, - "/api/v1/synthetics/metrics": { + "/api/v1/services/summary": { "get": { "tags": [ - "Synthetics metrics" + "Status Data" + ], + "summary": "Global status summary across all services", + "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", + "operationId": "getGlobalStatusSummary", + "parameters": [ + { + "name": "publishedOnly", + "in": "query", + "description": "Aggregate only published services (curated public pSEO set); default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } ], - "summary": "Get whole-family Synthetics metrics", - "description": "Returns measured target availability for 30 days and distinct recovered monitors for 7 days.", - "operationId": "getSyntheticsFamilyMetrics", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSyntheticsFamilyMetricsDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } @@ -32169,6 +38900,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38940,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32232,35 +38993,20 @@ } } }, - "/api/v1/synthetics/metrics/run-durations": { + "/api/v1/status-pages": { "get": { "tags": [ - "Synthetics metrics" - ], - "summary": "Get code-monitor duration percentiles", - "description": "Returns exact per-monitor p50 execution durations for the rolling 30-day window.", - "operationId": "getSyntheticsRunDurations", - "parameters": [ - { - "name": "monitorIds", - "in": "query", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - } + "Status Pages" ], + "summary": "List status pages for the workspace", + "operationId": "list_5", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -32285,6 +39031,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39071,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32346,21 +39122,30 @@ } } } - } - }, - "/api/v1/synthetics/runtime-profiles": { - "get": { + }, + "post": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Pages" ], - "operationId": "list_16", + "summary": "Create a status page", + "operationId": "create_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRuntimeProfileDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32385,6 +39170,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39210,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32448,19 +39263,21 @@ } } }, - "/api/v1/synthetics/runtime-profiles/{id}": { + "/api/v1/status-pages/{id}": { "get": { "tags": [ - "synthetics-runtime-profile-controller" + "Status Pages" ], - "operationId": "get_11", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -32470,7 +39287,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRuntimeProfileDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32495,6 +39312,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39352,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32556,32 +39403,41 @@ } } } - } - }, - "/api/v1/tags": { - "get": { + }, + "put": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], - "responses": { - "200": { - "description": "OK", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -32606,6 +39462,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39502,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32668,35 +39554,39 @@ } } }, - "post": { + "delete": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Create a new tag", - "operationId": "create_4", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTagRequest" - } + "summary": "Delete a status page", + "operationId": "delete_3", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -32705,8 +39595,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -32745,6 +39635,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32778,13 +39688,13 @@ } } }, - "/api/v1/tags/{id}": { + "/api/v1/status-pages/{id}/components": { "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Get a tag by ID", - "operationId": "getById", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { "name": "id", @@ -32802,7 +39712,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" } } } @@ -32827,6 +39737,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39777,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32889,12 +39829,12 @@ } } }, - "put": { + "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "Add a component to the status page", + "operationId": "createComponent", "parameters": [ { "name": "id", @@ -32910,19 +39850,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -32947,6 +39887,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39927,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33008,13 +39978,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}": { + "put": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { "name": "id", @@ -33024,11 +39996,37 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33050,6 +40048,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40088,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33111,29 +40139,49 @@ } } } - } - }, - "/api/v1/vaults/rotate": { - "post": { + }, + "delete": { "tags": [ - "Vault" + "Status Pages" + ], + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Rotate DEK", - "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", - "operationId": "rotateDek", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -33142,8 +40190,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33182,6 +40230,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33215,29 +40283,41 @@ } } }, - "/api/v1/webhook/inboxes": { + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List webhook testing inboxes for the workspace", - "operationId": "listWebhookInboxes", + "summary": "Get measured (check-based) component uptime history", + "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", + "operationId": "componentMeasuredUptime", "parameters": [ { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "pageable", - "in": "query", + "name": "componentId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 } } ], @@ -33247,7 +40327,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } @@ -33272,6 +40352,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40392,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33333,30 +40443,53 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" + ], + "summary": "Set a timed human status override on a component", + "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", + "operationId": "setComponentOverride", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create a webhook testing inbox", - "operationId": "createWebhookInbox", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookInboxRequest" + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -33381,6 +40514,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40554,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33442,18 +40605,25 @@ } } } - } - }, - "/api/v1/webhook/inboxes/{inboxId}": { - "get": { + }, + "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get a webhook testing inbox", - "operationId": "getWebhookInbox", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { - "name": "inboxId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", "in": "path", "required": true, "schema": { @@ -33468,7 +40638,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -33493,6 +40663,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40703,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33554,27 +40754,56 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete a webhook testing inbox and cascade events", - "operationId": "deleteWebhookInbox", + "summary": "Get component uptime history from published incident windows", + "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", + "operationId": "componentUptime_1", "parameters": [ { - "name": "inboxId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33596,6 +40825,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40865,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33657,16 +40916,18 @@ } } } - }, - "patch": { + } + }, + "/api/v1/status-pages/{id}/components/reorder": { + "put": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Patch a webhook testing inbox", - "operationId": "updateWebhookInbox", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33679,25 +40940,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookInboxRequest" + "$ref": "#/components/schemas/ReorderComponentsRequest" } } }, "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/SingleValueResponseWebhookInboxDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -33706,8 +40970,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -33746,6 +41010,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33779,65 +41063,22 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events": { + "/api/v1/status-pages/{id}/domains": { "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "List captured HTTP events newest-first", - "operationId": "listWebhookEvents", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "cursor", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "method", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "path", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "after", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], "responses": { @@ -33846,7 +41087,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageWebhookEventDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" } } } @@ -33871,6 +41112,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33901,6 +41152,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33933,15 +41204,15 @@ } } }, - "delete": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete every captured event on this inbox", - "operationId": "deleteWebhookEvents", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -33950,9 +41221,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -33974,6 +41262,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41302,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34037,16 +41355,16 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Get one captured HTTP event", - "operationId": "getWebhookEvent", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34055,7 +41373,7 @@ } }, { - "name": "eventId", + "name": "domainId", "in": "path", "required": true, "schema": { @@ -34065,18 +41383,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEventDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -34085,8 +41406,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34125,6 +41446,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34156,16 +41497,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Delete one captured event", - "operationId": "deleteWebhookEvent", + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34174,7 +41517,7 @@ } }, { - "name": "eventId", + "name": "domainId", "in": "path", "required": true, "schema": { @@ -34184,8 +41527,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -34207,6 +41557,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41597,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34270,16 +41650,16 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}/raw": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Signed URL for the raw captured request", - "operationId": "getWebhookEventRaw", + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34288,7 +41668,7 @@ } }, { - "name": "eventId", + "name": "domainId", "in": "path", "required": true, "schema": { @@ -34303,7 +41683,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -34328,6 +41708,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41748,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34391,16 +41801,16 @@ } } }, - "/api/v1/webhook/inboxes/{inboxId}/wait": { - "post": { + "/api/v1/status-pages/{id}/groups": { + "get": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Wait for the oldest matching captured HTTP event", - "operationId": "waitForWebhookEvent", + "summary": "List component groups with nested components", + "operationId": "listGroups", "parameters": [ { - "name": "inboxId", + "name": "id", "in": "path", "required": true, "schema": { @@ -34409,22 +41819,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WaitWebhookEventRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WaitWebhookEventResponse" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" } } } @@ -34449,6 +41850,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34469,8 +41880,8 @@ } } }, - "408": { - "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -34479,8 +41890,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": { @@ -34520,37 +41941,41 @@ } } } - } - }, - "/api/v1/webhook/inboxes/activity": { - "get": { + }, + "post": { "tags": [ - "Webhook Testing" + "Status Pages" ], - "summary": "Last-24h received-request activity for webhook inboxes", - "operationId": "listWebhookInboxActivity", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { - "name": "inboxIds", - "in": "query", - "description": "Comma-separated inbox ids (1–100)", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListWebhookInboxActivityDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -34575,6 +42000,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42040,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34638,30 +42093,50 @@ } } }, - "/api/v1/webhooks": { - "get": { + "/api/v1/status-pages/{id}/groups/{groupId}": { + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -34686,6 +42161,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42201,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34748,35 +42253,48 @@ } } }, - "post": { + "delete": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" - } + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -34785,8 +42303,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -34825,6 +42343,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34858,13 +42396,13 @@ } } }, - "/api/v1/webhooks/{id}": { + "/api/v1/status-pages/{id}/incidents": { "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", "parameters": [ { "name": "id", @@ -34874,6 +42412,31 @@ "type": "string", "format": "uuid" } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -34882,7 +42445,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -34907,6 +42470,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42510,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34969,12 +42562,12 @@ } } }, - "put": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { "name": "id", @@ -34990,19 +42583,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35027,38 +42620,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": { @@ -35067,51 +42630,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "delete": { - "tags": [ - "Webhooks" - ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -35120,8 +42640,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -35130,8 +42650,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": { @@ -35140,8 +42660,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -35150,8 +42670,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": { @@ -35193,13 +42713,13 @@ } } }, - "/api/v1/webhooks/{id}/deliveries": { + "/api/v1/status-pages/{id}/incidents/{incidentId}": { "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", + "summary": "Get incident details with timeline", + "operationId": "getIncident", "parameters": [ { "name": "id", @@ -35211,13 +42731,12 @@ } }, { - "name": "limit", - "in": "query", - "required": false, + "name": "incidentId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -35227,7 +42746,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35252,6 +42771,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42811,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35313,15 +42862,13 @@ } } } - } - }, - "/api/v1/webhooks/{id}/test": { - "post": { + }, + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Send a test delivery to a webhook endpoint", - "operationId": "test", + "summary": "Update an incident", + "operationId": "updateIncident", "parameters": [ { "name": "id", @@ -35331,16 +42878,26 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -35348,7 +42905,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35373,8 +42930,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": { @@ -35383,8 +42940,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -35393,8 +42950,8 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -35403,8 +42960,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -35413,8 +42970,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -35423,8 +42980,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "429": { + "description": "Too many requests — retry after the window resets", "content": { "application/json": { "schema": { @@ -35432,31 +42989,9 @@ } } } - } - } - } - }, - "/api/v1/webhooks/events": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "List all available webhook event types", - "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", - "operationId": "listEvents", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/WebhookEventCatalogResponse" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "500": { + "description": "Internal server error — see the message field for details", "content": { "application/json": { "schema": { @@ -35465,8 +43000,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { "application/json": { "schema": { @@ -35475,8 +43010,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "503": { + "description": "Service unavailable — try again shortly", "content": { "application/json": { "schema": { @@ -35484,29 +43019,41 @@ } } } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Delete an incident", + "operationId": "deleteIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, - "500": { - "description": "Internal server error — see the message field for details", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -35515,8 +43062,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -35525,8 +43072,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35534,30 +43081,9 @@ } } } - } - } - } - }, - "/api/v1/webhooks/signing-secret": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" - } - } - } }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -35566,8 +43092,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -35576,8 +43102,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": { @@ -35586,8 +43112,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -35596,8 +43122,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": { @@ -35639,26 +43165,49 @@ } } }, - "/api/v1/webhooks/signing-secret/rotate": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { "post": { "tags": [ - "Webhooks" + "Status Pages" + ], + "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", + "operationId": "dismissIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseString" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -35667,8 +43216,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -35707,6 +43256,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35740,30 +43309,49 @@ } } }, - "/api/v1/workspaces": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "List workspaces", - "operationId": "list_1", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35788,6 +43376,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43416,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35849,18 +43467,40 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { "post": { "tags": [ - "Workspaces" + "Status Pages" + ], + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create workspace", - "operationId": "create_2", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWorkspaceRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } }, @@ -35872,7 +43512,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -35897,6 +43537,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43577,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35960,31 +43630,59 @@ } } }, - "/api/v1/workspaces/{workspaceId}": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Get workspace by ID", - "operationId": "get", + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -36009,6 +43707,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43747,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36070,21 +43798,23 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/layout/reorder": { "put": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Update workspace", - "operationId": "update", + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], @@ -36092,25 +43822,28 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRequest" + "$ref": "#/components/schemas/ReorderPageLayoutRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -36119,8 +43852,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -36159,6 +43892,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36190,21 +43943,7752 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/maintenance": { + "get": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "Delete workspace", - "operationId": "delete", + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", "parameters": [ { - "name": "workspaceId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a maintenance window with timeline", + "operationId": "getMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Status Pages" + ], + "summary": "Update a maintenance window", + "operationId": "updateMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Cancel a maintenance window", + "operationId": "deleteMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Dismiss a draft maintenance window", + "operationId": "dismissMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Post a maintenance window timeline update", + "operationId": "postMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { + "tags": [ + "Status Pages" + ], + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventType", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "SUBSCRIPTION_CONFIRMATION", + "INCIDENT_CREATED", + "INCIDENT_UPDATED", + "INCIDENT_RESOLVED" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a notification delivery receipt", + "operationId": "getNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Retry a failed notification delivery", + "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", + "operationId": "retryNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List subscribers including awaiting confirmation (paginated)", + "operationId": "listSubscribers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", + "operationId": "addSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminAddSubscriberRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Remove a subscriber", + "operationId": "removeSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subscriberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/fleet": { + "get": { + "tags": [ + "synthetics-inventory-controller" + ], + "summary": "Get workspace monitor fleet history and group counts", + "operationId": "fleet", + "parameters": [ + { + "name": "window", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorFleetSummaryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/metrics": { + "get": { + "tags": [ + "Synthetics metrics" + ], + "summary": "Get whole-family Synthetics metrics", + "description": "Returns measured target availability for 30 days and distinct recovered monitors for 7 days.", + "operationId": "getSyntheticsFamilyMetrics", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSyntheticsFamilyMetricsDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/metrics/run-durations": { + "get": { + "tags": [ + "Synthetics metrics" + ], + "summary": "Get code-monitor duration percentiles", + "description": "Returns exact per-monitor p50 execution durations for the rolling 30-day window.", + "operationId": "getSyntheticsRunDurations", + "parameters": [ + { + "name": "monitorIds", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/regions/status": { + "get": { + "tags": [ + "synthetics-inventory-controller" + ], + "summary": "Get public runner-region acceptance status", + "operationId": "regions", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunnerRegionStatusesDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/runtime-profiles": { + "get": { + "tags": [ + "synthetics-runtime-profile-controller" + ], + "operationId": "list_17", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRuntimeProfileDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/synthetics/runtime-profiles/{id}": { + "get": { + "tags": [ + "synthetics-runtime-profile-controller" + ], + "operationId": "get_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRuntimeProfileDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/tags": { + "get": { + "tags": [ + "Tags" + ], + "summary": "List tags for the authenticated organization", + "operationId": "list_4", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Tags" + ], + "summary": "Create a new tag", + "operationId": "create_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/tags/{id}": { + "get": { + "tags": [ + "Tags" + ], + "summary": "Get a tag by ID", + "operationId": "getById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Tags" + ], + "summary": "Update a tag's name and/or color", + "operationId": "update_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Tags" + ], + "summary": "Delete a tag (cascades to all monitor associations)", + "operationId": "delete_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/vaults/rotate": { + "post": { + "tags": [ + "Vault" + ], + "summary": "Rotate DEK", + "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", + "operationId": "rotateDek", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "List webhook testing inboxes for the workspace", + "operationId": "listWebhookInboxes", + "parameters": [ + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookInboxDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Webhook Testing" + ], + "summary": "Create a webhook testing inbox", + "operationId": "createWebhookInbox", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookInboxRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Get a webhook testing inbox", + "operationId": "getWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete a webhook testing inbox and cascade events", + "operationId": "deleteWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Webhook Testing" + ], + "summary": "Patch a webhook testing inbox", + "operationId": "updateWebhookInbox", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookInboxRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookInboxDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "List captured HTTP events newest-first", + "operationId": "listWebhookEvents", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "method", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "path", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "after", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageWebhookEventDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete every captured event on this inbox", + "operationId": "deleteWebhookEvents", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Get one captured HTTP event", + "operationId": "getWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEventDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhook Testing" + ], + "summary": "Delete one captured event", + "operationId": "deleteWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/events/{eventId}/raw": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Signed URL for the raw captured request", + "operationId": "getWebhookEventRaw", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSignedDownload" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/{inboxId}/wait": { + "post": { + "tags": [ + "Webhook Testing" + ], + "summary": "Wait for the oldest matching captured HTTP event", + "operationId": "waitForWebhookEvent", + "parameters": [ + { + "name": "inboxId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WaitWebhookEventRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WaitWebhookEventResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "408": { + "description": "Wait timed out — no match arrived (code WAIT_TIMEOUT)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhook/inboxes/activity": { + "get": { + "tags": [ + "Webhook Testing" + ], + "summary": "Last-24h received-request activity for webhook inboxes", + "operationId": "listWebhookInboxActivity", + "parameters": [ + { + "name": "inboxIds", + "in": "query", + "description": "Comma-separated inbox ids (1–100)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseListWebhookInboxActivityDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List webhook endpoints for the authenticated org", + "operationId": "list_3", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Register a new webhook endpoint", + "operationId": "create_4", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get a single webhook endpoint", + "operationId": "get_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Webhooks" + ], + "summary": "Update a webhook endpoint", + "operationId": "update_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhooks" + ], + "summary": "Delete a webhook endpoint", + "operationId": "delete_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}/deliveries": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List recent deliveries for a webhook endpoint", + "operationId": "listDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/{id}/test": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Send a test delivery to a webhook endpoint", + "operationId": "test", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestWebhookEndpointRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/events": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List all available webhook event types", + "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", + "operationId": "listEvents", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WebhookEventCatalogResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/signing-secret": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get signing secret metadata for the authenticated org", + "operationId": "getSigningSecretInfo", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/webhooks/signing-secret/rotate": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Generate or rotate the organization webhook signing secret", + "operationId": "rotateSigningSecret", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseString" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "List workspaces", + "operationId": "list_2", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Workspaces" + ], + "summary": "Create workspace", + "operationId": "create_3", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkspaceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/workspaces/{workspaceId}": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "Get workspace by ID", + "operationId": "get", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Workspaces" + ], + "summary": "Update workspace", + "operationId": "update", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkspaceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Workspaces" + ], + "summary": "Delete workspace", + "operationId": "delete", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" } } ], @@ -36232,6 +51716,168 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/workspaces/{workspaceId}/runtime-profile": { + "put": { + "tags": [ + "Workspaces" + ], + "summary": "Set workspace execution environment", + "operationId": "updateRuntime", + "parameters": [ + { + "name": "workspaceId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkspaceRuntimeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36262,110 +51908,8 @@ } } }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/workspaces/{workspaceId}/runtime-profile": { - "put": { - "tags": [ - "Workspaces" - ], - "summary": "Set workspace execution environment", - "operationId": "updateRuntime", - "parameters": [ - { - "name": "workspaceId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWorkspaceRuntimeRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWorkspaceDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "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": { @@ -36374,8 +51918,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": { @@ -36465,6 +52009,32 @@ }, "description": "Request to acquire a deploy lock for the current workspace" }, + "ActorDisplayDto": { + "required": [ + "identity" + ], + "type": "object", + "properties": { + "identity": { + "type": "string", + "description": "Stable actor identity" + }, + "user": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "keyName": { + "type": "string", + "description": "API key display name; never the key value", + "nullable": true + } + }, + "description": "Actor that last wrote this environment value" + }, "AddCustomDomainRequest": { "required": [ "hostname" @@ -36990,6 +52560,7 @@ "createdAt", "key", "name", + "scopes", "id" ], "type": "object", @@ -37019,6 +52590,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 +52619,7 @@ "createdAt", "key", "name", + "scopes", "updatedAt", "id" ], @@ -37075,10 +52667,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 +52921,7 @@ }, "actorEmail": { "type": "string", - "description": "Email of the actor; null for system actions", + "description": "User email, api-key:{id} for API keys, or system for automated actions", "nullable": true }, "action": { @@ -37324,6 +52955,14 @@ "type": "string", "description": "Timestamp when the action was performed", "format": "date-time" + }, + "changes": { + "type": "array", + "description": "Non-secret settings changed by this action", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorFieldChange" + } } } }, @@ -37333,12 +52972,20 @@ "discriminator": { "propertyName": "kind", "mapping": { - "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata" + "member_role_changed": "#/components/schemas/MemberRoleChangedMetadata", + "evidence_purged": "#/components/schemas/EvidencePurgedMetadata", + "monitor_ownership": "#/components/schemas/MonitorOwnershipMetadata" } }, "oneOf": [ { "$ref": "#/components/schemas/MemberRoleChangedMetadata" + }, + { + "$ref": "#/components/schemas/EvidencePurgedMetadata" + }, + { + "$ref": "#/components/schemas/MonitorOwnershipMetadata" } ] }, @@ -37494,6 +53141,68 @@ "upload" ] }, + "Bucket": { + "required": [ + "start", + "passed", + "failed", + "timedOut", + "couldntRun", + "passedOnRetry", + "durationSamples" + ], + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "Inclusive clock-aligned bucket start", + "format": "date-time" + }, + "passed": { + "type": "integer", + "description": "Health-voting region cycles whose final attempt passed", + "format": "int64" + }, + "failed": { + "type": "integer", + "description": "Health-voting region cycles whose final attempt failed", + "format": "int64" + }, + "timedOut": { + "type": "integer", + "description": "Region cycles whose final attempt timed out", + "format": "int64" + }, + "couldntRun": { + "type": "integer", + "description": "Region cycles with a final non-target outcome", + "format": "int64" + }, + "passedOnRetry": { + "type": "integer", + "description": "Passed cycles that had an earlier failed attempt", + "format": "int64" + }, + "durationSamples": { + "type": "integer", + "description": "Executions with a completed duration in this bucket", + "format": "int64" + }, + "p50Ms": { + "type": "number", + "description": "Median duration of completed executions in milliseconds", + "format": "double", + "nullable": true + }, + "p95Ms": { + "type": "number", + "description": "p95 duration of completed executions in milliseconds", + "format": "double", + "nullable": true + } + }, + "description": "Clock-aligned chart buckets" + }, "BulkMonitorActionRequest": { "required": [ "action", @@ -37520,7 +53229,12 @@ "RESUME", "DELETE", "ADD_TAG", - "REMOVE_TAG" + "REMOVE_TAG", + "UPDATE_SCHEDULE", + "RUN", + "MUTE", + "UNMUTE", + "ACKNOWLEDGE" ] }, "tagIds": { @@ -37540,6 +53254,22 @@ "items": { "$ref": "#/components/schemas/NewTagRequest" } + }, + "frequencySeconds": { + "maximum": 86400, + "minimum": 10, + "type": "integer", + "description": "New check frequency in seconds (10–86400), required for UPDATE_SCHEDULE", + "format": "int32", + "nullable": true + }, + "overlay": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + ] } }, "description": "Request body for performing a bulk action on multiple monitors" @@ -37570,6 +53300,64 @@ }, "description": "Result of a bulk monitor action, including partial-success details" }, + "BundleCheckResultDto": { + "required": [ + "findings" + ], + "type": "object", + "properties": { + "findings": { + "type": "array", + "description": "Problems found in the supplied source files", + "items": { + "$ref": "#/components/schemas/Finding" + } + } + } + }, + "BundleDto": { + "required": [ + "digest", + "files", + "keys", + "uploadDigest", + "size" + ], + "type": "object", + "properties": { + "digest": { + "minLength": 1, + "type": "string", + "description": "Closure digest, sha256:. Same files always return this value" + }, + "uploadDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of every file that was sent, before import closure" + }, + "files": { + "type": "array", + "description": "Files in the import closure", + "items": { + "type": "string", + "description": "Files in the import closure" + } + }, + "keys": { + "type": "array", + "description": "Secret names detected in the closure", + "items": { + "type": "string", + "description": "Secret names detected in the closure" + } + }, + "size": { + "type": "integer", + "description": "Uncompressed closure size in bytes", + "format": "int64" + } + } + }, "CaptureCompareDto": { "required": [ "baselineKind", @@ -37649,9 +53437,19 @@ "on_failure", "off" ] + }, + "network": { + "type": "string", + "description": "When network rows and HAR are retained; null uses always", + "nullable": true, + "enum": [ + "always", + "on_failure", + "off" + ] } }, - "description": "When to capture screenshots, traces, and video during a code run" + "description": "When to retain screenshots, traces, video, and network evidence" }, "CategoryDto": { "required": [ @@ -38047,6 +53845,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 +53892,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 +54407,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 +54584,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 +54920,18 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Only the managedBy tool may change configuration (default: false)", + "nullable": true + }, + "ownerProject": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the owning tool declares for this monitor, e.g. acme/web", + "nullable": true + }, "environmentId": { "type": "string", "description": "Environment to associate with this monitor. Required for browser and multi-step monitors", @@ -39044,13 +55007,34 @@ "format": "uuid", "nullable": true }, - "package": { + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "ownerDeclaration": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/OwnerDeclaration" } ] + }, + "secretKeys": { + "maxItems": 256, + "minItems": 0, + "type": "array", + "description": "Secret keys to attach; null starts with the scanned set", + "nullable": true, + "items": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Secret keys to attach; null starts with the scanned set" + } } } }, @@ -39101,20 +55085,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 +55862,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 +55940,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 +56317,32 @@ "type": "string", "description": "Rollback reason when this Head was restored", "nullable": true + }, + "rolledBackDigest": { + "type": "string", + "description": "Digest the last rollback replaced; cleared by the next publish", + "nullable": true + }, + "linkedIncidents": { + "type": "array", + "description": "Open incidents on this monitor", + "nullable": true, + "items": { + "$ref": "#/components/schemas/LinkedIncidentDto" + } + }, + "note": { + "type": "string", + "description": "Note from the latest publish", + "nullable": true + }, + "activatedByActor": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ActorDisplayDto" + } + ] } }, "description": "Active Head for a definition in one environment" @@ -40407,35 +56481,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 +56513,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 +57426,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 +57599,6 @@ }, "ErrorNext": { "type": "object", - "description": "Command and documentation that fix this error", "properties": { "command": { "type": "string", @@ -41405,16 +57612,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 +57747,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 +57763,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 +57788,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 +57858,42 @@ }, "description": "Ordered escalation steps, evaluated in sequence" }, + "EvidencePurgedMetadata": { + "required": [ + "kind", + "reason" + ], + "type": "object", + "description": "Reason recorded when stored evidence is purged", + "properties": { + "kind": { + "type": "string", + "enum": [ + "evidence_purged" + ] + }, + "reason": { + "minLength": 1, + "type": "string", + "description": "Why the evidence was deleted" + } + } + }, + "EvidencePurgeRequest": { + "required": [ + "reason" + ], + "type": "object", + "properties": { + "reason": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Why the evidence must be deleted; kept in the audit log (max 500)" + } + }, + "description": "Purge of stored evidence" + }, "FailureDetail": { "required": [ "monitorId", @@ -41663,10 +57909,432 @@ "reason": { "type": "string", "description": "Human-readable reason for the failure" + }, + "code": { + "type": "string", + "description": "Error code for the failure, as returned by the single-monitor operation", + "nullable": true } }, "description": "Details about a single monitor that failed the bulk action" }, + "Finding": { + "required": [ + "code", + "message" + ], + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Import validation code", + "enum": [ + "MONITOR_CONFIG_TYPE_MISMATCH", + "MONITOR_FREQUENCY_BELOW_PLAN_MIN", + "MONITOR_LIMIT_REACHED", + "MONITOR_AUTH_TYPE_UNSUPPORTED", + "MONITOR_HEARTBEAT_REGIONS_NOT_SUPPORTED", + "MONITOR_HEARTBEAT_INTERVAL_TOO_SHORT", + "MONITOR_HEARTBEAT_GRACE_TOO_SHORT", + "MONITOR_HEARTBEAT_GRACE_EXCEEDS_INTERVAL", + "MONITOR_HTTP_HEADERS_TOO_MANY", + "MONITOR_HTTP_HEADER_RESERVED", + "MONITOR_HTTP_BODY_METHOD_INVALID", + "MONITOR_HTTP_BODY_TOO_LARGE", + "MONITOR_ASSERTION_TYPE_NOT_ALLOWED", + "MONITOR_ALERT_CHANNEL_NOT_FOUND", + "MONITOR_TAGS_ADD_INVALID", + "MONITOR_TAGS_REMOVE_INVALID", + "MONITOR_TOKEN_ROTATION_HEARTBEAT_ONLY", + "MONITOR_CODE_CHECK_NOT_AVAILABLE", + "MONITOR_CODE_CHECK_LIMIT_REACHED", + "MONITOR_CODE_CHECK_REGION_UNAVAILABLE", + "MONITOR_CODE_CHECK_TEST_UNAVAILABLE", + "MONITOR_TEST_BUNDLE_UNAVAILABLE", + "MONITOR_BROWSER_CHECKS_DISABLED", + "MONITOR_ENVIRONMENT_REQUIRED", + "MONITOR_ENVIRONMENT_CLEAR_FORBIDDEN", + "MONITOR_PACKAGE_XOR_DEFINITION", + "MONITOR_PACKAGE_DIGEST_INVALID", + "MONITOR_PACKAGE_NOT_SUPPORTED", + "MONITOR_PACKAGE_PATH_INVALID", + "MONITOR_PACKAGE_CONCURRENT", + "MONITOR_DEFINITION_HAS_NO_REVISION", + "MONITOR_DEFINITION_IN_USE", + "MONITOR_STATUS_NOT_WRITABLE", + "MONITOR_PAUSED", + "MONITOR_OVERLAY_EXPIRES_IN_PAST", + "MONITOR_QUARANTINE_FIELDS_REQUIRED", + "MONITOR_MANAGED_BY_TAKEOVER_REQUIRED", + "MONITOR_HISTORY_PARAM_INVALID", + "MONITOR_TAKEOVER_FIELD_UNKNOWN", + "MONITOR_CAPTURE_POLICY_INVALID", + "MONITOR_RUN_PARALLEL_CODE_ONLY", + "REVISION_PACKAGE_BYTES_UNAVAILABLE", + "MONITOR_CODE_TYPE_REQUIRED", + "MONITOR_DEFINITION_REQUIRED", + "REVISION_NOT_ON_DEFINITION", + "REVISION_DIFF_CROSS_DEFINITION", + "DEFINITION_HEAD_INCOMPLETE", + "MONITOR_ASSERTION_NOT_SUPPORTED_FOR_TYPE", + "MONITOR_AUTH_ALREADY_EXISTS", + "MONITOR_AUTH_NOT_SUPPORTED_FOR_TYPE", + "MONITOR_AUTH_VAULT_FOREIGN_ORG", + "ALERT_CHANNEL_DISABLED", + "ALERT_CHANNEL_PLAN_REQUIRED", + "ALERT_CHANNEL_TYPE_IMMUTABLE", + "ALERT_CHANNEL_CONFIG_INVALID", + "ALERT_CHANNEL_SLACK_WEBHOOK_INVALID", + "ALERT_CHANNEL_DISCORD_WEBHOOK_INVALID", + "ALERT_CHANNEL_TEAMS_WEBHOOK_INVALID", + "ALERT_CHANNEL_TEAMS_WEBHOOK_CLASSIC_RETIRED", + "ALERT_CHANNEL_TEAMS_WEBHOOK_HOST", + "ALERT_CHANNEL_WEBHOOK_URL_INVALID", + "ALERT_CHANNEL_WEBHOOK_HEADER_RESERVED", + "ALERT_CHANNEL_OPSGENIE_REGION_INVALID", + "ALERT_CHANNEL_PAGERDUTY_SEVERITY_INVALID", + "ALERT_CHANNEL_GOOGLE_CHAT_WEBHOOK_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_UNVERIFIED", + "ALERT_CHANNEL_PHONE_NUMBERS_COUNT_INVALID", + "ALERT_CHANNEL_PHONE_NUMBER_REQUIRED", + "ALERT_CHANNEL_VERIFIED_PHONE_NOT_FOUND", + "ALERT_CHANNEL_PHONE_DESTINATION_MISMATCH", + "ALERT_CHANNEL_VOICE_LANGUAGE_INVALID", + "NOTIFICATION_POLICY_RULE_TYPE_REQUIRED", + "NOTIFICATION_POLICY_RULE_TYPE_INVALID", + "NOTIFICATION_POLICY_RULE_VALUE_REQUIRED", + "NOTIFICATION_POLICY_RULE_VALUE_INVALID", + "NOTIFICATION_POLICY_RULE_VALUES_REQUIRED", + "NOTIFICATION_POLICY_RULE_MONITOR_IDS_REQUIRED", + "NOTIFICATION_POLICY_RULE_REGIONS_REQUIRED", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_REQUIRED", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_INVALID", + "NOTIFICATION_POLICY_RULE_INCIDENT_STATUS_CONFLICT", + "NOTIFICATION_POLICY_ESCALATION_REQUIRED", + "NOTIFICATION_POLICY_STEPS_REQUIRED", + "NOTIFICATION_POLICY_ON_RESOLVE_INVALID", + "NOTIFICATION_POLICY_ON_REOPEN_INVALID", + "NOTIFICATION_POLICY_STEP_CHANNELS_EMPTY", + "NOTIFICATION_POLICY_STEP_DELAY_NEGATIVE", + "NOTIFICATION_POLICY_STEP_DELAY_TOO_LARGE", + "NOTIFICATION_POLICY_STEP_REPEAT_INVALID", + "NOTIFICATION_POLICY_STEP_REPEAT_TOO_LARGE", + "NOTIFICATION_POLICY_STEPS_TOO_MANY", + "NOTIFICATION_POLICY_STEP_CHANNEL_NOT_FOUND", + "NOTIFICATION_POLICY_DELETE_BLOCKED", + "MONITOR_POLICY_TRIGGER_RULES_EMPTY", + "MONITOR_POLICY_RULE_TYPE_REQUIRED", + "MONITOR_POLICY_RULE_SEVERITY_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_TYPE_REQUIRED", + "MONITOR_POLICY_CONFIRMATION_REGIONS_TOO_FEW", + "MONITOR_POLICY_CONFIRMATION_WAIT_TOO_SHORT", + "MONITOR_POLICY_CONFIRMATION_WAIT_BELOW_INVARIANT", + "MONITOR_POLICY_RECOVERY_REQUIRED", + "MONITOR_POLICY_RECOVERY_SUCCESSES_TOO_FEW", + "MONITOR_POLICY_RECOVERY_REGIONS_TOO_FEW", + "MONITOR_POLICY_RECOVERY_COOLDOWN_OUT_OF_RANGE", + "MONITOR_POLICY_FIELD_REQUIRED", + "MONITOR_POLICY_FIELD_NOT_POSITIVE", + "MONITOR_POLICY_FIELD_OUT_OF_RANGE", + "URL_INVALID", + "URL_SCHEME_UNSUPPORTED", + "URL_HOST_REQUIRED", + "URL_HOST_PRIVATE", + "RESOURCE_GROUP_LIMIT_REACHED", + "RESOURCE_GROUP_MEMBER_LIMIT_REACHED", + "RESOURCE_GROUP_MEMBER_ALREADY_PRESENT", + "RESOURCE_GROUP_MEMBER_TYPE_INVALID", + "RESOURCE_GROUP_THRESHOLD_VALUE_REQUIRED", + "RESOURCE_GROUP_THRESHOLD_TYPE_REQUIRED", + "RESOURCE_GROUP_THRESHOLD_OUT_OF_RANGE", + "RESOURCE_GROUP_SLUG_GENERATION_FAILED", + "STATUS_PAGE_LIMIT_REACHED", + "STATUS_PAGE_SLUG_TAKEN", + "STATUS_PAGE_SLUG_REQUIRED", + "STATUS_PAGE_SLUG_RESERVED", + "STATUS_PAGE_VISIBILITY_UNSUPPORTED", + "STATUS_PAGE_FEATURE_PLAN_REQUIRED", + "STATUS_PAGE_HOSTNAME_FIRST_PARTY_RESERVED", + "STATUS_PAGE_HOSTNAME_TLD_RESERVED", + "STATUS_PAGE_HOSTNAME_TAKEN", + "STATUS_PAGE_DOMAIN_NOT_VERIFIED", + "STATUS_PAGE_COMPONENT_GROUP_NOT_FOUND", + "STATUS_PAGE_COMPONENT_MONITOR_REQUIRED", + "STATUS_PAGE_COMPONENT_GROUP_REQUIRED", + "STATUS_PAGE_COMPONENT_STATIC_REFS_INVALID", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_REQUIRED", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_NOT_FOUND", + "STATUS_PAGE_COMPONENT_DEPENDENCY_REFS_INVALID", + "STATUS_PAGE_COMPONENT_SUBSCRIPTION_REFS_INVALID", + "STATUS_PAGE_NOTIFICATION_DELIVERY_RETRY_NOT_FAILED", + "STATUS_PAGE_NOTIFICATION_DELIVERY_RETRY_TERMINAL", + "STATUS_PAGE_MEASURED_UPTIME_MONITOR_ONLY", + "STATUS_PAGE_COMPONENT_OVERRIDE_EXPIRES_AT_IN_PAST", + "STATUS_PAGE_COMPONENT_OVERRIDE_EXPIRES_AT_EXCEEDS_MAX", + "STATUS_PAGE_SUBSCRIBER_DESTINATION_REQUIRED", + "STATUS_PAGE_SUBSCRIBER_DESTINATION_INVALID", + "STATUS_PAGE_SUBSCRIBER_COMPONENT_NOT_FOUND", + "SP_INCIDENT_PUBLISH_RESOLVED", + "SP_INCIDENT_DISMISS_PUBLISHED", + "SP_INCIDENT_SCHEDULED_FOR_REQUIRED", + "SP_INCIDENT_SCHEDULED_UNTIL_BEFORE_FOR", + "SP_INCIDENT_AUTO_RESOLVE_REQUIRES_UNTIL", + "SP_INCIDENT_COMPONENT_FOREIGN", + "SP_INCIDENT_MONITORING_INCIDENT_NOT_FOUND", + "SUBSCRIPTION_PRICE_INACTIVE", + "SUBSCRIPTION_PRICE_UNAVAILABLE", + "SUBSCRIPTION_ALREADY_ACTIVE", + "SUBSCRIPTION_NOT_ACTIVE", + "SUBSCRIPTION_NO_SCHEDULED_CHANGE", + "SUBSCRIPTION_CHANGE_PENDING", + "SUBSCRIPTION_CANCELING", + "SUBSCRIPTION_CADENCE_UNAVAILABLE", + "SUBSCRIPTION_PRICES_INVALID", + "BILLING_OVERAGE_CAP_INVALID", + "BILLING_OVERAGE_NOT_ACTIVE", + "SERVICE_SUBSCRIPTION_FREE_TIER_LIMIT", + "SERVICE_SUBSCRIPTION_SERVICE_UNAVAILABLE", + "ACTOR_BAD_REQUEST", + "ORGANIZATION_ID_REQUIRED", + "WORKSPACE_REQUIRED", + "WORKSPACE_INTERNAL_ACTOR_NO_WORKSPACE", + "WORKSPACE_NOT_FOUND_ON_ORG", + "ENVIRONMENT_LIMIT_REACHED", + "ENVIRONMENT_SLUG_TAKEN", + "ENVIRONMENT_DELETE_BLOCKED", + "INBOUND_INBOX_NAME_BLANK", + "INBOUND_HTTP_RESPONSE_DELAY_INVALID", + "INBOUND_HTTP_RESPONSE_STATUS_INVALID", + "INBOUND_HTTP_RESPONSE_BODY_TOO_LARGE", + "INBOUND_HTTP_RESPONSE_BODY_INVALID", + "INBOUND_HTTP_RESPONSE_CONTENT_TYPE_INVALID", + "INBOUND_HTTP_RESPONSE_HEADERS_INVALID", + "INBOUND_EVENTS_CURSOR_INVALID", + "INBOUND_EVENTS_LIMIT_OUT_OF_RANGE", + "INBOUND_DOMAIN_CUSTOM_NAME_REQUIRED", + "INBOUND_DOMAIN_IN_ASSIGNED_ZONE", + "INBOUND_DOMAIN_NAME_TAKEN", + "INBOUND_DOMAIN_KIND_INVALID", + "INBOUND_DOMAIN_STATUS_INVALID", + "INBOUND_DOMAIN_NAME_INVALID", + "INBOUND_INJECT_TO_BLANK", + "INBOUND_INJECT_FROM_BLANK", + "INBOUND_INJECT_DOMAIN_DISABLED", + "INBOUND_INJECT_TO_INVALID", + "INBOUND_INJECT_FROM_INVALID", + "INBOUND_INJECT_HEADER_INVALID", + "INBOUND_WAIT_TO_REQUIRED", + "INBOUND_WAIT_TO_INVALID", + "INBOUND_WAIT_DOMAIN_REQUIRED", + "INBOUND_WEBHOOK_INBOX_LIMIT_REACHED", + "INBOUND_EMAIL_DOMAIN_LIMIT_REACHED", + "INBOUND_CUSTOM_MX_PLAN_REQUIRED", + "INBOUND_RETENTION_ABOVE_PLAN", + "INBOUND_EVENTS_MONTHLY_LIMIT_REACHED", + "INBOUND_ACTIVITY_INBOX_IDS_REQUIRED", + "INBOUND_ACTIVITY_INBOX_IDS_TOO_MANY", + "INBOUND_ACTIVITY_DOMAIN_IDS_REQUIRED", + "INBOUND_ACTIVITY_DOMAIN_IDS_TOO_MANY", + "TAG_NAME_TAKEN", + "SAVED_VIEW_TABLE_UNKNOWN", + "SAVED_VIEW_LIMIT_REACHED", + "SAVED_VIEW_FILTERS_TOO_LARGE", + "SECRET_KEY_TAKEN", + "SECRET_ENVIRONMENT_VALUE_BLANK", + "SECRET_REQUEST_ENVIRONMENT_QUERY", + "SECRET_REQUEST_HEAD_REQUIRED", + "SECRET_REQUEST_REMAP_SECRET_ID", + "SESSION_SETUP_FILE_BLANK", + "SESSION_HEAD_REQUIRED", + "RUN_NO_HEAD", + "RUN_KEYS_MISSING", + "SYNTHETICS_USAGE_CAPPED", + "RUN_LIST_PARAM_INVALID", + "ARTIFACT_BYTES_TOO_LARGE", + "SUPERVISOR_TOKEN_INVALID", + "LEASE_COMPLETION_CONFLICT", + "LEASE_FENCE_REJECTED", + "CAPACITY_TARGET_INVALID", + "ADMISSIONS_NOT_HELD", + "RUNTIME_UNKNOWN", + "RUNTIME_RETIRED", + "RUNTIME_NOT_AVAILABLE", + "RUNTIME_UNAVAILABLE", + "RUNTIME_EOL", + "RUNTIME_AMBIGUOUS", + "RUNTIME_DIGEST_IMMUTABLE", + "RUNTIME_DIGEST_INVALID", + "API_KEY_LIMIT_REACHED", + "API_KEY_REVOKED", + "AUDIT_EXPORT_LIMIT_EXCEEDED", + "AUTH_FIELD_BLANK", + "AUTH_EMAIL_INVALID", + "AUTH_EMAIL_TAKEN", + "EMAIL_ALREADY_VERIFIED", + "ORG_EMAIL_TAKEN", + "ONBOARDING_STAGE_BACKWARD", + "INVITE_USER_ALREADY_MEMBER", + "INVITE_ALREADY_ACCEPTED", + "INVITE_REVOKED", + "INVITE_EXPIRED", + "INVITE_EMAIL_MISMATCH", + "MEMBER_LIMIT_REACHED", + "MAINTENANCE_WINDOW_END_BEFORE_START", + "FORENSICS_HASH_BLANK", + "FORENSICS_HASH_INVALID", + "CHECK_RESULTS_LIMIT_OUT_OF_RANGE", + "CHECK_RESULTS_WINDOW_INVALID", + "CHECK_RESULTS_CURSOR_INVALID", + "CHECK_RESULTS_REGION_INVALID", + "STATUS_DATA_STATUS_INVALID", + "STATUS_DATA_PERIOD_INVALID", + "STATUS_DATA_GRANULARITY_INVALID", + "STATUS_DATA_GRANULARITY_PERIOD_MISMATCH", + "STATUS_DATA_PERIOD_UNKNOWN", + "STATUS_DATA_FROM_REQUIRED_WITH_TO", + "STATUS_DATA_TO_IN_FUTURE", + "STATUS_DATA_FROM_AFTER_TO", + "STATUS_DATA_WINDOW_TOO_WIDE", + "STATUS_DATA_TYPES_INVALID", + "STATUS_DATA_CURSOR_INVALID", + "STATUS_DATA_LIMIT_OUT_OF_RANGE", + "STATUS_DATA_COMPONENT_IDS_TOO_MANY", + "INCIDENT_ACTIVE_EXISTS", + "INCIDENT_TRANSITION_INVALID", + "INCIDENT_SERVICE_NOT_FOUND", + "INCIDENT_SERVICE_INCIDENT_NOT_FOUND", + "INCIDENT_SERVICE_MISMATCH", + "INCIDENT_EVENTS_CURSOR_INVALID", + "INCIDENT_EVENTS_LIMIT_OUT_OF_RANGE", + "NOTIFICATION_DISPATCH_INVALID_STATE", + "NOTIFICATION_POLICY_DISPATCHES_LIMIT_OUT_OF_RANGE", + "NOTIFICATION_POLICY_DISPATCHES_WINDOW_INVALID", + "NOTIFICATION_POLICY_DISPATCHES_CURSOR_INVALID", + "WEBHOOK_LIMIT_REACHED", + "WEBHOOK_URL_BLANK", + "WEBHOOK_EVENT_TYPES_INVALID", + "WEBHOOK_EVENT_TYPE_INVALID", + "ALERT_DELIVERY_RETRY_NOT_FAILED", + "ADMIN_BACKFILL_TYPE_UNKNOWN", + "ADMIN_PUBLISH_BLOCKED", + "ADMIN_ADAPTER_TYPE_UNKNOWN", + "ADMIN_SEO_METADATA_INVALID", + "ADMIN_RELATED_SERVICES_TOO_MANY", + "ADMIN_RELATED_SERVICE_SELF", + "ADMIN_PROBE_NO_OFFICIAL_URL", + "ADMIN_PROBE_URL_MALFORMED", + "ADMIN_LIFECYCLE_TRANSITION_INVALID", + "CLOUDFLARE_REQUEST_FAILED", + "CLOUDFLARE_API_ERROR", + "FIELD_REQUIRED", + "FIELD_TOO_SMALL", + "FIELD_TOO_LARGE", + "FIELD_OUT_OF_RANGE", + "FIELD_PATTERN_MISMATCH", + "FIELD_INVALID_EMAIL", + "FIELD_INVALID_URL", + "FIELD_INVALID_FORMAT", + "FIELD_INVARIANT_VIOLATED", + "FIELD_VALIDATION_FAILED", + "REQUEST_BODY_REQUIRED", + "REQUEST_BODY_MALFORMED", + "REQUEST_BODY_TYPE_MISMATCH", + "REQUEST_PARAMETER_REQUIRED", + "REQUEST_MEDIA_TYPE_UNSUPPORTED", + "CARRIER_CREDITS_EXHAUSTED", + "SYNTHETICS_USAGE_RESERVED", + "TESTING_QUOTA_EXHAUSTED", + "RATE_LIMITED", + "NOTIFY_RATE", + "SCOPE_REQUIRED", + "RUN_TOKEN_ADDRESS_FORBIDDEN", + "MONITOR_OWNED_BY_OTHER", + "DEPLOY_LOCKED", + "LIVE_REVISION_CHANGED", + "CONFIRMATION_REQUIRED", + "UPDATE_REQUIRED", + "CLAIMED", + "REVISION_ROLLED_BACK", + "REVISION_NEVER_LIVE", + "REVISION_UNTESTED", + "REVISION_DISCARDED", + "REVISION_IS_LIVE", + "DRAFT_LIMIT", + "NO_TOKEN", + "CLIENT_TOO_OLD", + "MAX_RUNS_EXCEEDED", + "IMPORT_NOT_IN_BUNDLE", + "USE_PROBE", + "IDEMPOTENCY_KEY_REUSED", + "IDEMPOTENCY_KEY_IN_PROGRESS", + "IDEMPOTENCY_KEY_ORPHANED", + "TRIGGER_UNSUPPORTED_TYPE", + "ENVIRONMENT_NOT_FOUND", + "EVIDENCE_EXPIRED", + "RUN_EXPIRED", + "BUNDLE_TOO_LARGE", + "BUNDLE_NOT_FOUND", + "IMPORT_NOT_IN_RUNTIME", + "SECRET_LITERAL", + "FIELD_UNKNOWN", + "API_KEY_EXPIRED", + "DEVICE_AUTHORIZATION_NOT_FOUND", + "DEVICE_AUTHORIZATION_EXPIRED", + "DEVICE_WORKSPACE_ORG_MISMATCH" + ] + }, + "file": { + "type": "string", + "description": "Source file containing the import", + "nullable": true + }, + "line": { + "type": "integer", + "description": "One-based source line containing the import", + "format": "int32", + "nullable": true + }, + "message": { + "type": "string", + "description": "Description of the import problem" + } + }, + "description": "Problems found in the supplied source files" + }, + "Flakiness": { + "required": [ + "from", + "to", + "cycleCount", + "flakyCycleCount" + ], + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Start of the seven-day measurement window", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive end of the measurement window", + "format": "date-time" + }, + "cycleCount": { + "type": "integer", + "description": "Completed region cycles in this window", + "format": "int64" + }, + "flakyCycleCount": { + "type": "integer", + "description": "Completed region cycles recovered by retry", + "format": "int64" + } + }, + "description": "Completed region-cycle retry recovery counts" + }, "GitLabChannelConfig": { "required": [ "channelType", @@ -42875,6 +59543,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 +60129,14 @@ "format": "date-time", "nullable": true }, + "triggeringRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, "source": { "minLength": 1, "type": "string", @@ -43772,6 +60454,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 +60579,7 @@ "required": [ "createdAt", "name", + "scopes", "id" ], "type": "object", @@ -43887,6 +60609,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 +60652,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 +61655,172 @@ } } }, + "MonitorBatchHistoryDto": { + "required": [ + "monitors" + ], + "type": "object", + "properties": { + "monitors": { + "type": "array", + "description": "One entry per requested monitor that exists in the workspace", + "items": { + "$ref": "#/components/schemas/MonitorBatchHistoryItemDto" + } + } + }, + "description": "History for a set of monitors" + }, + "MonitorBatchHistoryItemDto": { + "required": [ + "id", + "ticks" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Monitor identifier", + "format": "uuid" + }, + "availability": { + "type": "number", + "description": "Share of checks that passed, 0–100; null when no checks ran", + "format": "double", + "nullable": true + }, + "p95": { + "type": "number", + "description": "95th percentile response time in milliseconds; null when none recorded", + "format": "double", + "nullable": true + }, + "ticks": { + "type": "array", + "description": "Outcome per time bucket, oldest first", + "items": { + "$ref": "#/components/schemas/MonitorHistoryTickDto" + } + }, + "displayTicks": { + "type": "array", + "description": "48 display buckets; present only when density=48", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorDisplayTickDto" + } + } + }, + "description": "Availability, p95 latency and ticks of one monitor over the window" + }, + "MonitorCappedDto": { + "type": "object", + "properties": { + "resumesAt": { + "type": "string", + "description": "When runs resume; null when unknown", + "format": "date-time", + "nullable": true + } + }, + "description": "Run allowance that is keeping a code monitor from running" + }, + "MonitorCodeSpec": { + "required": [ + "bundle", + "entrypoint" + ], + "type": "object", + "properties": { + "bundle": { + "maxLength": 80, + "minLength": 0, + "pattern": "^sha256:[a-f0-9]{64}$", + "type": "string", + "description": "Closure digest from POST /bundles (sha256:)" + }, + "entrypoint": { + "maxLength": 512, + "minLength": 0, + "type": "string", + "description": "File that runs, relative to the bundle root" + }, + "source": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeSource" + } + ] + } + }, + "description": "Bundle digest and entrypoint to publish as the live revision" + }, + "MonitorDisplayTickDto": { + "required": [ + "at", + "failingRegions", + "outcome", + "retryPassCount" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Inclusive start of this bucket", + "format": "date-time" + }, + "outcome": { + "type": "string", + "description": "passed, failed, degraded, timed_out, passed_on_retry, couldnt_run, skipped, or no_data" + }, + "runId": { + "type": "string", + "description": "Representative run to open for this bucket", + "format": "uuid", + "nullable": true + }, + "failingRegions": { + "type": "array", + "description": "Regions with a target failure in this bucket", + "items": { + "type": "string", + "description": "Regions with a target failure in this bucket" + } + }, + "retryPassCount": { + "type": "integer", + "description": "Region cycles that passed after retry in this bucket", + "format": "int64" + } + }, + "description": "Display history bucket; infrastructure outcomes do not vote on target health" + }, + "MonitorDriftCodeDto": { + "required": [ + "gitDigest", + "liveDigest", + "drifted" + ], + "type": "object", + "properties": { + "liveDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of the code revision running now" + }, + "gitDigest": { + "minLength": 1, + "type": "string", + "description": "Digest of the code revision last applied from Git" + }, + "drifted": { + "type": "boolean", + "description": "Whether the live digest differs from the Git digest" + } + }, + "description": "Live code digest compared with the last digest applied from Git" + }, "MonitorDriftDto": { "required": [ "fields" @@ -44901,9 +61833,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 +61879,51 @@ }, "description": "One field where live state differs from declared" }, + "MonitorDriftSettingDto": { + "required": [ + "field", + "git", + "live" + ], + "type": "object", + "properties": { + "field": { + "minLength": 1, + "type": "string", + "description": "Setting name: frequency or regions" + }, + "live": { + "minLength": 1, + "type": "string", + "description": "Live value: seconds for frequency, comma-separated ids for regions" + }, + "git": { + "minLength": 1, + "type": "string", + "description": "Value last applied from Git, in the same format as live" + }, + "changedAt": { + "type": "string", + "description": "When this setting was last changed", + "format": "date-time", + "nullable": true + }, + "changedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "reason": { + "type": "string", + "description": "Recorded reason; null when no reason was stored", + "nullable": true + } + }, + "description": "One setting where the live value differs from Git" + }, "MonitorDto": { "required": [ "config", @@ -44944,6 +61937,7 @@ "organizationId", "frequencySeconds", "enabled", + "ownerEnforced", "muted" ], "type": "object", @@ -45029,6 +62023,10 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Whether only the managedBy tool may change this monitor's configuration" + }, "createdAt": { "type": "string", "description": "Timestamp when the monitor was created", @@ -45126,135 +62124,595 @@ "infra", "flaky", "blocked", + "capped", "paused", "never_run", "confirming" ] }, - "bindingReadiness": { + "bindingReadiness": { + "type": "string", + "description": "Secret binding state: ready, blocked, or not_applicable", + "nullable": true, + "enum": [ + "ready", + "blocked", + "not_applicable" + ] + }, + "needsAttention": { + "type": "boolean", + "description": "True when the monitor needs operator attention", + "nullable": true + }, + "openIncident": { + "type": "string", + "description": "Open confirmed incident id", + "format": "uuid", + "nullable": true + }, + "lastRunAt": { + "type": "string", + "description": "When the latest code run was enqueued", + "format": "date-time", + "nullable": true + }, + "lastRunId": { + "type": "string", + "description": "Latest code run id", + "format": "uuid", + "nullable": true + }, + "resumesAt": { + "type": "string", + "description": "When a capped monitor resumes", + "format": "date-time", + "nullable": true + }, + "capped": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCappedDto" + } + ] + }, + "missingKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "blockedKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "owner": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOwnerDto" + } + ] + }, + "flakyRate": { + "type": "number", + "description": "Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + "format": "double", + "nullable": true + }, + "flakySince": { + "type": "string", + "description": "When the first retry-passed cycle in the last 7 days finished", + "format": "date-time", + "nullable": true + }, + "flakySeverity": { + "type": "string", + "description": "How flaky the monitor is: LOW, MEDIUM, or HIGH", + "nullable": true, + "enum": [ + "low", + "medium", + "high" + ] + }, + "lastCheckOutcome": { + "type": "string", + "description": "Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + "nullable": true, + "enum": [ + "passed", + "degraded", + "failed" + ] + }, + "lastCheckRegion": { + "type": "string", + "description": "Region of the most recent check", + "nullable": true + }, + "lastFailureSummary": { + "type": "string", + "description": "Why the latest failing region failed", + "nullable": true + }, + "lastStateChangeAt": { + "type": "string", + "description": "When the monitor last changed state: paused, evaluation change, or incident open or resolve", + "format": "date-time", + "nullable": true + }, + "regionHealth": { + "type": "array", + "description": "Latest verdict per region the monitor runs from; null while paused", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorRegionHealthDto" + } + }, + "definitionId": { + "type": "string", + "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", + "format": "uuid", + "nullable": true + }, + "capturePolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CapturePolicy" + } + ] + }, + "secretKeys": { + "type": "array", + "description": "Explicit attached secret keys; null uses scanned demand", + "nullable": true, + "items": { + "type": "string", + "description": "Explicit attached secret keys; null uses scanned demand" + } + }, + "fastRetryMaxAttempts": { + "type": "integer", + "description": "Fast-retry max attempts; null/0 = off", + "format": "int32", + "nullable": true + }, + "runParallel": { + "type": "boolean", + "description": "When multiple locations are set, run all of them each interval. False rotates one location per interval", + "nullable": true + }, + "muted": { + "type": "boolean", + "description": "Whether alert delivery is muted" + }, + "mutedUntil": { + "type": "string", + "description": "Mute expiry; null means indefinite while muted", + "format": "date-time", + "nullable": true + }, + "muteReason": { + "type": "string", + "description": "Optional mute reason", + "nullable": true + }, + "pausedAt": { + "type": "string", + "description": "When the monitor was paused", + "format": "date-time", + "nullable": true + }, + "pauseReason": { + "type": "string", + "description": "Optional pause reason", + "nullable": true + }, + "pauseExpiresAt": { + "type": "string", + "description": "Pause expiry", + "format": "date-time", + "nullable": true + }, + "quarantineOwnerId": { + "type": "string", + "description": "Quarantine person owner id", + "nullable": true + }, + "quarantineUntil": { + "type": "string", + "description": "Quarantine expiry; non-null means quarantined", + "format": "date-time", + "nullable": true + }, + "quarantineReason": { + "type": "string", + "description": "Quarantine reason", + "nullable": true + }, + "usageProjection": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorUsageProjectionDto" + } + ] + }, + "liveRevisionId": { + "type": "string", + "description": "Revision scheduled runs execute", + "format": "uuid", + "nullable": true + }, + "liveRevisionDigest": { + "type": "string", + "description": "Closure digest of the revision scheduled runs execute", + "nullable": true + }, + "triage": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorTriageDto" + } + ] + }, + "deletedAt": { + "type": "string", + "description": "When the monitor was moved to Trash", + "format": "date-time", + "nullable": true + }, + "deletedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "createdVia": { + "type": "string", + "description": "Client that originally created the monitor", + "nullable": true + } + }, + "description": "Full monitor representation" + }, + "MonitorFacetDto": { + "required": [ + "field", + "values" + ], + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "Facet field: type, environment, region, tag, or owner", + "enum": [ + "type", + "environment", + "region", + "tag", + "owner", + "project" + ] + }, + "values": { + "type": "array", + "description": "Values with at least one monitor, largest first", + "items": { + "$ref": "#/components/schemas/MonitorFacetValueDto" + } + } + }, + "description": "Values of one facet field" + }, + "MonitorFacetValueDto": { + "required": [ + "value", + "worstState", + "count" + ], + "type": "object", + "properties": { + "value": { + "minLength": 1, + "type": "string", + "description": "Value as the list filter takes it: type name, environment id, region, tag name, or owner" + }, + "count": { + "type": "integer", + "description": "Monitors with this value", + "format": "int64" + }, + "worstState": { + "type": "string", + "description": "Most severe displayHealth among the monitors with this value", + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "failing": { + "type": "integer", + "description": "Matching monitors currently failing", + "format": "int64", + "nullable": true + }, + "notRunning": { + "type": "integer", + "description": "Matching monitors currently unable to run", + "format": "int64", + "nullable": true + }, + "flaky": { + "type": "integer", + "description": "Matching running monitors recovered by retry", + "format": "int64", + "nullable": true + }, + "owner": { "type": "string", - "description": "Secret binding state: ready, blocked, or not_applicable", + "description": "Owning tool for a project facet value", "nullable": true, "enum": [ - "ready", - "blocked", - "not_applicable" + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" ] + } + }, + "description": "One value of a facet field" + }, + "MonitorFieldChange": { + "required": [ + "field" + ], + "type": "object", + "properties": { + "field": { + "minLength": 1, + "type": "string", + "description": "Setting that changed" }, - "needsAttention": { - "type": "boolean", - "description": "True when the monitor needs operator attention", + "from": { + "type": "string", + "description": "Previous setting value", "nullable": true }, - "openIncident": { + "to": { "type": "string", - "description": "Open confirmed incident id", - "format": "uuid", + "description": "New setting value", "nullable": true + } + }, + "description": "One non-secret setting changed by a monitor action" + }, + "MonitorFleetSummaryDto": { + "required": [ + "from", + "groups", + "ticks", + "to", + "window", + "openIncidentCount" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Window: 24h, 7d, or 30d" }, - "lastRunAt": { + "from": { "type": "string", - "description": "When the latest code run was enqueued", - "format": "date-time", - "nullable": true + "description": "Inclusive start of the history window", + "format": "date-time" }, - "lastRunId": { + "to": { "type": "string", - "description": "Latest code run id", - "format": "uuid", + "description": "Exclusive end of the history window", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed target checks divided by measured target checks, 0–100", + "format": "double", "nullable": true }, - "definitionId": { + "lastFailureBucketAt": { "type": "string", - "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", - "format": "uuid", + "description": "Start of the most recent failing display bucket", + "format": "date-time", "nullable": true }, - "capturePolicy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/CapturePolicy" - } - ] - }, - "fastRetryMaxAttempts": { + "openIncidentCount": { "type": "integer", - "description": "Fast-retry max attempts; null/0 = off", - "format": "int32", - "nullable": true - }, - "runParallel": { - "type": "boolean", - "description": "When multiple locations are set, run all of them each interval. False rotates one location per interval", - "nullable": true + "description": "Open confirmed monitor incidents", + "format": "int64" }, - "muted": { - "type": "boolean", - "description": "Whether alert delivery is muted" + "groups": { + "type": "array", + "description": "Current monitor group counts, independent of list filters", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "mutedUntil": { + "ticks": { + "type": "array", + "description": "48 display buckets showing the worst observed monitor outcome", + "items": { + "$ref": "#/components/schemas/MonitorDisplayTickDto" + } + } + }, + "description": "Whole-workspace monitor history and live group counts" + }, + "MonitorHistoryEntryDto": { + "required": [ + "from", + "kind", + "monitorId", + "reason", + "to", + "count" + ], + "type": "object", + "properties": { + "kind": { "type": "string", - "description": "Mute expiry; null means indefinite while muted", - "format": "date-time", - "nullable": true + "description": "Row kind: not_run" }, - "muteReason": { + "monitorId": { "type": "string", - "description": "Optional mute reason", - "nullable": true + "description": "Monitor this row belongs to", + "format": "uuid" }, - "pausedAt": { + "region": { "type": "string", - "description": "When the monitor was paused", - "format": "date-time", + "description": "Region of the skipped ticks; null when they span several regions", "nullable": true }, - "pauseReason": { + "reason": { "type": "string", - "description": "Optional pause reason", - "nullable": true + "description": "Why the ticks were skipped: quota, blocked, or plan_limit" }, - "pauseExpiresAt": { + "from": { "type": "string", - "description": "Pause expiry", - "format": "date-time", - "nullable": true + "description": "First skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineOwnerId": { + "to": { "type": "string", - "description": "Quarantine person owner id", - "nullable": true + "description": "Latest skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineUntil": { - "type": "string", - "description": "Quarantine expiry; non-null means quarantined", - "format": "date-time", - "nullable": true + "count": { + "type": "integer", + "description": "Skipped ticks collapsed into this row", + "format": "int32" }, - "quarantineReason": { + "missingKeys": { + "type": "array", + "description": "Secret keys recorded as missing for this interval", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys recorded as missing for this interval" + } + }, + "environment": { "type": "string", - "description": "Quarantine reason", + "description": "Environment recorded when these ticks were skipped", "nullable": true + } + }, + "description": "Collapsed scheduled ticks that did not run" + }, + "MonitorHistoryTickDto": { + "required": [ + "at", + "outcome" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Start of the bucket", + "format": "date-time" }, - "upload": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PackageUploadDto" - } + "outcome": { + "type": "string", + "description": "PASSED when every check passed, FAILED when none did, otherwise DEGRADED", + "enum": [ + "passed", + "degraded", + "failed" ] + } + }, + "description": "Outcome of the checks in one time bucket" + }, + "MonitorListFacetsDto": { + "required": [ + "facets", + "groups" + ], + "type": "object", + "properties": { + "groups": { + "type": "array", + "description": "Count per list group", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "usageProjection": { + "facets": { + "type": "array", + "description": "Values and counts per facet field", + "items": { + "$ref": "#/components/schemas/MonitorFacetDto" + } + }, + "sources": { + "type": "array", + "description": "Matching monitors per owning tool and project", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/MonitorUsageProjectionDto" - } + "items": { + "$ref": "#/components/schemas/MonitorSourceSummaryDto" + } + } + }, + "description": "Group and facet counts for the monitors a list filter selects" + }, + "MonitorListGroupDto": { + "required": [ + "key", + "count" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Group: failing, not_running, flaky, passing, running, or paused", + "enum": [ + "failing", + "not_running", + "flaky", + "passing", + "running", + "paused" ] + }, + "count": { + "type": "integer", + "description": "Monitors in the group", + "format": "int64" } }, - "description": "Full monitor representation" + "description": "Number of monitors in one list group" }, "MonitorOverlayRequest": { "type": "object", @@ -45274,91 +62732,90 @@ } } }, - "MonitorPackageSpec": { + "MonitorOwnerDto": { "required": [ - "digest", - "entrypoint", - "files" + "type" ], "type": "object", "properties": { - "digest": { - "maxLength": 64, - "minLength": 64, + "type": { "type": "string", - "description": "SHA-256 hex digest of the package zip (64 characters)" + "description": "Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] }, - "entrypoint": { - "maxLength": 512, - "minLength": 0, + "project": { "type": "string", - "description": "Entrypoint path inside the zip, e.g. tests/login.spec.ts" - }, - "files": { - "maxItems": 256, - "minItems": 0, - "type": "array", - "description": "Relative file paths included in the zip", - "items": { - "maxLength": 512, - "minLength": 0, - "type": "string", - "description": "Relative file paths included in the zip" - } - }, - "keys": { - "maxItems": 64, - "minItems": 0, - "type": "array", - "description": "Secret names the zip demanded. PUT: null preserves, [] clears", - "nullable": true, - "items": { - "maxLength": 255, - "minLength": 0, - "type": "string", - "description": "Secret names the zip demanded. PUT: null preserves, [] clears" - } + "description": "Project the owning tool declares; null when it declares none", + "nullable": true }, - "gitSha": { - "maxLength": 64, - "minLength": 0, + "address": { "type": "string", - "description": "Commit SHA from the repo that produced this zip. Client-supplied provenance only", + "description": "Resource address declared by the owning tool", "nullable": true }, - "gitMessage": { - "maxLength": 1024, - "minLength": 0, + "label": { "type": "string", - "description": "Commit message from the repo that produced this zip", + "description": "Display label declared by the owning client", "nullable": true }, - "gitFile": { - "maxLength": 512, - "minLength": 0, + "labeledAt": { "type": "string", - "description": "Path of the declaring file in that repo", + "description": "When the owner label was declared", + "format": "date-time", "nullable": true + } + }, + "description": "Tool that owns a monitor and the project it declares" + }, + "MonitorOwnershipMetadata": { + "type": "object", + "description": "Ownership change, admin override, or forced deploy-lock release", + "properties": { + "kind": { + "type": "string", + "enum": [ + "monitor_ownership" + ] }, - "authoredBy": { - "maxLength": 255, - "minLength": 0, + "fromOwner": { "type": "string", - "description": "Author attribution supplied with the package", - "nullable": true + "description": "Owning tool before the change", + "nullable": true, + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] }, - "keyLocations": { - "maxItems": 64, - "minItems": 0, - "type": "array", - "description": "Per-key declaring file and location from package scan", + "toOwner": { + "type": "string", + "description": "Owning tool after the change", "nullable": true, - "items": { - "$ref": "#/components/schemas/DemandedKeyLocation" - } + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "reason": { + "type": "string", + "description": "Reason the caller gave", + "nullable": true } }, - "description": "New package zip metadata for this environment" + "required": [ + "kind" + ] }, "MonitorReference": { "required": [ @@ -45377,7 +62834,87 @@ "description": "Monitor name" } }, - "description": "Monitors that reference this secret for authentication" + "description": "Monitors that reference this secret in code, authentication, or sessions" + }, + "MonitorRegionalHealthDto": { + "required": [ + "regions" + ], + "type": "object", + "properties": { + "regionalDisplayHealth": { + "type": "string", + "description": "Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + "nullable": true, + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "evaluationCycleId": { + "type": "string", + "description": "Cycle used for the regional presentation", + "format": "uuid", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Latest health-voting execution for each configured region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "lastFailure": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "failingCycleCount": { + "type": "integer", + "description": "Failing cycles since evaluation changed; null outside retained history", + "format": "int64", + "nullable": true + } + }, + "description": "Regional presentation from runs, independent of incident evaluation" + }, + "MonitorRegionHealthDto": { + "required": [ + "region", + "verdict" + ], + "type": "object", + "properties": { + "region": { + "minLength": 1, + "type": "string", + "description": "Probe region" + }, + "verdict": { + "type": "string", + "description": "Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check", + "enum": [ + "up", + "degraded", + "down", + "paused", + "unknown" + ] + } + }, + "description": "Latest verdict for one region of a monitor" }, "MonitorRunDurationBatchDto": { "required": [ @@ -45475,7 +63012,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 +63036,18 @@ "format": "uuid", "nullable": true }, + "from": { + "type": "string", + "description": "Inclusive enqueue lower bound (clamped to 90 days)", + "format": "date-time", + "nullable": true + }, + "to": { + "type": "string", + "description": "Inclusive enqueue upper bound (default now)", + "format": "date-time", + "nullable": true + }, "cursor": { "type": "string", "description": "Opaque cursor from the previous page; results cover the last 90 days", @@ -45510,12 +63059,146 @@ "type": "integer", "description": "Page size (1–100, default 25)", "format": "int32" + }, + "monitorType": { + "type": "string", + "description": "Monitor type: BROWSER or MULTI_STEP_API", + "nullable": true + }, + "incidentId": { + "type": "string", + "description": "Runs in the incident window, intersected with from and to", + "format": "uuid", + "nullable": true + }, + "branch": { + "type": "string", + "description": "Exact branch from revision provenance", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Select monitors currently flaky over the last seven days", + "nullable": true + }, + "sessionId": { + "type": "string", + "description": "Caller-provided CI session identifier", + "nullable": true + }, + "evaluationCycleId": { + "type": "string", + "description": "Only runs in this evaluation cycle, including retries", + "format": "uuid", + "nullable": true + }, + "excludeSource": { + "type": "string", + "description": "Exclude this source; omitted preserves all sources", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Enqueue order: asc or desc (default: desc)", + "nullable": true + }, + "step": { + "minimum": 0, + "type": "integer", + "description": "Zero-based failed step index; requires monitor and caseIndex", + "format": "int32", + "nullable": true + }, + "caseIndex": { + "minimum": 0, + "type": "integer", + "description": "Zero-based case index qualifying the failed step", + "format": "int32", + "nullable": true } }, "required": [ "limit" ] }, + "MonitorRunSeriesDto": { + "required": [ + "buckets", + "from", + "regions", + "to", + "window", + "pointsTruncated" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Requested chart window" + }, + "from": { + "type": "string", + "description": "Inclusive start of the chart", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive end of the chart", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed final target outcomes as a percent of passed and failed", + "format": "double", + "nullable": true + }, + "previousUptimePercent": { + "type": "number", + "description": "Target uptime in the previous equal-length period", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Buckets across every selected region", + "items": { + "$ref": "#/components/schemas/Bucket" + } + }, + "regions": { + "type": "array", + "description": "Buckets for each selected region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "points": { + "type": "array", + "description": "Latest execution points for 24h; null for longer windows", + "nullable": true, + "items": { + "$ref": "#/components/schemas/Point" + } + }, + "pointsTruncated": { + "type": "boolean", + "description": "More 24h points exist than the returned 2000-point limit" + } + }, + "description": "Execution chart and target-health cycles, read directly from retained runs. Health retries are reduced before assigning a cycle to its initial enqueue bucket; execution durations use their own enqueue window. Both comparison windows use the same current retained-cycle evidence" + }, + "MonitorScheduleDto": { + "type": "object", + "properties": { + "nextRunAt": { + "type": "string", + "description": "When the next scheduled cycle is due for admission", + "format": "date-time", + "nullable": true + } + }, + "description": "Scheduler admission clock for a code monitor" + }, "MonitorSecretRequestsDto": { "required": [ "environment", @@ -45532,6 +63215,14 @@ "items": { "$ref": "#/components/schemas/SecretRequestDto" } + }, + "undemanded": { + "type": "array", + "description": "Keys retained outside the selected revision scanned demand", + "nullable": true, + "items": { + "$ref": "#/components/schemas/SecretRequestDto" + } } }, "description": "Environment and secret keys this monitor requires" @@ -45613,6 +63304,23 @@ "description": "When this session row was last written", "format": "date-time", "nullable": true + }, + "capturedAt": { + "type": "string", + "description": "When storage state was last captured successfully", + "format": "date-time", + "nullable": true + }, + "captureRunId": { + "type": "string", + "description": "Run that last captured storage state successfully", + "format": "uuid", + "nullable": true + }, + "defaultSession": { + "type": "boolean", + "description": "Whether legacy single-session routes select this setup file; absent on older APIs", + "nullable": true } }, "description": "Cached sign-in session for a monitor" @@ -45659,6 +63367,24 @@ }, "description": "Projected run volume and meter headroom for this monitor" }, + "MonitorSourceSummaryDto": { + "required": [ + "owner", + "count" + ], + "type": "object", + "properties": { + "owner": { + "$ref": "#/components/schemas/MonitorOwnerDto" + }, + "count": { + "type": "integer", + "description": "Number of matching monitors", + "format": "int64" + } + }, + "description": "Monitors declared by one owning tool and project" + }, "MonitorsSummaryDto": { "type": "object", "properties": { @@ -45768,6 +63494,22 @@ "description": "Environment to test against; null uses the monitor environment", "format": "uuid", "nullable": true + }, + "code": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "session": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunSessionContext" + } + ] } } }, @@ -45835,11 +63577,134 @@ "type": "array", "nullable": true, "items": { - "type": "string" + "type": "string", + "nullable": true } } } }, + "MonitorTriageDto": { + "required": [ + "deletedBindings", + "restoreBlockers" + ], + "type": "object", + "properties": { + "lastCheckAt": { + "type": "string", + "description": "When the latest completed check finished", + "format": "date-time", + "nullable": true + }, + "latestRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "latestHealthRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "incident": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentDto" + } + ] + }, + "pausedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/UserDto" + } + ] + }, + "flakiness": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/Flakiness" + } + ] + }, + "restoreBlockers": { + "type": "array", + "description": "Reasons this trashed monitor cannot currently be restored", + "items": { + "type": "string", + "description": "Reasons this trashed monitor cannot currently be restored" + } + }, + "deletedBindings": { + "type": "array", + "description": "Status-page bindings retained for restoration", + "items": { + "$ref": "#/components/schemas/RestorableBinding" + } + } + }, + "description": "Operational facts for a monitor" + }, + "MonitorTriageParams": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Exact monitor name, ignoring case and surrounding spaces", + "nullable": true + }, + "openIncident": { + "type": "boolean", + "description": "Whether a confirmed incident is open", + "nullable": true + }, + "muted": { + "type": "boolean", + "description": "Whether alert delivery is currently muted", + "nullable": true + }, + "quarantined": { + "type": "boolean", + "description": "Whether quarantine has not expired", + "nullable": true + }, + "pausedBefore": { + "type": "string", + "description": "Only monitors paused before this timestamp", + "format": "date-time", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Whether recent completed cycles recovered on retry", + "nullable": true + }, + "group": { + "type": "string", + "description": "List group: failing, not_running, passing, or paused", + "nullable": true + }, + "ownerProject": { + "type": "string", + "description": "Exact project declared by the owning tool", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Use state for group and streak ordering", + "nullable": true + } + } + }, "MonitorUsageProjectionDto": { "type": "object", "properties": { @@ -45898,6 +63763,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 +63945,7 @@ }, "NearestOtherRegion": { "required": [ - "artifactId", + "finishedAt", "region", "runId" ], @@ -45966,20 +63953,21 @@ "properties": { "runId": { "type": "string", - "description": "Run that holds the other-region shot", + "description": "Passing run identifier", "format": "uuid" }, "region": { + "minLength": 1, "type": "string", - "description": "Region of that run" + "description": "Region of the passing run" }, - "artifactId": { + "finishedAt": { "type": "string", - "description": "Screenshot on that run", - "format": "uuid" + "description": "When the passing run finished", + "format": "date-time" } }, - "description": "Prior pass of this step in another region" + "description": "Nearest earlier pass in another region when this region has none" }, "NetworkRowDto": { "required": [ @@ -46774,6 +64762,12 @@ "format": "double", "nullable": true }, + "p99Ms": { + "type": "number", + "description": "p99 duration in ms; null without settled timings", + "format": "double", + "nullable": true + }, "failed": { "type": "integer", "description": "Failed first-attempt count in the window", @@ -46848,34 +64842,25 @@ }, "description": "Overview step catalog joined to run-step aggregates" }, - "PackageUploadDto": { - "required": [ - "expiresAt", - "putUrl", - "requiredHeaders" - ], + "OwnerDeclaration": { "type": "object", "properties": { - "putUrl": { - "minLength": 1, + "address": { + "maxLength": 512, + "minLength": 0, "type": "string", - "description": "Presigned PUT URL for the zip bytes" + "description": "Resource address declared by the owning tool", + "nullable": true }, - "expiresAt": { + "label": { + "maxLength": 255, + "minLength": 0, "type": "string", - "description": "When the signed URL expires", - "format": "date-time" - }, - "requiredHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Must send Content-Type: application/zip and If-None-Match: *" - }, - "description": "Must send Content-Type: application/zip and If-None-Match: *" + "description": "Display label declared by the owning client", + "nullable": true } }, - "description": "Signed package upload target" + "description": "Advisory location and label declared by the owner" }, "Pageable": { "type": "object", @@ -47021,6 +65006,33 @@ "type": "string", "description": "When that run finished", "format": "date-time" + }, + "region": { + "type": "string", + "description": "Region of this finished run", + "nullable": true + }, + "outcome": { + "type": "string", + "description": "Outcome of this finished run", + "nullable": true, + "enum": [ + "passed", + "failed", + "execution_error", + "timed_out", + "passed_on_retry", + "cancelled", + "inconclusive" + ] + }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] } }, "description": "Finished run offered as an alternate baseline" @@ -47080,6 +65092,42 @@ }, "description": "Billing plan and entitlement state" }, + "Point": { + "required": [ + "at", + "outcome", + "region", + "runId" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "When the execution finished", + "format": "date-time" + }, + "runId": { + "type": "string", + "description": "Execution identifier", + "format": "uuid" + }, + "region": { + "type": "string", + "description": "Execution region" + }, + "outcome": { + "type": "string", + "description": "Recorded execution outcome" + }, + "durationMs": { + "type": "integer", + "description": "Execution duration in milliseconds", + "format": "int64", + "nullable": true + } + }, + "description": "Latest execution points for 24h; null for longer windows" + }, "PolicySnapshotDto": { "required": [ "engineVersion", @@ -47188,8 +65236,36 @@ "properties": { "revisionId": { "type": "string", - "description": "Existing revision to activate as Head for this monitor's environment", + "description": "Revision to make live for this monitor's environment", "format": "uuid" + }, + "expectedLiveRevisionId": { + "type": "string", + "description": "Live revision this publish replaces; null skips the check", + "format": "uuid", + "nullable": true + }, + "requireTested": { + "type": "boolean", + "description": "When true, require a passing test in this environment within 24 hours", + "nullable": true + }, + "force": { + "type": "boolean", + "description": "Skip the requireTested check; needs the publish-untested scope", + "nullable": true + }, + "acknowledgeRollback": { + "type": "string", + "description": "Rolled-back digest this publish re-applies on purpose", + "nullable": true + }, + "note": { + "maxLength": 280, + "minLength": 0, + "type": "string", + "description": "Optional note describing this publish", + "nullable": true } } }, @@ -47457,6 +65533,161 @@ } } }, + "Region": { + "required": [ + "buckets", + "region" + ], + "type": "object", + "properties": { + "region": { + "type": "string", + "description": "Execution region" + }, + "uptimePercent": { + "type": "number", + "description": "Final target uptime in this region", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Clock-aligned chart buckets", + "items": { + "$ref": "#/components/schemas/Bucket" + } + } + }, + "description": "Buckets for each selected region" + }, + "RegionBucketDto": { + "required": [ + "from", + "to", + "total", + "passed" + ], + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "Inclusive bucket start (ISO 8601)", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive bucket end (ISO 8601)", + "format": "date-time" + }, + "p50": { + "type": "number", + "description": "50th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "p95": { + "type": "number", + "description": "95th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "p99": { + "type": "number", + "description": "99th-percentile latency in milliseconds", + "format": "double", + "nullable": true + }, + "total": { + "type": "integer", + "description": "Checks run in this bucket", + "format": "int64" + }, + "passed": { + "type": "integer", + "description": "Checks that passed in this bucket", + "format": "int64" + } + }, + "description": "One chart bucket of checks and latency percentiles" + }, + "RegionDto": { + "required": [ + "displayName", + "id" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Region id, such as us-east" + }, + "displayName": { + "type": "string", + "description": "Name shown for this region" + } + }, + "description": "Public region checks can run from" + }, + "RegionResultSeriesDto": { + "required": [ + "regions", + "window", + "bucketSeconds" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Requested window (24h, 7d, or 30d)" + }, + "bucketSeconds": { + "type": "integer", + "description": "Chart bucket width in seconds", + "format": "int32" + }, + "previousUptimePercent": { + "type": "number", + "description": "Uptime percent for the previous equal-length window", + "format": "double", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Per-region series covering the requested window", + "items": { + "$ref": "#/components/schemas/RegionSeriesDto" + } + } + }, + "description": "Per-region uptime and latency series for a monitor chart window" + }, + "RegionSeriesDto": { + "required": [ + "buckets", + "region" + ], + "type": "object", + "properties": { + "region": { + "type": "string", + "description": "Probe region identifier" + }, + "uptimePercent": { + "type": "number", + "description": "Uptime percent over checks run in the window", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Clock-aligned buckets spanning the window", + "items": { + "$ref": "#/components/schemas/RegionBucketDto" + } + } + }, + "description": "Uptime and latency buckets for one region" + }, "RegionStatusDto": { "required": [ "region", @@ -48107,6 +66338,33 @@ "warnMs" ] }, + "RestorableBinding": { + "required": [ + "component", + "statusPage" + ], + "type": "object", + "properties": { + "statusPage": { + "$ref": "#/components/schemas/StatusPageDto" + }, + "component": { + "$ref": "#/components/schemas/StatusPageBindingSnapshot" + } + }, + "description": "Status-page binding retained while a monitor is trashed" + }, + "RestoreMonitorRequest": { + "type": "object", + "properties": { + "environmentId": { + "type": "string", + "description": "Environment to restore a code monitor into; null preserves its environment", + "format": "uuid", + "nullable": true + } + } + }, "ResultSummaryDto": { "required": [ "chartData", @@ -48277,7 +66535,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 +66564,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 +66590,146 @@ "description": "Who authored this package", "nullable": true }, + "source": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeSource" + } + ] + }, "createdAt": { "type": "string", "description": "When the revision was minted", "format": "date-time" + }, + "state": { + "type": "string", + "description": "draft, tested_passed, tested_failed, live, previous, or discarded", + "nullable": true, + "enum": [ + "draft", + "tested_passed", + "tested_failed", + "live", + "previous", + "discarded" + ] + }, + "testRunId": { + "type": "string", + "description": "Latest validation run for this revision", + "format": "uuid", + "nullable": true + }, + "testOutcome": { + "type": "string", + "description": "Latest test outcome; absent until a test finishes", + "nullable": true, + "enum": [ + "passed", + "failed" + ] + }, + "liveStats": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionLiveStatsDto" + } + ] + }, + "expiresAt": { + "type": "string", + "description": "When this draft expires; preserved after discard", + "format": "date-time", + "nullable": true + }, + "createdByKind": { + "type": "string", + "description": "Tool that created this draft", + "nullable": true, + "enum": [ + "dashboard", + "git", + "terraform", + "api", + "mcp" + ] + }, + "baseRevision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionReferenceDto" + } + ] } }, "description": "Definition revision package" }, + "RevisionFilesDto": { + "required": [ + "entrypoint", + "files" + ], + "type": "object", + "properties": { + "entrypoint": { + "type": "string", + "description": "Entry file path inside the bundle" + }, + "files": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Source text by file path" + }, + "description": "Source text by file path" + } + }, + "description": "Source files of a revision bundle" + }, + "RevisionLiveStatsDto": { + "type": "object", + "properties": { + "runs": { + "type": "integer", + "description": "Scheduled runs and fast retries of this revision", + "format": "int64" + }, + "failed": { + "type": "integer", + "description": "How many of those runs failed", + "format": "int64" + } + }, + "description": "Scheduled runs of this revision, and how many failed", + "required": [ + "runs", + "failed" + ] + }, + "RevisionReferenceDto": { + "required": [ + "id", + "number" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Related revision identifier", + "format": "uuid" + }, + "number": { + "type": "integer", + "description": "Revision number within its definition", + "format": "int32" + } + }, + "description": "Live revision this draft was based on" + }, "RollbackPreviewDto": { "required": [ "affectedMonitors", @@ -48364,21 +66760,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 +67311,8 @@ "last_pass_same_revision_region", "last_pass_any_revision", "attempts_in_run", - "none" + "none", + "selected_run" ] }, "readsAs": { @@ -48925,6 +67333,14 @@ "items": { "$ref": "#/components/schemas/PickerItem" } + }, + "nearestOtherRegion": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NearestOtherRegion" + } + ] } }, "description": "Step duration diff against a prior pass" @@ -48950,7 +67366,8 @@ "cancelRequested", "stream", "attempt", - "attemptOf" + "attemptOf", + "billable" ], "type": "object", "properties": { @@ -49010,6 +67427,14 @@ "description": "Revision this run executed", "format": "uuid" }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + }, "region": { "minLength": 1, "type": "string", @@ -49037,6 +67462,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 +67571,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 +67682,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 +67971,99 @@ }, "description": "Frozen execution identity; null when historical identity is unknown" }, + "RunFacetDto": { + "required": [ + "field", + "values" + ], + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "Filter field these values describe" + }, + "values": { + "type": "array", + "description": "Values selected by the other filters", + "items": { + "$ref": "#/components/schemas/Value" + } + } + }, + "description": "Run facets respecting the other active filters" + }, + "RunFailureDto": { + "required": [ + "kind" + ], + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "Failure category", + "enum": [ + "assertion", + "timeout", + "navigation", + "network", + "target_blocked", + "script_error", + "wait_timeout", + "setup" + ] + }, + "step": { + "type": "string", + "description": "Step title that failed; null when the run failed before a step", + "nullable": true + }, + "message": { + "type": "string", + "description": "Reporter message, trimmed", + "nullable": true + }, + "file": { + "type": "string", + "description": "User source file; null when the reporter did not capture one", + "nullable": true + }, + "line": { + "type": "integer", + "description": "1-based line in the user source file", + "format": "int32", + "nullable": true + }, + "index": { + "type": "integer", + "description": "0-based index of the failed step", + "format": "int32", + "nullable": true + } + }, + "description": "Why a run failed, including the source location when the reporter captured one" + }, + "RunHistogramBucketDto": { + "required": [ + "counts", + "start" + ], + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "Inclusive UTC start of this bucket", + "format": "date-time" + }, + "counts": { + "type": "array", + "description": "Health-voting run attempt counts", + "items": { + "$ref": "#/components/schemas/RunOutcomeCountDto" + } + } + }, + "description": "UTC time buckets of health-voting run attempts" + }, "RunListParams": { "type": "object", "properties": { @@ -49483,7 +68074,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 +68095,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 +68110,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 +68343,109 @@ "description": "Required artifact records explicitly suppressed, not reached, or not captured", "format": "int64", "nullable": true + }, + "outcomeCounts": { + "type": "array", + "description": "Health-voting run attempts by projected outcome", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunOutcomeCountDto" + } + }, + "excludedRunCount": { + "type": "integer", + "description": "Matching attempts that do not vote on health", + "format": "int64", + "nullable": true + }, + "cycleCount": { + "type": "integer", + "description": "Distinct scheduled cycle identities in the filtered population", + "format": "int64", + "nullable": true + }, + "failedCycleCount": { + "type": "integer", + "description": "Recorded complete cycles with a final failed or timed-out region; display count", + "format": "int64", + "nullable": true + }, + "displayGroupCount": { + "type": "integer", + "description": "Cycle and manual-trigger groups in the filtered population", + "format": "int64", + "nullable": true + }, + "healthVotingP95DurationMs": { + "type": "number", + "description": "95th-percentile duration of health-voting run attempts", + "format": "double", + "nullable": true + }, + "sessionLastRunAt": { + "type": "string", + "description": "Latest session enqueue within retention, independent of the window", + "format": "date-time", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "UTC time buckets of health-voting run attempts", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunHistogramBucketDto" + } + }, + "facets": { + "type": "array", + "description": "Run facets respecting the other active filters", + "nullable": true, + "items": { + "$ref": "#/components/schemas/RunFacetDto" + } } }, "description": "Duration and evidence metrics for the filtered Runs population" }, + "RunMonitorStripDto": { + "required": [ + "monitors", + "failingCount", + "flakyCount", + "healthyCount", + "unclassifiedCount" + ], + "type": "object", + "properties": { + "failingCount": { + "type": "integer", + "description": "Monitors whose latest window group is complete with a failed or timed-out region", + "format": "int64" + }, + "flakyCount": { + "type": "integer", + "description": "Passing monitors with current seven-day flakiness", + "format": "int64" + }, + "healthyCount": { + "type": "integer", + "description": "Monitors whose latest window group passed without current flakiness", + "format": "int64" + }, + "unclassifiedCount": { + "type": "integer", + "description": "Monitors whose latest voting group is pending or has no passing/failing verdict", + "format": "int64" + }, + "monitors": { + "type": "array", + "description": "At most 100 monitor chips; counts cover the complete population", + "items": { + "$ref": "#/components/schemas/Item" + } + } + } + }, "RunnerLogLiveEvent": { "required": [ "line", @@ -49704,6 +68465,40 @@ }, "description": "Live runner-log line" }, + "RunnerRegionStatusDto": { + "required": [ + "id", + "status" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Public region identifier" + }, + "status": { + "type": "string", + "description": "ok when both code-monitor types have an active accepting pool; otherwise degraded" + } + }, + "description": "Whether a public region accepts browser and multi-step runs" + }, + "RunnerRegionStatusesDto": { + "required": [ + "regions" + ], + "type": "object", + "properties": { + "regions": { + "type": "array", + "description": "Acceptance status per public region", + "items": { + "$ref": "#/components/schemas/RunnerRegionStatusDto" + } + } + }, + "description": "Public runner-region acceptance status" + }, "RunNetworkDto": { "required": [ "data", @@ -49777,6 +68572,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 +68874,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 +69000,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 +69172,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 +69185,7 @@ "minLength": 0, "pattern": "^$|^[A-Za-z0-9._-]+$", "type": "string", - "description": "Runtime pin such as 2026.11; omit to pin the current runtime at create", + "description": "Runtime pin such as 2026.11; omit to pin the newest runtime that can run", "nullable": true } } @@ -50172,11 +69251,27 @@ }, "usedByMonitors": { "type": "array", - "description": "Monitors that reference this secret for authentication", + "description": "Monitors that reference this secret in code, authentication, or sessions", "nullable": true, "items": { "$ref": "#/components/schemas/MonitorReference" } + }, + "valuesAt": { + "type": "array", + "description": "Environments in which this secret has a value", + "nullable": true, + "items": { + "$ref": "#/components/schemas/Summary" + } + }, + "valueStamp": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SecretValueStampDto" + } + ] } }, "description": "Organization secret and its change-detection hash" @@ -50238,6 +69333,24 @@ "description": "Run that last resolved this key", "format": "uuid", "nullable": true + }, + "demanded": { + "type": "boolean", + "description": "Whether the selected revision statically declares this key", + "nullable": true + }, + "attached": { + "type": "boolean", + "description": "Whether this key is attached for vault resolution", + "nullable": true + }, + "valueStamp": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SecretValueStampDto" + } + ] } }, "description": "Secret key a monitor requires and how it is fulfilled" @@ -50258,6 +69371,32 @@ }, "description": "Monitors that reference this secret" }, + "SecretValueStampDto": { + "required": [ + "environment" + ], + "type": "object", + "properties": { + "environment": { + "$ref": "#/components/schemas/Summary" + }, + "updatedAt": { + "type": "string", + "description": "When this environment value was last written", + "format": "date-time", + "nullable": true + }, + "updatedBy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ActorDisplayDto" + } + ] + } + }, + "description": "Change metadata for the requested environment value" + }, "SeoMetadataDto": { "type": "object", "properties": { @@ -51403,6 +70542,17 @@ } } }, + "SingleValueResponseArtifactDownloadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ArtifactDownloadDto" + } + } + }, "SingleValueResponseAuthMeResponse": { "required": [ "data" @@ -51436,6 +70586,28 @@ } } }, + "SingleValueResponseBundleCheckResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleCheckResultDto" + } + } + }, + "SingleValueResponseBundleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BundleDto" + } + } + }, "SingleValueResponseCaptureCompareDto": { "required": [ "data" @@ -51458,6 +70630,17 @@ } } }, + "SingleValueResponseCreateDraftRevisionResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateDraftRevisionResponse" + } + } + }, "SingleValueResponseDashboardOverviewDto": { "required": [ "data" @@ -51513,6 +70696,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 +70751,17 @@ } } }, + "SingleValueResponseEntitlementResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EntitlementResponse" + } + } + }, "SingleValueResponseEnvironmentDto": { "required": [ "data" @@ -51648,6 +70864,20 @@ } } }, + "SingleValueResponseListRegionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegionDto" + } + } + } + }, "SingleValueResponseListUUID": { "required": [ "data" @@ -51722,6 +70952,17 @@ } } }, + "SingleValueResponseMonitorBatchHistoryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorBatchHistoryDto" + } + } + }, "SingleValueResponseMonitorDriftDto": { "required": [ "data" @@ -51744,6 +70985,39 @@ } } }, + "SingleValueResponseMonitorFleetSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorFleetSummaryDto" + } + } + }, + "SingleValueResponseMonitorListFacetsDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorListFacetsDto" + } + } + }, + "SingleValueResponseMonitorRegionalHealthDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorRegionalHealthDto" + } + } + }, "SingleValueResponseMonitorRunDurationBatchDto": { "required": [ "data" @@ -51766,6 +71040,28 @@ } } }, + "SingleValueResponseMonitorRunSeriesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorRunSeriesDto" + } + } + }, + "SingleValueResponseMonitorScheduleDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorScheduleDto" + } + } + }, "SingleValueResponseMonitorSecretRequestsDto": { "required": [ "data" @@ -51821,6 +71117,17 @@ } } }, + "SingleValueResponseMonitorValidationResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorValidationResultDto" + } + } + }, "SingleValueResponseMonitorVersionDto": { "required": [ "data" @@ -51887,25 +71194,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 +71282,17 @@ } } }, + "SingleValueResponseRevisionFilesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionFilesDto" + } + } + }, "SingleValueResponseRollbackPreviewDto": { "required": [ "data" @@ -52030,6 +71348,28 @@ } } }, + "SingleValueResponseRunMonitorStripDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunMonitorStripDto" + } + } + }, + "SingleValueResponseRunnerRegionStatusesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunnerRegionStatusesDto" + } + } + }, "SingleValueResponseRuntimeProfileDto": { "required": [ "data" @@ -52041,6 +71381,17 @@ } } }, + "SingleValueResponseRunTraceSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunTraceSummaryDto" + } + } + }, "SingleValueResponseSecretAuditDto": { "required": [ "data" @@ -52316,6 +71667,17 @@ } } }, + "SingleValueResponseTriggerRunsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerRunsResponse" + } + } + }, "SingleValueResponseUptimeDto": { "required": [ "data" @@ -52753,6 +72115,53 @@ }, "description": "Curated vendor status-event row for the Dependencies Detail rail" }, + "StatusPageBindingSnapshot": { + "required": [ + "name", + "showUptime", + "displayOrder", + "excludeFromOverall" + ], + "type": "object", + "properties": { + "name": { + "minLength": 1, + "type": "string", + "description": "Component display name" + }, + "description": { + "type": "string", + "description": "Optional component description", + "nullable": true + }, + "groupId": { + "type": "string", + "description": "Group that contains this component", + "format": "uuid", + "nullable": true + }, + "showUptime": { + "type": "boolean", + "description": "Whether to show measured uptime" + }, + "displayOrder": { + "type": "integer", + "description": "Position within the page or group", + "format": "int32" + }, + "excludeFromOverall": { + "type": "boolean", + "description": "Whether to exclude this component from overall status" + }, + "startDate": { + "type": "string", + "description": "Optional start date for published uptime history", + "format": "date", + "nullable": true + } + }, + "description": "Saved component configuration" + }, "StatusPageBoundComponentDto": { "required": [ "componentId", @@ -53762,6 +73171,9 @@ } } }, + "StreamingResponseBody": { + "type": "object" + }, "Summary": { "required": [ "id", @@ -53783,7 +73195,7 @@ "type": "string" } }, - "description": "Environment associated with this monitor; null when unassigned" + "description": "Environment containing this value" }, "SyntheticsFamilyMetricsDto": { "required": [ @@ -54205,39 +73617,71 @@ } } }, - "TableValueResultInboundOtpCode": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/InboundOtpCode" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultIncidentDto": { + "TableValueResultInboundOtpCode": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InboundOtpCode" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IncidentDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentStateTransitionDto": { "required": [ "data", "hasNext", @@ -54248,7 +73692,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IncidentDto" + "$ref": "#/components/schemas/IncidentStateTransitionDto" } }, "hasNext": { @@ -54269,7 +73713,7 @@ } } }, - "TableValueResultIncidentStateTransitionDto": { + "TableValueResultIntegrationDto": { "required": [ "data", "hasNext", @@ -54280,7 +73724,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IncidentStateTransitionDto" + "$ref": "#/components/schemas/IntegrationDto" } }, "hasNext": { @@ -54301,7 +73745,7 @@ } } }, - "TableValueResultIntegrationDto": { + "TableValueResultInviteDto": { "required": [ "data", "hasNext", @@ -54312,7 +73756,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IntegrationDto" + "$ref": "#/components/schemas/InviteDto" } }, "hasNext": { @@ -54333,7 +73777,7 @@ } } }, - "TableValueResultInviteDto": { + "TableValueResultMaintenanceWindowDto": { "required": [ "data", "hasNext", @@ -54344,7 +73788,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/InviteDto" + "$ref": "#/components/schemas/MaintenanceWindowDto" } }, "hasNext": { @@ -54365,7 +73809,7 @@ } } }, - "TableValueResultMaintenanceWindowDto": { + "TableValueResultMemberDto": { "required": [ "data", "hasNext", @@ -54376,7 +73820,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MaintenanceWindowDto" + "$ref": "#/components/schemas/MemberDto" } }, "hasNext": { @@ -54397,7 +73841,7 @@ } } }, - "TableValueResultMemberDto": { + "TableValueResultMonitorDto": { "required": [ "data", "hasNext", @@ -54408,7 +73852,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MemberDto" + "$ref": "#/components/schemas/MonitorDto" } }, "hasNext": { @@ -54429,7 +73873,7 @@ } } }, - "TableValueResultMonitorDto": { + "TableValueResultMonitorSessionDto": { "required": [ "data", "hasNext", @@ -54440,7 +73884,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MonitorDto" + "$ref": "#/components/schemas/MonitorSessionDto" } }, "hasNext": { @@ -54749,38 +74193,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 +75452,47 @@ }, "description": "Actions around the failure, teardown labelled" }, + "TransferMonitorRequest": { + "required": [ + "reason", + "to" + ], + "type": "object", + "properties": { + "to": { + "type": "string", + "description": "New owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + }, + "reason": { + "maxLength": 280, + "minLength": 0, + "type": "string", + "description": "Why ownership is moving (recorded in the audit log)" + }, + "project": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the new owner declares for this monitor; null clears it", + "nullable": true + }, + "ownerDeclaration": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/OwnerDeclaration" + } + ] + } + } + }, "TriggerRule": { "required": [ "scope", @@ -56106,6 +75559,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 +76412,18 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Only the managedBy tool may change configuration. Null preserves current", + "nullable": true + }, + "ownerProject": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the owning tool declares; null preserves current", + "nullable": true + }, "environmentId": { "type": "string", "description": "New environment; null preserves current", @@ -56944,18 +76503,42 @@ "description": "Run every location each interval; false rotates one. Null preserves current", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" } ] }, + "acknowledgeRollback": { + "type": "string", + "description": "Rolled-back digest this code publish re-applies on purpose", + "nullable": true + }, "status": { "type": "string", "description": "Not writable; use pause or resume", "nullable": true + }, + "expectedUpdatedAt": { + "type": "string", + "description": "Last updatedAt this edit was based on; null skips the check", + "format": "date-time", + "nullable": true + }, + "secretKeys": { + "maxItems": 256, + "minItems": 0, + "type": "array", + "description": "Replace attached secret keys; null preserves current", + "nullable": true, + "items": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Replace attached secret keys; null preserves current" + } } } }, @@ -58131,6 +77714,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..b8c44a2 100644 --- a/src/devhelm/_generated.py +++ b/src/devhelm/_generated.py @@ -423,6 +423,16 @@ class ApiKeyCreateResponse(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None class ApiKeyDto(BaseModel): @@ -463,6 +473,25 @@ class ApiKeyDto(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None + + +class ArtifactDownloadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + url: Annotated[str, Field(description="Signed GET URL for the artifact bytes")] + expires_at: Annotated[ + AwareDatetime, + Field(alias="expiresAt", description="When the signed URL stops working"), + ] class ArtifactViewport(BaseModel): @@ -554,12 +583,95 @@ class BrowserCapabilityEnvelope(BaseModel): upload: Annotated[bool, Field(description="File upload is enabled")] +class Bucket(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start: Annotated[ + AwareDatetime, Field(description="Inclusive clock-aligned bucket start") + ] + passed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt passed") + ] + failed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt failed") + ] + timed_out: Annotated[ + int, + Field( + alias="timedOut", description="Region cycles whose final attempt timed out" + ), + ] + couldnt_run: Annotated[ + int, + Field( + alias="couldntRun", + description="Region cycles with a final non-target outcome", + ), + ] + passed_on_retry: Annotated[ + int, + Field( + alias="passedOnRetry", + description="Passed cycles that had an earlier failed attempt", + ), + ] + duration_samples: Annotated[ + int, + Field( + alias="durationSamples", + description="Executions with a completed duration in this bucket", + ), + ] + p50_ms: Annotated[ + float | None, + Field( + alias="p50Ms", + description="Median duration of completed executions in milliseconds", + ), + ] = None + p95_ms: Annotated[ + float | None, + Field( + alias="p95Ms", + description="p95 duration of completed executions in milliseconds", + ), + ] = None + + class Action(StrEnum): pause = "PAUSE" resume = "RESUME" delete = "DELETE" add_tag = "ADD_TAG" remove_tag = "REMOVE_TAG" + update_schedule = "UPDATE_SCHEDULE" + run = "RUN" + mute = "MUTE" + unmute = "UNMUTE" + acknowledge = "ACKNOWLEDGE" + + +class BundleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + digest: Annotated[ + str, + Field( + description="Closure digest, sha256:. Same files always return this value", + min_length=1, + ), + ] + upload_digest: Annotated[ + str, + Field( + alias="uploadDigest", + description="Digest of every file that was sent, before import closure", + min_length=1, + ), + ] + files: Annotated[list[str], Field(description="Files in the import closure")] + keys: Annotated[ + list[str], Field(description="Secret names detected in the closure") + ] + size: Annotated[int, Field(description="Uncompressed closure size in bytes")] class Screenshots(StrEnum): @@ -580,6 +692,12 @@ class Video(StrEnum): off = "off" +class Network(StrEnum): + always = "always" + on_failure = "on_failure" + off = "off" + + class CapturePolicy(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) screenshots: Annotated[ @@ -589,6 +707,10 @@ class CapturePolicy(BaseModel): Trace | None, Field(description="When to capture a Playwright trace") ] = None video: Annotated[Video | None, Field(description="When to capture video")] = None + network: Annotated[ + Network | None, + Field(description="When network rows and HAR are retained; null uses always"), + ] = None class CategoryDto(BaseModel): @@ -689,18 +811,35 @@ class CodeCheckStep(BaseModel): ] = None -class CodeTestTargetRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - environment_id: Annotated[ - UUID | None, +class CodeSource(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + repo: Annotated[ + str | None, Field( - alias="environmentId", - description="Environment to test against; null uses the monitor's environment", + description="Repository that produced this code", + max_length=512, + min_length=0, ), ] = None - region: Annotated[ + branch: Annotated[ str | None, - Field(description="Region for this test; null uses the monitor's first region"), + Field( + description="Branch that produced this code", max_length=255, min_length=0 + ), + ] = None + commit: Annotated[ + str | None, + Field( + description="Commit that produced this code", max_length=64, min_length=0 + ), + ] = None + file: Annotated[ + str | None, + Field( + description="Declaring file in that repository", + max_length=512, + min_length=0, + ), ] = None @@ -939,6 +1078,14 @@ class ManagedBy(StrEnum): api = "API" +class Tool(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + class CreateApiKeyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -956,6 +1103,21 @@ class CreateApiKeyRequest(BaseModel): description="Optional expiration timestamp in ISO 8601 format", ), ] = None + preset: Annotated[ + str | None, + Field( + description="Preset expanded into scopes: ci-pr, ci-deploy, agent-responder, agent-author" + ), + ] = None + scopes: Annotated[ + list[str] | None, Field(description="Scopes to grant (default: full)") + ] = None + tool: Annotated[ + Tool | None, + Field( + description="Tool this key writes as on owner-enforced monitors (default: API)" + ), + ] = None class Severity(StrEnum): @@ -963,6 +1125,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,14 +1327,13 @@ class Type(StrEnum): multi_step_api = "MULTI_STEP_API" -class CreatePackageUploadRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - digest: Annotated[ +class SecretKey(RootModel[str]): + root: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip to upload (64 chars)", - max_length=64, - min_length=64, + description="Secret keys to attach; null starts with the scanned set", + max_length=255, + min_length=0, ), ] @@ -1679,32 +1878,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 +1902,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,36 +2362,77 @@ class EntitlementDto(BaseModel): ] -class EnvironmentDto(BaseModel): +class EntitlementResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique environment identifier")] - org_id: Annotated[ - int, - Field(alias="orgId", description="Organization this environment belongs to"), - ] - name: Annotated[ - str, Field(description="Human-readable environment name", min_length=1) - ] - slug: Annotated[str, Field(description="URL-safe identifier", min_length=1)] - variables: Annotated[ - dict[str, str], - Field(description="Key-value variable pairs available for interpolation"), + tier: Annotated[str, Field(description="Resolved billing plan tier")] + entitlements: Annotated[ + dict[str, EntitlementDto], + Field(description="All entitlements keyed by entitlement key"), ] - created_at: Annotated[ - AwareDatetime, + usage: Annotated[ + dict[str, int], Field( - alias="createdAt", description="Timestamp when the environment was created" + description="Current usage counters keyed by entitlement key (only for countable resources)" ), ] - updated_at: Annotated[ - AwareDatetime, + trial_active: Annotated[ + bool, Field( - alias="updatedAt", - description="Timestamp when the environment was last updated", + alias="trialActive", description="Whether the org is currently on a trial" ), ] - monitor_count: Annotated[ - int, + 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")] + org_id: Annotated[ + int, + Field(alias="orgId", description="Organization this environment belongs to"), + ] + name: Annotated[ + str, Field(description="Human-readable environment name", min_length=1) + ] + slug: Annotated[str, Field(description="URL-safe identifier", min_length=1)] + variables: Annotated[ + dict[str, str], + Field(description="Key-value variable pairs available for interpolation"), + ] + created_at: Annotated[ + AwareDatetime, + Field( + alias="createdAt", description="Timestamp when the environment was created" + ), + ] + updated_at: Annotated[ + AwareDatetime, + Field( + alias="updatedAt", + description="Timestamp when the environment was last updated", + ), + ] + monitor_count: Annotated[ + int, Field( alias="monitorCount", description="Number of monitors using this environment", @@ -2323,11 +2617,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 +2669,72 @@ class EscalationStep(BaseModel): ] = None +class EvidencePurgedMetadata(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Literal["evidence_purged"] = "evidence_purged" + reason: Annotated[ + str, Field(description="Why the evidence was deleted", min_length=1) + ] + + +class EvidencePurgeRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[ + str, + Field( + description="Why the evidence must be deleted; kept in the audit log (max 500)", + max_length=500, + min_length=0, + ), + ] + + class FailureDetail(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitor_id: Annotated[ UUID, Field(alias="monitorId", description="Monitor ID that failed") ] reason: Annotated[str, Field(description="Human-readable reason for the failure")] + code: Annotated[ + str | None, + Field( + description="Error code for the failure, as returned by the single-monitor operation" + ), + ] = None + + +class Finding(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + code: Annotated[str, Field(description="Import validation code")] + file: Annotated[ + str | None, Field(description="Source file containing the import") + ] = None + line: Annotated[ + int | None, Field(description="One-based source line containing the import") + ] = None + message: Annotated[str, Field(description="Description of the import problem")] + + +class Flakiness(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Start of the seven-day measurement window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the measurement window") + ] + cycle_count: Annotated[ + int, + Field(alias="cycleCount", description="Completed region cycles in this window"), + ] + flaky_cycle_count: Annotated[ + int, + Field( + alias="flakyCycleCount", + description="Completed region cycles recovered by retry", + ), + ] class GitLabChannelConfig(BaseModel): @@ -3195,57 +3547,6 @@ class IncidentsSummaryDto(BaseModel): mttr30d: float | None = None -class IncidentTriggerDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - rule_type: Annotated[ - str | None, - Field( - alias="ruleType", - description="Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", - ), - ] = None - rule_index: Annotated[ - int | None, - Field( - alias="ruleIndex", - description="0-based index into the policy trigger_rules array; null when unknown", - ), - ] = None - count: Annotated[ - int | None, - Field( - description="Observed failing_streak or failures_in_window from forensics; null when unavailable" - ), - ] = None - threshold: Annotated[ - int | None, - Field( - description="Rule required count or threshold_ms from forensics; null when unavailable" - ), - ] = None - last_error: Annotated[ - str | None, - Field( - alias="lastError", - description="failure_reason from the triggering check result; null when unavailable", - ), - ] = None - first_failed_check_at: Annotated[ - AwareDatetime | None, - Field( - alias="firstFailedCheckAt", - description="Earliest failing check timestamp in the confirm window when computable; null otherwise", - ), - ] = None - source: Annotated[ - str, - Field( - description="Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", - min_length=1, - ), - ] - - class IncidentUpdateDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -3407,6 +3708,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 +3730,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,146 +4161,274 @@ class MonitorAuthDto(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig -class MonitorDriftFieldDto(BaseModel): +class MonitorCappedDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - field: Annotated[ - str, - Field( - description="Field name: enabled, muted, quarantine, or managedBy", - min_length=1, - ), - ] - live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] - declared: Annotated[ - str, Field(description="Implied declared / IaC baseline", min_length=1) - ] - - -class MonitorOverlayRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - reason: Annotated[ - str | None, - Field( - description="Optional human-readable reason (max 280)", - max_length=280, - min_length=0, - ), - ] = None - expires_at: Annotated[ + resumes_at: Annotated[ AwareDatetime | None, - Field(alias="expiresAt", description="When this overlay expires"), + Field(alias="resumesAt", description="When runs resume; null when unknown"), ] = None -class File(RootModel[str]): - root: Annotated[ +class MonitorCodeSpec(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + bundle: Annotated[ str, Field( - description="Relative file paths included in the zip", - max_length=512, + description="Closure digest from POST /bundles (sha256:)", + max_length=80, min_length=0, + pattern="^sha256:[a-f0-9]{64}$", ), ] - - -class Key(RootModel[str]): - root: Annotated[ + entrypoint: Annotated[ str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=255, + description="File that runs, relative to the bundle root", + max_length=512, min_length=0, ), ] + source: CodeSource | None = None -class MonitorPackageSpec(BaseModel): +class MonitorDisplayTickDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - digest: Annotated[ + at: Annotated[AwareDatetime, Field(description="Inclusive start of this bucket")] + outcome: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip (64 characters)", - max_length=64, - min_length=64, + description="passed, failed, degraded, timed_out, passed_on_retry, couldnt_run, skipped, or no_data" ), ] - entrypoint: Annotated[ - str, + run_id: Annotated[ + UUID | None, + Field(alias="runId", description="Representative run to open for this bucket"), + ] = None + failing_regions: Annotated[ + list[str], Field( - description="Entrypoint path inside the zip, e.g. tests/login.spec.ts", - max_length=512, - min_length=0, + alias="failingRegions", + description="Regions with a target failure in this bucket", ), ] - files: Annotated[ - list[File], + retry_pass_count: Annotated[ + int, Field( - description="Relative file paths included in the zip", - max_length=256, - min_length=0, + alias="retryPassCount", + description="Region cycles that passed after retry in this bucket", ), ] - keys: Annotated[ - list[Key] | None, + + +class MonitorDriftCodeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + live_digest: Annotated[ + str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=64, - min_length=0, + alias="liveDigest", + description="Digest of the code revision running now", + min_length=1, ), - ] = None - git_sha: Annotated[ - str | None, + ] + git_digest: Annotated[ + str, Field( - alias="gitSha", - description="Commit SHA from the repo that produced this zip. Client-supplied provenance only", - max_length=64, - min_length=0, + alias="gitDigest", + description="Digest of the code revision last applied from Git", + min_length=1, ), - ] = None - git_message: Annotated[ - str | None, + ] + drifted: Annotated[ + bool, Field(description="Whether the live digest differs from the Git digest") + ] + + +class MonitorDriftFieldDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[ + str, Field( - alias="gitMessage", - description="Commit message from the repo that produced this zip", - max_length=1024, - min_length=0, + description="Field name: enabled, muted, quarantine, or managedBy", + min_length=1, ), - ] = None - git_file: Annotated[ - str | None, + ] + live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] + declared: Annotated[ + str, Field(description="Implied declared / IaC baseline", min_length=1) + ] + + +class MonitorFacetValueDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + value: Annotated[ + str, Field( - alias="gitFile", - description="Path of the declaring file in that repo", - max_length=512, - min_length=0, + description="Value as the list filter takes it: type name, environment id, region, tag name, or owner", + min_length=1, ), - ] = None - authored_by: Annotated[ - str | None, + ] + count: Annotated[int, Field(description="Monitors with this value")] + worst_state: Annotated[ + str, Field( - alias="authoredBy", - description="Author attribution supplied with the package", - max_length=255, - min_length=0, + alias="worstState", + description="Most severe displayHealth among the monitors with this value", ), + ] + failing: Annotated[ + int | None, Field(description="Matching monitors currently failing") ] = None - key_locations: Annotated[ - list[DemandedKeyLocation] | None, + not_running: Annotated[ + int | None, Field( - alias="keyLocations", - description="Per-key declaring file and location from package scan", - max_length=64, - min_length=0, + alias="notRunning", description="Matching monitors currently unable to run" ), ] = None + flaky: Annotated[ + int | None, Field(description="Matching running monitors recovered by retry") + ] = None + owner: Annotated[ + str | None, Field(description="Owning tool for a project facet value") + ] = None -class MonitorReference(BaseModel): +class MonitorFieldChange(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Monitor identifier")] + field: Annotated[str, Field(description="Setting that changed", min_length=1)] + from_: Annotated[ + str | None, Field(alias="from", description="Previous setting value") + ] = None + to: Annotated[str | None, Field(description="New setting value")] = None + + +class MonitorHistoryEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Row kind: not_run")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this row belongs to") + ] + region: Annotated[ + str | None, + Field( + 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"), + ] + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="First skipped tick in this collapsed row"), + ] + to: Annotated[ + AwareDatetime, Field(description="Latest skipped tick in this collapsed row") + ] + count: Annotated[int, Field(description="Skipped ticks collapsed into this row")] + missing_keys: Annotated[ + list[str] | None, + Field( + alias="missingKeys", + description="Secret keys recorded as missing for this interval", + ), + ] = None + environment: Annotated[ + str | None, + Field(description="Environment recorded when these ticks were skipped"), + ] = None + + +class MonitorHistoryTickDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + at: Annotated[AwareDatetime, Field(description="Start of the bucket")] + outcome: Annotated[ + str, + Field( + description="PASSED when every check passed, FAILED when none did, otherwise DEGRADED" + ), + ] + + +class MonitorListGroupDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + key: Annotated[ + str, + Field( + description="Group: failing, not_running, flaky, passing, running, or paused" + ), + ] + count: Annotated[int, Field(description="Monitors in the group")] + + +class MonitorOverlayRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[ + str | None, + Field( + description="Optional human-readable reason (max 280)", + max_length=280, + min_length=0, + ), + ] = None + expires_at: Annotated[ + AwareDatetime | None, + Field(alias="expiresAt", description="When this overlay expires"), + ] = None + + +class MonitorOwnerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + type: Annotated[ + str, Field(description="Owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + project: Annotated[ + str | None, + Field( + description="Project the owning tool declares; null when it declares none" + ), + ] = None + address: Annotated[ + str | None, Field(description="Resource address declared by the owning tool") + ] = None + label: Annotated[ + str | None, Field(description="Display label declared by the owning client") + ] = None + labeled_at: Annotated[ + AwareDatetime | None, + Field(alias="labeledAt", description="When the owner label was declared"), + ] = None + + +class MonitorOwnershipMetadata(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Literal["monitor_ownership"] = "monitor_ownership" + from_owner: Annotated[ + str | None, + Field(alias="fromOwner", description="Owning tool before the change"), + ] = None + to_owner: Annotated[ + str | None, Field(alias="toOwner", description="Owning tool after the change") + ] = None + reason: Annotated[str | None, Field(description="Reason the caller gave")] = None + + +class MonitorReference(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Monitor identifier")] name: Annotated[str, Field(description="Monitor name")] +class MonitorRegionHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Probe region", min_length=1)] + verdict: Annotated[ + str, + Field( + description="Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check" + ), + ] + + class MonitorRunDurationMetricDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitor_id: Annotated[ @@ -4040,7 +4483,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 +4495,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 +4515,73 @@ class MonitorRunListParams(BaseModel): limit: Annotated[ int, Field(description="Page size (1–100, default 25)", ge=1, le=100) ] + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), + ] = None + incident_id: Annotated[ + UUID | None, + Field( + alias="incidentId", + description="Runs in the incident window, intersected with from and to", + ), + ] = None + branch: Annotated[ + str | None, Field(description="Exact branch from revision provenance") + ] = None + flaky: Annotated[ + bool | None, + Field(description="Select monitors currently flaky over the last seven days"), + ] = None + session_id: Annotated[ + str | None, + Field(alias="sessionId", description="Caller-provided CI session identifier"), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Only runs in this evaluation cycle, including retries", + ), + ] = None + exclude_source: Annotated[ + str | None, + Field( + alias="excludeSource", + description="Exclude this source; omitted preserves all sources", + ), + ] = None + sort: Annotated[ + str | None, Field(description="Enqueue order: asc or desc (default: desc)") + ] = None + step: Annotated[ + int | None, + Field( + description="Zero-based failed step index; requires monitor and caseIndex", + ge=0, + ), + ] = None + case_index: Annotated[ + int | None, + Field( + alias="caseIndex", + description="Zero-based case index qualifying the failed step", + ge=0, + ), + ] = None + + +class MonitorScheduleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + next_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="nextRunAt", + description="When the next scheduled cycle is due for admission", + ), + ] = None class MonitorSessionDto(BaseModel): @@ -4108,6 +4629,27 @@ class MonitorSessionDto(BaseModel): AwareDatetime | None, Field(alias="updatedAt", description="When this session row was last written"), ] = None + captured_at: Annotated[ + AwareDatetime | None, + Field( + alias="capturedAt", + description="When storage state was last captured successfully", + ), + ] = None + capture_run_id: Annotated[ + UUID | None, + Field( + alias="captureRunId", + description="Run that last captured storage state successfully", + ), + ] = None + default_session: Annotated[ + bool | None, + Field( + alias="defaultSession", + description="Whether legacy single-session routes select this setup file; absent on older APIs", + ), + ] = None class MonitorSettingsPreviewDto(BaseModel): @@ -4138,6 +4680,12 @@ class MonitorSettingsPreviewDto(BaseModel): ] = None +class MonitorSourceSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + owner: MonitorOwnerDto + count: Annotated[int, Field(description="Number of matching monitors")] + + class MonitorsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) total: Annotated[ @@ -4197,6 +4745,49 @@ class MonitorTestResultDto(BaseModel): warnings: list[str] | None = None +class MonitorTriageParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str | None, + Field(description="Exact monitor name, ignoring case and surrounding spaces"), + ] = None + open_incident: Annotated[ + bool | None, + Field(alias="openIncident", description="Whether a confirmed incident is open"), + ] = None + muted: Annotated[ + bool | None, Field(description="Whether alert delivery is currently muted") + ] = None + quarantined: Annotated[ + bool | None, Field(description="Whether quarantine has not expired") + ] = None + paused_before: Annotated[ + AwareDatetime | None, + Field( + alias="pausedBefore", + description="Only monitors paused before this timestamp", + ), + ] = None + flaky: Annotated[ + bool | None, + Field(description="Whether recent completed cycles recovered on retry"), + ] = None + group: Annotated[ + str | None, + Field(description="List group: failing, not_running, passing, or paused"), + ] = None + owner_project: Annotated[ + str | None, + Field( + alias="ownerProject", + description="Exact project declared by the owning tool", + ), + ] = None + sort: Annotated[ + str | None, Field(description="Use state for group and streak ordering") + ] = None + + class MonitorUsageProjectionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) meter: Annotated[ @@ -4260,14 +4851,78 @@ class MonitorUsageProjectionDto(BaseModel): ] = None -class NearestOtherRegion(BaseModel): +class MonitorValidationFindingDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - run_id: Annotated[ - UUID, Field(alias="runId", description="Run that holds the other-region shot") + severity: Annotated[ + str, Field(description="error blocks a write; warning does not") ] - region: Annotated[str, Field(description="Region of that run")] - artifact_id: Annotated[ - UUID, Field(alias="artifactId", description="Screenshot on that run") + code: Annotated[ + str, + Field( + description="Stable problem code, such as MONITOR_FREQUENCY_BELOW_PLAN_MIN" + ), + ] + message: Annotated[str, Field(description="What is wrong")] + field: Annotated[ + str | None, Field(description="Request field this finding refers to") + ] = None + have: Annotated[int | None, Field(description="Current or requested amount")] = None + limit: Annotated[int | None, Field(description="Plan limit or floor")] = None + plan: Annotated[str | None, Field(description="Billing plan, such as FREE")] = None + upgrade_url: Annotated[ + str | None, Field(alias="upgradeUrl", description="Where to change plan") + ] = None + environment: Annotated[ + str | None, Field(description="Destination environment slug or id") + ] = None + secret_key: Annotated[ + str | None, + Field( + alias="secretKey", + description="Secret key name with no value in this environment", + ), + ] = None + runtime_id: Annotated[ + str | None, + Field(alias="runtimeId", description="Runtime id this finding refers to"), + ] = None + monitor_index: Annotated[ + int | None, + Field(alias="monitorIndex", description="Index of the monitor in the request"), + ] = None + + +class MonitorValidationProjectionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor_index: Annotated[ + int, + Field(alias="monitorIndex", description="Index of the monitor in the request"), + ] + environment: Annotated[ + str | None, Field(description="Destination environment slug or id") + ] = None + usage: MonitorUsageProjectionDto + + +class MonitorValidationResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + findings: Annotated[ + list[MonitorValidationFindingDto], + Field(description="Every problem found, including warnings"), + ] + projections: Annotated[ + list[MonitorValidationProjectionDto], + Field(description="Projected monthly runs for each code monitor destination"), + ] + + +class NearestOtherRegion(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[UUID, Field(alias="runId", description="Passing run identifier")] + region: Annotated[str, Field(description="Region of the passing run", min_length=1)] + finished_at: Annotated[ + AwareDatetime, + Field(alias="finishedAt", description="When the passing run finished"), ] @@ -4658,6 +5313,13 @@ class OverviewStepDto(BaseModel): description="p95 duration in ms; null until the step has settled timings", ), ] = None + p99_ms: Annotated[ + float | None, + Field( + alias="p99Ms", + description="p99 duration in ms; null without settled timings", + ), + ] = None failed: Annotated[ int, Field(description="Failed first-attempt count in the window") ] @@ -4714,27 +5376,24 @@ class OverviewStepsDto(BaseModel): ] -class PackageUploadDto(BaseModel): +class OwnerDeclaration(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - put_url: Annotated[ - str, + address: Annotated[ + str | None, Field( - alias="putUrl", - description="Presigned PUT URL for the zip bytes", - min_length=1, + description="Resource address declared by the owning tool", + max_length=512, + min_length=0, ), - ] - expires_at: Annotated[ - AwareDatetime, - Field(alias="expiresAt", description="When the signed URL expires"), - ] - required_headers: Annotated[ - dict[str, str], + ] = None + label: Annotated[ + str | None, Field( - alias="requiredHeaders", - description="Must send Content-Type: application/zip and If-None-Match: *", + description="Display label declared by the owning client", + max_length=255, + min_length=0, ), - ] + ] = None class Pageable(BaseModel): @@ -4825,17 +5484,6 @@ class PhoneCallChannelConfig(BaseModel): ] = None -class PickerItem(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - run_id: Annotated[UUID, Field(alias="runId", description="Finished run identifier")] - revision_id: Annotated[ - UUID, Field(alias="revisionId", description="Revision that run executed") - ] - finished_at: Annotated[ - AwareDatetime, Field(alias="finishedAt", description="When that run finished") - ] - - class PlanInfo(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) tier: Annotated[str, Field(description="Resolved plan tier")] @@ -4865,6 +5513,18 @@ class PlanInfo(BaseModel): ] +class Point(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + at: Annotated[AwareDatetime, Field(description="When the execution finished")] + run_id: Annotated[UUID, Field(alias="runId", description="Execution identifier")] + region: Annotated[str, Field(description="Execution region")] + outcome: Annotated[str, Field(description="Recorded execution outcome")] + duration_ms: Annotated[ + int | None, + Field(alias="durationMs", description="Execution duration in milliseconds"), + ] = None + + class PolicySnapshotDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) hash_hex: Annotated[ @@ -4959,9 +5619,44 @@ class PublishRevisionRequest(BaseModel): UUID, Field( alias="revisionId", - description="Existing revision to activate as Head for this monitor's environment", + description="Revision to make live for this monitor's environment", ), ] + expected_live_revision_id: Annotated[ + UUID | None, + Field( + alias="expectedLiveRevisionId", + description="Live revision this publish replaces; null skips the check", + ), + ] = None + require_tested: Annotated[ + bool | None, + Field( + alias="requireTested", + description="When true, require a passing test in this environment within 24 hours", + ), + ] = None + force: Annotated[ + bool | None, + Field( + description="Skip the requireTested check; needs the publish-untested scope" + ), + ] = None + acknowledge_rollback: Annotated[ + str | None, + Field( + alias="acknowledgeRollback", + description="Rolled-back digest this publish re-applies on purpose", + ), + ] = None + note: Annotated[ + str | None, + Field( + description="Optional note describing this publish", + max_length=280, + min_length=0, + ), + ] = None class Status7(StrEnum): @@ -5145,6 +5840,60 @@ class RegexBodyAssertion(BaseModel): ] +class Region(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Execution region")] + uptime_percent: Annotated[ + float | None, + Field(alias="uptimePercent", description="Final target uptime in this region"), + ] = None + buckets: Annotated[list[Bucket], Field(description="Clock-aligned chart buckets")] + + +class RegionBucketDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive bucket start (ISO 8601)"), + ] + to: Annotated[AwareDatetime, Field(description="Exclusive bucket end (ISO 8601)")] + p50: Annotated[ + float | None, Field(description="50th-percentile latency in milliseconds") + ] = None + p95: Annotated[ + float | None, Field(description="95th-percentile latency in milliseconds") + ] = None + p99: Annotated[ + float | None, Field(description="99th-percentile latency in milliseconds") + ] = None + total: Annotated[int, Field(description="Checks run in this bucket")] + passed: Annotated[int, Field(description="Checks that passed in this bucket")] + + +class RegionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[str, Field(description="Region id, such as us-east")] + display_name: Annotated[ + str, Field(alias="displayName", description="Name shown for this region") + ] + + +class RegionSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + region: Annotated[str, Field(description="Probe region identifier")] + uptime_percent: Annotated[ + float | None, + Field( + alias="uptimePercent", + description="Uptime percent over checks run in the window", + ), + ] = None + buckets: Annotated[ + list[RegionBucketDto], + Field(description="Clock-aligned buckets spanning the window"), + ] + + class RegionStatusDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) region: Annotated[str, Field(description="Region identifier", examples=["us-east"])] @@ -5387,6 +6136,17 @@ class ResponseTimeWarnAssertion(BaseModel): ] +class RestoreMonitorRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + environment_id: Annotated[ + UUID | None, + Field( + alias="environmentId", + description="Environment to restore a code monitor into; null preserves its environment", + ), + ] = None + + class ResultSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) current_status: Annotated[ @@ -5465,57 +6225,35 @@ class RevisionDiffHunkDto(BaseModel): right: Annotated[str | None, Field(description="Right value when present")] = None -class RevisionDto(BaseModel): +class RevisionFilesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Revision identifier")] - definition_id: Annotated[ - UUID, Field(alias="definitionId", description="Parent definition") - ] - number: Annotated[ - int, Field(description="Monotonic revision number within the definition") - ] - digest: Annotated[ - str, Field(description="SHA-256 hex digest of the zip", min_length=1) - ] - entrypoint: Annotated[ - str, Field(description="Entrypoint file that runs", min_length=1) - ] - files: Annotated[list[str], Field(description="Paths present in the zip")] - keys: Annotated[list[str], Field(description="Secret key names the code demands")] - download_until: Annotated[ - AwareDatetime | None, - Field( - alias="downloadUntil", description="When package bytes expire for download" - ), - ] = None - git_sha: Annotated[ - str | None, - Field(alias="gitSha", description="Git commit SHA when sourced from Git"), - ] = None - git_message: Annotated[ - str | None, Field(alias="gitMessage", description="Git commit message") - ] = None - git_file: Annotated[ - str | None, Field(alias="gitFile", description="Declaring Git file path") - ] = None - authored_by: Annotated[ - str | None, Field(alias="authoredBy", description="Who authored this package") - ] = None - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="When the revision was minted"), + entrypoint: Annotated[str, Field(description="Entry file path inside the bundle")] + files: Annotated[dict[str, str], Field(description="Source text by file path")] + + +class RevisionLiveStatsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + runs: Annotated[ + int, Field(description="Scheduled runs and fast retries of this revision") ] + failed: Annotated[int, Field(description="How many of those runs failed")] + + +class RevisionReferenceDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Related revision identifier")] + number: Annotated[int, Field(description="Revision number within its definition")] class RollbackRevisionRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) revision_id: Annotated[ - UUID, + UUID | None, Field( alias="revisionId", - description="Existing revision to restore as Head for this monitor's environment", + description="Revision to restore; null restores the previous live revision", ), - ] + ] = None reason: Annotated[ str, Field( @@ -5524,6 +6262,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 +6466,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 +6539,32 @@ class RunExecutionAttemptDto(BaseModel): ] +class RunFailureDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Failure category")] + step: Annotated[ + str | None, + Field( + description="Step title that failed; null when the run failed before a step" + ), + ] = None + message: Annotated[str | None, Field(description="Reporter message, trimmed")] = ( + None + ) + file: Annotated[ + str | None, + Field( + description="User source file; null when the reporter did not capture one" + ), + ] = None + line: Annotated[ + int | None, Field(description="1-based line in the user source file") + ] = None + index: Annotated[ + int | None, Field(description="0-based index of the failed step") + ] = None + + class RunListParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) phase: Annotated[ @@ -5826,7 +6574,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 +6592,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 +6602,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 +6698,139 @@ class RunLiveDto(BaseModel): ] = None -class RunMetricsSummaryDto(BaseModel): +class RunnerLogLiveEvent(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - from_: Annotated[ - AwareDatetime, - Field(alias="from", description="Inclusive start of the enqueue-time window"), - ] - to: Annotated[ - AwareDatetime, Field(description="Inclusive end of the enqueue-time window") - ] - matching_run_count: Annotated[ - int, + ts: Annotated[str, Field(description="Loki timestamp in nanoseconds")] + line: Annotated[str, Field(description="One runner-log line", min_length=1)] + + +class RunnerRegionStatusDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[str, Field(description="Public region identifier")] + status: Annotated[ + str, Field( - alias="matchingRunCount", - description="Runs matching the complete list filter", + description="ok when both code-monitor types have an active accepting pool; otherwise degraded" ), ] - duration_sample_count: Annotated[ - int, - Field( - alias="durationSampleCount", - description="Finished matching runs with a measured execution duration", - ), + + +class RunnerRegionStatusesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regions: Annotated[ + list[RunnerRegionStatusDto], + Field(description="Acceptance status per public region"), ] - p95_duration_ms: Annotated[ - float | None, - Field( - alias="p95DurationMs", - description="95th percentile execution duration in milliseconds; null when no durations were measured", - ), + + +class RunNetworkParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + attempt: Annotated[ + int | None, Field(description="In-check attempt (default selected attempt)") ] = None - evidence_eligible_run_count: Annotated[ - int, - Field( - alias="evidenceEligibleRunCount", - description="Runs with a known capture policy", - ), - ] - evidence_unknown_policy_run_count: Annotated[ - int, - Field( - alias="evidenceUnknownPolicyRunCount", - description="Runs with a missing or incomplete capture policy", - ), - ] - evidence_incomplete_run_count: Annotated[ - int | None, - Field( - alias="evidenceIncompleteRunCount", - description="Eligible runs with required evidence missing, processing, failed, or expired", - ), + failed: Annotated[ + bool | None, Field(description="Only rows with status >= 400 or a failure") ] = None - evidence_processing_run_count: Annotated[ - int | None, - Field( - alias="evidenceProcessingRunCount", - description="Eligible runs with required evidence still processing", - ), + slow: Annotated[ + bool | None, Field(description="Only rows with durationMs >= 1000") ] = None - evidence_no_evidence_policy_run_count: Annotated[ - int | None, - Field( - alias="evidenceNoEvidencePolicyRunCount", - description="Eligible runs with no evidence required by their recorded policy", - ), + step_id: Annotated[ + str | None, Field(alias="stepId", description="Only rows for this step") ] = None - evidence_complete_run_count: Annotated[ - int | None, - Field( - alias="evidenceCompleteRunCount", - description="Eligible runs with all required evidence available", - ), + xhr: Annotated[ + bool | None, Field(description="Only xhr, fetch, and api resource types") ] = None - available_artifact_count: Annotated[ - int | None, - Field( - alias="availableArtifactCount", - description="Required artifact records with an available unexpired object key", - ), + source: Annotated[str | None, Field(description="page or request")] = None + cursor: Annotated[ + str | None, Field(description="Opaque cursor from the previous page") ] = None - processing_artifact_count: Annotated[ - int | None, + + +class RunOutcomeCountDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + outcome: Annotated[str, Field(description="Projected run outcome")] + count: Annotated[int, Field(description="Matching run attempts with this outcome")] + + +class RunSessionContext(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + str, Field( - alias="processingArtifactCount", - description="Required artifact records still processing", + description="Caller-provided CI session identifier", + max_length=255, + min_length=0, ), - ] = None - failed_artifact_count: Annotated[ - int | None, + ] + label: Annotated[ + str | None, Field( - alias="failedArtifactCount", - description="Required artifact records with a failed upload", + description="CI session label, such as CI #4812", + max_length=255, + min_length=0, ), ] = None - expired_artifact_count: Annotated[ - int | None, + commit: Annotated[ + str | None, Field( - alias="expiredArtifactCount", - description="Required artifact records marked expired or past their expiry", + description="Commit that started this CI session", + max_length=64, + min_length=0, ), ] = None - missing_artifact_kind_count: Annotated[ - int | None, + branch: Annotated[ + str | None, Field( - alias="missingArtifactKindCount", - description="Required evidence kinds with no artifact record after the run finished", + description="Branch that started this CI session", + max_length=255, + min_length=0, ), ] = None - intentional_no_evidence_artifact_count: Annotated[ - int | None, + url: Annotated[ + str | None, Field( - alias="intentionalNoEvidenceArtifactCount", - description="Required artifact records explicitly suppressed, not reached, or not captured", + description="HTTP or HTTPS URL of the CI job", + max_length=2048, + min_length=0, + pattern="^[hH][tT][tT][pP][sS]?://\\S+$", ), ] = None -class RunnerLogLiveEvent(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - ts: Annotated[str, Field(description="Loki timestamp in nanoseconds")] - line: Annotated[str, Field(description="One runner-log line", min_length=1)] - - -class RunNetworkParams(BaseModel): +class RunSkippedListParams(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - attempt: Annotated[ - int | None, Field(description="In-check attempt (default selected attempt)") + from_: Annotated[ + AwareDatetime | None, + Field( + alias="from", + description="Inclusive window start; default last 24 hours, clamped to 90 days", + ), ] = None - failed: Annotated[ - bool | None, Field(description="Only rows with status >= 400 or a failure") + to: Annotated[ + AwareDatetime | None, Field(description="Inclusive window end; default now") ] = None - slow: Annotated[ - bool | None, Field(description="Only rows with durationMs >= 1000") + monitor_id: Annotated[ + UUID | None, + Field(alias="monitorId", description="Only entries for this monitor"), ] = None - step_id: Annotated[ - str | None, Field(alias="stepId", description="Only rows for this step") + cursor: Annotated[ + str | None, Field(description="Opaque cursor returned by this endpoint") ] = None - xhr: Annotated[ - bool | None, Field(description="Only xhr, fetch, and api resource types") + limit: Annotated[ + int, Field(description="Page size (1–100, default 50)", ge=1, le=100) + ] + environment_id: Annotated[ + UUID | None, + Field( + alias="environmentId", + description="Current monitor environment; historical ticks retain their snapshot", + ), ] = None - source: Annotated[str | None, Field(description="page or request")] = None - cursor: Annotated[ - str | None, Field(description="Opaque cursor from the previous page") + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), ] = None @@ -6059,7 +6867,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 +6942,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 +7051,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 +7064,7 @@ class ScriptMonitorConfig(BaseModel): str | None, Field( alias="runtimeId", - description="Runtime pin such as 2026.11; omit to pin the current runtime at create", + description="Runtime pin such as 2026.11; omit to pin the newest runtime that can run", max_length=32, min_length=0, pattern="^$|^[A-Za-z0-9._-]+$", @@ -6227,82 +7072,6 @@ class ScriptMonitorConfig(BaseModel): ] = None -class SecretDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique secret identifier")] - key: Annotated[ - str, Field(description="Secret key name, unique within the workspace") - ] - dek_version: Annotated[ - int, - Field( - alias="dekVersion", description="DEK version at the time of last encryption" - ), - ] - value_hash: Annotated[ - str, - Field( - alias="valueHash", - description="SHA-256 hex digest of the current plaintext; use for change detection", - ), - ] - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="Timestamp when the secret was created"), - ] - updated_at: Annotated[ - AwareDatetime, - Field( - alias="updatedAt", description="Timestamp when the secret was last updated" - ), - ] - used_by_monitors: Annotated[ - list[MonitorReference] | None, - Field( - alias="usedByMonitors", - description="Monitors that reference this secret for authentication", - ), - ] = None - - -class SecretRequestDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - key: Annotated[str, Field(description="Secret key this monitor requires")] - secret: SecretDto | None = None - readiness: Annotated[ - str, Field(description="Whether this key is resolved or missing") - ] - fulfilled_by: Annotated[ - str | None, - Field( - alias="fulfilledBy", - description="Fulfilled from environment variables or a secret", - ), - ] = None - declaring_file: Annotated[ - str | None, - Field( - alias="declaringFile", - description="Declaring file path inside the package zip", - ), - ] = None - declaring_location: Annotated[ - str | None, - Field( - alias="declaringLocation", - description="Call site from package scan, e.g. signIn(…) · line 6", - ), - ] = None - last_resolved_at: Annotated[ - AwareDatetime | None, - Field(alias="lastResolvedAt", description="When a run last resolved this key"), - ] = None - last_resolved_run_id: Annotated[ - UUID | None, - Field(alias="lastResolvedRunId", description="Run that last resolved this key"), - ] = None - - class SeoMetadataDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) short_description: Annotated[ @@ -6786,17 +7555,37 @@ class SingleValueResponseApiKeyDto(BaseModel): data: ApiKeyDto -class SingleValueResponseDekRotationResultDto(BaseModel): +class SingleValueResponseArtifactDownloadDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DekRotationResultDto + data: ArtifactDownloadDto -class SingleValueResponseDeployLockDto(BaseModel): +class SingleValueResponseBundleDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DeployLockDto + data: BundleDto -class SingleValueResponseEmailDomainDto(BaseModel): +class SingleValueResponseDekRotationResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DekRotationResultDto + + +class SingleValueResponseDeployLockDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + 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 +7595,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 +7620,11 @@ class SingleValueResponseListEmailDomainActivityDto(BaseModel): data: list[EmailDomainActivityDto] +class SingleValueResponseListRegionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[RegionDto] + + class SingleValueResponseListUUID(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[UUID] @@ -6856,6 +7650,11 @@ class SingleValueResponseMonitorRunDurationSummaryDto(BaseModel): data: MonitorRunDurationSummaryDto +class SingleValueResponseMonitorScheduleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorScheduleDto + + class SingleValueResponseMonitorSessionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: MonitorSessionDto @@ -6876,6 +7675,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 +7695,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 +7710,9 @@ class SingleValueResponseResultSummaryDto(BaseModel): data: ResultSummaryDto -class SingleValueResponseRevisionDto(BaseModel): +class SingleValueResponseRevisionFilesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RevisionDto + data: RevisionFilesDto class SingleValueResponseRunConsoleDto(BaseModel): @@ -6921,14 +7720,9 @@ class SingleValueResponseRunConsoleDto(BaseModel): data: RunConsoleDto -class SingleValueResponseRunDiffDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunDiffDto - - -class SingleValueResponseRunMetricsSummaryDto(BaseModel): +class SingleValueResponseRunnerRegionStatusesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunMetricsSummaryDto + data: RunnerRegionStatusesDto class SingleValueResponseRuntimeProfileDto(BaseModel): @@ -6936,9 +7730,9 @@ class SingleValueResponseRuntimeProfileDto(BaseModel): data: RuntimeProfileDto -class SingleValueResponseSecretDto(BaseModel): +class SingleValueResponseRunTraceSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: SecretDto + data: RunTraceSummaryDto class SingleValueResponseServiceDayDetailDto(BaseModel): @@ -7134,6 +7928,39 @@ class StatusEventDto(BaseModel): ] = None +class StatusPageBindingSnapshot(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + name: Annotated[str, Field(description="Component display name", min_length=1)] + description: Annotated[ + str | None, Field(description="Optional component description") + ] = None + group_id: Annotated[ + UUID | None, + Field(alias="groupId", description="Group that contains this component"), + ] = None + show_uptime: Annotated[ + bool, Field(alias="showUptime", description="Whether to show measured uptime") + ] + display_order: Annotated[ + int, + Field(alias="displayOrder", description="Position within the page or group"), + ] + exclude_from_overall: Annotated[ + bool, + Field( + alias="excludeFromOverall", + description="Whether to exclude this component from overall status", + ), + ] + start_date: Annotated[ + date_aliased | None, + Field( + alias="startDate", + description="Optional start date for published uptime history", + ), + ] = None + + class StatusPageBoundComponentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) component_id: Annotated[ @@ -7585,6 +8412,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 @@ -7777,27 +8608,27 @@ class TableValueResultMemberDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationDispatchDto(BaseModel): +class TableValueResultMonitorSessionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationDispatchDto] + data: list[MonitorSessionDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationDto(BaseModel): +class TableValueResultNotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationDto] + data: list[NotificationDispatchDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRevisionDto(BaseModel): +class TableValueResultNotificationDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RevisionDto] + data: list[NotificationDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -7831,15 +8662,6 @@ class TableValueResultScheduledMaintenanceDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultSecretDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[SecretDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - class TableValueResultServiceComponentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[ServiceComponentDto] @@ -8259,6 +9081,40 @@ class TraceNearbyAction(BaseModel): ] +class To(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + +class TransferMonitorRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + to: Annotated[ + To, Field(description="New owning tool: DASHBOARD, CLI, TERRAFORM, MCP, or API") + ] + reason: Annotated[ + str, + Field( + description="Why ownership is moving (recorded in the audit log)", + max_length=280, + min_length=0, + ), + ] + project: Annotated[ + str | None, + Field( + description="Project the new owner declares for this monitor; null clears it", + max_length=255, + min_length=0, + ), + ] = None + owner_declaration: Annotated[ + OwnerDeclaration | None, Field(alias="ownerDeclaration") + ] = None + + class Type4(StrEnum): consecutive_failures = "consecutive_failures" failures_in_window = "failures_in_window" @@ -8324,6 +9180,52 @@ class TriggerRule(BaseModel): ] = None +class TriggerRunRef(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Run identifier")] + region: Annotated[str, Field(description="Probe region for this run", min_length=1)] + phase: Annotated[str, Field(description="Current run phase")] + url: Annotated[str, Field(description="API path for this run", min_length=1)] + + +class TriggerRunRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + regions: Annotated[ + list[str] | None, + Field( + description="Regions to run; empty or omitted runs every configured region" + ), + ] = None + signal: Annotated[ + bool | None, + Field( + description="Count these runs toward health and incidents (default: false)" + ), + ] = None + session: RunSessionContext | None = None + + +class TriggerRunsResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + trigger_id: Annotated[ + UUID, + Field( + alias="triggerId", + description="Groups every run started by this trigger; scheduled runs group by evaluation cycle instead", + ), + ] + billed_runs: Annotated[ + int, + Field( + alias="billedRuns", + description="Runs billed for this trigger, one per region", + ), + ] + runs: Annotated[ + list[TriggerRunRef], Field(description="Queued runs, one per region") + ] + + class UpdateAlertSensitivityRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) alert_sensitivity: Annotated[ @@ -8692,6 +9594,17 @@ class UpdateMonitorAuthRequest(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig +class SecretKey1(RootModel[str]): + root: Annotated[ + str, + Field( + description="Replace attached secret keys; null preserves current", + max_length=255, + min_length=0, + ), + ] + + class UpdateOpsGenieChannelConfig(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( @@ -9617,6 +10530,28 @@ class UserDto(BaseModel): ] +class Value(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + value: Annotated[ + str, Field(description="Exact filter value; steps use caseIndex:step") + ] + count: Annotated[int, Field(description="Matching run attempts for this value")] + failed_count: Annotated[ + int | None, + Field( + alias="failedCount", + description="Failed attempt count; populated for region facets", + ), + ] = None + outcome_counts: Annotated[ + list[RunOutcomeCountDto] | None, + Field( + alias="outcomeCounts", + description="Per-outcome attempt counts; populated for region facets", + ), + ] = None + + class VoiceLanguageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) code: Annotated[ @@ -10020,6 +10955,16 @@ class AcknowledgeAllIncidentsResponse(BaseModel): ] +class ActorDisplayDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + identity: Annotated[str, Field(description="Stable actor identity")] + user: UserDto | None = None + key_name: Annotated[ + str | None, + Field(alias="keyName", description="API key display name; never the key value"), + ] = None + + class AddMonitorTagsRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) tag_ids: Annotated[ @@ -10059,9 +11004,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 +11061,16 @@ class BulkMonitorActionRequest(BaseModel): description="New tags to create and attach (only for ADD_TAG)", ), ] = None + frequency_seconds: Annotated[ + int | None, + Field( + alias="frequencySeconds", + description="New check frequency in seconds (10–86400), required for UPDATE_SCHEDULE", + ge=10, + le=86400, + ), + ] = None + overlay: MonitorOverlayRequest | None = None class BulkMonitorActionResult(BaseModel): @@ -10121,6 +11086,13 @@ class BulkMonitorActionResult(BaseModel): ] +class BundleCheckResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + findings: Annotated[ + list[Finding], Field(description="Problems found in the supplied source files") + ] + + class CaptureCompareDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) this_artifact_id: Annotated[ @@ -10191,6 +11163,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 +11321,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 +11372,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 +11435,19 @@ class CreateMonitorRequest(BaseModel): description="Existing definition to reuse for a sibling monitor", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None + owner_declaration: Annotated[ + OwnerDeclaration | None, Field(alias="ownerDeclaration") + ] = None + secret_keys: Annotated[ + list[SecretKey] | None, + Field( + alias="secretKeys", + description="Secret keys to attach; null starts with the scanned set", + max_length=256, + min_length=0, + ), + ] = None class CreateResourceGroupRequest(BaseModel): @@ -10659,6 +11681,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,34 +11799,14 @@ class DashboardOverviewDto(BaseModel): incidents: IncidentsSummaryDto -class DefinitionHeadDto(BaseModel): +class EmailMessageDto(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")] - domain_id: Annotated[UUID, Field(alias="domainId", description="Parent domain id")] - inbox: Annotated[ - str | None, Field(description="Local-part the message was addressed to") - ] = None - received_at: Annotated[ + id: Annotated[UUID, Field(description="Message id")] + domain_id: Annotated[UUID, Field(alias="domainId", description="Parent domain id")] + inbox: Annotated[ + str | None, Field(description="Local-part the message was addressed to") + ] = None + received_at: Annotated[ AwareDatetime, Field(alias="receivedAt", description="When the message was received"), ] @@ -11157,6 +12179,13 @@ class IncidentDto(BaseModel): description="Scheduler-minted check execution ID whose result confirmed this incident; joins to check_results, rule_evaluations, and incident_state_transitions. Omitted from JSON (undefined to SDKs) when null, treat missing as null.", ), ] = None + triggering_run_id: Annotated[ + UUID | None, + Field( + alias="triggeringRunId", + description="Code-monitor run whose failing tick confirmed this incident; null for uptime", + ), + ] = None triggered_by_rule_snapshot_hash_hex: Annotated[ str | None, Field( @@ -11422,202 +12451,127 @@ class MonitorAssertionDto(BaseModel): severity: str -class MonitorDriftDto(BaseModel): +class MonitorBatchHistoryItemDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - fields: Annotated[ - list[MonitorDriftFieldDto], + id: Annotated[UUID, Field(description="Monitor identifier")] + availability: Annotated[ + float | None, Field( - description="Fields whose live overlay differs from the declared baseline" + description="Share of checks that passed, 0–100; null when no checks ran" ), - ] - - -class MonitorDto(BaseModel): - """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" - - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique monitor identifier")] - organization_id: Annotated[ - int, + ] = None + p95: Annotated[ + float | None, Field( - alias="organizationId", description="Organization this monitor belongs to" + description="95th percentile response time in milliseconds; null when none recorded" ), + ] = None + ticks: Annotated[ + list[MonitorHistoryTickDto], + Field(description="Outcome per time bucket, oldest first"), ] - name: Annotated[ - str, Field(description="Human-readable name for this monitor", min_length=1) - ] - type: str - config: ( - DnsMonitorConfig - | HeartbeatMonitorConfig - | HttpMonitorConfig - | IcmpMonitorConfig - | McpServerMonitorConfig - | ScriptMonitorConfig - | TcpMonitorConfig - ) - frequency_seconds: Annotated[ - int, + display_ticks: Annotated[ + list[MonitorDisplayTickDto] | None, Field( - alias="frequencySeconds", - description="Check frequency in seconds (30–86400)", + alias="displayTicks", + description="48 display buckets; present only when density=48", ), + ] = None + + +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) ] - enabled: Annotated[bool, Field(description="Whether the monitor is active")] - regions: Annotated[ - list[str], Field(description="Probe regions where checks are executed") - ] - managed_by: Annotated[ + live: Annotated[ str, Field( - alias="managedBy", - description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", + description="Live value: seconds for frequency, comma-separated ids for regions", + min_length=1, ), ] - created_at: Annotated[ - AwareDatetime, - Field(alias="createdAt", description="Timestamp when the monitor was created"), - ] - updated_at: Annotated[ - AwareDatetime, + git: Annotated[ + str, Field( - alias="updatedAt", description="Timestamp when the monitor was last updated" + description="Value last applied from Git, in the same format as live", + min_length=1, ), ] - assertions: Annotated[ - list[MonitorAssertionDto] | None, - Field( - description="Assertions evaluated against each check result; null on list responses" - ), - ] = None - tags: Annotated[ - list[TagDto] | None, Field(description="Tags applied to this monitor") - ] = None - ping_url: Annotated[ - str | None, - Field( - alias="pingUrl", - description="Heartbeat ping URL; populated for HEARTBEAT monitors only", - ), - ] = None - environment: Summary | None = None - auth: MonitorAuthConfig | None = None - incident_policy: Annotated[ - IncidentPolicyDto | None, Field(alias="incidentPolicy") - ] = None - alert_channel_ids: Annotated[ - list[UUID] | None, - Field( - alias="alertChannelIds", - description="Alert channel IDs linked to this monitor; populated on single-monitor responses", - ), - ] = None - bound_status_page_components: Annotated[ - list[StatusPageBoundComponentDto] | None, - Field( - alias="boundStatusPageComponents", - description="Status-page components that represent this monitor; omitted when none", - ), - ] = None - current_status: Annotated[ - str | None, - Field( - alias="currentStatus", - description="Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", - ), - ] = None - display_health: Annotated[ - str | None, - Field( - alias="displayHealth", - description="List and header chip health; not currentStatus and not evaluation state", - ), - ] = None - binding_readiness: Annotated[ - str | None, - Field( - alias="bindingReadiness", - description="Secret binding state: ready, blocked, or not_applicable", - ), - ] = None - needs_attention: Annotated[ - bool | None, - Field( - alias="needsAttention", - description="True when the monitor needs operator attention", - ), - ] = None - open_incident: Annotated[ - UUID | None, - Field(alias="openIncident", description="Open confirmed incident id"), - ] = None - last_run_at: Annotated[ + changed_at: Annotated[ AwareDatetime | None, - Field(alias="lastRunAt", description="When the latest code run was enqueued"), - ] = None - last_run_id: Annotated[ - UUID | None, Field(alias="lastRunId", description="Latest code run id") + Field(alias="changedAt", description="When this setting was last changed"), ] = None - definition_id: Annotated[ - UUID | None, - Field( - alias="definitionId", - description="Definition id for a browser or multi-step monitor. Null on probe monitors", - ), + changed_by: Annotated[UserDto | None, Field(alias="changedBy")] = None + reason: Annotated[ + str | None, Field(description="Recorded reason; null when no reason was stored") ] = None - capture_policy: Annotated[CapturePolicy | None, Field(alias="capturePolicy")] = None - fast_retry_max_attempts: Annotated[ - int | 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 MonitorFleetSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + window: Annotated[str, Field(description="Window: 24h, 7d, or 30d")] + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the history window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the history window") + ] + uptime_percent: Annotated[ + float | None, Field( - alias="fastRetryMaxAttempts", - description="Fast-retry max attempts; null/0 = off", + alias="uptimePercent", + description="Passed target checks divided by measured target checks, 0–100", ), ] = None - run_parallel: Annotated[ - bool | None, + last_failure_bucket_at: Annotated[ + AwareDatetime | None, Field( - alias="runParallel", - description="When multiple locations are set, run all of them each interval. False rotates one location per interval", + alias="lastFailureBucketAt", + description="Start of the most recent failing display bucket", ), ] = None - muted: Annotated[bool, Field(description="Whether alert delivery is muted")] - muted_until: Annotated[ - AwareDatetime | None, + open_incident_count: Annotated[ + int, Field( - alias="mutedUntil", - description="Mute expiry; null means indefinite while muted", + alias="openIncidentCount", description="Open confirmed monitor incidents" ), - ] = None - mute_reason: Annotated[ - str | None, Field(alias="muteReason", description="Optional mute reason") - ] = None - paused_at: Annotated[ - AwareDatetime | None, - Field(alias="pausedAt", description="When the monitor was paused"), - ] = None - pause_reason: Annotated[ - str | None, Field(alias="pauseReason", description="Optional pause reason") - ] = None - pause_expires_at: Annotated[ - AwareDatetime | None, Field(alias="pauseExpiresAt", description="Pause expiry") - ] = None - quarantine_owner_id: Annotated[ - str | None, - Field(alias="quarantineOwnerId", description="Quarantine person owner id"), - ] = None - quarantine_until: Annotated[ - AwareDatetime | None, + ] + groups: Annotated[ + list[MonitorListGroupDto], + Field(description="Current monitor group counts, independent of list filters"), + ] + ticks: Annotated[ + list[MonitorDisplayTickDto], Field( - alias="quarantineUntil", - description="Quarantine expiry; non-null means quarantined", + description="48 display buckets showing the worst observed monitor outcome" ), - ] = None - quarantine_reason: Annotated[ - str | None, Field(alias="quarantineReason", description="Quarantine reason") - ] = None - upload: PackageUploadDto | None = None - usage_projection: Annotated[ - MonitorUsageProjectionDto | None, Field(alias="usageProjection") + ] + + +class MonitorListFacetsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + groups: Annotated[ + list[MonitorListGroupDto], Field(description="Count per list group") + ] + facets: Annotated[ + list[MonitorFacetDto], Field(description="Values and counts per facet field") + ] + sources: Annotated[ + list[MonitorSourceSummaryDto] | None, + Field(description="Matching monitors per owning tool and project"), ] = None @@ -11636,74 +12590,71 @@ class MonitorRunDurationBatchDto(BaseModel): ] -class MonitorSecretRequestsDto(BaseModel): +class MonitorRunSeriesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - environment: EnvironmentDto - requests: Annotated[ - list[SecretRequestDto], - Field(description="Secret keys this monitor requires and their resolve state"), + window: Annotated[str, Field(description="Requested chart window")] + from_: Annotated[ + AwareDatetime, Field(alias="from", description="Inclusive start of the chart") ] - - -class MonitorTestRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - type: Annotated[Type3, Field(description="Monitor protocol type to test")] - config: ( - DnsMonitorConfig - | HeartbeatMonitorConfig - | HttpMonitorConfig - | IcmpMonitorConfig - | McpServerMonitorConfig - | ScriptMonitorConfig - | TcpMonitorConfig - ) - assertions: Annotated[ - list[CreateAssertionRequest] | None, - Field(description="Optional assertions to evaluate against the test result"), - ] = None - environment_id: Annotated[ - UUID | None, + to: Annotated[AwareDatetime, Field(description="Exclusive end of the chart")] + uptime_percent: Annotated[ + float | None, Field( - alias="environmentId", - description="Environment to test against; null uses the monitor environment", + alias="uptimePercent", + description="Passed final target outcomes as a percent of passed and failed", ), ] = None - - -class MonitorVersionDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique version record identifier")] - monitor_id: Annotated[ - UUID, Field(alias="monitorId", description="Monitor this version belongs to") - ] - version: Annotated[ - int, Field(description="Monotonically increasing version number") - ] - snapshot: MonitorDto - changed_by_id: Annotated[ - int | None, + previous_uptime_percent: Annotated[ + float | None, Field( - alias="changedById", - description="User ID who made the change; null for automated changes", + alias="previousUptimePercent", + description="Target uptime in the previous equal-length period", ), ] = None - changed_via: Annotated[ - str, - Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), + buckets: Annotated[ + list[Bucket], Field(description="Buckets across every selected region") ] - change_summary: Annotated[ - str | None, + regions: Annotated[ + list[Region], Field(description="Buckets for each selected region") + ] + points: Annotated[ + list[Point] | None, + Field(description="Latest execution points for 24h; null for longer windows"), + ] = None + points_truncated: Annotated[ + bool, Field( - alias="changeSummary", - description="Human-readable description of what changed", + alias="pointsTruncated", + description="More 24h points exist than the returned 2000-point limit", ), + ] + + +class MonitorTestRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + type: Annotated[Type3, Field(description="Monitor protocol type to test")] + config: ( + DnsMonitorConfig + | HeartbeatMonitorConfig + | HttpMonitorConfig + | IcmpMonitorConfig + | McpServerMonitorConfig + | ScriptMonitorConfig + | TcpMonitorConfig + ) + assertions: Annotated[ + list[CreateAssertionRequest] | None, + Field(description="Optional assertions to evaluate against the test result"), ] = None - created_at: Annotated[ - AwareDatetime, + environment_id: Annotated[ + UUID | None, Field( - alias="createdAt", description="Timestamp when this version was recorded" + alias="environmentId", + description="Environment to test against; null uses the monitor environment", ), - ] + ] = None + code: MonitorCodeSpec | None = None + session: RunSessionContext | None = None class NetworkRowDto(BaseModel): @@ -11865,6 +12816,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 +12979,86 @@ class ResourceGroupMemberDto(BaseModel): ] = None -class RevisionDiffDto(BaseModel): +class RevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - left: RevisionDto - right: RevisionDto - hunks: Annotated[ - list[RevisionDiffHunkDto], - Field(description="File and field-level hunks (bounded)"), + id: Annotated[UUID, Field(description="Revision identifier")] + definition_id: Annotated[ + UUID, Field(alias="definitionId", description="Parent definition") ] - - -class RollbackPreviewDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - target: RevisionDto - current: DefinitionHeadDto | None = None - affected_monitors: Annotated[ - list[MonitorDto], + number: Annotated[ + int, Field(description="Monotonic revision number within the definition") + ] + digest: Annotated[ + str, Field( - alias="affectedMonitors", - description="Monitors sharing this definition and environment", + description="Closure digest from POST /bundles (sha256:)", min_length=1 + ), + ] + entrypoint: Annotated[ + str, Field(description="Entrypoint file that runs", min_length=1) + ] + files: Annotated[list[str], Field(description="Paths present in the zip")] + keys: Annotated[list[str], Field(description="Secret key names the code demands")] + download_until: Annotated[ + AwareDatetime | None, + Field( + alias="downloadUntil", description="When package bytes expire for download" ), + ] = None + purged_at: Annotated[ + AwareDatetime | None, + Field(alias="purgedAt", description="When package bytes were purged"), + ] = None + git_sha: Annotated[ + str | None, + Field(alias="gitSha", description="Git commit SHA when sourced from Git"), + ] = None + git_message: Annotated[ + str | None, Field(alias="gitMessage", description="Git commit message") + ] = None + git_file: Annotated[ + str | None, Field(alias="gitFile", description="Declaring Git file path") + ] = None + authored_by: Annotated[ + str | None, Field(alias="authoredBy", description="Who authored this package") + ] = None + source: CodeSource | None = None + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="When the revision was minted"), ] + state: Annotated[ + str | None, + Field( + description="draft, tested_passed, tested_failed, live, previous, or discarded" + ), + ] = None + test_run_id: Annotated[ + UUID | None, + Field(alias="testRunId", description="Latest validation run for this revision"), + ] = None + test_outcome: Annotated[ + str | None, + Field( + alias="testOutcome", + description="Latest test outcome; absent until a test finishes", + ), + ] = None + live_stats: Annotated[RevisionLiveStatsDto | None, Field(alias="liveStats")] = None + expires_at: Annotated[ + AwareDatetime | None, + Field( + alias="expiresAt", + description="When this draft expires; preserved after discard", + ), + ] = None + created_by_kind: Annotated[ + str | None, + Field(alias="createdByKind", description="Tool that created this draft"), + ] = None + base_revision: Annotated[ + RevisionReferenceDto | None, Field(alias="baseRevision") + ] = None class RunArtifactDto(BaseModel): @@ -12168,104 +13197,301 @@ class RunExecutionDto(BaseModel): ] -class RunNetworkDto(BaseModel): +class RunFacetDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: Annotated[ - list[NetworkRowDto], Field(description="Waterfall rows on this page") - ] - case_duration_ms: Annotated[ - int | None, - Field( - alias="caseDurationMs", description="Case wall time for waterfall bar scale" - ), - ] = None - next_cursor: Annotated[ - str | None, - Field(alias="nextCursor", description="Opaque cursor for the next page"), - ] = None - has_more: Annotated[ - bool, - Field(alias="hasMore", description="Whether more rows exist beyond this page"), + field: Annotated[str, Field(description="Filter field these values describe")] + values: Annotated[ + list[Value], Field(description="Values selected by the other filters") ] -class SecretAuditDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - updated_at: Annotated[ - AwareDatetime | None, - Field(alias="updatedAt", description="When this secret was last updated"), - ] = None - updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = None - - -class SecretUsageDto(BaseModel): +class RunHistogramBucketDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - monitors: Annotated[ - list[MonitorDto], Field(description="Monitors that reference this secret") + start: Annotated[ + AwareDatetime, Field(description="Inclusive UTC start of this bucket") + ] + counts: Annotated[ + list[RunOutcomeCountDto], Field(description="Health-voting run attempt counts") ] -class ServiceIncidentDetailDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - title: str - status: str - impact: str | None = None - started_at: Annotated[AwareDatetime | None, Field(alias="startedAt")] = None - resolved_at: Annotated[AwareDatetime | None, Field(alias="resolvedAt")] = None - detected_at: Annotated[AwareDatetime | None, Field(alias="detectedAt")] = None - shortlink: str | None = None - affected_components: Annotated[ - list[str] | None, Field(alias="affectedComponents") - ] = None - affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None - updates: list[ServiceIncidentUpdateDto] - - -class ServiceSubscriptionDto(BaseModel): +class RunMetricsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - subscription_id: Annotated[ - UUID, - Field(alias="subscriptionId", description="Unique subscription identifier"), + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the enqueue-time window"), ] - service_id: Annotated[ - UUID, Field(alias="serviceId", description="Service identifier") + to: Annotated[ + AwareDatetime, Field(description="Inclusive end of the enqueue-time window") ] - slug: Annotated[str, Field(min_length=1)] - name: Annotated[str, Field(min_length=1)] - category: str | None = None - official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None - adapter_type: Annotated[str, Field(alias="adapterType", min_length=1)] - polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] - enabled: bool - logo_url: Annotated[ - str | None, - Field(alias="logoUrl", description="Logo URL from the service catalog"), - ] = None - overall_status: Annotated[ - str | None, + matching_run_count: Annotated[ + int, Field( - alias="overallStatus", - description="Current overall status; null when the service has never been polled", + alias="matchingRunCount", + description="Runs matching the complete list filter", ), - ] = None - component_id: Annotated[ - UUID | None, + ] + duration_sample_count: Annotated[ + int, Field( - alias="componentId", - description="Subscribed component id; null for whole-service subscription", + 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 - component: ServiceComponentDto | None = None - alert_sensitivity: Annotated[ - str, + evidence_eligible_run_count: Annotated[ + int, Field( - alias="alertSensitivity", - description="Alert sensitivity: ALL (synthetic + real incidents, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (real + DOWN severity, paged), AWARENESS (real vendor incidents tracked silently — visible on dashboard, never paged; default for new subscriptions)", - min_length=1, + alias="evidenceEligibleRunCount", + description="Runs with a known capture policy", ), ] - subscribed_at: Annotated[ + evidence_unknown_policy_run_count: Annotated[ + int, + Field( + alias="evidenceUnknownPolicyRunCount", + description="Runs with a missing or incomplete capture policy", + ), + ] + evidence_incomplete_run_count: Annotated[ + int | None, + Field( + alias="evidenceIncompleteRunCount", + description="Eligible runs with required evidence missing, processing, failed, or expired", + ), + ] = None + evidence_processing_run_count: Annotated[ + int | None, + Field( + alias="evidenceProcessingRunCount", + description="Eligible runs with required evidence still processing", + ), + ] = None + evidence_no_evidence_policy_run_count: Annotated[ + int | None, + Field( + alias="evidenceNoEvidencePolicyRunCount", + description="Eligible runs with no evidence required by their recorded policy", + ), + ] = None + evidence_complete_run_count: Annotated[ + int | None, + Field( + alias="evidenceCompleteRunCount", + description="Eligible runs with all required evidence available", + ), + ] = None + available_artifact_count: Annotated[ + int | None, + Field( + alias="availableArtifactCount", + description="Required artifact records with an available unexpired object key", + ), + ] = None + processing_artifact_count: Annotated[ + int | None, + Field( + alias="processingArtifactCount", + description="Required artifact records still processing", + ), + ] = None + failed_artifact_count: Annotated[ + int | None, + Field( + alias="failedArtifactCount", + description="Required artifact records with a failed upload", + ), + ] = None + expired_artifact_count: Annotated[ + int | None, + Field( + alias="expiredArtifactCount", + description="Required artifact records marked expired or past their expiry", + ), + ] = None + missing_artifact_kind_count: Annotated[ + int | None, + Field( + alias="missingArtifactKindCount", + description="Required evidence kinds with no artifact record after the run finished", + ), + ] = None + intentional_no_evidence_artifact_count: Annotated[ + int | None, + Field( + alias="intentionalNoEvidenceArtifactCount", + description="Required artifact records explicitly suppressed, not reached, or not captured", + ), + ] = None + outcome_counts: Annotated[ + list[RunOutcomeCountDto] | None, + Field( + alias="outcomeCounts", + description="Health-voting run attempts by projected outcome", + ), + ] = None + excluded_run_count: Annotated[ + int | None, + Field( + alias="excludedRunCount", + description="Matching attempts that do not vote on health", + ), + ] = None + cycle_count: Annotated[ + int | None, + Field( + alias="cycleCount", + description="Distinct scheduled cycle identities in the filtered population", + ), + ] = None + failed_cycle_count: Annotated[ + int | None, + Field( + alias="failedCycleCount", + description="Recorded complete cycles with a final failed or timed-out region; display count", + ), + ] = None + display_group_count: Annotated[ + int | None, + Field( + alias="displayGroupCount", + description="Cycle and manual-trigger groups in the filtered population", + ), + ] = None + health_voting_p95_duration_ms: Annotated[ + float | None, + Field( + alias="healthVotingP95DurationMs", + description="95th-percentile duration of health-voting run attempts", + ), + ] = None + session_last_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="sessionLastRunAt", + description="Latest session enqueue within retention, independent of the window", + ), + ] = None + buckets: Annotated[ + list[RunHistogramBucketDto] | None, + Field(description="UTC time buckets of health-voting run attempts"), + ] = None + facets: Annotated[ + list[RunFacetDto] | None, + Field(description="Run facets respecting the other active filters"), + ] = None + + +class RunNetworkDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[ + list[NetworkRowDto], Field(description="Waterfall rows on this page") + ] + case_duration_ms: Annotated[ + int | None, + Field( + alias="caseDurationMs", description="Case wall time for waterfall bar scale" + ), + ] = None + next_cursor: Annotated[ + str | None, + Field(alias="nextCursor", description="Opaque cursor for the next page"), + ] = None + has_more: Annotated[ + bool, + Field(alias="hasMore", description="Whether more rows exist beyond this page"), + ] + + +class SecretAuditDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + updated_at: Annotated[ + AwareDatetime | None, + Field(alias="updatedAt", description="When this secret was last updated"), + ] = None + updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = None + + +class SecretValueStampDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + environment: Summary + updated_at: Annotated[ + AwareDatetime | None, + Field( + alias="updatedAt", + description="When this environment value was last written", + ), + ] = None + updated_by: Annotated[ActorDisplayDto | None, Field(alias="updatedBy")] = None + + +class ServiceIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: UUID + title: str + status: str + impact: str | None = None + started_at: Annotated[AwareDatetime | None, Field(alias="startedAt")] = None + resolved_at: Annotated[AwareDatetime | None, Field(alias="resolvedAt")] = None + detected_at: Annotated[AwareDatetime | None, Field(alias="detectedAt")] = None + shortlink: str | None = None + affected_components: Annotated[ + list[str] | None, Field(alias="affectedComponents") + ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None + updates: list[ServiceIncidentUpdateDto] + + +class ServiceSubscriptionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + subscription_id: Annotated[ + UUID, + Field(alias="subscriptionId", description="Unique subscription identifier"), + ] + service_id: Annotated[ + UUID, Field(alias="serviceId", description="Service identifier") + ] + slug: Annotated[str, Field(min_length=1)] + name: Annotated[str, Field(min_length=1)] + category: str | None = None + official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None + adapter_type: Annotated[str, Field(alias="adapterType", min_length=1)] + polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] + enabled: bool + logo_url: Annotated[ + str | None, + Field(alias="logoUrl", description="Logo URL from the service catalog"), + ] = None + overall_status: Annotated[ + str | None, + Field( + alias="overallStatus", + description="Current overall status; null when the service has never been polled", + ), + ] = None + component_id: Annotated[ + UUID | None, + Field( + alias="componentId", + description="Subscribed component id; null for whole-service subscription", + ), + ] = None + component: ServiceComponentDto | None = None + alert_sensitivity: Annotated[ + str, + Field( + alias="alertSensitivity", + description="Alert sensitivity: ALL (synthetic + real incidents, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (real + DOWN severity, paged), AWARENESS (real vendor incidents tracked silently — visible on dashboard, never paged; default for new subscriptions)", + min_length=1, + ), + ] + subscribed_at: Annotated[ AwareDatetime, Field( alias="subscribedAt", @@ -12323,6 +13549,11 @@ class SingleValueResponseBulkMonitorActionResult(BaseModel): data: BulkMonitorActionResult +class SingleValueResponseBundleCheckResultDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BundleCheckResultDto + + class SingleValueResponseCaptureCompareDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: CaptureCompareDto @@ -12333,11 +13564,6 @@ class SingleValueResponseDashboardOverviewDto(BaseModel): data: DashboardOverviewDto -class SingleValueResponseDefinitionHeadDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionHeadDto - - class SingleValueResponseEmailMessageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: EmailMessageDto @@ -12368,14 +13594,14 @@ class SingleValueResponseMonitorAssertionDto(BaseModel): data: MonitorAssertionDto -class SingleValueResponseMonitorDriftDto(BaseModel): +class SingleValueResponseMonitorFleetSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorDriftDto + data: MonitorFleetSummaryDto -class SingleValueResponseMonitorDto(BaseModel): +class SingleValueResponseMonitorListFacetsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorDto + data: MonitorListFacetsDto class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): @@ -12383,14 +13609,9 @@ class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): data: MonitorRunDurationBatchDto -class SingleValueResponseMonitorSecretRequestsDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorSecretRequestsDto - - -class SingleValueResponseMonitorVersionDto(BaseModel): +class SingleValueResponseMonitorRunSeriesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorVersionDto + data: MonitorRunSeriesDto class SingleValueResponseNetworkRowDto(BaseModel): @@ -12403,19 +13624,24 @@ class SingleValueResponseNotificationPolicyDto(BaseModel): data: NotificationPolicyDto +class SingleValueResponseRegionResultSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RegionResultSeriesDto + + class SingleValueResponseResourceGroupMemberDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ResourceGroupMemberDto -class SingleValueResponseRevisionDiffDto(BaseModel): +class SingleValueResponseRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RevisionDiffDto + data: RevisionDto -class SingleValueResponseRollbackPreviewDto(BaseModel): +class SingleValueResponseRunMetricsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RollbackPreviewDto + data: RunMetricsSummaryDto class SingleValueResponseSecretAuditDto(BaseModel): @@ -12423,11 +13649,6 @@ class SingleValueResponseSecretAuditDto(BaseModel): data: SecretAuditDto -class SingleValueResponseSecretUsageDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: SecretUsageDto - - class SingleValueResponseServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceIncidentDetailDto @@ -12493,6 +13714,11 @@ class SingleValueResponseTestMatchResult(BaseModel): data: TestMatchResult +class SingleValueResponseTriggerRunsResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: TriggerRunsResponse + + class SingleValueResponseUptimeDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: UptimeDto @@ -12696,27 +13922,18 @@ class TableValueResultIntegrationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultMonitorDto(BaseModel): +class TableValueResultNotificationPolicyDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorDto] + data: list[NotificationPolicyDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultMonitorVersionDto(BaseModel): +class TableValueResultRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorVersionDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - -class TableValueResultNotificationPolicyDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationPolicyDto] + data: list[RevisionDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -12958,6 +14175,22 @@ class UpdateMonitorRequest(BaseModel): description="New ownership source for probe monitors. Null preserves current. Code monitors use takeover", ), ] = None + owner_enforced: Annotated[ + bool | None, + Field( + alias="ownerEnforced", + description="Only the managedBy tool may change configuration. Null preserves current", + ), + ] = None + owner_project: Annotated[ + str | None, + Field( + alias="ownerProject", + description="Project the owning tool declares; null preserves current", + max_length=255, + min_length=0, + ), + ] = None environment_id: Annotated[ UUID | None, Field( @@ -13008,10 +14241,33 @@ class UpdateMonitorRequest(BaseModel): description="Run every location each interval; false rotates one. Null preserves current", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None + acknowledge_rollback: Annotated[ + str | None, + Field( + alias="acknowledgeRollback", + description="Rolled-back digest this code publish re-applies on purpose", + ), + ] = None status: Annotated[ str | None, Field(description="Not writable; use pause or resume") ] = None + expected_updated_at: Annotated[ + AwareDatetime | None, + Field( + alias="expectedUpdatedAt", + description="Last updatedAt this edit was based on; null skips the check", + ), + ] = None + secret_keys: Annotated[ + list[SecretKey1] | None, + Field( + alias="secretKeys", + description="Replace attached secret keys; null preserves current", + max_length=256, + min_length=0, + ), + ] = None class UpdateNotificationPolicyRequest(BaseModel): @@ -13052,6 +14308,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 +14344,7 @@ class AuditEventDto(BaseModel): str | None, Field( alias="actorEmail", - description="Email of the actor; null for system actions", + description="User email, api-key:{id} for API keys, or system for automated actions", ), ] = None action: Annotated[ @@ -13105,6 +14373,10 @@ class AuditEventDto(BaseModel): AwareDatetime, Field(alias="createdAt", description="Timestamp when the action was performed"), ] + changes: Annotated[ + list[MonitorFieldChange] | None, + Field(description="Non-secret settings changed by this action"), + ] = None class BatchComponentUptimeDto(BaseModel): @@ -13150,6 +14422,12 @@ class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer | Code]) ] +class CreateDraftRevisionResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + revision: RevisionDto + evicted: RevisionDto | None = None + + class CreateNotificationPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -13225,22 +14503,86 @@ class CursorPageIncidentActivityEventDto(BaseModel): ] -class DefinitionDetailDto(BaseModel): +class DefinitionHeadDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - definition: DefinitionDto - heads: Annotated[ - list[DefinitionHeadDto], Field(description="Active Heads per environment") + definition_id: Annotated[ + UUID, Field(alias="definitionId", description="Definition this Head belongs to") + ] + environment: EnvironmentDto + revision: RevisionDto + activated_at: Annotated[ + AwareDatetime, + Field(alias="activatedAt", description="When this Head last activated"), + ] + activated_by: Annotated[ + str | None, + Field(alias="activatedBy", description="Who last activated this Head"), + ] = None + reason: Annotated[ + str | None, Field(description="Rollback reason when this Head was restored") + ] = None + rolled_back_digest: Annotated[ + str | None, + Field( + alias="rolledBackDigest", + description="Digest the last rollback replaced; cleared by the next publish", + ), + ] = None + linked_incidents: Annotated[ + list[LinkedIncidentDto] | None, + Field(alias="linkedIncidents", description="Open incidents on this monitor"), + ] = None + note: Annotated[str | None, Field(description="Note from the latest publish")] = ( + None + ) + activated_by_actor: Annotated[ + ActorDisplayDto | None, Field(alias="activatedByActor") + ] = None + + +class MonitorBatchHistoryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitors: Annotated[ + list[MonitorBatchHistoryItemDto], + Field( + description="One entry per requested monitor that exists in the workspace" + ), ] -class IncidentDetailDto(BaseModel): +class MonitorDriftDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - incident: IncidentDto - updates: list[IncidentUpdateDto] - status_page_incidents: Annotated[ - list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + fields: Annotated[ + list[MonitorDriftFieldDto], + Field( + description="Fields whose live overlay differs from the declared baseline" + ), + ] + code: MonitorDriftCodeDto | None = None + settings: Annotated[ + list[MonitorDriftSettingDto] | None, + Field( + description="Settings that differ from the last values applied from Git; null without a settings baseline" + ), ] = None - trigger: IncidentTriggerDto | None = None + + +class PickerItem(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[UUID, Field(alias="runId", description="Finished run identifier")] + revision_id: Annotated[ + UUID, Field(alias="revisionId", description="Revision that run executed") + ] + finished_at: Annotated[ + AwareDatetime, Field(alias="finishedAt", description="When that run finished") + ] + region: Annotated[str | None, Field(description="Region of this finished run")] = ( + None + ) + outcome: Annotated[ + str | None, Field(description="Outcome of this finished run") + ] = None + revision: RevisionDto | None = None class ResourceGroupDto(BaseModel): @@ -13360,6 +14702,51 @@ class ResourceGroupDto(BaseModel): ] +class RestorableBinding(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + status_page: Annotated[StatusPageDto, Field(alias="statusPage")] + component: StatusPageBindingSnapshot + + +class RevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + left: RevisionDto + right: RevisionDto + hunks: Annotated[ + list[RevisionDiffHunkDto], + Field(description="File and field-level hunks (bounded)"), + ] + + +class RunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + baseline_run_id: Annotated[ + UUID | None, + Field( + alias="baselineRunId", description="Baseline run; null when no prior pass" + ), + ] = None + baseline_kind: Annotated[ + str, Field(alias="baselineKind", description="How the baseline was chosen") + ] + reads_as: Annotated[ + str, + Field( + alias="readsAs", + description="Human-readable baseline sentence", + min_length=1, + ), + ] + rows: Annotated[list[Row], Field(description="One row per step on this run")] + picker: Annotated[ + list[PickerItem], + Field(description="Other finished runs of this monitor for the picker"), + ] + nearest_other_region: Annotated[ + NearestOtherRegion | None, Field(alias="nearestOtherRegion") + ] = None + + class RunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique run identifier")] @@ -13390,6 +14777,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 +14791,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 +14856,14 @@ class RunDto(BaseModel): AwareDatetime | None, Field(alias="artifactsExpiredAt", description="When artifact bytes expired"), ] = None + pinned_at: Annotated[ + AwareDatetime | None, + Field(alias="pinnedAt", description="When this run was pinned past retention"), + ] = None + purged_at: Annotated[ + AwareDatetime | None, + Field(alias="purgedAt", description="When stored evidence was purged"), + ] = None capture_policy_snapshot: Annotated[ dict[str, dict[str, Any]], Field( @@ -13526,76 +14926,209 @@ class RunDto(BaseModel): alias="executionAttempts", description="Persisted worker execution attempts" ), ] + url: Annotated[str | None, Field(description="Dashboard URL for this run")] = None + trigger_id: Annotated[ + UUID | None, + Field( + alias="triggerId", + description="Groups runs started by one manual trigger; null for other runs", + ), + ] = None + session: RunSessionContext | None = None + runtime_id: Annotated[ + str | None, + Field(alias="runtimeId", description="Runtime profile that executed this run"), + ] = None + cause: Annotated[ + str | None, + Field( + description="Platform cause for an execution error, inconclusive finish, or network failure" + ), + ] = None + billable: Annotated[ + bool, + Field( + description="Whether a finished run counts against the included run pool" + ), + ] + failure: RunFailureDto | None = None + artifacts_expire_at: Annotated[ + AwareDatetime | None, + Field(alias="artifactsExpireAt", description="When artifact bytes will expire"), + ] = None -class ServiceDetailDto(BaseModel): +class SecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - slug: str - name: str - category: str | None = None - official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None - developer_context: Annotated[str | None, Field(alias="developerContext")] = None - logo_url: Annotated[str | None, Field(alias="logoUrl")] = None - adapter_type: Annotated[str, Field(alias="adapterType")] - polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] - lifecycle_status: Annotated[ - str, + id: Annotated[UUID, Field(description="Unique secret identifier")] + key: Annotated[ + str, Field(description="Secret key name, unique within the workspace") + ] + dek_version: Annotated[ + int, Field( - alias="lifecycleStatus", - description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + alias="dekVersion", description="DEK version at the time of last encryption" ), ] - enabled: bool - created_at: Annotated[AwareDatetime, Field(alias="createdAt")] - updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] - current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( - None - ) - recent_incidents: Annotated[ - list[ServiceIncidentDto], Field(alias="recentIncidents") + value_hash: Annotated[ + str, + Field( + alias="valueHash", + description="SHA-256 hex digest of the current plaintext; use for change detection", + ), ] - components: list[ServiceComponentDto] - components_summary: Annotated[ - ComponentsSummaryDto | None, Field(alias="componentsSummary") - ] = None - uptime: ComponentUptimeSummaryDto | None = None - active_maintenances: Annotated[ - list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the secret was created"), ] - data_completeness: Annotated[str, Field(alias="dataCompleteness")] - sla_published: Annotated[ - bool, + updated_at: Annotated[ + AwareDatetime, Field( - alias="slaPublished", - description="Whether the service's SLA page is publicly visible", + alias="updatedAt", description="Timestamp when the secret was last updated" ), ] - seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None - sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None - related_services: Annotated[ - list[ServiceCatalogDto] | None, Field(alias="relatedServices") + used_by_monitors: Annotated[ + list[MonitorReference] | None, + Field( + alias="usedByMonitors", + description="Monitors that reference this secret in code, authentication, or sessions", + ), ] = None + values_at: Annotated[ + list[Summary] | None, + Field( + alias="valuesAt", + description="Environments in which this secret has a value", + ), + ] = None + value_stamp: Annotated[SecretValueStampDto | None, Field(alias="valueStamp")] = None -class SingleValueResponseBatchComponentUptimeDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: BatchComponentUptimeDto - - -class SingleValueResponseCheckTraceDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: CheckTraceDto - - -class SingleValueResponseDefinitionDetailDto(BaseModel): +class SecretRequestDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionDetailDto - - -class SingleValueResponseIncidentDetailDto(BaseModel): + key: Annotated[str, Field(description="Secret key this monitor requires")] + secret: SecretDto | None = None + readiness: Annotated[ + str, Field(description="Whether this key is resolved or missing") + ] + fulfilled_by: Annotated[ + str | None, + Field( + alias="fulfilledBy", + description="Fulfilled from environment variables or a secret", + ), + ] = None + declaring_file: Annotated[ + str | None, + Field( + alias="declaringFile", + description="Declaring file path inside the package zip", + ), + ] = None + declaring_location: Annotated[ + str | None, + Field( + alias="declaringLocation", + description="Call site from package scan, e.g. signIn(…) · line 6", + ), + ] = None + last_resolved_at: Annotated[ + AwareDatetime | None, + Field(alias="lastResolvedAt", description="When a run last resolved this key"), + ] = None + last_resolved_run_id: Annotated[ + UUID | None, + Field(alias="lastResolvedRunId", description="Run that last resolved this key"), + ] = None + demanded: Annotated[ + bool | None, + Field(description="Whether the selected revision statically declares this key"), + ] = None + attached: Annotated[ + bool | None, + Field(description="Whether this key is attached for vault resolution"), + ] = None + value_stamp: Annotated[SecretValueStampDto | None, Field(alias="valueStamp")] = None + + +class ServiceDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: IncidentDetailDto + id: UUID + slug: str + name: str + category: str | None = None + official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None + developer_context: Annotated[str | None, Field(alias="developerContext")] = None + logo_url: Annotated[str | None, Field(alias="logoUrl")] = None + adapter_type: Annotated[str, Field(alias="adapterType")] + polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] + lifecycle_status: Annotated[ + str, + Field( + alias="lifecycleStatus", + description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + ), + ] + enabled: bool + created_at: Annotated[AwareDatetime, Field(alias="createdAt")] + updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] + current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( + None + ) + recent_incidents: Annotated[ + list[ServiceIncidentDto], Field(alias="recentIncidents") + ] + components: list[ServiceComponentDto] + components_summary: Annotated[ + ComponentsSummaryDto | None, Field(alias="componentsSummary") + ] = None + uptime: ComponentUptimeSummaryDto | None = None + active_maintenances: Annotated[ + list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + ] + data_completeness: Annotated[str, Field(alias="dataCompleteness")] + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] + seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None + sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None + related_services: Annotated[ + list[ServiceCatalogDto] | None, Field(alias="relatedServices") + ] = None + + +class SingleValueResponseBatchComponentUptimeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BatchComponentUptimeDto + + +class SingleValueResponseCheckTraceDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: CheckTraceDto + + +class SingleValueResponseCreateDraftRevisionResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: CreateDraftRevisionResponse + + +class SingleValueResponseDefinitionHeadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DefinitionHeadDto + + +class SingleValueResponseMonitorBatchHistoryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorBatchHistoryDto + + +class SingleValueResponseMonitorDriftDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDriftDto class SingleValueResponseResourceGroupDto(BaseModel): @@ -13603,11 +15136,26 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto +class SingleValueResponseRevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RevisionDiffDto + + +class SingleValueResponseRunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunDiffDto + + class SingleValueResponseRunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: RunDto +class SingleValueResponseSecretDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SecretDto + + class SingleValueResponseServiceDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceDetailDto @@ -13646,9 +15194,9 @@ class TableValueResultResourceGroupDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRunDto(BaseModel): +class TableValueResultSecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RunDto] + data: list[SecretDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -13788,3 +15336,737 @@ class CursorPageRunDto(BaseModel): alias="hasMore", description="Whether more results exist beyond this page" ), ] + + +class DefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + definition: DefinitionDto + heads: Annotated[ + list[DefinitionHeadDto], Field(description="Active Heads per environment") + ] + + +class IncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + rule_type: Annotated[ + str | None, + Field( + alias="ruleType", + description="Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", + ), + ] = None + rule_index: Annotated[ + int | None, + Field( + alias="ruleIndex", + description="0-based index into the policy trigger_rules array; null when unknown", + ), + ] = None + count: Annotated[ + int | None, + Field( + description="Observed failing_streak or failures_in_window from forensics; null when unavailable" + ), + ] = None + threshold: Annotated[ + int | None, + Field( + description="Rule required count or threshold_ms from forensics; null when unavailable" + ), + ] = None + last_error: Annotated[ + str | None, + Field( + alias="lastError", + description="failure_reason from the triggering check result; null when unavailable", + ), + ] = None + first_failed_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="firstFailedCheckAt", + description="Earliest failing check timestamp in the confirm window when computable; null otherwise", + ), + ] = None + triggering_run: Annotated[RunDto | None, Field(alias="triggeringRun")] = None + source: Annotated[ + str, + Field( + description="Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", + min_length=1, + ), + ] + + +class MonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regional_display_health: Annotated[ + str | None, + Field( + alias="regionalDisplayHealth", + description="Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + ), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Cycle used for the regional presentation", + ), + ] = None + regions: Annotated[ + list[Region], + Field(description="Latest health-voting execution for each configured region"), + ] + last_failure: Annotated[RunDto | None, Field(alias="lastFailure")] = None + failing_cycle_count: Annotated[ + int | None, + Field( + alias="failingCycleCount", + description="Failing cycles since evaluation changed; null outside retained history", + ), + ] = None + + +class MonitorSecretRequestsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + environment: EnvironmentDto + requests: Annotated[ + list[SecretRequestDto], + Field(description="Secret keys this monitor requires and their resolve state"), + ] + undemanded: Annotated[ + list[SecretRequestDto] | None, + Field(description="Keys retained outside the selected revision scanned demand"), + ] = None + + +class MonitorTriageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + last_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastCheckAt", description="When the latest completed check finished" + ), + ] = None + latest_run: Annotated[RunDto | None, Field(alias="latestRun")] = None + latest_health_run: Annotated[RunDto | None, Field(alias="latestHealthRun")] = None + incident: IncidentDto | None = None + paused_by: Annotated[UserDto | None, Field(alias="pausedBy")] = None + flakiness: Flakiness | None = None + restore_blockers: Annotated[ + list[str], + Field( + alias="restoreBlockers", + description="Reasons this trashed monitor cannot currently be restored", + ), + ] + deleted_bindings: Annotated[ + list[RestorableBinding], + Field( + alias="deletedBindings", + description="Status-page bindings retained for restoration", + ), + ] + + +class SingleValueResponseDefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DefinitionDetailDto + + +class SingleValueResponseIncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentTriggerDto + + +class SingleValueResponseMonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorRegionalHealthDto + + +class SingleValueResponseMonitorSecretRequestsDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorSecretRequestsDto + + +class IncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + incident: IncidentDto + updates: list[IncidentUpdateDto] + status_page_incidents: Annotated[ + list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + ] = None + trigger: IncidentTriggerDto | None = None + + +class MonitorDto(BaseModel): + """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" + + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique monitor identifier")] + organization_id: Annotated[ + int, + Field( + alias="organizationId", description="Organization this monitor belongs to" + ), + ] + name: Annotated[ + str, Field(description="Human-readable name for this monitor", min_length=1) + ] + type: str + config: ( + DnsMonitorConfig + | HeartbeatMonitorConfig + | HttpMonitorConfig + | IcmpMonitorConfig + | McpServerMonitorConfig + | ScriptMonitorConfig + | TcpMonitorConfig + ) + frequency_seconds: Annotated[ + int, + Field( + alias="frequencySeconds", + description="Check frequency in seconds (30–86400)", + ), + ] + enabled: Annotated[bool, Field(description="Whether the monitor is active")] + regions: Annotated[ + list[str], Field(description="Probe regions where checks are executed") + ] + managed_by: Annotated[ + str, + Field( + alias="managedBy", + description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", + ), + ] + owner_enforced: Annotated[ + bool, + Field( + alias="ownerEnforced", + description="Whether only the managedBy tool may change this monitor's configuration", + ), + ] + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the monitor was created"), + ] + updated_at: Annotated[ + AwareDatetime, + Field( + alias="updatedAt", description="Timestamp when the monitor was last updated" + ), + ] + assertions: Annotated[ + list[MonitorAssertionDto] | None, + Field( + description="Assertions evaluated against each check result; null on list responses" + ), + ] = None + tags: Annotated[ + list[TagDto] | None, Field(description="Tags applied to this monitor") + ] = None + ping_url: Annotated[ + str | None, + Field( + alias="pingUrl", + description="Heartbeat ping URL; populated for HEARTBEAT monitors only", + ), + ] = None + environment: Summary | None = None + auth: MonitorAuthConfig | None = None + incident_policy: Annotated[ + IncidentPolicyDto | None, Field(alias="incidentPolicy") + ] = None + alert_channel_ids: Annotated[ + list[UUID] | None, + Field( + alias="alertChannelIds", + description="Alert channel IDs linked to this monitor; populated on single-monitor responses", + ), + ] = None + bound_status_page_components: Annotated[ + list[StatusPageBoundComponentDto] | None, + Field( + alias="boundStatusPageComponents", + description="Status-page components that represent this monitor; omitted when none", + ), + ] = None + current_status: Annotated[ + str | None, + Field( + alias="currentStatus", + description="Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", + ), + ] = None + display_health: Annotated[ + str | None, + Field( + alias="displayHealth", + description="List and header chip health; not currentStatus and not evaluation state", + ), + ] = None + binding_readiness: Annotated[ + str | None, + Field( + alias="bindingReadiness", + description="Secret binding state: ready, blocked, or not_applicable", + ), + ] = None + needs_attention: Annotated[ + bool | None, + Field( + alias="needsAttention", + description="True when the monitor needs operator attention", + ), + ] = None + open_incident: Annotated[ + UUID | None, + Field(alias="openIncident", description="Open confirmed incident id"), + ] = None + last_run_at: Annotated[ + AwareDatetime | None, + Field(alias="lastRunAt", description="When the latest code run was enqueued"), + ] = None + last_run_id: Annotated[ + UUID | None, Field(alias="lastRunId", description="Latest code run id") + ] = None + resumes_at: Annotated[ + AwareDatetime | None, + Field(alias="resumesAt", description="When a capped monitor resumes"), + ] = None + capped: MonitorCappedDto | None = None + missing_keys: Annotated[ + list[str] | None, + Field( + alias="missingKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + blocked_keys: Annotated[ + list[str] | None, + Field( + alias="blockedKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + owner: MonitorOwnerDto | None = None + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + ), + ] = None + flaky_since: Annotated[ + AwareDatetime | None, + Field( + alias="flakySince", + description="When the first retry-passed cycle in the last 7 days finished", + ), + ] = None + flaky_severity: Annotated[ + str | None, + Field( + alias="flakySeverity", + description="How flaky the monitor is: LOW, MEDIUM, or HIGH", + ), + ] = None + last_check_outcome: Annotated[ + str | None, + Field( + alias="lastCheckOutcome", + description="Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + ), + ] = None + last_check_region: Annotated[ + str | None, + Field(alias="lastCheckRegion", description="Region of the most recent check"), + ] = None + last_failure_summary: Annotated[ + str | None, + Field( + alias="lastFailureSummary", + description="Why the latest failing region failed", + ), + ] = None + last_state_change_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastStateChangeAt", + description="When the monitor last changed state: paused, evaluation change, or incident open or resolve", + ), + ] = None + region_health: Annotated[ + list[MonitorRegionHealthDto] | None, + Field( + alias="regionHealth", + description="Latest verdict per region the monitor runs from; null while paused", + ), + ] = None + definition_id: Annotated[ + UUID | None, + Field( + alias="definitionId", + description="Definition id for a browser or multi-step monitor. Null on probe monitors", + ), + ] = None + capture_policy: Annotated[CapturePolicy | None, Field(alias="capturePolicy")] = None + secret_keys: Annotated[ + list[str] | None, + Field( + alias="secretKeys", + description="Explicit attached secret keys; null uses scanned demand", + ), + ] = None + fast_retry_max_attempts: Annotated[ + int | None, + Field( + alias="fastRetryMaxAttempts", + description="Fast-retry max attempts; null/0 = off", + ), + ] = None + run_parallel: Annotated[ + bool | None, + Field( + alias="runParallel", + description="When multiple locations are set, run all of them each interval. False rotates one location per interval", + ), + ] = None + muted: Annotated[bool, Field(description="Whether alert delivery is muted")] + muted_until: Annotated[ + AwareDatetime | None, + Field( + alias="mutedUntil", + description="Mute expiry; null means indefinite while muted", + ), + ] = None + mute_reason: Annotated[ + str | None, Field(alias="muteReason", description="Optional mute reason") + ] = None + paused_at: Annotated[ + AwareDatetime | None, + Field(alias="pausedAt", description="When the monitor was paused"), + ] = None + pause_reason: Annotated[ + str | None, Field(alias="pauseReason", description="Optional pause reason") + ] = None + pause_expires_at: Annotated[ + AwareDatetime | None, Field(alias="pauseExpiresAt", description="Pause expiry") + ] = None + quarantine_owner_id: Annotated[ + str | None, + Field(alias="quarantineOwnerId", description="Quarantine person owner id"), + ] = None + quarantine_until: Annotated[ + AwareDatetime | None, + Field( + alias="quarantineUntil", + description="Quarantine expiry; non-null means quarantined", + ), + ] = None + quarantine_reason: Annotated[ + str | None, Field(alias="quarantineReason", description="Quarantine reason") + ] = None + usage_projection: Annotated[ + MonitorUsageProjectionDto | None, Field(alias="usageProjection") + ] = None + live_revision_id: Annotated[ + UUID | None, + Field(alias="liveRevisionId", description="Revision scheduled runs execute"), + ] = None + live_revision_digest: Annotated[ + str | None, + Field( + alias="liveRevisionDigest", + description="Closure digest of the revision scheduled runs execute", + ), + ] = None + triage: MonitorTriageDto | None = None + deleted_at: Annotated[ + AwareDatetime | None, + Field(alias="deletedAt", description="When the monitor was moved to Trash"), + ] = None + deleted_by: Annotated[UserDto | None, Field(alias="deletedBy")] = None + created_via: Annotated[ + str | None, + Field( + alias="createdVia", description="Client that originally created the monitor" + ), + ] = None + + +class MonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique version record identifier")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this version belongs to") + ] + version: Annotated[ + int, Field(description="Monotonically increasing version number") + ] + snapshot: MonitorDto + changed_by_id: Annotated[ + int | None, + Field( + alias="changedById", + description="User ID who made the change; null for automated changes", + ), + ] = None + changed_via: Annotated[ + str, + Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), + ] + change_summary: Annotated[ + str | None, + Field( + alias="changeSummary", + description="Human-readable description of what changed", + ), + ] = None + created_at: Annotated[ + AwareDatetime, + Field( + alias="createdAt", description="Timestamp when this version was recorded" + ), + ] + + +class RollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + target: RevisionDto + current: DefinitionHeadDto | None = None + affected_monitors: Annotated[ + list[MonitorDto], + Field( + alias="affectedMonitors", + description="Monitors sharing this definition and environment", + ), + ] + + +class RunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + revision: RevisionDto + activated_at: Annotated[ + AwareDatetime, + Field( + alias="activatedAt", + description="Latest recorded activation of this revision in the monitor environment", + ), + ] + + +class RunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + UUID | None, + Field( + description="Persisted skipped row identity; absent for a plan-disabled interval" + ), + ] = None + kind: Annotated[ + str, + Field( + description="not_run for recorded ticks; plan_disabled for a current plan pause" + ), + ] + monitor: MonitorDto | None = None + reason: Annotated[ + str, Field(description="Cause: quota, blocked, spend_cap, or plan_limit") + ] + region: Annotated[ + str | None, + Field(description="Region; absent when ticks cover multiple regions"), + ] = None + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Beginning of the recorded interval"), + ] + to: Annotated[ + AwareDatetime, + Field( + description="End of the interval; current plan pauses end at the query snapshot" + ), + ] + count: Annotated[ + int | None, + Field( + description="Recorded ticks in the whole folded row; absent for a plan pause" + ), + ] = None + missing_keys: Annotated[ + list[str], + Field(alias="missingKeys", description="Secret keys recorded as missing"), + ] + environment: Annotated[ + str | None, Field(description="Environment recorded when ticks were skipped") + ] = None + + +class SecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitors: Annotated[ + list[MonitorDto], Field(description="Monitors that reference this secret") + ] + + +class SingleValueResponseIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentDetailDto + + +class SingleValueResponseMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDto + + +class SingleValueResponseMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorVersionDto + + +class SingleValueResponseRollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RollbackPreviewDto + + +class SingleValueResponseSecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SecretUsageDto + + +class TableValueResultMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class TableValueResultMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorVersionDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class CursorPageRunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunRevisionMarkerDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class CursorPageRunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunSkippedEntryDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class Item(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + bucket: Annotated[ + str, Field(description="Display bucket: failing, flaky, or healthy") + ] + worst_region: Annotated[ + str | None, + Field( + alias="worstRegion", + description="Region deciding this cycle display verdict", + ), + ] = None + streak_started_at: Annotated[ + AwareDatetime | None, + Field( + alias="streakStartedAt", + description="Earliest recorded failure after the last retained passing group", + ), + ] = None + streak_truncated: Annotated[ + bool, + Field( + alias="streakTruncated", + description="True when retention prevents proving the failure streak start", + ), + ] + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Current seven-day fraction of retry-saved cycles", + ), + ] = None + + +class RunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + failing_count: Annotated[ + int, + Field( + alias="failingCount", + description="Monitors whose latest window group is complete with a failed or timed-out region", + ), + ] + flaky_count: Annotated[ + int, + Field( + alias="flakyCount", + description="Passing monitors with current seven-day flakiness", + ), + ] + healthy_count: Annotated[ + int, + Field( + alias="healthyCount", + description="Monitors whose latest window group passed without current flakiness", + ), + ] + unclassified_count: Annotated[ + int, + Field( + alias="unclassifiedCount", + description="Monitors whose latest voting group is pending or has no passing/failing verdict", + ), + ] + monitors: Annotated[ + list[Item], + Field( + description="At most 100 monitor chips; counts cover the complete population" + ), + ] + + +class SingleValueResponseRunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunMonitorStripDto