From a81882830444519e0d90e6854dcdc8c0daabc14e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Oct 2026 09:07:32 +0000 Subject: [PATCH] chore: update generated API types from latest spec --- docs/openapi/monitoring-api.json | 30794 +++++++++++++++++++++++------ src/devhelm/_generated.py | 3793 +++- 2 files changed, 27731 insertions(+), 6856 deletions(-) diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 7ba8f4e..ccc9c1d 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,7661 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/members": { + "get": { + "tags": [ + "Members" + ], + "summary": "List organization members", + "operationId": "list_21", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMemberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/members/{userId}": { + "delete": { + "tags": [ + "Members" + ], + "summary": "Remove member from organization", + "operationId": "remove_2", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/members/{userId}/role": { + "put": { + "tags": [ + "Members" + ], + "summary": "Change member role", + "operationId": "changeRole", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeRoleRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/members/{userId}/status": { + "put": { + "tags": [ + "Members" + ], + "summary": "Change member status", + "operationId": "changeStatus", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeStatusRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "List monitors for the authenticated org", + "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type` or `types`, `managedBy`, `tag` / `tags`, `search`, `environmentId`, `displayHealth`, `needsAttention`, and `region`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", + "operationId": "list_9", + "parameters": [ + { + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "types", + "in": "query", + "description": "Filter by monitor types, comma-separated; matches any listed type", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "displayHealth", + "in": "query", + "description": "Filter by projected chip health", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "needsAttention", + "in": "query", + "description": "When true, only monitors that need operator attention", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "region", + "in": "query", + "description": "Filter by probe region", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "triage", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorTriageParams" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Monitors" + ], + "summary": "Create a new monitor", + "operationId": "create_10", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "Get a single monitor by id", + "operationId": "get_6", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Monitors" + ], + "summary": "Update a monitor", + "operationId": "update_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Monitors" + ], + "summary": "Soft-delete a monitor", + "description": "Also deletes status-page components that represent this monitor. The parent status page stays.", + "operationId": "delete_7", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/drift": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "IaC-declared baseline vs live overlays", + "operationId": "drift", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDriftDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/history": { + "get": { + "tags": [ + "Monitor History" + ], + "summary": "List skipped ticks for a monitor", + "description": "Collapsed NotRun rows. These are not Runs and they are not billed.", + "operationId": "listMonitorHistory", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageMonitorHistoryEntryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/mute": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Mute alert delivery without flipping enabled", + "operationId": "mute", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/overview/steps": { + "get": { + "tags": [ + "Check Results" + ], + "summary": "Overview step catalog", + "description": "Step catalog from finished runs of the Head revision in the window, with first-try and flake aggregates. Empty when the monitor has no step catalog.", + "operationId": "getMonitorOverviewSteps", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "window", + "in": "query", + "description": "Time window for step aggregates", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to inspect; defaults to the live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "lastRuns", + "in": "query", + "description": "Latest settled runs, 1–30; ignores the window within retention", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseOverviewStepsDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/pause": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Pause a monitor", + "operationId": "pause", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorOverlayRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/publish": { + "post": { + "tags": [ + "Monitor definitions" + ], + "summary": "Publish a revision as Head for this monitor", + "description": "Untested and failed-test revisions publish. requireTested needs a passing test in this environment on the pinned runtime within 24 hours. Does not upload a new bundle.", + "operationId": "publish", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishRevisionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/quarantine": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Quarantine a monitor", + "operationId": "quarantine", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuarantineMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/release-quarantine": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Release quarantine", + "operationId": "releaseQuarantine", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/restore": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Restore a deleted monitor", + "description": "Restores the monitor, its status-page components and its schedule. Counts against the plan's monitor limit. An optional environmentId selects a code monitor's restore environment.", + "operationId": "restore", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RestoreMonitorRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/results": { + "get": { + "tags": [ + "Check Results" + ], + "summary": "List raw check results", + "description": "Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.", + "operationId": "getResults", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "from", + "in": "query", + "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1–200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Paginated check results", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "400": { + "description": "Invalid query parameters", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/results/by-region": { + "get": { + "tags": [ + "Check Results" + ], + "summary": "Get per-region uptime and latency series", + "description": "Returns clock-aligned buckets of p50/p95/p99 latency and pass counts per region. 24h uses 30-minute buckets, 7d uses 3-hour buckets, and 30d uses 12-hour buckets. previousUptimePercent covers the equal-length window before this one.", + "operationId": "getMonitorResultsByRegion", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "window", + "in": "query", + "description": "Time window: 24h (30-minute buckets), 7d (3-hour), 30d (12-hour)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d" + ] + } + }, + { + "name": "region", + "in": "query", + "description": "Limit to one of the monitor's regions (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Per-region chart series", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/RegionResultSeriesDto" + } + } + } + }, + "400": { + "description": "Invalid window or region parameter", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRegionResultSeriesDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/results/summary": { + "get": { + "tags": [ + "Check Results" + ], + "summary": "Get results summary", + "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", + "operationId": "getSummary", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "chartWindow", + "in": "query", + "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } + } + ], + "responses": { + "200": { + "description": "Results summary", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ResultSummaryDto" + } + } + } + }, + "400": { + "description": "Invalid chartWindow parameter", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/resume": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Resume a paused monitor", + "operationId": "resume", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/revisions": { + "get": { + "tags": [ + "Monitor definitions" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "state", + "in": "query", + "description": "Comma-separated draft, tested_passed, tested_failed, live, previous, discarded, or all; default live,previous", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultRevisionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Monitor definitions" + ], + "summary": "Save a draft revision", + "description": "Does not change the revision scheduled runs execute. Reuses a draft with the same digest.", + "operationId": "createDraft", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "X-DevHelm-Client", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDraftRevisionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseCreateDraftRevisionResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/revisions/{revisionId}": { + "delete": { + "tags": [ + "Monitor definitions" + ], + "summary": "Discard a draft revision", + "operationId": "discardDraft", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/revisions/{revisionId}/keep": { + "post": { + "tags": [ + "Monitor definitions" + ], + "summary": "Extend an open draft for another fourteen days", + "operationId": "keepDraft", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/revisions/{revisionId}/test": { + "post": { + "tags": [ + "Monitor definitions" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeTestTargetRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/rollback": { + "post": { + "tags": [ + "Monitor definitions" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RollbackRevisionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/rollback-preview": { + "get": { + "tags": [ + "Monitor definitions" + ], + "summary": "Preview rollback consequences for this environment", + "operationId": "rollbackPreview", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "revisionId", + "in": "query", + "description": "Revision to preview; null previews the previous live revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/rotate-token": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Rotate the ping token for a heartbeat monitor", + "description": "Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.", + "operationId": "rotateToken", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/runs": { + "get": { + "tags": [ + "Monitor Runs" + ], + "summary": "List runs for a code monitor", + "description": "Cursor page of runs from the last 90 days. Default limit 25.", + "operationId": "listMonitorRuns", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/MonitorRunListParams" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageRunDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Monitor Runs" + ], + "summary": "Run a code monitor now", + "description": "Starts one queued run in the monitor's first region. Works on paused monitors and does not affect health.", + "operationId": "runNow", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Idempotency-Key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/runs/regional-health": { + "get": { + "tags": [ + "monitor-run-diagnostics-controller" + ], + "summary": "Get regional run health without changing incident evaluation", + "operationId": "health", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRegionalHealthDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/runs/schedule": { + "get": { + "tags": [ + "monitor-run-diagnostics-controller" + ], + "summary": "Get the next actual scheduler admission time", + "operationId": "schedule", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorScheduleDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/runs/series": { + "get": { + "tags": [ + "monitor-run-diagnostics-controller" + ], + "summary": "Get execution-duration and regional target-health chart buckets", + "operationId": "series", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "window", + "in": "query", + "description": "Chart window: 24h, 7d, or 30d", + "required": false, + "schema": { + "type": "string", + "default": "24h" + } + }, + { + "name": "revisionId", + "in": "query", + "description": "Limit chart samples to one revision", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "region", + "in": "query", + "description": "Limit chart samples to one configured region", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRunSeriesDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/runs/summary": { + "get": { + "tags": [ + "Monitor Runs" + ], + "summary": "Summarize one monitor's execution durations", + "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", + "operationId": "summarizeMonitorRuns", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/secret-requests": { + "get": { + "tags": [ + "Monitor secret requests" + ], + "summary": "List secret requests for a monitor", + "operationId": "list_20", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/secret-requests/{key}": { + "put": { + "tags": [ + "Monitor secret requests" + ], + "summary": "Attach or clear a remapped secret for a key", + "operationId": "remap", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemapSecretRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/secret-requests/rescan": { + "post": { + "tags": [ + "Monitor secret requests" + ], + "summary": "Rescan secret requests from the active package", + "operationId": "rescan", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/session": { + "get": { + "tags": [ + "Monitor session" + ], + "summary": "Get the monitor session", + "operationId": "getSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } + }, + "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": [ + "Monitor session" + ], + "summary": "Create or update the monitor session", + "operationId": "putSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/session/renew": { + "post": { + "tags": [ + "Monitor session" + ], + "summary": "Renew the monitor session", + "operationId": "renewSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/session/revoke": { + "post": { + "tags": [ + "Monitor session" + ], + "summary": "Revoke the monitor session", + "operationId": "revokeSession", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/settings/preview": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "Projected run volume and meter headroom", + "operationId": "settingsPreview", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/status-pages": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "List status pages that contain this monitor as a component", + "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", + "operationId": "listStatusPagesForMonitor", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/tags": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "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": [ + "Monitors" + ], + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddMonitorTagsRequest" + } + } + }, + "required": true + }, + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Monitors" + ], + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/takeover": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Claim a field for dashboard ownership or reset an overlay", + "operationId": "takeover", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TakeoverMonitorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/test": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Test an existing monitor", + "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", + "operationId": "testExisting", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeTestTargetRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Probe result for an uptime monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API monitor", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "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": { @@ -12074,6 +21832,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12107,13 +21885,14 @@ } } }, - "/api/v1/monitors/{id}/quarantine": { + "/api/v1/monitors/{id}/test-notifications": { "post": { "tags": [ "Monitors" ], - "summary": "Quarantine a monitor", - "operationId": "quarantine", + "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", @@ -12129,7 +21908,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QuarantineMonitorRequest" + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" } } }, @@ -12141,7 +21920,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -12166,6 +21945,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +21985,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12229,13 +22038,14 @@ } } }, - "/api/v1/monitors/{id}/release-quarantine": { + "/api/v1/monitors/{id}/transfer": { "post": { "tags": [ "Monitors" ], - "summary": "Release quarantine", - "operationId": "releaseQuarantine", + "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", @@ -12247,6 +22057,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransferMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -12278,6 +22098,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12308,6 +22138,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12341,14 +22191,14 @@ } } }, - "/api/v1/monitors/{id}/results": { - "get": { + "/api/v1/monitors/{id}/triggers": { + "post": { "tags": [ - "Check Results" + "Monitor Runs" ], - "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": "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", @@ -12360,82 +22210,182 @@ } }, { - "name": "from", - "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "name": "Idempotency-Key", + "in": "header", "required": false, "schema": { - "type": "string", - "format": "date-time" + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerRunRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Accepted", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTriggerRunsResponse" + } + } } }, - { - "name": "to", - "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response for pagination", - "required": false, - "schema": { - "type": "string" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "limit", - "in": "query", - "description": "Maximum results per page (1–200)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, - { - "name": "region", - "in": "query", - "description": "Filter by region (e.g. us-east)", - "required": false, - "schema": { - "type": "string" + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/unmute": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Clear mute overlay", + "operationId": "unmute", + "parameters": [ { - "name": "passed", - "in": "query", - "description": "Filter by pass/fail status", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "boolean" + "type": "string", + "format": "uuid" } } ], "responses": { "200": { - "description": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid query parameters", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12450,22 +22400,32 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "404": { - "description": "Monitor not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -12480,6 +22440,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12513,14 +22493,14 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { + "/api/v1/monitors/{id}/uptime": { "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", + "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", @@ -12532,9 +22512,9 @@ } }, { - "name": "chartWindow", + "name": "window", "in": "query", - "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "description": "Time window for uptime calculation", "required": false, "schema": { "type": "string", @@ -12549,21 +22529,21 @@ ], "responses": { "200": { - "description": "Results summary", + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/UptimeDto" } } } }, "400": { - "description": "Invalid chartWindow parameter", + "description": "Invalid window parameter", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -12578,12 +22558,22 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Monitor does not belong to the caller's org", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -12593,7 +22583,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -12608,6 +22598,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12641,13 +22651,13 @@ } } }, - "/api/v1/monitors/{id}/resume": { + "/api/v1/monitors/{id}/usage-preview": { "post": { "tags": [ "Monitors" ], - "summary": "Resume a paused monitor", - "operationId": "resume", + "summary": "Project monthly usage for an update payload", + "operationId": "previewUsage", "parameters": [ { "name": "id", @@ -12659,13 +22669,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -12690,6 +22710,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12720,6 +22750,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12753,14 +22803,14 @@ } } }, - "/api/v1/monitors/{id}/revisions": { + "/api/v1/monitors/{id}/versions": { "get": { "tags": [ - "Monitor definitions" + "Monitors" ], - "summary": "List revisions published in this monitor's environment", - "description": "Omits drafts never published here. Page size default 25.", - "operationId": "listRevisions", + "summary": "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", @@ -12786,7 +22836,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRevisionDto" + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" } } } @@ -12811,6 +22861,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -12841,6 +22901,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -12874,14 +22954,14 @@ } } }, - "/api/v1/monitors/{id}/revisions/{revisionId}/test": { - "post": { + "/api/v1/monitors/{id}/versions/{version}": { + "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": "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", @@ -12893,31 +22973,22 @@ } }, { - "name": "revisionId", + "name": "version", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } - } - } - }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } @@ -12942,6 +23013,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23053,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13005,17 +23106,16 @@ } } }, - "/api/v1/monitors/{id}/rollback": { - "post": { + "/api/v1/monitors/{monitorId}/alert-channels": { + "put": { "tags": [ - "Monitor definitions" + "Monitor Alert Channels" ], - "summary": "Roll back Head to a prior revision", - "description": "Same Head UPDATE as publish; stores reason on the Head.", - "operationId": "rollback", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -13028,7 +23128,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RollbackRevisionRequest" + "$ref": "#/components/schemas/SetAlertChannelsRequest" } } }, @@ -13040,7 +23140,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDefinitionHeadDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } @@ -13065,58 +23165,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": { @@ -13124,50 +23174,9 @@ } } } - } - } - } - }, - "/api/v1/monitors/{id}/rollback-preview": { - "get": { - "tags": [ - "Monitor definitions" - ], - "summary": "Preview rollback consequences for this environment", - "operationId": "rollbackPreview", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "revisionId", - "in": "query", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseRollbackPreviewDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -13176,8 +23185,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -13186,8 +23195,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": { @@ -13196,8 +23205,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -13206,8 +23215,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": { @@ -13249,17 +23258,16 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { + "/api/v1/monitors/{monitorId}/assertions": { "post": { "tags": [ - "Monitors" + "Monitor Assertions" ], - "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": "Add an assertion to a monitor", + "operationId": "add", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -13268,13 +23276,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -13299,6 +23317,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23357,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13362,17 +23410,16 @@ } } }, - "/api/v1/monitors/{id}/runs": { - "get": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Monitor Runs" + "Monitor Assertions" ], - "summary": "List runs for a code monitor", - "description": "Cursor page of runs from the last 90 days. Default limit 25.", - "operationId": "listMonitorRuns", + "summary": "Update an assertion on a monitor", + "operationId": "update_10", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -13381,21 +23428,32 @@ } }, { - "name": "params", - "in": "query", + "name": "assertionId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/MonitorRunListParams" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageRunDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -13420,6 +23478,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13450,6 +23518,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13482,16 +23570,24 @@ } } }, - "post": { + "delete": { "tags": [ - "Monitor Runs" + "Monitor Assertions" ], - "summary": "Run now", - "description": "Persists a run in queued phase. 409 if no Head or any secret key is missing.", - "operationId": "runNow", + "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": { @@ -13501,18 +23597,21 @@ } ], "responses": { - "202": { - "description": "Accepted", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13521,8 +23620,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13561,6 +23660,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +23713,16 @@ } } }, - "/api/v1/monitors/{id}/runs/summary": { - "get": { + "/api/v1/monitors/{monitorId}/auth": { + "put": { "tags": [ - "Monitor Runs" + "Monitor Auth" ], - "summary": "Summarize one monitor's execution durations", - "description": "Exact median of finished run durations enqueued in the rolling 30-day window.", - "operationId": "summarizeMonitorRuns", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -13613,13 +23731,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -13644,6 +23772,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +23812,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13705,18 +23863,16 @@ } } } - } - }, - "/api/v1/monitors/{id}/secret-requests": { - "get": { + }, + "post": { "tags": [ - "Monitor secret requests" + "Monitor Auth" ], - "summary": "List secret requests for a monitor", - "operationId": "list_19", + "summary": "Set authentication config for a monitor", + "operationId": "set", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -13725,13 +23881,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -13756,6 +23922,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -13786,6 +23962,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -13817,57 +24013,40 @@ } } } - } - }, - "/api/v1/monitors/{id}/secret-requests/{key}": { - "put": { + }, + "delete": { "tags": [ - "Monitor secret requests" + "Monitor Auth" ], - "summary": "Attach or clear a remapped secret for a key", - "operationId": "remap", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, + "summary": "Remove authentication config from a monitor", + "operationId": "remove", + "parameters": [ { - "name": "key", + "name": "monitorId", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemapSecretRequest" - } - } - }, - "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/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -13876,8 +24055,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -13916,6 +24095,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +24148,19 @@ } } }, - "/api/v1/monitors/{id}/secret-requests/rescan": { - "post": { + "/api/v1/monitors/{monitorId}/policy": { + "get": { "tags": [ - "Monitor secret requests" + "Incident Policies" ], - "summary": "Rescan secret requests from the active package", - "operationId": "rescan", + "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", @@ -13969,11 +24170,11 @@ ], "responses": { "200": { - "description": "OK", + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSecretRequestsDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } @@ -13998,6 +24199,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14009,11 +24220,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" } } } @@ -14028,6 +24239,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -14059,19 +24290,19 @@ } } } - } - }, - "/api/v1/monitors/{id}/session": { - "get": { + }, + "put": { "tags": [ - "Monitor session" + "Incident Policies" ], - "summary": "Get the monitor session", - "operationId": "getSession", + "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", @@ -14079,23 +24310,33 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$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" } } } @@ -14110,6 +24351,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14121,11 +24372,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" } } } @@ -14140,6 +24391,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +24442,57 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/batch-history": { + "get": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Create or update the monitor session", - "operationId": "putSession", + "summary": "Availability, p95 and ticks for several monitors", + "description": "History for up to 100 monitors in one call, so a list page needs no per-monitor request. window is 24h (default), 7d or 30d.", + "operationId": "batchHistory", "parameters": [ { - "name": "id", - "in": "path", + "name": "ids", + "in": "query", + "description": "Monitor ids, comma-separated; at most 100", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertMonitorSessionRequest" + "type": "array", + "items": { + "type": "string", + "format": "uuid" } } }, - "required": true - }, + { + "name": "window", + "in": "query", + "description": "History window: 24h (default), 7d or 30d", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "density", + "in": "query", + "description": "Return 48 display-only history buckets", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorBatchHistoryDto" } } } @@ -14230,6 +24517,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24557,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,31 +24610,31 @@ } } }, - "/api/v1/monitors/{id}/session/renew": { + "/api/v1/monitors/bulk": { "post": { "tags": [ - "Monitor session" + "Monitors" ], - "summary": "Renew the monitor session", - "operationId": "renewSession", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG, UPDATE_SCHEDULE, or RUN to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", + "operationId": "bulkAction", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkMonitorActionRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "202": { - "description": "Accepted", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -14342,6 +24659,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +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": { @@ -14405,21 +24752,24 @@ } } }, - "/api/v1/monitors/{id}/session/revoke": { - "post": { + "/api/v1/monitors/export.csv": { + "get": { "tags": [ - "Monitor session" + "monitor-export-controller" ], - "summary": "Revoke the monitor session", - "operationId": "revokeSession", + "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" + } } } ], @@ -14427,9 +24777,10 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSessionDto" + "type": "string", + "format": "byte" } } } @@ -14454,6 +24805,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +24845,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +24898,161 @@ } } }, - "/api/v1/monitors/{id}/settings/preview": { + "/api/v1/monitors/facets": { "get": { "tags": [ "Monitors" ], - "summary": "Projected run volume and meter headroom", - "operationId": "settingsPreview", + "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": { @@ -14541,7 +25061,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorSettingsPreviewDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorListFacetsDto" } } } @@ -14566,6 +25086,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14596,6 +25126,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,32 +25179,41 @@ } } }, - "/api/v1/monitors/{id}/status-pages": { - "get": { + "/api/v1/monitors/test": { + "post": { "tags": [ "Monitors" ], - "summary": "List status pages that contain this monitor as a component", - "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", - "operationId": "listStatusPagesForMonitor", - "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/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "202": { + "description": "Queued validation run for a browser or multi-step API bundle", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -14679,6 +25238,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14709,6 +25278,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +25331,20 @@ } } }, - "/api/v1/monitors/{id}/tags": { + "/api/v1/monitors/trash": { "get": { "tags": [ "Monitors" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "List deleted monitors that can still be restored", + "operationId": "listTrash", "parameters": [ { - "name": "id", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -14766,7 +25354,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -14791,6 +25379,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -14821,6 +25419,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,29 +25470,20 @@ } } } - }, + } + }, + "/api/v1/monitors/usage-preview": { "post": { "tags": [ "Monitors" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "Project monthly usage for a create payload", + "operationId": "previewUsage_1", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/CreateMonitorRequest" } } }, @@ -14886,7 +25495,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" } } } @@ -14911,8 +25520,8 @@ } } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -14921,91 +25530,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": [ - "Monitors" - ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" - } - } - }, - "required": true - }, - "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": { @@ -15014,8 +25540,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -15024,8 +25550,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": { @@ -15034,8 +25560,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -15044,8 +25570,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": { @@ -15087,29 +25613,18 @@ } } }, - "/api/v1/monitors/{id}/takeover": { + "/api/v1/monitors/validate": { "post": { "tags": [ "Monitors" ], - "summary": "Claim a field for dashboard ownership or reset an overlay", - "operationId": "takeover", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "Dry-run plan, secret, and runtime checks", + "operationId": "validateMonitors", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TakeoverMonitorRequest" + "$ref": "#/components/schemas/ValidateMonitorsRequest" } } }, @@ -15121,7 +25636,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorValidationResultDto" } } } @@ -15146,6 +25661,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +25701,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,18 +25754,19 @@ } } }, - "/api/v1/monitors/{id}/test": { - "post": { + "/api/v1/notification-dispatches": { + "get": { "tags": [ - "Monitors" + "Notification Dispatches" ], - "summary": "Test an existing monitor", - "description": "Uptime monitors run their saved config and assertions once through the probe and return the probe result (200) without persisting it. Browser and multi-step API monitors admit a queued validation run (202) that does not vote on health; poll the run for its outcome. Optional environmentId defaults to the monitor's environment; optional region defaults to the monitor's first region.", - "operationId": "testExisting", + "summary": "List all dispatches for an incident", + "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", + "operationId": "listByIncident", "parameters": [ { - "name": "id", - "in": "path", + "name": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", "required": true, "schema": { "type": "string", @@ -15228,38 +25774,29 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeTestTargetRequest" - } - } - } - }, "responses": { "200": { - "description": "Probe result for an uptime monitor", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } }, - "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 +25805,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -15308,6 +25845,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15341,14 +25898,14 @@ } } }, - "/api/v1/monitors/{id}/test-notifications": { - "post": { + "/api/v1/notification-dispatches/{id}": { + "get": { "tags": [ - "Monitors" + "Notification Dispatches" ], - "summary": "Send test notifications through the monitor's alert channels", - "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", - "operationId": "testNotifications", + "summary": "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", @@ -15360,23 +25917,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestMonitorNotificationsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -15401,6 +25948,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15431,6 +25988,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15464,13 +26041,14 @@ } } }, - "/api/v1/monitors/{id}/unmute": { + "/api/v1/notification-dispatches/{id}/acknowledge": { "post": { "tags": [ - "Monitors" + "Notification Dispatches" ], - "summary": "Clear mute overlay", - "operationId": "unmute", + "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", @@ -15488,7 +26066,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -15513,6 +26091,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26131,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +26184,14 @@ } } }, - "/api/v1/monitors/{id}/uptime": { - "get": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Check Results" + "Notification Dispatches" ], - "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": "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", @@ -15593,40 +26201,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], "responses": { "200": { - "description": "Uptime statistics", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/UptimeDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } }, "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 +26234,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 +26274,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,41 +26327,20 @@ } } }, - "/api/v1/monitors/{id}/usage-preview": { - "post": { + "/api/v1/notification-policies": { + "get": { "tags": [ - "Monitors" - ], - "summary": "Project monthly usage for an update payload", - "operationId": "previewUsage", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notification Policies" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" - } - } - }, - "required": true - }, + "summary": "List all notification policies for the authenticated org", + "operationId": "list_8", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -15763,6 +26365,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15783,8 +26395,28 @@ } } }, - "409": { - "description": "Conflict — the request collides with current resource state", + "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": { @@ -15824,42 +26456,30 @@ } } } - } - }, - "/api/v1/monitors/{id}/versions": { - "get": { + }, + "post": { "tags": [ - "Monitors" + "Notification Policies" ], - "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" + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_9", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + } } }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -15884,6 +26504,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -15914,6 +26544,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -15947,14 +26597,13 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { + "/api/v1/notification-policies/{id}": { "get": { "tags": [ - "Monitors" + "Notification Policies" ], - "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": "Get a notification policy by ID", + "operationId": "getById_1", "parameters": [ { "name": "id", @@ -15964,15 +26613,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -15981,7 +26621,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -16006,6 +26646,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26686,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -16067,18 +26737,16 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/alert-channels": { + }, "put": { "tags": [ - "Monitor Alert Channels" + "Notification Policies" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "Update a notification policy", + "operationId": "update_7", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16091,7 +26759,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" } } }, @@ -16103,7 +26771,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -16128,6 +26796,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +26836,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,18 +26887,16 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions": { - "post": { + }, + "delete": { "tags": [ - "Monitor Assertions" + "Notification Policies" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "Delete a notification policy", + "operationId": "delete_6", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16209,29 +26905,22 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" - } - } - }, - "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/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16240,8 +26929,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -16280,6 +26969,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +27022,17 @@ } } }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + "/api/v1/notification-policies/{id}/dispatches": { + "get": { "tags": [ - "Monitor Assertions" + "Notification Policies" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "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": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16331,32 +27041,52 @@ } }, { - "name": "assertionId", - "in": "path", - "required": true, + "name": "since", + "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" - } + }, + { + "name": "until", + "in": "query", + "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } }, - "required": true - }, + { + "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/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" } } } @@ -16381,6 +27111,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27151,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +27202,18 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Monitor Assertions" + "Notification Policies" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -16469,9 +27222,25 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestNotificationPolicyRequest" + } + } + } + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16493,6 +27262,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27302,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +27355,51 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { - "put": { + "/api/v1/notifications": { + "get": { "tags": [ - "Monitor Auth" + "Notifications" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "List notifications for the current user", + "operationId": "list_19", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, + "name": "unreadOnly", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" - } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 } }, - "required": true - }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/TableValueResultNotificationDto" } } } @@ -16615,6 +27424,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27464,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,47 +27515,42 @@ } } } - }, - "post": { + } + }, + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Monitor Auth" + "Notifications" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int64" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "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/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -16725,8 +27559,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -16765,6 +27599,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,24 +27650,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Monitor Auth" - ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { "204": { "description": "No Content" @@ -16838,6 +27683,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27723,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +27776,20 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { + "/api/v1/notifications/unread-count": { "get": { "tags": [ - "Incident Policies" - ], - "summary": "Get incident policy for a monitor", - "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", - "operationId": "get_5", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "description": "Monitor UUID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } @@ -16952,6 +27814,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27835,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 +27854,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,53 +27905,32 @@ } } } - }, - "put": { + } + }, + "/api/v1/org": { + "get": { "tags": [ - "Incident Policies" - ], - "summary": "Update incident policy for a monitor", - "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", - "operationId": "update_8", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "description": "Monitor UUID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Organizations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" - } - } - }, - "required": true - }, + "summary": "Get the current organization", + "operationId": "get_4", "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } }, "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 +27945,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +27966,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 +27985,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17135,21 +28036,18 @@ } } } - } - }, - "/api/v1/monitors/bulk": { - "post": { + }, + "put": { "tags": [ - "Monitors" + "Organizations" ], - "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", + "summary": "Update the current organization", + "operationId": "update_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" + "$ref": "#/components/schemas/UpdateOrgDetailsRequest" } } }, @@ -17161,7 +28059,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -17186,6 +28084,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28124,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17249,30 +28177,20 @@ } } }, - "/api/v1/monitors/package-uploads": { - "post": { + "/api/v1/regions": { + "get": { "tags": [ - "Monitors" + "Regions" ], - "summary": "Mint a signed package upload URL", - "operationId": "createPackageUpload", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreatePackageUploadRequest" - } - } - }, - "required": true - }, + "summary": "List public regions", + "operationId": "listRegions", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponsePackageUploadDto" + "$ref": "#/components/schemas/SingleValueResponseListRegionDto" } } } @@ -17297,6 +28215,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28255,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +28308,20 @@ } } }, - "/api/v1/monitors/test": { - "post": { + "/api/v1/resource-groups": { + "get": { "tags": [ - "Monitors" + "Resource Groups" ], - "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" - } - } - }, - "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/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" } } } @@ -17409,6 +28346,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28386,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17470,32 +28437,30 @@ } } } - } - }, - "/api/v1/monitors/usage-preview": { + }, "post": { "tags": [ - "Monitors" + "Resource Groups" ], - "summary": "Project monthly usage for a create payload", - "operationId": "previewUsage_1", + "summary": "Create a new resource group", + "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" + "$ref": "#/components/schemas/CreateResourceGroupRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorUsageProjectionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -17520,6 +28485,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28525,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,24 +28578,32 @@ } } }, - "/api/v1/notification-dispatches": { + "/api/v1/resource-groups/{id}": { "get": { "tags": [ - "Notification Dispatches" + "Resource Groups" ], - "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": "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": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "id", + "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "includeMetrics", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -17609,7 +28612,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -17634,6 +28637,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28677,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +28728,13 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}": { - "get": { + }, + "put": { "tags": [ - "Notification Dispatches" + "Resource Groups" ], - "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": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", "parameters": [ { "name": "id", @@ -17716,13 +28746,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -17747,6 +28787,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +28827,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -17808,16 +28878,14 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}/acknowledge": { - "post": { + }, + "delete": { "tags": [ - "Notification Dispatches" + "Resource Groups" ], - "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": "Delete a resource group (cascades to member rows)", + "description": "Also deletes status-page components that represent this group. The parent status page stays.", + "operationId": "delete_5", "parameters": [ { "name": "id", @@ -17830,18 +28898,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -17850,8 +28921,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -17890,6 +28961,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +29014,14 @@ } } }, - "/api/v1/notification-dispatches/{id}/unacknowledge": { - "post": { + "/api/v1/resource-groups/{id}/health": { + "get": { "tags": [ - "Notification Dispatches" + "Resource Groups" ], - "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": "Get the detailed health breakdown for a resource group", + "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", + "operationId": "getHealth", "parameters": [ { "name": "id", @@ -17948,7 +29039,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -17973,6 +29064,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18003,6 +29104,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18036,13 +29157,25 @@ } } }, - "/api/v1/notification-policies": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Notification Policies" + "Resource Groups" + ], + "summary": "List notification policies that match this resource group", + "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", + "operationId": "listMatchedPolicies", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", "responses": { "200": { "description": "OK", @@ -18074,6 +29207,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -18104,6 +29247,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18135,18 +29298,31 @@ } } } - }, + } + }, + "/api/v1/resource-groups/{id}/members": { "post": { "tags": [ - "Notification Policies" + "Resource Groups" + ], + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" } } }, @@ -18158,7 +29334,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } @@ -18183,6 +29359,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29399,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +29452,13 @@ } } }, - "/api/v1/notification-policies/{id}": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Notification Policies" + "Resource Groups" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", "parameters": [ { "name": "id", @@ -18262,21 +29468,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "memberId", + "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/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18285,8 +29503,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -18325,6 +29543,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +29594,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/revisions/{id}": { + "get": { "tags": [ - "Notification Policies" + "Revisions" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "summary": "Get revision package", + "operationId": "get_13", "parameters": [ { "name": "id", @@ -18374,23 +29614,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/SingleValueResponseRevisionDto" } } } @@ -18415,58 +29645,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": { @@ -18474,32 +29654,9 @@ } } } - } - } - }, - "delete": { - "tags": [ - "Notification Policies" - ], - "summary": "Delete a notification policy", - "operationId": "delete_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -18508,8 +29665,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -18518,8 +29675,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": { @@ -18528,8 +29685,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -18538,8 +29695,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": { @@ -18581,14 +29738,14 @@ } } }, - "/api/v1/notification-policies/{id}/dispatches": { + "/api/v1/revisions/{id}/bundle": { "get": { "tags": [ - "Notification Policies" + "Revisions" ], - "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": "Redirect to signed package download", + "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", + "operationId": "bundle", "parameters": [ { "name": "id", @@ -18598,60 +29755,24 @@ "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", + "description": "OK" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -18660,8 +29781,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -18700,6 +29821,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +29874,14 @@ } } }, - "/api/v1/notification-policies/{id}/test": { - "post": { + "/api/v1/revisions/{id}/bundle/content": { + "get": { "tags": [ - "Notification Policies" + "Revisions" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Download revision archive", + "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", + "operationId": "bundleContent", "parameters": [ { "name": "id", @@ -18751,22 +29893,14 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/zip": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "type": "string", + "format": "binary" } } } @@ -18791,6 +29925,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +29965,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -18854,41 +30018,30 @@ } } }, - "/api/v1/notifications": { + "/api/v1/revisions/{id}/diff/{other}": { "get": { "tags": [ - "Notifications" + "Revisions" ], - "summary": "List notifications for the current user", - "operationId": "list_18", + "summary": "Compare two revisions (bounded hunks)", + "operationId": "diff", "parameters": [ { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "type": "string", + "format": "uuid" } }, { - "name": "size", - "in": "query", - "required": false, + "name": "other", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -18898,7 +30051,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" + "$ref": "#/components/schemas/SingleValueResponseRevisionDiffDto" } } } @@ -18923,6 +30076,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30116,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,80 +30169,38 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/revisions/{id}/files": { + "get": { "tags": [ - "Notifications" + "Revisions" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Read revision source files", + "description": "Returns the entry file path and source text by path. Returns 404 when the package is unavailable.", + "operationId": "files", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + "200": { + "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseRevisionFilesDto" } } } }, - "500": { - "description": "Internal server error — see the message field for details", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -19068,8 +30209,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -19078,8 +30219,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -19087,23 +30228,9 @@ } } } - } - } - } - }, - "/api/v1/notifications/read-all": { - "put": { - "tags": [ - "Notifications" - ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", - "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": { @@ -19112,8 +30239,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -19122,8 +30249,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": { @@ -19132,8 +30259,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -19142,8 +30269,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": { @@ -19185,20 +30312,42 @@ } } }, - "/api/v1/notifications/unread-count": { - "get": { + "/api/v1/revisions/{id}/purge": { + "post": { "tags": [ - "Notifications" + "Revisions" ], - "summary": "Get unread notification count", - "operationId": "unreadCount", + "summary": "Purge revision package bytes", + "description": "Deletes stored package bytes unless another revision shares them. The revision stays; bundle, files and rollback then return 410. 409 while live. Requires an org admin.", + "operationId": "purgeRevision", + "parameters": [ + { + "name": "id", + "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/SingleValueResponseLong" + "$ref": "#/components/schemas/SingleValueResponseRevisionDto" } } } @@ -19223,6 +30372,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30412,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30465,31 @@ } } }, - "/api/v1/org": { + "/api/v1/runs": { "get": { "tags": [ - "Organizations" + "Runs" + ], + "summary": "List code runs", + "description": "Cursor page of runs across the organization. Default window last 24 hours; from is clamped to 90 days.", + "operationId": "listRuns", + "parameters": [ + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunListParams" + } + } ], - "summary": "Get the current organization", - "operationId": "get_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/CursorPageRunDto" } } } @@ -19324,6 +30514,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30554,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19385,30 +30605,33 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}": { + "get": { "tags": [ - "Organizations" + "Runs" ], - "summary": "Update the current organization", - "operationId": "update_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" - } + "summary": "Get a run", + "operationId": "getRun", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -19433,6 +30656,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -19463,6 +30696,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30749,32 @@ } } }, - "/api/v1/resource-groups": { + "/api/v1/runs/{id}/artifacts": { "get": { "tags": [ - "Resource Groups" + "Runs" + ], + "summary": "List run artifacts", + "description": "Complete persist manifest for this run.", + "operationId": "listRunArtifacts", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + "$ref": "#/components/schemas/TableValueResultRunArtifactDto" } } } @@ -19534,6 +30799,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30839,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +30890,34 @@ } } } - }, + } + }, + "/api/v1/runs/{id}/cancel": { "post": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Create a new resource group", - "operationId": "create_7", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" - } + "summary": "Request run cancel", + "description": "Sets cancel_requested; phase unchanged.", + "operationId": "cancelRun", + "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/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -19643,6 +30942,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +30982,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +31035,14 @@ } } }, - "/api/v1/resource-groups/{id}": { + "/api/v1/runs/{id}/captures/{artifactId}/compare": { "get": { "tags": [ - "Resource Groups" + "Runs" ], - "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": "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", @@ -19725,12 +31054,12 @@ } }, { - "name": "includeMetrics", - "in": "query", - "required": false, + "name": "artifactId", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -19738,9 +31067,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" } } } @@ -19765,6 +31094,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31134,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19826,13 +31185,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/runs/{id}/cases": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "summary": "List run cases with nested steps", + "operationId": "listRunCases", "parameters": [ { "name": "id", @@ -19842,25 +31203,23 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunCaseListParams" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/TableValueResultRunCaseDto" } } } @@ -19885,6 +31244,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31284,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -19946,14 +31335,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/runs/{id}/console": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Delete a resource group (cascades to member rows)", - "description": "Also deletes status-page components that represent this group. The parent status page stays.", - "operationId": "delete_5", + "summary": "Download raw console log", + "description": "Ungrouped text/plain console lines.", + "operationId": "getRunConsoleRaw", "parameters": [ { "name": "id", @@ -19963,11 +31354,31 @@ "type": "string", "format": "uuid" } + }, + { + "name": "params", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/RunConsoleParams" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19989,6 +31400,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31440,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20052,14 +31493,14 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/runs/{id}/diff": { "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Get the detailed health breakdown for a resource group", - "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", - "operationId": "getHealth", + "summary": "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", @@ -20069,15 +31510,24 @@ "type": "string", "format": "uuid" } + }, + { + "name": "baselineRunId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { "200": { "description": "OK", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" } } } @@ -20102,6 +31552,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31592,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20165,14 +31645,13 @@ } } }, - "/api/v1/resource-groups/{id}/matched-policies": { + "/api/v1/runs/{id}/events": { "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "List notification policies that match this resource group", - "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", - "operationId": "listMatchedPolicies", + "summary": "Stream run control events", + "operationId": "streamRunEvents", "parameters": [ { "name": "id", @@ -20182,15 +31661,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/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/RunEventDto" } } } @@ -20215,6 +31710,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20245,6 +31750,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20278,13 +31803,14 @@ } } }, - "/api/v1/resource-groups/{id}/members": { - "post": { + "/api/v1/runs/{id}/export": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "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", @@ -20296,25 +31822,11 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "Zip of snapshot.json and available artifacts", "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" - } - } + "application/zip": {} } }, "400": { @@ -20337,6 +31849,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +31889,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20400,13 +31942,14 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/runs/{id}/network": { + "get": { "tags": [ - "Resource Groups" + "Runs" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "List run network rows", + "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", + "operationId": "listRunNetwork", "parameters": [ { "name": "id", @@ -20418,18 +31961,24 @@ } }, { - "name": "memberId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunNetworkParams" } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/RunNetworkDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20451,6 +32000,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32040,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20514,13 +32093,14 @@ } } }, - "/api/v1/revisions/{id}": { + "/api/v1/runs/{id}/network/{rowId}": { "get": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Get revision package", - "operationId": "get_13", + "summary": "Get one network row", + "description": "Includes redacted headers, bodies, and copy-as-cURL.", + "operationId": "getRunNetworkRow", "parameters": [ { "name": "id", @@ -20530,6 +32110,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "rowId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -20538,7 +32126,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRevisionDto" + "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" } } } @@ -20563,6 +32151,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20593,6 +32191,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20626,14 +32244,14 @@ } } }, - "/api/v1/revisions/{id}/bundle": { - "get": { + "/api/v1/runs/{id}/pin": { + "post": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Redirect to signed package download", - "description": "Returns 302 Location with a signed GET URL. 404 after downloadUntil.", - "operationId": "bundle", + "summary": "Pin a run past retention", + "description": "Keeps the run and its evidence past the retention windows until unpinned.", + "operationId": "pinRun", "parameters": [ { "name": "id", @@ -20647,7 +32265,14 @@ ], "responses": { "200": { - "description": "OK" + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseRunDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -20669,6 +32294,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20699,6 +32334,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,16 +32385,14 @@ } } } - } - }, - "/api/v1/revisions/{id}/bundle/content": { - "get": { + }, + "delete": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Download revision archive", - "description": "Streams package bytes after access checks. Returns 404 when the package is unavailable.", - "operationId": "bundleContent", + "summary": "Unpin a run", + "description": "Normal retention applies again from the next sweep.", + "operationId": "unpinRun", "parameters": [ { "name": "id", @@ -20755,10 +32408,9 @@ "200": { "description": "OK", "content": { - "application/zip": { + "*/*": { "schema": { - "type": "string", - "format": "binary" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -20783,6 +32435,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20813,6 +32475,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20846,13 +32528,14 @@ } } }, - "/api/v1/revisions/{id}/diff/{other}": { - "get": { + "/api/v1/runs/{id}/purge": { + "post": { "tags": [ - "Revisions" + "Runs" ], - "summary": "Compare two revisions (bounded hunks)", - "operationId": "diff", + "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", @@ -20862,24 +32545,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "other", - "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/SingleValueResponseRevisionDiffDto" + "$ref": "#/components/schemas/SingleValueResponseRunDto" } } } @@ -20904,6 +32588,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -20934,6 +32628,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -20967,21 +32681,22 @@ } } }, - "/api/v1/runs": { + "/api/v1/runs/{id}/runner-log": { "get": { "tags": [ "Runs" ], - "summary": "List code runs", - "description": "Org index. Default window last 30 minutes; from clamped to 90 days. Page size 50.", - "operationId": "listRuns", + "summary": "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": "params", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string", + "format": "uuid" } } ], @@ -20989,9 +32704,14 @@ "200": { "description": "OK", "content": { + "text/plain": { + "schema": { + "type": "string" + } + }, "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunDto" + "type": "string" } } } @@ -21016,6 +32736,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32776,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21079,13 +32829,14 @@ } } }, - "/api/v1/runs/{id}": { + "/api/v1/runs/{id}/runner-log/live": { "get": { "tags": [ "Runs" ], - "summary": "Get a run", - "operationId": "getRun", + "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", @@ -21099,11 +32850,11 @@ ], "responses": { "200": { - "description": "OK", + "description": "Server-sent runner-log lines", "content": { - "*/*": { + "text/event-stream": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "$ref": "#/components/schemas/RunnerLogLiveEvent" } } } @@ -21128,6 +32879,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +32919,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21191,14 +32972,14 @@ } } }, - "/api/v1/runs/{id}/artifacts": { + "/api/v1/runs/{id}/trace-summary": { "get": { "tags": [ "Runs" ], - "summary": "List run artifacts", - "description": "Complete persist manifest for this run.", - "operationId": "listRunArtifacts", + "summary": "Summarize a failed trace", + "description": "Bounded text of failed actions, failed requests, and console errors.", + "operationId": "getRunTraceSummary", "parameters": [ { "name": "id", @@ -21216,7 +32997,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunArtifactDto" + "$ref": "#/components/schemas/SingleValueResponseRunTraceSummaryDto" } } } @@ -21241,6 +33022,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33062,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,22 +33115,21 @@ } } }, - "/api/v1/runs/{id}/cancel": { - "post": { + "/api/v1/runs/export": { + "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Request run cancel", - "description": "Sets cancel_requested; phase unchanged.", - "operationId": "cancelRun", + "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" } } ], @@ -21327,9 +33137,9 @@ "200": { "description": "OK", "content": { - "*/*": { + "text/csv": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDto" + "type": "string" } } } @@ -21354,6 +33164,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33204,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +33257,21 @@ } } }, - "/api/v1/runs/{id}/captures/{artifactId}/compare": { + "/api/v1/runs/monitors": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Compare a screenshot to the last pass of this step", - "description": "Captures viewer baseline: last pass of this step in this region, any revision.", - "operationId": "compareRunCapture", + "summary": "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": "artifactId", - "in": "path", + "name": "params", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -21449,9 +33279,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseCaptureCompareDto" + "$ref": "#/components/schemas/SingleValueResponseRunMonitorStripDto" } } } @@ -21476,6 +33306,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33346,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21539,29 +33399,21 @@ } } }, - "/api/v1/runs/{id}/cases": { + "/api/v1/runs/revisions": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "List run cases with nested steps", - "operationId": "listRunCases", + "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": "params", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/RunCaseListParams" + "$ref": "#/components/schemas/RunWindowListParams" } } ], @@ -21571,7 +33423,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultRunCaseDto" + "$ref": "#/components/schemas/CursorPageRunRevisionMarkerDto" } } } @@ -21596,6 +33448,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33488,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +33541,20 @@ } } }, - "/api/v1/runs/{id}/console": { + "/api/v1/runs/skipped": { "get": { "tags": [ - "Runs" + "run-list-read-controller" ], - "summary": "Download raw console log", - "description": "Ungrouped text/plain console lines.", - "operationId": "getRunConsoleRaw", + "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": "params", "in": "query", "required": true, "schema": { - "$ref": "#/components/schemas/RunConsoleParams" + "$ref": "#/components/schemas/RunSkippedListParams" } } ], @@ -21690,14 +33562,9 @@ "200": { "description": "OK", "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunConsoleDto" - } - }, - "text/plain": { + "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/CursorPageRunSkippedEntryDto" } } } @@ -21722,6 +33589,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33629,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21785,31 +33682,21 @@ } } }, - "/api/v1/runs/{id}/diff": { + "/api/v1/runs/summary": { "get": { "tags": [ "Runs" ], - "summary": "Diff this run against a prior pass", - "description": "Default baseline is the last pass of the same revision in this region. Pass baselineRunId to pick another finished run of the same monitor.", - "operationId": "getRunDiff", + "summary": "Summarize the filtered Runs population", + "description": "Uses the same enqueue-time window and filters as the Runs list; independent of pagination.", + "operationId": "summarizeRuns", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "baselineRunId", + "name": "params", "in": "query", - "required": false, + "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/RunListParams" } } ], @@ -21817,9 +33704,9 @@ "200": { "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunDiffDto" + "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" } } } @@ -21844,6 +33731,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +33771,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -21907,47 +33824,20 @@ } } }, - "/api/v1/runs/{id}/events": { + "/api/v1/secrets": { "get": { "tags": [ - "Runs" - ], - "summary": "Stream run control events", - "operationId": "streamRunEvents", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunEventParams" - } - }, - { - "name": "Last-Event-ID", - "in": "header", - "required": false, - "schema": { - "type": "string" - } - } + "Secrets" ], + "summary": "List organization secrets", + "operationId": "list_6", "responses": { "200": { - "description": "Server-sent persist control events", + "description": "OK", "content": { - "text/event-stream": { + "*/*": { "schema": { - "$ref": "#/components/schemas/RunEventDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } @@ -21972,6 +33862,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -22002,6 +33902,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22033,32 +33953,32 @@ } } } - } - }, - "/api/v1/runs/{id}/export": { - "get": { + }, + "post": { "tags": [ - "Runs" + "Secrets" ], - "summary": "Export run snapshot and available artifacts", - "description": "Zip of snapshot.json plus available artifact bytes. Expired files are omitted.", - "operationId": "exportRun", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create secret", + "operationId": "create_7", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSecretRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "Zip of snapshot.json and available artifacts", + "201": { + "description": "Created", "content": { - "application/zip": {} + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretDto" + } + } } }, "400": { @@ -22081,6 +34001,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34041,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,40 +34094,40 @@ } } }, - "/api/v1/runs/{id}/network": { - "get": { + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Runs" + "Secrets" ], - "summary": "List run network rows", - "description": "Waterfall collection. Filters: failed, slow, stepId, xhr, source. 500 per page.", - "operationId": "listRunNetwork", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "params", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/RunNetworkParams" + "type": "string" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/RunNetworkDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -22202,6 +34152,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34192,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22263,28 +34243,16 @@ } } } - } - }, - "/api/v1/runs/{id}/network/{rowId}": { - "get": { + }, + "delete": { "tags": [ - "Runs" + "Secrets" ], - "summary": "Get one network row", - "description": "Includes redacted headers, bodies, and copy-as-cURL.", - "operationId": "getRunNetworkRow", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "rowId", + "name": "key", "in": "path", "required": true, "schema": { @@ -22293,18 +34261,21 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNetworkRowDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -22313,8 +34284,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -22353,6 +34324,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22386,22 +34377,20 @@ } } }, - "/api/v1/runs/{id}/runner-log": { + "/api/v1/secrets/{key}/audit": { "get": { "tags": [ - "Runs" + "Secrets" ], - "summary": "Snapshot in-flight runner log", - "description": "Hot Loki snapshot (text/plain) of lines so far. This is not live tail — poll this endpoint or use GET /runner-log/live (SSE). After finish, the cold file is the runner_log artifact (GET /artifacts/{id}/content). Empty while no lines have been pushed.", - "operationId": "getRunRunnerLog", + "summary": "Last update metadata for a secret", + "operationId": "audit", "parameters": [ { - "name": "id", + "name": "key", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], @@ -22409,14 +34398,9 @@ "200": { "description": "OK", "content": { - "text/plain": { - "schema": { - "type": "string" - } - }, "*/*": { "schema": { - "type": "string" + "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" } } } @@ -22441,6 +34425,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34465,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,17 +34518,24 @@ } } }, - "/api/v1/runs/{id}/runner-log/live": { - "get": { + "/api/v1/secrets/{key}/environments/{environmentId}": { + "put": { "tags": [ - "Runs" + "Secrets" ], - "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": "Write a secret value for one environment", + "operationId": "writeEnvironmentValue", "parameters": [ { - "name": "id", + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", "in": "path", "required": true, "schema": { @@ -22523,17 +34544,20 @@ } } ], - "responses": { - "200": { - "description": "Server-sent runner-log lines", - "content": { - "text/event-stream": { - "schema": { - "$ref": "#/components/schemas/RunnerLogLiveEvent" - } + "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": { @@ -22554,6 +34578,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34618,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -22617,21 +34671,20 @@ } } }, - "/api/v1/runs/summary": { + "/api/v1/secrets/{key}/usage": { "get": { "tags": [ - "Runs" + "Secrets" ], - "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": "Secret usage across monitors", + "operationId": "usage", "parameters": [ { - "name": "params", - "in": "query", + "name": "key", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/RunListParams" + "type": "string" } } ], @@ -22641,7 +34694,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseRunMetricsSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" } } } @@ -22666,8 +34719,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": { @@ -22676,79 +34729,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/secrets": { - "get": { - "tags": [ - "Secrets" - ], - "summary": "List organization secrets", - "operationId": "list_5", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -22757,8 +34739,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -22766,9 +34748,9 @@ } } } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", + }, + "409": { + "description": "Conflict — the request collides with current resource state", "content": { "application/json": { "schema": { @@ -22777,8 +34759,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -22787,8 +34769,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": { @@ -22828,30 +34810,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/service-subscriptions": { + "get": { "tags": [ - "Secrets" + "Service Subscriptions" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } - } - }, - "required": true - }, + "summary": "List all service subscriptions for the organization", + "operationId": "list_18", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" } } } @@ -22876,6 +34850,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +34890,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,40 +34943,31 @@ } } }, - "/api/v1/secrets/{key}": { - "put": { + "/api/v1/service-subscriptions/{id}": { + "get": { "tags": [ - "Secrets" + "Service Subscriptions" ], - "summary": "Update secret", - "operationId": "update_4", + "summary": "Get a subscription by its ID", + "operationId": "get_12", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -22997,6 +34992,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35032,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23061,17 +35086,19 @@ }, "delete": { "tags": [ - "Secrets" + "Service Subscriptions" ], - "summary": "Delete secret", - "operationId": "delete_4", + "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": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -23099,6 +35126,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35166,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,30 +35219,42 @@ } } }, - "/api/v1/secrets/{key}/audit": { - "get": { + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { "tags": [ - "Secrets" + "Service Subscriptions" ], - "summary": "Last update metadata for a secret", - "operationId": "audit", + "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": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretAuditDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -23210,6 +35279,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -23240,6 +35319,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,45 +35372,43 @@ } } }, - "/api/v1/secrets/{key}/environments/{environmentId}": { - "put": { + "/api/v1/service-subscriptions/{slug}": { + "post": { "tags": [ - "Secrets" + "Service Subscriptions" ], - "summary": "Write a secret value for one environment", - "operationId": "writeEnvironmentValue", + "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": "key", + "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } - }, - { - "name": "environmentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WriteSecretEnvironmentValueRequest" + "$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", @@ -23333,6 +35430,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35470,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,21 +35523,87 @@ } } }, - "/api/v1/secrets/{key}/usage": { + "/api/v1/services": { "get": { "tags": [ - "Secrets" + "Status Data" ], - "summary": "Secret usage across monitors", - "operationId": "usage", + "summary": "List all enabled services (cursor-paginated)", + "operationId": "listServices", "parameters": [ { - "name": "key", - "in": "path", - "required": true, + "name": "category", + "in": "query", + "description": "Filter by category (exact match)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Filter by current overall_status (exact match)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "published", + "in": "query", + "description": "Filter by published status for pSEO pages", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on service name or slug", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, "schema": { "type": "string" } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } } ], "responses": { @@ -23419,7 +35612,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretUsageDto" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } @@ -23444,6 +35637,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35677,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +35730,51 @@ } } }, - "/api/v1/service-subscriptions": { + "/api/v1/services/{slugOrId}": { "get": { "tags": [ - "Service Subscriptions" + "Status Data" + ], + "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", + "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", + "operationId": "getService", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "summary", + "in": "query", + "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "publishedOnly", + "in": "query", + "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_17", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" } } } @@ -23545,6 +35799,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +35839,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23608,87 +35892,76 @@ } } }, - "/api/v1/service-subscriptions/{id}": { + "/api/v1/services/{slugOrId}/components": { "get": { "tags": [ - "Service Subscriptions" + "Status Data" ], - "summary": "Get a subscription by its ID", - "operationId": "get_12", + "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" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" - } - } + "type": "string" } }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "groupId", + "in": "query", + "description": "Restrict result to direct children of this group component id", + "required": false, + "schema": { + "type": "string", + "format": "uuid" } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" } }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "page", + "in": "query", + "description": "Zero-based page index", + "required": false, + "schema": { + "type": "integer", + "format": "int32" } }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "size", + "in": "query", + "description": "Page size (default 25, max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" } - }, - "409": { - "description": "Conflict — the request collides with current resource state", + } + ], + "responses": { + "200": { + "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" } } } }, - "500": { - "description": "Internal server error — see the message field for details", + "400": { + "description": "Bad request — the payload failed validation", "content": { "application/json": { "schema": { @@ -23697,8 +35970,8 @@ } } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -23707,8 +35980,8 @@ } } }, - "503": { - "description": "Service unavailable — try again shortly", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -23716,33 +35989,9 @@ } } } - } - } - }, - "delete": { - "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" - } - } - ], - "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": { @@ -23751,8 +36000,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -23761,8 +36010,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": { @@ -23771,8 +36020,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -23781,8 +36030,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": { @@ -23824,42 +36073,75 @@ } } }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { + "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "get": { "tags": [ - "Service Subscriptions" + "Status Data" ], - "summary": "Update alert sensitivity for a subscription", - "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", - "operationId": "updateAlertSensitivity", + "summary": "Get 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" + } + }, + { + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" - } + }, + { + "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/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -23884,6 +36166,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36206,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -23947,40 +36259,79 @@ } } }, - "/api/v1/service-subscriptions/{slug}": { - "post": { + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Service Subscriptions" + "Status Data" ], - "summary": "Subscribe to a service or a component of a service", - "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", - "operationId": "subscribe_1", + "summary": "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": "slug", + "name": "slugOrId", "in": "path", "required": true, "schema": { "type": "string" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" + }, + { + "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" } } } - }, + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" } } } @@ -24005,6 +36356,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36396,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +36449,31 @@ } } }, - "/api/v1/services": { + "/api/v1/services/{slugOrId}/days/{date}": { "get": { "tags": [ "Status Data" ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", + "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": "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": "slugOrId", + "in": "path", + "required": true, "schema": { "type": "string" } }, { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 20)", - "required": false, + "name": "date", + "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "date" } } ], @@ -24157,7 +36483,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" } } } @@ -24182,6 +36508,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +36548,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24245,14 +36601,13 @@ } } }, - "/api/v1/services/{slugOrId}": { + "/api/v1/services/{slugOrId}/incidents": { "get": { "tags": [ "Status Data" ], - "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", - "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", - "operationId": "getService", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { "name": "slugOrId", @@ -24263,23 +36618,34 @@ } }, { - "name": "summary", + "name": "from", "in": "query", - "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", + "description": "Earliest start date (ISO 8601 date)", "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "date" } }, { - "name": "publishedOnly", + "name": "status", "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", + "description": "Filter: active (unresolved), resolved, or omit for all", "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string", + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -24289,7 +36655,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -24314,6 +36680,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24344,6 +36720,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -24377,14 +36773,13 @@ } } }, - "/api/v1/services/{slugOrId}/components": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { "get": { "tags": [ "Status Data" ], - "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", - "operationId": "getComponents", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { "name": "slugOrId", @@ -24395,43 +36790,13 @@ } }, { - "name": "groupId", - "in": "query", - "description": "Restrict result to direct children of this group component id", - "required": false, + "name": "incidentId", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on component name", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "Zero-based page index", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "size", - "in": "query", - "description": "Page size (default 25, max 100)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -24440,7 +36805,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -24465,6 +36830,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -24495,6 +36870,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +36923,14 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "/api/v1/services/{slugOrId}/live-status": { "get": { "tags": [ "Status Data" ], - "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": "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": "slugOrId", @@ -24544,50 +36939,6 @@ "schema": { "type": "string" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } } ], "responses": { @@ -24596,7 +36947,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } @@ -24621,6 +36972,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37012,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +37065,13 @@ } } }, - "/api/v1/services/{slugOrId}/components/uptime": { + "/api/v1/services/{slugOrId}/maintenances": { "get": { "tags": [ "Status Data" ], - "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 scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { "name": "slugOrId", @@ -24702,50 +37082,14 @@ } }, { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "componentIds", + "name": "status", "in": "query", - "description": "Component ids to include (max 100); omit for every component", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", "required": false, "schema": { "type": "array", "items": { - "type": "string", - "format": "uuid" + "type": "string" } } } @@ -24756,7 +37100,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -24781,6 +37125,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37165,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +37218,13 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { + "/api/v1/services/{slugOrId}/poll-results": { "get": { "tags": [ "Status Data" ], - "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": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { "name": "slugOrId", @@ -24862,13 +37235,23 @@ } }, { - "name": "date", - "in": "path", - "description": "UTC calendar day in ISO format (YYYY-MM-DD)", - "required": true, + "name": "cursor", + "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", + "required": false, "schema": { - "type": "string", - "format": "date" + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -24878,7 +37261,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } @@ -24903,6 +37286,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37326,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +37379,13 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { + "/api/v1/services/{slugOrId}/poll-summary": { "get": { "tags": [ "Status Data" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { "name": "slugOrId", @@ -24983,35 +37396,18 @@ } }, { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", + "name": "window", "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", + "description": "Time window", "required": false, "schema": { "type": "string", "enum": [ - "active", - "resolved" + "24h", + "7d", + "30d" ] } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -25020,7 +37416,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } @@ -25045,6 +37441,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25075,6 +37481,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +37534,14 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "/api/v1/services/{slugOrId}/status-events": { "get": { "tags": [ "Status Data" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { "name": "slugOrId", @@ -25125,12 +37552,66 @@ } }, { - "name": "incidentId", - "in": "path", - "required": true, + "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": "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 } } ], @@ -25140,7 +37621,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } @@ -25165,6 +37646,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +37686,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,14 +37739,14 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/services/{slugOrId}/uptime": { "get": { "tags": [ "Status Data" ], - "summary": "Lightweight live-status snapshot for polling", - "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", - "operationId": "getServiceLiveStatus", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { "name": "slugOrId", @@ -25244,6 +37755,38 @@ "schema": { "type": "string" } + }, + { + "name": "period", + "in": "query", + "description": "Time window", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] + } + }, + { + "name": "granularity", + "in": "query", + "description": "Bucket granularity", + "required": false, + "schema": { + "type": "string", + "enum": [ + "hourly", + "daily", + "monthly" + ] + } } ], "responses": { @@ -25252,7 +37795,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" } } } @@ -25277,6 +37820,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25307,6 +37860,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25337,35 +37910,61 @@ } } } - } + }, + "security": [ + { + "BearerAuth": [] + } + ] } }, - "/api/v1/services/{slugOrId}/maintenances": { + "/api/v1/services/incidents": { "get": { "tags": [ "Status Data" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { - "type": "string" + "type": "string", + "format": "date" } }, { "name": "status", "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "description": "Filter: active (unresolved), resolved, or omit for all", "required": false, "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "category", + "in": "query", + "description": "Filter by service category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -25375,7 +37974,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -25400,6 +37999,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38039,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +38092,23 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/services/summary": { "get": { "tags": [ "Status Data" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "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": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", + "name": "publishedOnly", "in": "query", - "description": "Page size (1–100, default 50)", + "description": "Aggregate only published services (curated public pSEO set); default false", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "boolean", + "default": false } } ], @@ -25506,7 +38118,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } @@ -25531,6 +38143,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38183,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,44 +38236,20 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { + "/api/v1/status-pages": { "get": { "tags": [ - "Status Data" - ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "window", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] - } - } + "Status Pages" ], + "summary": "List status pages for the workspace", + "operationId": "list_5", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -25656,6 +38274,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38314,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25717,96 +38365,30 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/status-events": { - "get": { + }, + "post": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "List curated vendor status events for a service", - "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", - "operationId": "listStatusEvents", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "types", - "in": "query", - "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit lower bound (ISO 8601); overrides period", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit upper bound (ISO 8601); default now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "summary": "Create a status page", + "operationId": "create_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageRequest" + } } }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageStatusEventDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -25831,6 +38413,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -25861,6 +38453,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -25894,53 +38506,21 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/status-pages/{id}": { "get": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] - } - }, - { - "name": "granularity", - "in": "query", - "description": "Bucket granularity", - "required": false, "schema": { "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "format": "uuid" } } ], @@ -25950,7 +38530,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -25975,6 +38555,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38595,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,71 +38645,42 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] - } - }, - "/api/v1/services/incidents": { - "get": { + } + }, + "put": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "Update a status page", + "operationId": "update_3", "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" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -26124,6 +38705,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +38745,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26185,41 +38796,40 @@ } } } - } - }, - "/api/v1/services/summary": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Status Pages" ], - "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": "Delete a status page", + "operationId": "delete_3", "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" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -26228,8 +38838,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -26268,6 +38878,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26301,20 +38931,31 @@ } } }, - "/api/v1/status-pages": { + "/api/v1/status-pages/{id}/components": { "get": { "tags": [ "Status Pages" ], - "summary": "List status pages for the workspace", - "operationId": "list_4", + "summary": "List all components", + "operationId": "listComponents", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" } } } @@ -26339,6 +38980,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39020,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26405,13 +39076,24 @@ "tags": [ "Status Pages" ], - "summary": "Create a status page", - "operationId": "create_5", + "summary": "Add a component to the status page", + "operationId": "createComponent", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, @@ -26423,7 +39105,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -26448,18 +39130,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": { @@ -26468,80 +39140,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/status-pages/{id}": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "Get a status page", - "operationId": "get_2", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -26550,8 +39150,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -26560,8 +39160,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": { @@ -26570,8 +39170,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -26580,8 +39180,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": { @@ -26621,13 +39221,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/components/{componentId}": { "put": { "tags": [ "Status Pages" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { "name": "id", @@ -26637,13 +39239,22 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" } } }, @@ -26655,7 +39266,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -26680,6 +39291,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39331,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -26746,8 +39387,8 @@ "tags": [ "Status Pages" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { "name": "id", @@ -26757,6 +39398,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -26783,6 +39433,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39473,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +39526,14 @@ } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { "get": { "tags": [ "Status Pages" ], - "summary": "List all components", - "operationId": "listComponents", + "summary": "Get measured (check-based) component uptime history", + "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", + "operationId": "componentMeasuredUptime", "parameters": [ { "name": "id", @@ -26862,6 +39543,25 @@ "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": { @@ -26870,7 +39570,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } @@ -26895,6 +39595,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +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": { @@ -26956,13 +39686,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ "Status Pages" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "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", @@ -26972,21 +39705,30 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { @@ -27015,6 +39757,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +39797,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27076,15 +39848,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Update a component", - "operationId": "updateComponent", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { "name": "id", @@ -27105,16 +39875,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -27146,8 +39906,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": { @@ -27156,90 +39916,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": [ - "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" - } - } - ], - "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": { @@ -27248,8 +39926,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -27258,8 +39936,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": { @@ -27268,8 +39946,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -27278,8 +39956,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": { @@ -27321,14 +39999,14 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { "get": { "tags": [ "Status Pages" ], - "summary": "Get measured (check-based) component uptime history", - "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", - "operationId": "componentMeasuredUptime", + "summary": "Get component uptime history from published incident windows", + "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", + "operationId": "componentUptime_1", "parameters": [ { "name": "id", @@ -27365,7 +40043,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -27390,6 +40068,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40108,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27453,14 +40161,13 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/override": { + "/api/v1/status-pages/{id}/components/reorder": { "put": { "tags": [ "Status Pages" ], - "summary": "Set a timed human status override on a component", - "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", - "operationId": "setComponentOverride", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { "name": "id", @@ -27470,40 +40177,34 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" + "$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/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -27512,8 +40213,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -27552,6 +40253,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27583,13 +40304,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/domains": { + "get": { "tags": [ "Status Pages" ], - "summary": "Clear a timed human status override on a component", - "operationId": "clearComponentOverride", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { "name": "id", @@ -27599,15 +40322,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { @@ -27616,7 +40330,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" } } } @@ -27641,6 +40355,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40395,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -27702,16 +40446,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { - "get": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "Get component uptime history from published incident windows", - "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", - "operationId": "componentUptime_1", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -27721,34 +40462,25 @@ "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 - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -27773,6 +40505,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40545,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +40598,13 @@ } } }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ "Status Pages" ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { "name": "id", @@ -27852,18 +40614,17 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" @@ -27888,6 +40649,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40689,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +40742,13 @@ } } }, - "/api/v1/status-pages/{id}/domains": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + "post": { "tags": [ "Status Pages" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", "parameters": [ { "name": "id", @@ -27967,6 +40758,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -27975,7 +40775,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -28000,6 +40800,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +40840,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28061,13 +40891,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { "post": { "tags": [ "Status Pages" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { "name": "id", @@ -28077,21 +40909,20 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { @@ -28120,6 +40951,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -28150,6 +40991,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28183,13 +41044,13 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/status-pages/{id}/groups": { + "get": { "tags": [ "Status Pages" ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", + "summary": "List component groups with nested components", + "operationId": "listGroups", "parameters": [ { "name": "id", @@ -28199,20 +41060,18 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28234,6 +41093,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41133,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28295,15 +41184,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + }, "post": { "tags": [ "Status Pages" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { "name": "id", @@ -28313,24 +41200,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "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/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -28355,6 +41243,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41283,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +41336,13 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { + "/api/v1/status-pages/{id}/groups/{groupId}": { + "put": { "tags": [ "Status Pages" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { "name": "id", @@ -28436,7 +41354,7 @@ } }, { - "name": "domainId", + "name": "groupId", "in": "path", "required": true, "schema": { @@ -28445,13 +41363,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -28476,6 +41404,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41444,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28537,15 +41495,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/groups": { - "get": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "List component groups with nested components", - "operationId": "listGroups", + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", "parameters": [ { "name": "id", @@ -28555,21 +41511,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "groupId", + "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/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -28578,8 +41546,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -28618,6 +41586,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28649,13 +41637,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/incidents": { + "get": { "tags": [ "Status Pages" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", "parameters": [ { "name": "id", @@ -28665,25 +41655,40 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] } } }, - "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/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -28708,6 +41713,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41753,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28769,15 +41804,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "Update a component group", - "operationId": "updateGroup", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { "name": "id", @@ -28787,34 +41820,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -28839,6 +41863,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +41903,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -28900,13 +41954,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "get": { "tags": [ "Status Pages" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "summary": "Get incident details with timeline", + "operationId": "getIncident", "parameters": [ { "name": "id", @@ -28918,7 +41974,7 @@ } }, { - "name": "groupId", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -28928,8 +41984,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -28951,6 +42014,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42054,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,15 +42105,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents": { - "get": { + }, + "put": { "tags": [ "Status Pages" ], - "summary": "List incidents for this status page (paginated)", - "operationId": "listIncidents", + "summary": "Update an incident", + "operationId": "updateIncident", "parameters": [ { "name": "id", @@ -29032,38 +42123,32 @@ } }, { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } - } - }, - { - "name": "pageable", - "in": "query", + "name": "incidentId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -29088,6 +42173,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29118,6 +42213,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29150,12 +42265,12 @@ } } }, - "post": { + "delete": { "tags": [ "Status Pages" ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", + "summary": "Delete an incident", + "operationId": "deleteIncident", "parameters": [ { "name": "id", @@ -29165,31 +42280,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" - } - } - }, - "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": { @@ -29198,8 +42315,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29238,6 +42355,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +42408,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { + "post": { "tags": [ "Status Pages" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", + "operationId": "dismissIncident", "parameters": [ { "name": "id", @@ -29299,18 +42436,21 @@ } ], "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": { @@ -29319,8 +42459,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29359,6 +42499,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29390,13 +42550,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ "Status Pages" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { "name": "id", @@ -29421,11 +42583,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -29458,6 +42619,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29488,6 +42659,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +42710,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { + "post": { "tags": [ "Status Pages" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", "parameters": [ { "name": "id", @@ -29546,9 +42739,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29570,6 +42780,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42820,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +42873,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { "tags": [ "Status Pages" ], - "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", - "operationId": "dismissIncident", + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", "parameters": [ { "name": "id", @@ -29658,11 +42898,37 @@ "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -29684,6 +42950,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +42990,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +43043,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/status-pages/{id}/layout/reorder": { + "put": { "tags": [ "Status Pages" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", "parameters": [ { "name": "id", @@ -29763,39 +43059,34 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + "$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/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -29804,8 +43095,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -29844,6 +43135,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -29877,13 +43188,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + "/api/v1/status-pages/{id}/maintenance": { + "get": { "tags": [ "Status Pages" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", "parameters": [ { "name": "id", @@ -29895,32 +43206,38 @@ } }, { - "name": "incidentId", - "in": "path", + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -29945,6 +43262,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -29975,6 +43302,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30006,15 +43353,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { - "patch": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "Edit an existing incident timeline update body", - "operationId": "patchIncidentUpdate", + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", "parameters": [ { "name": "id", @@ -30024,43 +43369,25 @@ "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/CreateStatusPageMaintenanceRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -30085,6 +43412,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43452,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30148,13 +43505,13 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "get": { "tags": [ "Status Pages" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "Get a maintenance window with timeline", + "operationId": "getMaintenance", "parameters": [ { "name": "id", @@ -30164,22 +43521,28 @@ "type": "string", "format": "uuid" } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -30200,6 +43563,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43603,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30261,15 +43654,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/maintenance": { - "get": { + }, + "put": { "tags": [ "Status Pages" ], - "summary": "List maintenance windows for this status page (paginated)", - "operationId": "listMaintenance", + "summary": "Update a maintenance window", + "operationId": "updateMaintenance", "parameters": [ { "name": "id", @@ -30281,38 +43672,32 @@ } }, { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } - } - }, - { - "name": "pageable", - "in": "query", + "name": "windowId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -30337,6 +43722,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +43762,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30399,12 +43814,12 @@ } } }, - "post": { + "delete": { "tags": [ "Status Pages" ], - "summary": "Schedule a maintenance window", - "operationId": "createMaintenance", + "summary": "Cancel a maintenance window", + "operationId": "deleteMaintenance", "parameters": [ { "name": "id", @@ -30414,31 +43829,33 @@ "type": "string", "format": "uuid" } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" - } - } - }, - "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": { @@ -30447,8 +43864,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -30487,6 +43904,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +43957,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}": { - "get": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "post": { "tags": [ "Status Pages" ], - "summary": "Get a maintenance window with timeline", - "operationId": "getMaintenance", + "summary": "Dismiss a draft maintenance window", + "operationId": "dismissMaintenance", "parameters": [ { "name": "id", @@ -30548,18 +43985,21 @@ } ], "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": { @@ -30568,8 +44008,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -30608,6 +44048,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +44099,15 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "post": { "tags": [ "Status Pages" ], - "summary": "Update a maintenance window", - "operationId": "updateMaintenance", + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", "parameters": [ { "name": "id", @@ -30670,11 +44132,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -30707,18 +44168,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": { @@ -30727,80 +44178,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" - } - } - } - } - } - }, - "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", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { "application/json": { "schema": { @@ -30809,8 +44188,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "404": { + "description": "Not found — the requested resource does not exist", "content": { "application/json": { "schema": { @@ -30819,8 +44198,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": { @@ -30829,8 +44208,8 @@ } } }, - "404": { - "description": "Not found — the requested resource does not exist", + "410": { + "description": "Gone — the resource is no longer available", "content": { "application/json": { "schema": { @@ -30839,8 +44218,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": { @@ -30882,13 +44261,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { "post": { "tags": [ "Status Pages" ], - "summary": "Dismiss a draft maintenance window", - "operationId": "dismissMaintenance", + "summary": "Post a maintenance window timeline update", + "operationId": "postMaintenanceUpdate", "parameters": [ { "name": "id", @@ -30909,9 +44288,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -30933,6 +44329,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44369,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -30996,13 +44422,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { - "post": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { "tags": [ "Status Pages" ], - "summary": "Publish a draft maintenance window", - "operationId": "publishMaintenance", + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", "parameters": [ { "name": "id", @@ -31021,16 +44447,26 @@ "type": "string", "format": "uuid" } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -31038,7 +44474,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -31063,6 +44499,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44539,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31126,13 +44592,14 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { - "post": { + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { "tags": [ "Status Pages" ], - "summary": "Post a maintenance window timeline update", - "operationId": "postMaintenanceUpdate", + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", "parameters": [ { "name": "id", @@ -31144,32 +44611,36 @@ } }, { - "name": "windowId", - "in": "path", - "required": true, + "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" + ] + } } ], - "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/TableValueResultStatusPageNotificationDeliveryDto" } } } @@ -31194,6 +44665,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44705,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31257,13 +44758,13 @@ } } }, - "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { - "patch": { + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "get": { "tags": [ "Status Pages" ], - "summary": "Edit an existing maintenance timeline update body", - "operationId": "patchMaintenanceUpdate", + "summary": "Get a notification delivery receipt", + "operationId": "getNotificationDelivery", "parameters": [ { "name": "id", @@ -31275,16 +44776,7 @@ } }, { - "name": "windowId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "updateId", + "name": "deliveryId", "in": "path", "required": true, "schema": { @@ -31293,23 +44785,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" } } } @@ -31334,6 +44816,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +44856,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31397,14 +44909,14 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries": { - "get": { + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + "post": { "tags": [ "Status Pages" ], - "summary": "List notification delivery receipts", - "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", - "operationId": "listNotificationDeliveries", + "summary": "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", @@ -31416,27 +44928,13 @@ } }, { - "name": "incidentId", - "in": "query", - "required": false, + "name": "deliveryId", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "eventType", - "in": "query", - "required": false, - "schema": { - "type": "string", - "enum": [ - "SUBSCRIPTION_CONFIRMATION", - "INCIDENT_CREATED", - "INCIDENT_UPDATED", - "INCIDENT_RESOLVED" - ] - } } ], "responses": { @@ -31445,7 +44943,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" } } } @@ -31470,6 +44968,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45008,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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,13 +45061,13 @@ } } }, - "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "/api/v1/status-pages/{id}/subscribers": { "get": { "tags": [ "Status Pages" ], - "summary": "Get a notification delivery receipt", - "operationId": "getNotificationDelivery", + "summary": "List subscribers including awaiting confirmation (paginated)", + "operationId": "listSubscribers", "parameters": [ { "name": "id", @@ -31551,12 +45079,11 @@ } }, { - "name": "deliveryId", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], @@ -31566,7 +45093,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" } } } @@ -31591,6 +45118,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45158,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31652,16 +45209,13 @@ } } } - } - }, - "/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", + "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", + "operationId": "addSubscriber", "parameters": [ { "name": "id", @@ -31671,24 +45225,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "deliveryId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminAddSubscriberRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" } } } @@ -31713,6 +45268,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -31743,6 +45308,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -31776,13 +45361,13 @@ } } }, - "/api/v1/status-pages/{id}/subscribers": { - "get": { + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + "delete": { "tags": [ "Status Pages" ], - "summary": "List subscribers including awaiting confirmation (paginated)", - "operationId": "listSubscribers", + "summary": "Remove a subscriber", + "operationId": "removeSubscriber", "parameters": [ { "name": "id", @@ -31794,27 +45379,31 @@ } }, { - "name": "pageable", - "in": "query", + "name": "subscriberId", + "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/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "400": { - "description": "Bad request — the payload failed validation", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { "application/json": { "schema": { @@ -31823,8 +45412,8 @@ } } }, - "401": { - "description": "Unauthorized — missing or invalid credentials", + "402": { + "description": "Payment required — the plan or quota does not allow this", "content": { "application/json": { "schema": { @@ -31863,6 +45452,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +45503,32 @@ } } } - }, - "post": { + } + }, + "/api/v1/synthetics/fleet": { + "get": { "tags": [ - "Status Pages" + "synthetics-inventory-controller" ], - "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", - "operationId": "addSubscriber", + "summary": "Get workspace monitor fleet history and group counts", + "operationId": "fleet", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "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/SingleValueResponseMonitorFleetSummaryDto" } } } @@ -31953,6 +45553,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45593,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32016,36 +45646,24 @@ } } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/synthetics/metrics": { + "get": { "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" - } - } + "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": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSyntheticsFamilyMetricsDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -32067,6 +45685,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45725,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +45778,35 @@ } } }, - "/api/v1/synthetics/metrics": { + "/api/v1/synthetics/metrics/run-durations": { "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", + "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/SingleValueResponseSyntheticsFamilyMetricsDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" } } } @@ -32169,6 +45831,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +45871,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry 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 +45924,20 @@ } } }, - "/api/v1/synthetics/metrics/run-durations": { + "/api/v1/synthetics/regions/status": { "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" - } - } - } + "synthetics-inventory-controller" ], + "summary": "Get public runner-region acceptance status", + "operationId": "regions", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorRunDurationBatchDto" + "$ref": "#/components/schemas/SingleValueResponseRunnerRegionStatusesDto" } } } @@ -32285,6 +45962,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46002,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32353,7 +46060,7 @@ "tags": [ "synthetics-runtime-profile-controller" ], - "operationId": "list_16", + "operationId": "list_17", "responses": { "200": { "description": "OK", @@ -32385,6 +46092,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46132,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32495,6 +46232,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46272,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32564,7 +46331,7 @@ "Tags" ], "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "operationId": "list_4", "parameters": [ { "name": "pageable", @@ -32606,6 +46373,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46413,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32673,7 +46470,7 @@ "Tags" ], "summary": "Create a new tag", - "operationId": "create_4", + "operationId": "create_5", "requestBody": { "content": { "application/json": { @@ -32715,6 +46512,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -32745,6 +46552,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32827,6 +46654,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46694,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -32947,6 +46804,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46844,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33050,6 +46937,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +46977,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33152,6 +47069,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33182,6 +47109,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33272,6 +47219,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47259,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33381,6 +47358,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47398,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33493,6 +47500,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47540,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33596,6 +47633,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +47673,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33716,6 +47783,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -33746,6 +47823,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33871,6 +47968,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48008,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -33974,6 +48101,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48141,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34095,6 +48252,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34125,6 +48292,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34207,6 +48394,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48434,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34328,6 +48545,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48585,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34449,6 +48696,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34489,6 +48746,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34575,6 +48852,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +48892,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34644,7 +48951,7 @@ "Webhooks" ], "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "operationId": "list_3", "parameters": [ { "name": "pageable", @@ -34686,6 +48993,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49033,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34753,7 +49090,7 @@ "Webhooks" ], "summary": "Register a new webhook endpoint", - "operationId": "create_3", + "operationId": "create_4", "requestBody": { "content": { "application/json": { @@ -34795,6 +49132,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -34825,6 +49172,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -34907,6 +49274,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49314,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35027,6 +49424,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35057,6 +49464,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35130,6 +49557,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35160,6 +49597,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35252,6 +49709,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +49749,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35373,6 +49860,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35403,6 +49900,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35475,6 +49992,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35505,6 +50032,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35576,6 +50123,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35606,6 +50163,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35677,6 +50254,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -35707,6 +50294,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35746,7 +50353,7 @@ "Workspaces" ], "summary": "List workspaces", - "operationId": "list_1", + "operationId": "list_2", "parameters": [ { "name": "pageable", @@ -35788,6 +50395,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +50435,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -35855,7 +50492,7 @@ "Workspaces" ], "summary": "Create workspace", - "operationId": "create_2", + "operationId": "create_3", "requestBody": { "content": { "application/json": { @@ -35897,6 +50534,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +50574,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36009,6 +50676,16 @@ } } }, + "402": { + "description": "Payment required — the plan or 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 +50716,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36129,6 +50826,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36159,6 +50866,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36232,6 +50959,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36262,6 +50999,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36354,6 +51111,16 @@ } } }, + "402": { + "description": "Payment required — the plan or quota does not allow this", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "403": { "description": "Forbidden — the actor lacks permission for this resource", "content": { @@ -36384,6 +51151,26 @@ } } }, + "410": { + "description": "Gone — the resource is no longer available", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Too many requests — retry after the window resets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "500": { "description": "Internal server error — see the message field for details", "content": { @@ -36465,6 +51252,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": "Display identity of the actor that activated this head" + }, "AddCustomDomainRequest": { "required": [ "hostname" @@ -36990,6 +51803,7 @@ "createdAt", "key", "name", + "scopes", "id" ], "type": "object", @@ -37019,6 +51833,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 +51862,7 @@ "createdAt", "key", "name", + "scopes", "updatedAt", "id" ], @@ -37075,10 +51910,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 +52164,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 +52198,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 +52215,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 +52384,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 +52472,12 @@ "RESUME", "DELETE", "ADD_TAG", - "REMOVE_TAG" + "REMOVE_TAG", + "UPDATE_SCHEDULE", + "RUN", + "MUTE", + "UNMUTE", + "ACKNOWLEDGE" ] }, "tagIds": { @@ -37540,6 +52497,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 +52543,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", @@ -38047,6 +53078,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 +53125,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 +53640,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 +53817,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 +54153,18 @@ "API" ] }, + "ownerEnforced": { + "type": "boolean", + "description": "Only the managedBy tool may change configuration (default: false)", + "nullable": true + }, + "ownerProject": { + "maxLength": 255, + "minLength": 0, + "type": "string", + "description": "Project the owning tool declares for this monitor, e.g. acme/web", + "nullable": true + }, "environmentId": { "type": "string", "description": "Environment to associate with this monitor. Required for browser and multi-step monitors", @@ -39044,11 +54240,19 @@ "format": "uuid", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" + } + ] + }, + "ownerDeclaration": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/OwnerDeclaration" } ] } @@ -39101,20 +54305,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 +55082,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 +55160,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 +55537,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 +55701,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 +55733,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 +56646,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 +56819,6 @@ }, "ErrorNext": { "type": "object", - "description": "Command and documentation that fix this error", "properties": { "command": { "type": "string", @@ -41405,16 +56832,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 +56967,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 +56983,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 +57008,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 +57078,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 +57129,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 +58763,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 +59349,14 @@ "format": "date-time", "nullable": true }, + "triggeringRun": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, "source": { "minLength": 1, "type": "string", @@ -43772,6 +59674,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 +59799,7 @@ "required": [ "createdAt", "name", + "scopes", "id" ], "type": "object", @@ -43887,6 +59829,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 +59872,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 +60875,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 +61053,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 +61099,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 +61157,7 @@ "organizationId", "frequencySeconds", "enabled", + "ownerEnforced", "muted" ], "type": "object", @@ -45029,6 +61243,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", @@ -45114,10 +61332,325 @@ "unknown" ] }, - "displayHealth": { + "displayHealth": { + "type": "string", + "description": "List and header chip health; not currentStatus and not evaluation state", + "nullable": true, + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "bindingReadiness": { + "type": "string", + "description": "Secret binding state: ready, blocked, or not_applicable", + "nullable": true, + "enum": [ + "ready", + "blocked", + "not_applicable" + ] + }, + "needsAttention": { + "type": "boolean", + "description": "True when the monitor needs operator attention", + "nullable": true + }, + "openIncident": { + "type": "string", + "description": "Open confirmed incident id", + "format": "uuid", + "nullable": true + }, + "lastRunAt": { + "type": "string", + "description": "When the latest code run was enqueued", + "format": "date-time", + "nullable": true + }, + "lastRunId": { + "type": "string", + "description": "Latest code run id", + "format": "uuid", + "nullable": true + }, + "resumesAt": { + "type": "string", + "description": "When a capped monitor resumes", + "format": "date-time", + "nullable": true + }, + "capped": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorCappedDto" + } + ] + }, + "missingKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "blockedKeys": { + "type": "array", + "description": "Secret keys missing while the monitor is blocked", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys missing while the monitor is blocked" + } + }, + "owner": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MonitorOwnerDto" + } + ] + }, + "flakyRate": { + "type": "number", + "description": "Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + "format": "double", + "nullable": true + }, + "flakySince": { + "type": "string", + "description": "When the first retry-passed cycle in the last 7 days finished", + "format": "date-time", + "nullable": true + }, + "flakySeverity": { + "type": "string", + "description": "How flaky the monitor is: LOW, MEDIUM, or HIGH", + "nullable": true, + "enum": [ + "low", + "medium", + "high" + ] + }, + "lastCheckOutcome": { + "type": "string", + "description": "Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + "nullable": true, + "enum": [ + "passed", + "degraded", + "failed" + ] + }, + "lastCheckRegion": { + "type": "string", + "description": "Region of the most recent check", + "nullable": true + }, + "lastFailureSummary": { + "type": "string", + "description": "Why the latest failing region failed", + "nullable": true + }, + "lastStateChangeAt": { + "type": "string", + "description": "When the monitor last changed state: paused, evaluation change, or incident open or resolve", + "format": "date-time", + "nullable": true + }, + "regionHealth": { + "type": "array", + "description": "Latest verdict per region the monitor runs from; null while paused", + "nullable": true, + "items": { + "$ref": "#/components/schemas/MonitorRegionHealthDto" + } + }, + "definitionId": { + "type": "string", + "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", + "format": "uuid", + "nullable": true + }, + "capturePolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CapturePolicy" + } + ] + }, + "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": "List and header chip health; not currentStatus and not evaluation state", - "nullable": true, + "description": "Most severe displayHealth among the monitors with this value", "enum": [ "healthy", "down", @@ -45126,135 +61659,271 @@ "infra", "flaky", "blocked", + "capped", "paused", "never_run", "confirming" ] }, - "bindingReadiness": { + "failing": { + "type": "integer", + "description": "Matching monitors currently failing", + "format": "int64", + "nullable": true + }, + "notRunning": { + "type": "integer", + "description": "Matching monitors currently unable to run", + "format": "int64", + "nullable": true + }, + "flaky": { + "type": "integer", + "description": "Matching running monitors recovered by retry", + "format": "int64", + "nullable": true + }, + "owner": { "type": "string", - "description": "Secret binding state: ready, blocked, or not_applicable", + "description": "Owning tool for a project facet value", "nullable": true, "enum": [ - "ready", - "blocked", - "not_applicable" + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" ] + } + }, + "description": "One value of a facet field" + }, + "MonitorFieldChange": { + "required": [ + "field" + ], + "type": "object", + "properties": { + "field": { + "minLength": 1, + "type": "string", + "description": "Setting that changed" }, - "needsAttention": { - "type": "boolean", - "description": "True when the monitor needs operator attention", + "from": { + "type": "string", + "description": "Previous setting value", "nullable": true }, - "openIncident": { + "to": { "type": "string", - "description": "Open confirmed incident id", - "format": "uuid", + "description": "New setting value", "nullable": true + } + }, + "description": "One non-secret setting changed by a monitor action" + }, + "MonitorFleetSummaryDto": { + "required": [ + "from", + "groups", + "ticks", + "to", + "window", + "openIncidentCount" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Window: 24h, 7d, or 30d" }, - "lastRunAt": { + "from": { "type": "string", - "description": "When the latest code run was enqueued", - "format": "date-time", - "nullable": true + "description": "Inclusive start of the history window", + "format": "date-time" }, - "lastRunId": { + "to": { "type": "string", - "description": "Latest code run id", - "format": "uuid", + "description": "Exclusive end of the history window", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed target checks divided by measured target checks, 0–100", + "format": "double", "nullable": true }, - "definitionId": { + "lastFailureBucketAt": { "type": "string", - "description": "Definition id for a browser or multi-step monitor. Null on probe monitors", - "format": "uuid", + "description": "Start of the most recent failing display bucket", + "format": "date-time", "nullable": true }, - "capturePolicy": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/CapturePolicy" - } - ] - }, - "fastRetryMaxAttempts": { + "openIncidentCount": { "type": "integer", - "description": "Fast-retry max attempts; null/0 = off", - "format": "int32", - "nullable": true - }, - "runParallel": { - "type": "boolean", - "description": "When multiple locations are set, run all of them each interval. False rotates one location per interval", - "nullable": true + "description": "Open confirmed monitor incidents", + "format": "int64" }, - "muted": { - "type": "boolean", - "description": "Whether alert delivery is muted" + "groups": { + "type": "array", + "description": "Current monitor group counts, independent of list filters", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "mutedUntil": { + "ticks": { + "type": "array", + "description": "48 display buckets showing the worst observed monitor outcome", + "items": { + "$ref": "#/components/schemas/MonitorDisplayTickDto" + } + } + }, + "description": "Whole-workspace monitor history and live group counts" + }, + "MonitorHistoryEntryDto": { + "required": [ + "from", + "kind", + "monitorId", + "reason", + "to", + "count" + ], + "type": "object", + "properties": { + "kind": { "type": "string", - "description": "Mute expiry; null means indefinite while muted", - "format": "date-time", - "nullable": true + "description": "Row kind: not_run" }, - "muteReason": { + "monitorId": { "type": "string", - "description": "Optional mute reason", - "nullable": true + "description": "Monitor this row belongs to", + "format": "uuid" }, - "pausedAt": { + "region": { "type": "string", - "description": "When the monitor was paused", - "format": "date-time", + "description": "Region of the skipped ticks; null when they span several regions", "nullable": true }, - "pauseReason": { + "reason": { "type": "string", - "description": "Optional pause reason", - "nullable": true + "description": "Why the ticks were skipped: quota, blocked, or plan_limit" }, - "pauseExpiresAt": { + "from": { "type": "string", - "description": "Pause expiry", - "format": "date-time", - "nullable": true + "description": "First skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineOwnerId": { + "to": { "type": "string", - "description": "Quarantine person owner id", - "nullable": true + "description": "Latest skipped tick in this collapsed row", + "format": "date-time" }, - "quarantineUntil": { - "type": "string", - "description": "Quarantine expiry; non-null means quarantined", - "format": "date-time", - "nullable": true + "count": { + "type": "integer", + "description": "Skipped ticks collapsed into this row", + "format": "int32" }, - "quarantineReason": { + "missingKeys": { + "type": "array", + "description": "Secret keys recorded as missing for this interval", + "nullable": true, + "items": { + "type": "string", + "description": "Secret keys recorded as missing for this interval" + } + }, + "environment": { "type": "string", - "description": "Quarantine reason", + "description": "Environment recorded when these ticks were skipped", "nullable": true + } + }, + "description": "Collapsed scheduled ticks that did not run" + }, + "MonitorHistoryTickDto": { + "required": [ + "at", + "outcome" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Start of the bucket", + "format": "date-time" }, - "upload": { - "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/PackageUploadDto" - } + "outcome": { + "type": "string", + "description": "PASSED when every check passed, FAILED when none did, otherwise DEGRADED", + "enum": [ + "passed", + "degraded", + "failed" ] + } + }, + "description": "Outcome of the checks in one time bucket" + }, + "MonitorListFacetsDto": { + "required": [ + "facets", + "groups" + ], + "type": "object", + "properties": { + "groups": { + "type": "array", + "description": "Count per list group", + "items": { + "$ref": "#/components/schemas/MonitorListGroupDto" + } }, - "usageProjection": { + "facets": { + "type": "array", + "description": "Values and counts per facet field", + "items": { + "$ref": "#/components/schemas/MonitorFacetDto" + } + }, + "sources": { + "type": "array", + "description": "Matching monitors per owning tool and project", "nullable": true, - "allOf": [ - { - "$ref": "#/components/schemas/MonitorUsageProjectionDto" - } + "items": { + "$ref": "#/components/schemas/MonitorSourceSummaryDto" + } + } + }, + "description": "Group and facet counts for the monitors a list filter selects" + }, + "MonitorListGroupDto": { + "required": [ + "key", + "count" + ], + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Group: failing, not_running, flaky, passing, running, or paused", + "enum": [ + "failing", + "not_running", + "flaky", + "passing", + "running", + "paused" ] + }, + "count": { + "type": "integer", + "description": "Monitors in the group", + "format": "int64" } }, - "description": "Full monitor representation" + "description": "Number of monitors in one list group" }, "MonitorOverlayRequest": { "type": "object", @@ -45274,91 +61943,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": [ @@ -45379,6 +62047,86 @@ }, "description": "Monitors that reference this secret for authentication" }, + "MonitorRegionalHealthDto": { + "required": [ + "regions" + ], + "type": "object", + "properties": { + "regionalDisplayHealth": { + "type": "string", + "description": "Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + "nullable": true, + "enum": [ + "healthy", + "down", + "degraded", + "recovering", + "infra", + "flaky", + "blocked", + "capped", + "paused", + "never_run", + "confirming" + ] + }, + "evaluationCycleId": { + "type": "string", + "description": "Cycle used for the regional presentation", + "format": "uuid", + "nullable": true + }, + "regions": { + "type": "array", + "description": "Latest health-voting execution for each configured region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "lastFailure": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RunDto" + } + ] + }, + "failingCycleCount": { + "type": "integer", + "description": "Failing cycles since evaluation changed; null outside retained history", + "format": "int64", + "nullable": true + } + }, + "description": "Regional presentation from runs, independent of incident evaluation" + }, + "MonitorRegionHealthDto": { + "required": [ + "region", + "verdict" + ], + "type": "object", + "properties": { + "region": { + "minLength": 1, + "type": "string", + "description": "Probe region" + }, + "verdict": { + "type": "string", + "description": "Latest verdict: UP, DEGRADED, DOWN, or UNKNOWN when no recent check", + "enum": [ + "up", + "degraded", + "down", + "paused", + "unknown" + ] + } + }, + "description": "Latest verdict for one region of a monitor" + }, "MonitorRunDurationBatchDto": { "required": [ "from", @@ -45475,7 +62223,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 +62247,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 +62270,146 @@ "type": "integer", "description": "Page size (1–100, default 25)", "format": "int32" + }, + "monitorType": { + "type": "string", + "description": "Monitor type: BROWSER or MULTI_STEP_API", + "nullable": true + }, + "incidentId": { + "type": "string", + "description": "Runs in the incident window, intersected with from and to", + "format": "uuid", + "nullable": true + }, + "branch": { + "type": "string", + "description": "Exact branch from revision provenance", + "nullable": true + }, + "flaky": { + "type": "boolean", + "description": "Select monitors currently flaky over the last seven days", + "nullable": true + }, + "sessionId": { + "type": "string", + "description": "Caller-provided CI session identifier", + "nullable": true + }, + "evaluationCycleId": { + "type": "string", + "description": "Only runs in this evaluation cycle, including retries", + "format": "uuid", + "nullable": true + }, + "excludeSource": { + "type": "string", + "description": "Exclude this source; omitted preserves all sources", + "nullable": true + }, + "sort": { + "type": "string", + "description": "Enqueue order: asc or desc (default: desc)", + "nullable": true + }, + "step": { + "minimum": 0, + "type": "integer", + "description": "Zero-based failed step index; requires monitor and caseIndex", + "format": "int32", + "nullable": true + }, + "caseIndex": { + "minimum": 0, + "type": "integer", + "description": "Zero-based case index qualifying the failed step", + "format": "int32", + "nullable": true } }, "required": [ "limit" ] }, + "MonitorRunSeriesDto": { + "required": [ + "buckets", + "from", + "regions", + "to", + "window", + "pointsTruncated" + ], + "type": "object", + "properties": { + "window": { + "type": "string", + "description": "Requested chart window" + }, + "from": { + "type": "string", + "description": "Inclusive start of the chart", + "format": "date-time" + }, + "to": { + "type": "string", + "description": "Exclusive end of the chart", + "format": "date-time" + }, + "uptimePercent": { + "type": "number", + "description": "Passed final target outcomes as a percent of passed and failed", + "format": "double", + "nullable": true + }, + "previousUptimePercent": { + "type": "number", + "description": "Target uptime in the previous equal-length period", + "format": "double", + "nullable": true + }, + "buckets": { + "type": "array", + "description": "Buckets across every selected region", + "items": { + "$ref": "#/components/schemas/Bucket" + } + }, + "regions": { + "type": "array", + "description": "Buckets for each selected region", + "items": { + "$ref": "#/components/schemas/Region" + } + }, + "points": { + "type": "array", + "description": "Latest execution points for 24h; null for longer windows", + "nullable": true, + "items": { + "$ref": "#/components/schemas/Point" + } + }, + "pointsTruncated": { + "type": "boolean", + "description": "More 24h points exist than the returned 2000-point limit" + } + }, + "description": "Execution chart and target-health cycles, read directly from retained runs. Health retries are reduced before assigning a cycle to its initial enqueue bucket; execution durations use their own enqueue window. Both comparison windows use the same current retained-cycle evidence" + }, + "MonitorScheduleDto": { + "type": "object", + "properties": { + "nextRunAt": { + "type": "string", + "description": "When the next scheduled cycle is due for admission", + "format": "date-time", + "nullable": true + } + }, + "description": "Scheduler admission clock for a code monitor" + }, "MonitorSecretRequestsDto": { "required": [ "environment", @@ -45659,6 +62553,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 +62680,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 +62763,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 +62949,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 +63131,7 @@ }, "NearestOtherRegion": { "required": [ - "artifactId", + "finishedAt", "region", "runId" ], @@ -45966,20 +63139,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 +63948,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 +64028,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 +64192,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 +64278,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 +64422,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 +64719,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 +65524,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 +65721,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 +65750,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 +65776,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 +65946,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 +66497,8 @@ "last_pass_same_revision_region", "last_pass_any_revision", "attempts_in_run", - "none" + "none", + "selected_run" ] }, "readsAs": { @@ -48925,6 +66519,14 @@ "items": { "$ref": "#/components/schemas/PickerItem" } + }, + "nearestOtherRegion": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NearestOtherRegion" + } + ] } }, "description": "Step duration diff against a prior pass" @@ -48950,7 +66552,8 @@ "cancelRequested", "stream", "attempt", - "attemptOf" + "attemptOf", + "billable" ], "type": "object", "properties": { @@ -49010,6 +66613,14 @@ "description": "Revision this run executed", "format": "uuid" }, + "revision": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/RevisionDto" + } + ] + }, "region": { "minLength": 1, "type": "string", @@ -49037,6 +66648,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 +66757,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 +66868,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 +67157,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 +67260,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 +67281,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 +67296,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 +67529,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 +67651,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 +67758,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 +68060,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 +68186,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 +68358,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 +68371,7 @@ "minLength": 0, "pattern": "^$|^[A-Za-z0-9._-]+$", "type": "string", - "description": "Runtime pin such as 2026.11; omit to pin the current runtime at create", + "description": "Runtime pin such as 2026.11; omit to pin the newest runtime that can run", "nullable": true } } @@ -51403,6 +69668,17 @@ } } }, + "SingleValueResponseArtifactDownloadDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ArtifactDownloadDto" + } + } + }, "SingleValueResponseAuthMeResponse": { "required": [ "data" @@ -51436,6 +69712,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 +69756,17 @@ } } }, + "SingleValueResponseCreateDraftRevisionResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateDraftRevisionResponse" + } + } + }, "SingleValueResponseDashboardOverviewDto": { "required": [ "data" @@ -51513,6 +69822,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 +69877,17 @@ } } }, + "SingleValueResponseEntitlementResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EntitlementResponse" + } + } + }, "SingleValueResponseEnvironmentDto": { "required": [ "data" @@ -51648,6 +69990,20 @@ } } }, + "SingleValueResponseListRegionDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegionDto" + } + } + } + }, "SingleValueResponseListUUID": { "required": [ "data" @@ -51722,6 +70078,17 @@ } } }, + "SingleValueResponseMonitorBatchHistoryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorBatchHistoryDto" + } + } + }, "SingleValueResponseMonitorDriftDto": { "required": [ "data" @@ -51744,6 +70111,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 +70166,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 +70243,17 @@ } } }, + "SingleValueResponseMonitorValidationResultDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorValidationResultDto" + } + } + }, "SingleValueResponseMonitorVersionDto": { "required": [ "data" @@ -51887,25 +70320,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 +70408,17 @@ } } }, + "SingleValueResponseRevisionFilesDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RevisionFilesDto" + } + } + }, "SingleValueResponseRollbackPreviewDto": { "required": [ "data" @@ -52030,6 +70474,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 +70507,17 @@ } } }, + "SingleValueResponseRunTraceSummaryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RunTraceSummaryDto" + } + } + }, "SingleValueResponseSecretAuditDto": { "required": [ "data" @@ -52316,6 +70793,17 @@ } } }, + "SingleValueResponseTriggerRunsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerRunsResponse" + } + } + }, "SingleValueResponseUptimeDto": { "required": [ "data" @@ -52753,6 +71241,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 +72297,9 @@ } } }, + "StreamingResponseBody": { + "type": "object" + }, "Summary": { "required": [ "id", @@ -54397,103 +72935,7 @@ } } }, - "TableValueResultMemberDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MemberDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultMonitorDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MonitorDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultMonitorVersionDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MonitorVersionDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultNotificationDispatchDto": { + "TableValueResultMemberDto": { "required": [ "data", "hasNext", @@ -54504,7 +72946,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationDispatchDto" + "$ref": "#/components/schemas/MemberDto" } }, "hasNext": { @@ -54525,7 +72967,7 @@ } } }, - "TableValueResultNotificationDto": { + "TableValueResultMonitorDto": { "required": [ "data", "hasNext", @@ -54536,7 +72978,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationDto" + "$ref": "#/components/schemas/MonitorDto" } }, "hasNext": { @@ -54557,7 +72999,7 @@ } } }, - "TableValueResultNotificationPolicyDto": { + "TableValueResultMonitorVersionDto": { "required": [ "data", "hasNext", @@ -54568,7 +73010,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationPolicyDto" + "$ref": "#/components/schemas/MonitorVersionDto" } }, "hasNext": { @@ -54589,7 +73031,7 @@ } } }, - "TableValueResultResourceGroupDto": { + "TableValueResultNotificationDispatchDto": { "required": [ "data", "hasNext", @@ -54600,7 +73042,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ResourceGroupDto" + "$ref": "#/components/schemas/NotificationDispatchDto" } }, "hasNext": { @@ -54621,7 +73063,7 @@ } } }, - "TableValueResultRevisionDto": { + "TableValueResultNotificationDto": { "required": [ "data", "hasNext", @@ -54632,7 +73074,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RevisionDto" + "$ref": "#/components/schemas/NotificationDto" } }, "hasNext": { @@ -54653,7 +73095,7 @@ } } }, - "TableValueResultRuleEvaluationDto": { + "TableValueResultNotificationPolicyDto": { "required": [ "data", "hasNext", @@ -54664,7 +73106,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RuleEvaluationDto" + "$ref": "#/components/schemas/NotificationPolicyDto" } }, "hasNext": { @@ -54685,7 +73127,7 @@ } } }, - "TableValueResultRunArtifactDto": { + "TableValueResultResourceGroupDto": { "required": [ "data", "hasNext", @@ -54696,7 +73138,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RunArtifactDto" + "$ref": "#/components/schemas/ResourceGroupDto" } }, "hasNext": { @@ -54717,7 +73159,7 @@ } } }, - "TableValueResultRunCaseDto": { + "TableValueResultRevisionDto": { "required": [ "data", "hasNext", @@ -54728,7 +73170,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RunCaseDto" + "$ref": "#/components/schemas/RevisionDto" } }, "hasNext": { @@ -54749,7 +73191,7 @@ } } }, - "TableValueResultRunDto": { + "TableValueResultRuleEvaluationDto": { "required": [ "data", "hasNext", @@ -54760,7 +73202,71 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RunDto" + "$ref": "#/components/schemas/RuleEvaluationDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultRunArtifactDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RunArtifactDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultRunCaseDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RunCaseDto" } }, "hasNext": { @@ -56040,6 +74546,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 +74653,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 +75506,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 +75597,29 @@ "description": "Run every location each interval; false rotates one. Null preserves current", "nullable": true }, - "package": { + "code": { "nullable": true, "allOf": [ { - "$ref": "#/components/schemas/MonitorPackageSpec" + "$ref": "#/components/schemas/MonitorCodeSpec" } ] }, + "acknowledgeRollback": { + "type": "string", + "description": "Rolled-back digest this code publish re-applies on purpose", + "nullable": true + }, "status": { "type": "string", "description": "Not writable; use pause or resume", "nullable": true + }, + "expectedUpdatedAt": { + "type": "string", + "description": "Last updatedAt this edit was based on; null skips the check", + "format": "date-time", + "nullable": true } } }, @@ -58131,6 +76795,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..d946309 100644 --- a/src/devhelm/_generated.py +++ b/src/devhelm/_generated.py @@ -423,6 +423,16 @@ class ApiKeyCreateResponse(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None class ApiKeyDto(BaseModel): @@ -463,6 +473,25 @@ class ApiKeyDto(BaseModel): description="Timestamp when the key expires; null if no expiration", ), ] = None + scopes: Annotated[ + list[str], + Field(description="Scopes this key is allowed to call; full grants everything"), + ] + tool: Annotated[ + str | None, + Field( + description="Tool this key writes as on owner-enforced monitors; null means API" + ), + ] = None + + +class ArtifactDownloadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + url: Annotated[str, Field(description="Signed GET URL for the artifact bytes")] + expires_at: Annotated[ + AwareDatetime, + Field(alias="expiresAt", description="When the signed URL stops working"), + ] class ArtifactViewport(BaseModel): @@ -554,12 +583,95 @@ class BrowserCapabilityEnvelope(BaseModel): upload: Annotated[bool, Field(description="File upload is enabled")] +class Bucket(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start: Annotated[ + AwareDatetime, Field(description="Inclusive clock-aligned bucket start") + ] + passed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt passed") + ] + failed: Annotated[ + int, Field(description="Health-voting region cycles whose final attempt failed") + ] + timed_out: Annotated[ + int, + Field( + alias="timedOut", description="Region cycles whose final attempt timed out" + ), + ] + couldnt_run: Annotated[ + int, + Field( + alias="couldntRun", + description="Region cycles with a final non-target outcome", + ), + ] + passed_on_retry: Annotated[ + int, + Field( + alias="passedOnRetry", + description="Passed cycles that had an earlier failed attempt", + ), + ] + duration_samples: Annotated[ + int, + Field( + alias="durationSamples", + description="Executions with a completed duration in this bucket", + ), + ] + p50_ms: Annotated[ + float | None, + Field( + alias="p50Ms", + description="Median duration of completed executions in milliseconds", + ), + ] = None + p95_ms: Annotated[ + float | None, + Field( + alias="p95Ms", + description="p95 duration of completed executions in milliseconds", + ), + ] = None + + class Action(StrEnum): pause = "PAUSE" resume = "RESUME" delete = "DELETE" add_tag = "ADD_TAG" remove_tag = "REMOVE_TAG" + update_schedule = "UPDATE_SCHEDULE" + run = "RUN" + mute = "MUTE" + unmute = "UNMUTE" + acknowledge = "ACKNOWLEDGE" + + +class BundleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + digest: Annotated[ + str, + Field( + description="Closure digest, sha256:. Same files always return this value", + min_length=1, + ), + ] + upload_digest: Annotated[ + str, + Field( + alias="uploadDigest", + description="Digest of every file that was sent, before import closure", + min_length=1, + ), + ] + files: Annotated[list[str], Field(description="Files in the import closure")] + keys: Annotated[ + list[str], Field(description="Secret names detected in the closure") + ] + size: Annotated[int, Field(description="Uncompressed closure size in bytes")] class Screenshots(StrEnum): @@ -689,18 +801,35 @@ class CodeCheckStep(BaseModel): ] = None -class CodeTestTargetRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - environment_id: Annotated[ - UUID | None, +class CodeSource(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + repo: Annotated[ + str | None, Field( - alias="environmentId", - description="Environment to test against; null uses the monitor's environment", + description="Repository that produced this code", + max_length=512, + min_length=0, ), ] = None - region: Annotated[ + branch: Annotated[ str | None, - Field(description="Region for this test; null uses the monitor's first region"), + Field( + description="Branch that produced this code", max_length=255, min_length=0 + ), + ] = None + commit: Annotated[ + str | None, + Field( + description="Commit that produced this code", max_length=64, min_length=0 + ), + ] = None + file: Annotated[ + str | None, + Field( + description="Declaring file in that repository", + max_length=512, + min_length=0, + ), ] = None @@ -939,6 +1068,14 @@ class ManagedBy(StrEnum): api = "API" +class Tool(StrEnum): + dashboard = "DASHBOARD" + cli = "CLI" + terraform = "TERRAFORM" + mcp = "MCP" + api = "API" + + class CreateApiKeyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -956,6 +1093,21 @@ class CreateApiKeyRequest(BaseModel): description="Optional expiration timestamp in ISO 8601 format", ), ] = None + preset: Annotated[ + str | None, + Field( + description="Preset expanded into scopes: ci-pr, ci-deploy, agent-responder, agent-author" + ), + ] = None + scopes: Annotated[ + list[str] | None, Field(description="Scopes to grant (default: full)") + ] = None + tool: Annotated[ + Tool | None, + Field( + description="Tool this key writes as on owner-enforced monitors (default: API)" + ), + ] = None class Severity(StrEnum): @@ -963,6 +1115,44 @@ class Severity(StrEnum): warn = "warn" +class CreateBundleRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + files: Annotated[ + dict[str, str], + Field(description="Path to UTF-8 text. Paths are relative to the bundle root"), + ] + entrypoint: Annotated[ + str | None, + Field( + description="File that runs. Omit when the map is already the import closure", + max_length=512, + min_length=0, + ), + ] = None + runtime_id: Annotated[ + str | None, + Field( + alias="runtimeId", + description="Runtime used to refuse imports. Omit for the newest runtime that can run", + max_length=32, + min_length=0, + ), + ] = None + + +class CreateDeviceAuthorizationRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + client_name: Annotated[ + str, + Field( + alias="clientName", + description="Client name stored on the minted API key, e.g. devhelm-cli on mbp (max 190)", + max_length=190, + min_length=0, + ), + ] + + class Kind(StrEnum): assigned = "assigned" custom = "custom" @@ -1127,18 +1317,6 @@ class Type(StrEnum): multi_step_api = "MULTI_STEP_API" -class CreatePackageUploadRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - digest: Annotated[ - str, - Field( - description="SHA-256 hex digest of the package zip to upload (64 chars)", - max_length=64, - min_length=64, - ), - ] - - class HealthThresholdType(StrEnum): count = "COUNT" # type: ignore[assignment] percentage = "PERCENTAGE" @@ -1679,32 +1857,6 @@ class DeliveryAttemptDto(BaseModel): attempted_at: Annotated[AwareDatetime, Field(alias="attemptedAt")] -class DemandedKeyLocation(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - key: Annotated[ - str, - Field(description="Secret name the code reads", max_length=255, min_length=0), - ] - declaring_file: Annotated[ - str | None, - Field( - alias="declaringFile", - description="Declaring file path inside the zip", - max_length=512, - min_length=0, - ), - ] = None - declaring_location: Annotated[ - str | None, - Field( - alias="declaringLocation", - description="Call site from package scan, e.g. signIn(…) · line 6", - max_length=255, - min_length=0, - ), - ] = None - - class DeployLockDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique lock identifier")] @@ -1729,6 +1881,86 @@ class DeployLockDto(BaseModel): ] +class DeviceAuthorizationDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + device_code: Annotated[ + str, + Field( + alias="deviceCode", + description="Secret code the CLI sends when polling for the API key", + min_length=1, + ), + ] + user_code: Annotated[ + str, + Field( + alias="userCode", + description="Short code the user confirms in the dashboard, e.g. ABCD-EFGH", + min_length=1, + ), + ] + verification_uri: Annotated[ + str, + Field( + alias="verificationUri", + description="Dashboard page where the user enters the code", + min_length=1, + ), + ] + verification_uri_complete: Annotated[ + str, + Field( + alias="verificationUriComplete", + description="Dashboard page with the user code already filled in", + min_length=1, + ), + ] + expires_in: Annotated[ + int, Field(alias="expiresIn", description="Seconds until the codes expire") + ] + interval: Annotated[int, Field(description="Minimum seconds between token polls")] + + +class DeviceTokenDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + status: Annotated[str, Field(description="Poll outcome")] + interval: Annotated[int, Field(description="Minimum seconds before the next poll")] + api_key: Annotated[ + str | None, + Field( + alias="apiKey", + description="Minted API key, returned once with status complete", + ), + ] = None + organization_id: Annotated[ + int | None, + Field( + alias="organizationId", + description="Organization that owns the minted API key", + ), + ] = None + workspace_id: Annotated[ + int | None, + Field( + alias="workspaceId", + description="Workspace chosen when the login was approved", + ), + ] = None + + +class DeviceTokenRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + device_code: Annotated[ + str, + Field( + alias="deviceCode", + description="Device code returned when the login was started", + max_length=128, + min_length=0, + ), + ] + + class DiscordChannelConfig(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) channel_type: Annotated[Literal["discord"], Field(alias="channelType")] = "discord" @@ -2109,6 +2341,47 @@ class EntitlementDto(BaseModel): ] +class EntitlementResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + tier: Annotated[str, Field(description="Resolved billing plan tier")] + entitlements: Annotated[ + dict[str, EntitlementDto], + Field(description="All entitlements keyed by entitlement key"), + ] + usage: Annotated[ + dict[str, int], + Field( + description="Current usage counters keyed by entitlement key (only for countable resources)" + ), + ] + trial_active: Annotated[ + bool, + Field( + alias="trialActive", description="Whether the org is currently on a trial" + ), + ] + trial_expires_at: Annotated[ + AwareDatetime | None, + Field( + alias="trialExpiresAt", + description="Trial expiry date (null if not trialing)", + ), + ] = None + subscription_status: Annotated[ + str | None, + Field( + alias="subscriptionStatus", + description="Current subscription status (null if no subscription)", + ), + ] = None + usage_period_start: Annotated[ + AwareDatetime, + Field( + alias="usagePeriodStart", description="Start of the current usage window" + ), + ] + + class EnvironmentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique environment identifier")] @@ -2323,11 +2596,9 @@ class ErrorResponse(BaseModel): description="Why permission was refused: scope or role", examples=["role"] ), ] = None - next: Annotated[ - ErrorNext | None, Field(description="Command and docs that fix this error") - ] = None + next: ErrorNext | None = None details: Annotated[ - dict[str, Any] | None, + dict[str, dict[str, Any]] | None, Field( description="Extra fields for this error, such as a missing secret key and environment" ), @@ -2377,12 +2648,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 +3526,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 +3687,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 +3709,16 @@ class LinearChannelConfig(BaseModel): ] = None +class LinkedIncidentDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Incident identifier")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor the incident belongs to") + ] + status: Annotated[str, Field(description="Incident status")] + title: Annotated[str | None, Field(description="Incident title")] = None + + class LinkedStatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[ @@ -3846,201 +4140,329 @@ class MonitorAuthDto(BaseModel): config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig -class MonitorDriftFieldDto(BaseModel): +class MonitorCappedDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - field: Annotated[ - str, - Field( - description="Field name: enabled, muted, quarantine, or managedBy", - min_length=1, - ), - ] - live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] - declared: Annotated[ - str, Field(description="Implied declared / IaC baseline", min_length=1) - ] - - -class MonitorOverlayRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - reason: Annotated[ - str | None, - Field( - description="Optional human-readable reason (max 280)", - max_length=280, - min_length=0, - ), - ] = None - expires_at: Annotated[ + resumes_at: Annotated[ AwareDatetime | None, - Field(alias="expiresAt", description="When this overlay expires"), + Field(alias="resumesAt", description="When runs resume; null when unknown"), ] = None -class File(RootModel[str]): - root: Annotated[ +class MonitorCodeSpec(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + bundle: Annotated[ str, Field( - description="Relative file paths included in the zip", - max_length=512, + description="Closure digest from POST /bundles (sha256:)", + max_length=80, min_length=0, + pattern="^sha256:[a-f0-9]{64}$", ), ] - - -class Key(RootModel[str]): - root: Annotated[ + entrypoint: Annotated[ str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=255, + description="File that runs, relative to the bundle root", + max_length=512, min_length=0, ), ] + source: CodeSource | None = None -class MonitorPackageSpec(BaseModel): +class MonitorDisplayTickDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - digest: Annotated[ + at: Annotated[AwareDatetime, Field(description="Inclusive start of this bucket")] + outcome: Annotated[ str, Field( - description="SHA-256 hex digest of the package zip (64 characters)", - max_length=64, - min_length=64, + description="passed, failed, degraded, timed_out, passed_on_retry, couldnt_run, skipped, or no_data" ), ] - entrypoint: Annotated[ - str, + run_id: Annotated[ + UUID | None, + Field(alias="runId", description="Representative run to open for this bucket"), + ] = None + failing_regions: Annotated[ + list[str], Field( - description="Entrypoint path inside the zip, e.g. tests/login.spec.ts", - max_length=512, - min_length=0, + alias="failingRegions", + description="Regions with a target failure in this bucket", ), ] - files: Annotated[ - list[File], + retry_pass_count: Annotated[ + int, Field( - description="Relative file paths included in the zip", - max_length=256, - min_length=0, + alias="retryPassCount", + description="Region cycles that passed after retry in this bucket", ), ] - keys: Annotated[ - list[Key] | None, + + +class MonitorDriftCodeDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + live_digest: Annotated[ + str, Field( - description="Secret names the zip demanded. PUT: null preserves, [] clears", - max_length=64, - min_length=0, + alias="liveDigest", + description="Digest of the code revision running now", + min_length=1, ), - ] = None - git_sha: Annotated[ - str | None, + ] + git_digest: Annotated[ + str, Field( - alias="gitSha", - description="Commit SHA from the repo that produced this zip. Client-supplied provenance only", - max_length=64, - min_length=0, + alias="gitDigest", + description="Digest of the code revision last applied from Git", + min_length=1, ), - ] = None - git_message: Annotated[ - str | None, + ] + drifted: Annotated[ + bool, Field(description="Whether the live digest differs from the Git digest") + ] + + +class MonitorDriftFieldDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[ + str, Field( - alias="gitMessage", - description="Commit message from the repo that produced this zip", - max_length=1024, - min_length=0, + description="Field name: enabled, muted, quarantine, or managedBy", + min_length=1, ), - ] = None - git_file: Annotated[ - str | None, + ] + live: Annotated[str, Field(description="Live value on the monitor", min_length=1)] + declared: Annotated[ + str, Field(description="Implied declared / IaC baseline", min_length=1) + ] + + +class MonitorFacetValueDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + value: Annotated[ + str, Field( - alias="gitFile", - description="Path of the declaring file in that repo", - max_length=512, - min_length=0, + description="Value as the list filter takes it: type name, environment id, region, tag name, or owner", + min_length=1, ), - ] = None - authored_by: Annotated[ - str | None, + ] + count: Annotated[int, Field(description="Monitors with this value")] + worst_state: Annotated[ + str, Field( - alias="authoredBy", - description="Author attribution supplied with the package", - max_length=255, - min_length=0, + alias="worstState", + description="Most severe displayHealth among the monitors with this value", ), + ] + failing: Annotated[ + int | None, Field(description="Matching monitors currently failing") ] = None - key_locations: Annotated[ - list[DemandedKeyLocation] | None, + not_running: Annotated[ + int | None, Field( - alias="keyLocations", - description="Per-key declaring file and location from package scan", - max_length=64, - min_length=0, + alias="notRunning", description="Matching monitors currently unable to run" ), ] = None + flaky: Annotated[ + int | None, Field(description="Matching running monitors recovered by retry") + ] = None + owner: Annotated[ + str | None, Field(description="Owning tool for a project facet value") + ] = None -class MonitorReference(BaseModel): +class MonitorFieldChange(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Monitor identifier")] - name: Annotated[str, Field(description="Monitor name")] + field: Annotated[str, Field(description="Setting that changed", min_length=1)] + from_: Annotated[ + str | None, Field(alias="from", description="Previous setting value") + ] = None + to: Annotated[str | None, Field(description="New setting value")] = None -class MonitorRunDurationMetricDto(BaseModel): +class MonitorHistoryEntryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) + kind: Annotated[str, Field(description="Row kind: not_run")] monitor_id: Annotated[ - UUID, Field(alias="monitorId", description="Monitor identifier") - ] - sample_count: Annotated[ - int, - Field( - alias="sampleCount", description="Finished runs with a measured duration" - ), + UUID, Field(alias="monitorId", description="Monitor this row belongs to") ] - p50_duration_ms: Annotated[ - float | None, + region: Annotated[ + str | None, Field( - alias="p50DurationMs", - description="Median execution duration in milliseconds", + description="Region of the skipped ticks; null when they span several regions" ), ] = None - - -class MonitorRunDurationSummaryDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) + reason: Annotated[ + str, + Field(description="Why the ticks were skipped: quota, blocked, or plan_limit"), + ] from_: Annotated[ AwareDatetime, - Field(alias="from", description="Inclusive start of the enqueue-time window"), + Field(alias="from", description="First skipped tick in this collapsed row"), ] to: Annotated[ - AwareDatetime, Field(description="Exclusive end of the enqueue-time window") - ] - sample_count: Annotated[ - int, - Field( - alias="sampleCount", - description="Number of finished runs with a measured execution duration", - ), + AwareDatetime, Field(description="Latest skipped tick in this collapsed row") ] - p50_duration_ms: Annotated[ - float | None, + count: Annotated[int, Field(description="Skipped ticks collapsed into this row")] + missing_keys: Annotated[ + list[str] | None, Field( - alias="p50DurationMs", - description="Median execution duration in milliseconds; null when no durations were measured", + alias="missingKeys", + description="Secret keys recorded as missing for this interval", ), ] = None - - -class MonitorRunListParams(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - phase: Annotated[ + environment: Annotated[ str | None, - Field(description="Filter by run phase; not_finished excludes finished runs"), + 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 | None, + 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[ + UUID, Field(alias="monitorId", description="Monitor identifier") + ] + sample_count: Annotated[ + int, + Field( + alias="sampleCount", description="Finished runs with a measured duration" + ), + ] + p50_duration_ms: Annotated[ + float | None, + Field( + alias="p50DurationMs", + description="Median execution duration in milliseconds", + ), + ] = None + + +class MonitorRunDurationSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the enqueue-time window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Exclusive end of the enqueue-time window") + ] + sample_count: Annotated[ + int, + Field( + alias="sampleCount", + description="Number of finished runs with a measured execution duration", + ), + ] + p50_duration_ms: Annotated[ + float | None, + Field( + alias="p50DurationMs", + description="Median execution duration in milliseconds; null when no durations were measured", + ), + ] = None + + +class MonitorRunListParams(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + phase: Annotated[ + str | None, + Field(description="Filter by run phase; not_finished excludes finished runs"), + ] = None + outcome: Annotated[ + str | None, Field( - description="Filter by outcome; not_passed also includes passed-on-retry runs" + description="Outcomes, repeated or comma-separated; not_passed includes retries" ), ] = None region: Annotated[str | None, Field(description="Filter by probe region")] = None @@ -4052,6 +4474,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 +4494,73 @@ class MonitorRunListParams(BaseModel): limit: Annotated[ int, Field(description="Page size (1–100, default 25)", ge=1, le=100) ] + monitor_type: Annotated[ + str | None, + Field( + alias="monitorType", description="Monitor type: BROWSER or MULTI_STEP_API" + ), + ] = None + incident_id: Annotated[ + UUID | None, + Field( + alias="incidentId", + description="Runs in the incident window, intersected with from and to", + ), + ] = None + branch: Annotated[ + str | None, Field(description="Exact branch from revision provenance") + ] = None + flaky: Annotated[ + bool | None, + Field(description="Select monitors currently flaky over the last seven days"), + ] = None + session_id: Annotated[ + str | None, + Field(alias="sessionId", description="Caller-provided CI session identifier"), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Only runs in this evaluation cycle, including retries", + ), + ] = None + exclude_source: Annotated[ + str | None, + Field( + alias="excludeSource", + description="Exclude this source; omitted preserves all sources", + ), + ] = None + sort: Annotated[ + str | None, Field(description="Enqueue order: asc or desc (default: desc)") + ] = None + step: Annotated[ + int | None, + Field( + description="Zero-based failed step index; requires monitor and caseIndex", + ge=0, + ), + ] = None + case_index: Annotated[ + int | None, + Field( + alias="caseIndex", + description="Zero-based case index qualifying the failed step", + ge=0, + ), + ] = None + + +class MonitorScheduleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + next_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="nextRunAt", + description="When the next scheduled cycle is due for admission", + ), + ] = None class MonitorSessionDto(BaseModel): @@ -4138,6 +4638,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 +4703,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 +4809,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 +5271,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 +5334,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 +5442,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 +5471,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 +5577,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 +5798,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 +6094,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 +6183,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 +6220,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 +6424,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 +6497,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 +6532,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 +6550,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 +6560,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 +6656,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, - Field( - alias="matchingRunCount", - description="Runs matching the complete list filter", - ), - ] - duration_sample_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="durationSampleCount", - description="Finished matching runs with a measured execution duration", + description="ok when both code-monitor types have an active accepting pool; otherwise degraded" ), ] - p95_duration_ms: Annotated[ - float | None, - Field( - alias="p95DurationMs", - description="95th percentile execution duration in milliseconds; null when no durations were measured", - ), - ] = None - evidence_eligible_run_count: Annotated[ - int, - Field( - alias="evidenceEligibleRunCount", - description="Runs with a known capture policy", - ), - ] - evidence_unknown_policy_run_count: Annotated[ - int, - Field( - alias="evidenceUnknownPolicyRunCount", - description="Runs with a missing or incomplete capture policy", - ), + + +class RunnerRegionStatusesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regions: Annotated[ + list[RunnerRegionStatusDto], + Field(description="Acceptance status per public region"), ] - evidence_incomplete_run_count: Annotated[ - int | None, - Field( - alias="evidenceIncompleteRunCount", - description="Eligible runs with required evidence missing, processing, failed, or expired", - ), + + +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_processing_run_count: Annotated[ - int | None, - Field( - alias="evidenceProcessingRunCount", - description="Eligible runs with required evidence still processing", - ), + failed: Annotated[ + bool | None, Field(description="Only rows with status >= 400 or a failure") ] = None - evidence_no_evidence_policy_run_count: Annotated[ - int | None, - Field( - alias="evidenceNoEvidencePolicyRunCount", - description="Eligible runs with no evidence required by their recorded policy", - ), + slow: Annotated[ + bool | None, Field(description="Only rows with durationMs >= 1000") ] = None - evidence_complete_run_count: Annotated[ - int | None, - Field( - alias="evidenceCompleteRunCount", - description="Eligible runs with all required evidence available", - ), + step_id: Annotated[ + str | None, Field(alias="stepId", description="Only rows for this step") ] = None - available_artifact_count: Annotated[ - int | None, - Field( - alias="availableArtifactCount", - description="Required artifact records with an available unexpired object key", - ), + xhr: Annotated[ + bool | None, Field(description="Only xhr, fetch, and api resource types") ] = None - processing_artifact_count: Annotated[ - int | None, + source: Annotated[str | None, Field(description="page or request")] = None + cursor: Annotated[ + str | None, Field(description="Opaque cursor from the previous page") + ] = 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 +6825,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 +6900,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 +7009,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 +7022,7 @@ class ScriptMonitorConfig(BaseModel): str | None, Field( alias="runtimeId", - description="Runtime pin such as 2026.11; omit to pin the current runtime at create", + description="Runtime pin such as 2026.11; omit to pin the newest runtime that can run", max_length=32, min_length=0, pattern="^$|^[A-Za-z0-9._-]+$", @@ -6786,6 +7589,16 @@ class SingleValueResponseApiKeyDto(BaseModel): data: ApiKeyDto +class SingleValueResponseArtifactDownloadDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: ArtifactDownloadDto + + +class SingleValueResponseBundleDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: BundleDto + + class SingleValueResponseDekRotationResultDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: DekRotationResultDto @@ -6796,6 +7609,16 @@ class SingleValueResponseDeployLockDto(BaseModel): data: DeployLockDto +class SingleValueResponseDeviceAuthorizationDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DeviceAuthorizationDto + + +class SingleValueResponseDeviceTokenDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DeviceTokenDto + + class SingleValueResponseEmailDomainDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: EmailDomainDto @@ -6806,14 +7629,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 +7654,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 +7684,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 +7709,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 +7729,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 +7744,9 @@ class SingleValueResponseResultSummaryDto(BaseModel): data: ResultSummaryDto -class SingleValueResponseRevisionDto(BaseModel): +class SingleValueResponseRevisionFilesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RevisionDto + data: RevisionFilesDto class SingleValueResponseRunConsoleDto(BaseModel): @@ -6921,19 +7754,19 @@ class SingleValueResponseRunConsoleDto(BaseModel): data: RunConsoleDto -class SingleValueResponseRunDiffDto(BaseModel): +class SingleValueResponseRunnerRegionStatusesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunDiffDto + data: RunnerRegionStatusesDto -class SingleValueResponseRunMetricsSummaryDto(BaseModel): +class SingleValueResponseRuntimeProfileDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RunMetricsSummaryDto + data: RuntimeProfileDto -class SingleValueResponseRuntimeProfileDto(BaseModel): +class SingleValueResponseRunTraceSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: RuntimeProfileDto + data: RunTraceSummaryDto class SingleValueResponseSecretDto(BaseModel): @@ -7134,21 +7967,54 @@ class StatusEventDto(BaseModel): ] = None -class StatusPageBoundComponentDto(BaseModel): +class StatusPageBindingSnapshot(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - component_id: Annotated[ - UUID, Field(alias="componentId", description="Component identifier") + 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") ] - component_name: Annotated[ - str, + display_order: Annotated[ + int, + Field(alias="displayOrder", description="Position within the page or group"), + ] + exclude_from_overall: Annotated[ + bool, Field( - alias="componentName", description="Component display name", min_length=1 + alias="excludeFromOverall", + description="Whether to exclude this component from overall status", ), ] - status_page_id: Annotated[ - UUID, - Field(alias="statusPageId", description="Status page that owns this component"), - ] + 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[ + UUID, Field(alias="componentId", description="Component identifier") + ] + component_name: Annotated[ + str, + Field( + alias="componentName", description="Component display name", min_length=1 + ), + ] + status_page_id: Annotated[ + UUID, + Field(alias="statusPageId", description="Status page that owns this component"), + ] status_page_name: Annotated[ str, Field( @@ -7585,6 +8451,10 @@ class StatusPageSubscriberDto(BaseModel): ] +class StreamingResponseBody(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + + class Summary(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7795,15 +8665,6 @@ class TableValueResultNotificationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRevisionDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RevisionDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - class TableValueResultRuleEvaluationDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[RuleEvaluationDto] @@ -8259,6 +9120,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 +9219,52 @@ class TriggerRule(BaseModel): ] = None +class TriggerRunRef(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Run identifier")] + region: Annotated[str, Field(description="Probe region for this run", min_length=1)] + phase: Annotated[str, Field(description="Current run phase")] + url: Annotated[str, Field(description="API path for this run", min_length=1)] + + +class TriggerRunRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + regions: Annotated[ + list[str] | None, + Field( + description="Regions to run; empty or omitted runs every configured region" + ), + ] = None + signal: Annotated[ + bool | None, + Field( + description="Count these runs toward health and incidents (default: false)" + ), + ] = None + session: RunSessionContext | None = None + + +class TriggerRunsResponse(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + trigger_id: Annotated[ + UUID, + Field( + alias="triggerId", + description="Groups every run started by this trigger; scheduled runs group by evaluation cycle instead", + ), + ] + billed_runs: Annotated[ + int, + Field( + alias="billedRuns", + description="Runs billed for this trigger, one per region", + ), + ] + runs: Annotated[ + list[TriggerRunRef], Field(description="Queued runs, one per region") + ] + + class UpdateAlertSensitivityRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) alert_sensitivity: Annotated[ @@ -9617,6 +10558,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 +10983,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 +11032,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 +11089,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 +11114,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 +11191,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 +11349,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 +11400,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 +11463,10 @@ 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 class CreateResourceGroupRequest(BaseModel): @@ -10659,6 +11700,26 @@ class CreditPolicy(BaseModel): ] = None +class CursorPageMonitorHistoryEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[ + list[MonitorHistoryEntryDto], Field(description="Items on this page") + ] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + class CursorPageNotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[ @@ -10757,26 +11818,6 @@ class DashboardOverviewDto(BaseModel): incidents: IncidentsSummaryDto -class DefinitionHeadDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - definition_id: Annotated[ - UUID, Field(alias="definitionId", description="Definition this Head belongs to") - ] - environment: EnvironmentDto - revision: RevisionDto - activated_at: Annotated[ - AwareDatetime, - Field(alias="activatedAt", description="When this Head last activated"), - ] - activated_by: Annotated[ - str | None, - Field(alias="activatedBy", description="Who last activated this Head"), - ] = None - reason: Annotated[ - str | None, Field(description="Rollback reason when this Head was restored") - ] = None - - class EmailMessageDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Message id")] @@ -11157,6 +12198,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 +12470,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,6 +12609,46 @@ class MonitorRunDurationBatchDto(BaseModel): ] +class MonitorRunSeriesDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + window: Annotated[str, Field(description="Requested chart window")] + from_: Annotated[ + AwareDatetime, Field(alias="from", description="Inclusive start of the chart") + ] + to: Annotated[AwareDatetime, Field(description="Exclusive end of the chart")] + uptime_percent: Annotated[ + float | None, + Field( + alias="uptimePercent", + description="Passed final target outcomes as a percent of passed and failed", + ), + ] = None + previous_uptime_percent: Annotated[ + float | None, + Field( + alias="previousUptimePercent", + description="Target uptime in the previous equal-length period", + ), + ] = None + buckets: Annotated[ + list[Bucket], Field(description="Buckets across every selected region") + ] + regions: Annotated[ + list[Region], Field(description="Buckets for each selected region") + ] + points: Annotated[ + list[Point] | None, + Field(description="Latest execution points for 24h; null for longer windows"), + ] = None + points_truncated: Annotated[ + bool, + Field( + alias="pointsTruncated", + description="More 24h points exist than the returned 2000-point limit", + ), + ] + + class MonitorSecretRequestsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) environment: EnvironmentDto @@ -11668,42 +12681,8 @@ class MonitorTestRequest(BaseModel): description="Environment to test against; null uses the monitor environment", ), ] = None - - -class MonitorVersionDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique version record identifier")] - monitor_id: Annotated[ - UUID, Field(alias="monitorId", description="Monitor this version belongs to") - ] - version: Annotated[ - int, Field(description="Monotonically increasing version number") - ] - snapshot: MonitorDto - changed_by_id: Annotated[ - int | None, - Field( - alias="changedById", - description="User ID who made the change; null for automated changes", - ), - ] = None - changed_via: Annotated[ - str, - Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), - ] - change_summary: Annotated[ - str | None, - Field( - alias="changeSummary", - description="Human-readable description of what changed", - ), - ] = None - created_at: Annotated[ - AwareDatetime, - Field( - alias="createdAt", description="Timestamp when this version was recorded" - ), - ] + code: MonitorCodeSpec | None = None + session: RunSessionContext | None = None class NetworkRowDto(BaseModel): @@ -11865,6 +12844,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,42 +13007,101 @@ class ResourceGroupMemberDto(BaseModel): ] = None -class RevisionDiffDto(BaseModel): +class RevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - left: RevisionDto - right: RevisionDto - hunks: Annotated[ - list[RevisionDiffHunkDto], - Field(description="File and field-level hunks (bounded)"), + id: Annotated[UUID, Field(description="Revision identifier")] + definition_id: Annotated[ + UUID, Field(alias="definitionId", description="Parent definition") ] - - -class RollbackPreviewDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - target: RevisionDto - current: DefinitionHeadDto | None = None - affected_monitors: Annotated[ - list[MonitorDto], - Field( - alias="affectedMonitors", - description="Monitors sharing this definition and environment", - ), + number: Annotated[ + int, Field(description="Monotonic revision number within the definition") ] - - -class RunArtifactDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: Annotated[UUID, Field(description="Unique artifact identifier")] - organization_id: Annotated[ - int, + digest: Annotated[ + str, Field( - alias="organizationId", description="Organization this artifact belongs to" + description="Closure digest from POST /bundles (sha256:)", min_length=1 ), ] - run_id: Annotated[ - UUID, Field(alias="runId", description="Run this artifact belongs to") + entrypoint: Annotated[ + str, Field(description="Entrypoint file that runs", min_length=1) ] - step_id: Annotated[ + 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): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique artifact identifier")] + organization_id: Annotated[ + int, + Field( + alias="organizationId", description="Organization this artifact belongs to" + ), + ] + run_id: Annotated[ + UUID, Field(alias="runId", description="Run this artifact belongs to") + ] + step_id: Annotated[ UUID | None, Field( alias="stepId", @@ -12168,6 +13225,197 @@ class RunExecutionDto(BaseModel): ] +class RunFacetDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + field: Annotated[str, Field(description="Filter field these values describe")] + values: Annotated[ + list[Value], Field(description="Values selected by the other filters") + ] + + +class RunHistogramBucketDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + start: Annotated[ + AwareDatetime, Field(description="Inclusive UTC start of this bucket") + ] + counts: Annotated[ + list[RunOutcomeCountDto], Field(description="Health-voting run attempt counts") + ] + + +class RunMetricsSummaryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Inclusive start of the enqueue-time window"), + ] + to: Annotated[ + AwareDatetime, Field(description="Inclusive end of the enqueue-time window") + ] + matching_run_count: Annotated[ + int, + Field( + alias="matchingRunCount", + description="Runs matching the complete list filter", + ), + ] + duration_sample_count: Annotated[ + int, + Field( + alias="durationSampleCount", + description="Finished matching runs with a measured execution duration", + ), + ] + p95_duration_ms: Annotated[ + float | None, + Field( + alias="p95DurationMs", + description="95th percentile execution duration in milliseconds; null when no durations were measured", + ), + ] = None + evidence_eligible_run_count: Annotated[ + int, + Field( + alias="evidenceEligibleRunCount", + description="Runs with a known capture policy", + ), + ] + evidence_unknown_policy_run_count: Annotated[ + int, + Field( + alias="evidenceUnknownPolicyRunCount", + description="Runs with a missing or incomplete capture policy", + ), + ] + evidence_incomplete_run_count: Annotated[ + int | None, + Field( + alias="evidenceIncompleteRunCount", + description="Eligible runs with required evidence missing, processing, failed, or expired", + ), + ] = None + evidence_processing_run_count: Annotated[ + int | None, + Field( + alias="evidenceProcessingRunCount", + description="Eligible runs with required evidence still processing", + ), + ] = None + evidence_no_evidence_policy_run_count: Annotated[ + int | None, + Field( + alias="evidenceNoEvidencePolicyRunCount", + description="Eligible runs with no evidence required by their recorded policy", + ), + ] = None + evidence_complete_run_count: Annotated[ + int | None, + Field( + alias="evidenceCompleteRunCount", + description="Eligible runs with all required evidence available", + ), + ] = None + available_artifact_count: Annotated[ + int | None, + Field( + alias="availableArtifactCount", + description="Required artifact records with an available unexpired object key", + ), + ] = None + processing_artifact_count: Annotated[ + int | None, + Field( + alias="processingArtifactCount", + description="Required artifact records still processing", + ), + ] = None + failed_artifact_count: Annotated[ + int | None, + Field( + alias="failedArtifactCount", + description="Required artifact records with a failed upload", + ), + ] = None + expired_artifact_count: Annotated[ + int | None, + Field( + alias="expiredArtifactCount", + description="Required artifact records marked expired or past their expiry", + ), + ] = None + missing_artifact_kind_count: Annotated[ + int | None, + Field( + alias="missingArtifactKindCount", + description="Required evidence kinds with no artifact record after the run finished", + ), + ] = None + intentional_no_evidence_artifact_count: Annotated[ + int | None, + Field( + alias="intentionalNoEvidenceArtifactCount", + description="Required artifact records explicitly suppressed, not reached, or not captured", + ), + ] = None + outcome_counts: Annotated[ + list[RunOutcomeCountDto] | None, + Field( + alias="outcomeCounts", + description="Health-voting run attempts by projected outcome", + ), + ] = None + excluded_run_count: Annotated[ + int | None, + Field( + alias="excludedRunCount", + description="Matching attempts that do not vote on health", + ), + ] = None + cycle_count: Annotated[ + int | None, + Field( + alias="cycleCount", + description="Distinct scheduled cycle identities in the filtered population", + ), + ] = None + failed_cycle_count: Annotated[ + int | None, + Field( + alias="failedCycleCount", + description="Recorded complete cycles with a final failed or timed-out region; display count", + ), + ] = None + display_group_count: Annotated[ + int | None, + Field( + alias="displayGroupCount", + description="Cycle and manual-trigger groups in the filtered population", + ), + ] = None + health_voting_p95_duration_ms: Annotated[ + float | None, + Field( + alias="healthVotingP95DurationMs", + description="95th-percentile duration of health-voting run attempts", + ), + ] = None + session_last_run_at: Annotated[ + AwareDatetime | None, + Field( + alias="sessionLastRunAt", + description="Latest session enqueue within retention, independent of the window", + ), + ] = None + buckets: Annotated[ + list[RunHistogramBucketDto] | None, + Field(description="UTC time buckets of health-voting run attempts"), + ] = None + facets: Annotated[ + list[RunFacetDto] | None, + Field(description="Run facets respecting the other active filters"), + ] = None + + class RunNetworkDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[ @@ -12198,13 +13446,6 @@ class SecretAuditDto(BaseModel): updated_by: Annotated[UserDto | None, Field(alias="updatedBy")] = None -class SecretUsageDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - monitors: Annotated[ - list[MonitorDto], Field(description="Monitors that reference this secret") - ] - - class ServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -12323,6 +13564,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 +13579,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 +13609,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 +13624,14 @@ class SingleValueResponseMonitorRunDurationBatchDto(BaseModel): data: MonitorRunDurationBatchDto -class SingleValueResponseMonitorSecretRequestsDto(BaseModel): +class SingleValueResponseMonitorRunSeriesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorSecretRequestsDto + data: MonitorRunSeriesDto -class SingleValueResponseMonitorVersionDto(BaseModel): +class SingleValueResponseMonitorSecretRequestsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: MonitorVersionDto + data: MonitorSecretRequestsDto class SingleValueResponseNetworkRowDto(BaseModel): @@ -12403,19 +13644,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,12 +13669,7 @@ class SingleValueResponseSecretAuditDto(BaseModel): data: SecretAuditDto -class SingleValueResponseSecretUsageDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: SecretUsageDto - - -class SingleValueResponseServiceIncidentDetailDto(BaseModel): +class SingleValueResponseServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceIncidentDetailDto @@ -12493,6 +13734,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 +13942,18 @@ class TableValueResultIntegrationDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultMonitorDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - -class TableValueResultMonitorVersionDto(BaseModel): +class TableValueResultNotificationPolicyDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[MonitorVersionDto] + data: list[NotificationPolicyDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultNotificationPolicyDto(BaseModel): +class TableValueResultRevisionDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[NotificationPolicyDto] + data: list[RevisionDto] has_next: Annotated[bool, Field(alias="hasNext")] has_prev: Annotated[bool, Field(alias="hasPrev")] total_elements: Annotated[int | None, Field(alias="totalElements")] = None @@ -12958,6 +14195,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 +14261,24 @@ class UpdateMonitorRequest(BaseModel): description="Run every location each interval; false rotates one. Null preserves current", ), ] = None - package: MonitorPackageSpec | None = None + code: MonitorCodeSpec | None = None + acknowledge_rollback: Annotated[ + str | None, + Field( + alias="acknowledgeRollback", + description="Rolled-back digest this code publish re-applies on purpose", + ), + ] = None status: Annotated[ str | None, Field(description="Not writable; use pause or resume") ] = None + expected_updated_at: Annotated[ + AwareDatetime | None, + Field( + alias="expectedUpdatedAt", + description="Last updatedAt this edit was based on; null skips the check", + ), + ] = None class UpdateNotificationPolicyRequest(BaseModel): @@ -13052,6 +14319,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 +14355,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 +14384,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 +14433,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 +14514,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 IncidentDetailDto(BaseModel): +class MonitorBatchHistoryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - incident: IncidentDto - updates: list[IncidentUpdateDto] - status_page_incidents: Annotated[ - list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + monitors: Annotated[ + list[MonitorBatchHistoryItemDto], + Field( + description="One entry per requested monitor that exists in the workspace" + ), + ] + + +class MonitorDriftDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + fields: Annotated[ + list[MonitorDriftFieldDto], + Field( + description="Fields whose live overlay differs from the declared baseline" + ), + ] + code: MonitorDriftCodeDto | None = None + settings: Annotated[ + list[MonitorDriftSettingDto] | None, + Field( + description="Settings that differ from the last values applied from Git; null without a settings baseline" + ), ] = None - trigger: IncidentTriggerDto | None = None + + +class PickerItem(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + run_id: Annotated[UUID, Field(alias="runId", description="Finished run identifier")] + revision_id: Annotated[ + UUID, Field(alias="revisionId", description="Revision that run executed") + ] + finished_at: Annotated[ + AwareDatetime, Field(alias="finishedAt", description="When that run finished") + ] + region: Annotated[str | None, Field(description="Region of this finished run")] = ( + None + ) + outcome: Annotated[ + str | None, Field(description="Outcome of this finished run") + ] = None + revision: RevisionDto | None = None class ResourceGroupDto(BaseModel): @@ -13360,6 +14713,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 +14788,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 +14802,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 +14867,14 @@ class RunDto(BaseModel): AwareDatetime | None, Field(alias="artifactsExpiredAt", description="When artifact bytes expired"), ] = None + pinned_at: Annotated[ + AwareDatetime | None, + Field(alias="pinnedAt", description="When this run was pinned past retention"), + ] = None + purged_at: Annotated[ + AwareDatetime | None, + Field(alias="purgedAt", description="When stored evidence was purged"), + ] = None capture_policy_snapshot: Annotated[ dict[str, dict[str, Any]], Field( @@ -13526,6 +14937,36 @@ class RunDto(BaseModel): alias="executionAttempts", description="Persisted worker execution attempts" ), ] + url: Annotated[str | None, Field(description="Dashboard URL for this run")] = None + trigger_id: Annotated[ + UUID | None, + Field( + alias="triggerId", + description="Groups runs started by one manual trigger; null for other runs", + ), + ] = None + session: RunSessionContext | None = None + runtime_id: Annotated[ + str | None, + Field(alias="runtimeId", description="Runtime profile that executed this run"), + ] = None + cause: Annotated[ + str | None, + Field( + description="Platform cause for an execution error, inconclusive finish, or network failure" + ), + ] = None + billable: Annotated[ + bool, + Field( + description="Whether a finished run counts against the included run pool" + ), + ] + failure: RunFailureDto | None = None + artifacts_expire_at: Annotated[ + AwareDatetime | None, + Field(alias="artifactsExpireAt", description="When artifact bytes will expire"), + ] = None class ServiceDetailDto(BaseModel): @@ -13588,14 +15029,24 @@ class SingleValueResponseCheckTraceDto(BaseModel): data: CheckTraceDto -class SingleValueResponseDefinitionDetailDto(BaseModel): +class SingleValueResponseCreateDraftRevisionResponse(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: DefinitionDetailDto + data: CreateDraftRevisionResponse -class SingleValueResponseIncidentDetailDto(BaseModel): +class SingleValueResponseDefinitionHeadDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: IncidentDetailDto + data: DefinitionHeadDto + + +class SingleValueResponseMonitorBatchHistoryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorBatchHistoryDto + + +class SingleValueResponseMonitorDriftDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDriftDto class SingleValueResponseResourceGroupDto(BaseModel): @@ -13603,6 +15054,16 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto +class SingleValueResponseRevisionDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RevisionDiffDto + + +class SingleValueResponseRunDiffDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunDiffDto + + class SingleValueResponseRunDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: RunDto @@ -13646,15 +15107,6 @@ class TableValueResultResourceGroupDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None -class TableValueResultRunDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: list[RunDto] - has_next: Annotated[bool, Field(alias="hasNext")] - has_prev: Annotated[bool, Field(alias="hasPrev")] - total_elements: Annotated[int | None, Field(alias="totalElements")] = None - total_pages: Annotated[int | None, Field(alias="totalPages")] = None - - class CheckResultDetailsDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) status_code: Annotated[ @@ -13788,3 +15240,712 @@ class CursorPageRunDto(BaseModel): alias="hasMore", description="Whether more results exist beyond this page" ), ] + + +class DefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + definition: DefinitionDto + heads: Annotated[ + list[DefinitionHeadDto], Field(description="Active Heads per environment") + ] + + +class IncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + rule_type: Annotated[ + str | None, + Field( + alias="ruleType", + description="Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", + ), + ] = None + rule_index: Annotated[ + int | None, + Field( + alias="ruleIndex", + description="0-based index into the policy trigger_rules array; null when unknown", + ), + ] = None + count: Annotated[ + int | None, + Field( + description="Observed failing_streak or failures_in_window from forensics; null when unavailable" + ), + ] = None + threshold: Annotated[ + int | None, + Field( + description="Rule required count or threshold_ms from forensics; null when unavailable" + ), + ] = None + last_error: Annotated[ + str | None, + Field( + alias="lastError", + description="failure_reason from the triggering check result; null when unavailable", + ), + ] = None + first_failed_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="firstFailedCheckAt", + description="Earliest failing check timestamp in the confirm window when computable; null otherwise", + ), + ] = None + triggering_run: Annotated[RunDto | None, Field(alias="triggeringRun")] = None + source: Annotated[ + str, + Field( + description="Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", + min_length=1, + ), + ] + + +class MonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + regional_display_health: Annotated[ + str | None, + Field( + alias="regionalDisplayHealth", + description="Target evidence from complete fresh parallel cycles; additive only. Consumers retain MonitorDto.displayHealth precedence for blocked, capped and quarantined states", + ), + ] = None + evaluation_cycle_id: Annotated[ + UUID | None, + Field( + alias="evaluationCycleId", + description="Cycle used for the regional presentation", + ), + ] = None + regions: Annotated[ + list[Region], + Field(description="Latest health-voting execution for each configured region"), + ] + last_failure: Annotated[RunDto | None, Field(alias="lastFailure")] = None + failing_cycle_count: Annotated[ + int | None, + Field( + alias="failingCycleCount", + description="Failing cycles since evaluation changed; null outside retained history", + ), + ] = None + + +class MonitorTriageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + last_check_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastCheckAt", description="When the latest completed check finished" + ), + ] = None + latest_run: Annotated[RunDto | None, Field(alias="latestRun")] = None + latest_health_run: Annotated[RunDto | None, Field(alias="latestHealthRun")] = None + incident: IncidentDto | None = None + paused_by: Annotated[UserDto | None, Field(alias="pausedBy")] = None + flakiness: Flakiness | None = None + restore_blockers: Annotated[ + list[str], + Field( + alias="restoreBlockers", + description="Reasons this trashed monitor cannot currently be restored", + ), + ] + deleted_bindings: Annotated[ + list[RestorableBinding], + Field( + alias="deletedBindings", + description="Status-page bindings retained for restoration", + ), + ] + + +class SingleValueResponseDefinitionDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: DefinitionDetailDto + + +class SingleValueResponseIncidentTriggerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentTriggerDto + + +class SingleValueResponseMonitorRegionalHealthDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorRegionalHealthDto + + +class IncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + incident: IncidentDto + updates: list[IncidentUpdateDto] + status_page_incidents: Annotated[ + list[LinkedStatusPageIncidentDto] | None, Field(alias="statusPageIncidents") + ] = None + trigger: IncidentTriggerDto | None = None + + +class MonitorDto(BaseModel): + """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" + + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique monitor identifier")] + organization_id: Annotated[ + int, + Field( + alias="organizationId", description="Organization this monitor belongs to" + ), + ] + name: Annotated[ + str, Field(description="Human-readable name for this monitor", min_length=1) + ] + type: str + config: ( + DnsMonitorConfig + | HeartbeatMonitorConfig + | HttpMonitorConfig + | IcmpMonitorConfig + | McpServerMonitorConfig + | ScriptMonitorConfig + | TcpMonitorConfig + ) + frequency_seconds: Annotated[ + int, + Field( + alias="frequencySeconds", + description="Check frequency in seconds (30–86400)", + ), + ] + enabled: Annotated[bool, Field(description="Whether the monitor is active")] + regions: Annotated[ + list[str], Field(description="Probe regions where checks are executed") + ] + managed_by: Annotated[ + str, + Field( + alias="managedBy", + description="Source that created/owns this monitor: DASHBOARD, CLI, TERRAFORM, MCP, or API", + ), + ] + owner_enforced: Annotated[ + bool, + Field( + alias="ownerEnforced", + description="Whether only the managedBy tool may change this monitor's configuration", + ), + ] + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the monitor was created"), + ] + updated_at: Annotated[ + AwareDatetime, + Field( + alias="updatedAt", description="Timestamp when the monitor was last updated" + ), + ] + assertions: Annotated[ + list[MonitorAssertionDto] | None, + Field( + description="Assertions evaluated against each check result; null on list responses" + ), + ] = None + tags: Annotated[ + list[TagDto] | None, Field(description="Tags applied to this monitor") + ] = None + ping_url: Annotated[ + str | None, + Field( + alias="pingUrl", + description="Heartbeat ping URL; populated for HEARTBEAT monitors only", + ), + ] = None + environment: Summary | None = None + auth: MonitorAuthConfig | None = None + incident_policy: Annotated[ + IncidentPolicyDto | None, Field(alias="incidentPolicy") + ] = None + alert_channel_ids: Annotated[ + list[UUID] | None, + Field( + alias="alertChannelIds", + description="Alert channel IDs linked to this monitor; populated on single-monitor responses", + ), + ] = None + bound_status_page_components: Annotated[ + list[StatusPageBoundComponentDto] | None, + Field( + alias="boundStatusPageComponents", + description="Status-page components that represent this monitor; omitted when none", + ), + ] = None + current_status: Annotated[ + str | None, + Field( + alias="currentStatus", + description="Current operational state. One of UP, DOWN, DEGRADED, PAUSED, or UNKNOWN", + ), + ] = None + display_health: Annotated[ + str | None, + Field( + alias="displayHealth", + description="List and header chip health; not currentStatus and not evaluation state", + ), + ] = None + binding_readiness: Annotated[ + str | None, + Field( + alias="bindingReadiness", + description="Secret binding state: ready, blocked, or not_applicable", + ), + ] = None + needs_attention: Annotated[ + bool | None, + Field( + alias="needsAttention", + description="True when the monitor needs operator attention", + ), + ] = None + open_incident: Annotated[ + UUID | None, + Field(alias="openIncident", description="Open confirmed incident id"), + ] = None + last_run_at: Annotated[ + AwareDatetime | None, + Field(alias="lastRunAt", description="When the latest code run was enqueued"), + ] = None + last_run_id: Annotated[ + UUID | None, Field(alias="lastRunId", description="Latest code run id") + ] = None + resumes_at: Annotated[ + AwareDatetime | None, + Field(alias="resumesAt", description="When a capped monitor resumes"), + ] = None + capped: MonitorCappedDto | None = None + missing_keys: Annotated[ + list[str] | None, + Field( + alias="missingKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + blocked_keys: Annotated[ + list[str] | None, + Field( + alias="blockedKeys", + description="Secret keys missing while the monitor is blocked", + ), + ] = None + owner: MonitorOwnerDto | None = None + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Share of recent cycles that passed only after a retry, 0–1; null when not flaky", + ), + ] = None + flaky_since: Annotated[ + AwareDatetime | None, + Field( + alias="flakySince", + description="When the first retry-passed cycle in the last 7 days finished", + ), + ] = None + flaky_severity: Annotated[ + str | None, + Field( + alias="flakySeverity", + description="How flaky the monitor is: LOW, MEDIUM, or HIGH", + ), + ] = None + last_check_outcome: Annotated[ + str | None, + Field( + alias="lastCheckOutcome", + description="Result of the most recent check in any region: PASSED, DEGRADED, or FAILED", + ), + ] = None + last_check_region: Annotated[ + str | None, + Field(alias="lastCheckRegion", description="Region of the most recent check"), + ] = None + last_failure_summary: Annotated[ + str | None, + Field( + alias="lastFailureSummary", + description="Why the latest failing region failed", + ), + ] = None + last_state_change_at: Annotated[ + AwareDatetime | None, + Field( + alias="lastStateChangeAt", + description="When the monitor last changed state: paused, evaluation change, or incident open or resolve", + ), + ] = None + region_health: Annotated[ + list[MonitorRegionHealthDto] | None, + Field( + alias="regionHealth", + description="Latest verdict per region the monitor runs from; null while paused", + ), + ] = None + definition_id: Annotated[ + UUID | None, + Field( + alias="definitionId", + description="Definition id for a browser or multi-step monitor. Null on probe monitors", + ), + ] = None + capture_policy: Annotated[CapturePolicy | None, Field(alias="capturePolicy")] = None + fast_retry_max_attempts: Annotated[ + int | None, + Field( + alias="fastRetryMaxAttempts", + description="Fast-retry max attempts; null/0 = off", + ), + ] = None + run_parallel: Annotated[ + bool | None, + Field( + alias="runParallel", + description="When multiple locations are set, run all of them each interval. False rotates one location per interval", + ), + ] = None + muted: Annotated[bool, Field(description="Whether alert delivery is muted")] + muted_until: Annotated[ + AwareDatetime | None, + Field( + alias="mutedUntil", + description="Mute expiry; null means indefinite while muted", + ), + ] = None + mute_reason: Annotated[ + str | None, Field(alias="muteReason", description="Optional mute reason") + ] = None + paused_at: Annotated[ + AwareDatetime | None, + Field(alias="pausedAt", description="When the monitor was paused"), + ] = None + pause_reason: Annotated[ + str | None, Field(alias="pauseReason", description="Optional pause reason") + ] = None + pause_expires_at: Annotated[ + AwareDatetime | None, Field(alias="pauseExpiresAt", description="Pause expiry") + ] = None + quarantine_owner_id: Annotated[ + str | None, + Field(alias="quarantineOwnerId", description="Quarantine person owner id"), + ] = None + quarantine_until: Annotated[ + AwareDatetime | None, + Field( + alias="quarantineUntil", + description="Quarantine expiry; non-null means quarantined", + ), + ] = None + quarantine_reason: Annotated[ + str | None, Field(alias="quarantineReason", description="Quarantine reason") + ] = None + usage_projection: Annotated[ + MonitorUsageProjectionDto | None, Field(alias="usageProjection") + ] = None + live_revision_id: Annotated[ + UUID | None, + Field(alias="liveRevisionId", description="Revision scheduled runs execute"), + ] = None + live_revision_digest: Annotated[ + str | None, + Field( + alias="liveRevisionDigest", + description="Closure digest of the revision scheduled runs execute", + ), + ] = None + triage: MonitorTriageDto | None = None + deleted_at: Annotated[ + AwareDatetime | None, + Field(alias="deletedAt", description="When the monitor was moved to Trash"), + ] = None + deleted_by: Annotated[UserDto | None, Field(alias="deletedBy")] = None + created_via: Annotated[ + str | None, + Field( + alias="createdVia", description="Client that originally created the monitor" + ), + ] = None + + +class MonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[UUID, Field(description="Unique version record identifier")] + monitor_id: Annotated[ + UUID, Field(alias="monitorId", description="Monitor this version belongs to") + ] + version: Annotated[ + int, Field(description="Monotonically increasing version number") + ] + snapshot: MonitorDto + changed_by_id: Annotated[ + int | None, + Field( + alias="changedById", + description="User ID who made the change; null for automated changes", + ), + ] = None + changed_via: Annotated[ + str, + Field(alias="changedVia", description="Change source (DASHBOARD, CLI, API)"), + ] + change_summary: Annotated[ + str | None, + Field( + alias="changeSummary", + description="Human-readable description of what changed", + ), + ] = None + created_at: Annotated[ + AwareDatetime, + Field( + alias="createdAt", description="Timestamp when this version was recorded" + ), + ] + + +class RollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + target: RevisionDto + current: DefinitionHeadDto | None = None + affected_monitors: Annotated[ + list[MonitorDto], + Field( + alias="affectedMonitors", + description="Monitors sharing this definition and environment", + ), + ] + + +class RunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + revision: RevisionDto + activated_at: Annotated[ + AwareDatetime, + Field( + alias="activatedAt", + description="Latest recorded activation of this revision in the monitor environment", + ), + ] + + +class RunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + UUID | None, + Field( + description="Persisted skipped row identity; absent for a plan-disabled interval" + ), + ] = None + kind: Annotated[ + str, + Field( + description="not_run for recorded ticks; plan_disabled for a current plan pause" + ), + ] + monitor: MonitorDto | None = None + reason: Annotated[ + str, Field(description="Cause: quota, blocked, spend_cap, or plan_limit") + ] + region: Annotated[ + str | None, + Field(description="Region; absent when ticks cover multiple regions"), + ] = None + from_: Annotated[ + AwareDatetime, + Field(alias="from", description="Beginning of the recorded interval"), + ] + to: Annotated[ + AwareDatetime, + Field( + description="End of the interval; current plan pauses end at the query snapshot" + ), + ] + count: Annotated[ + int | None, + Field( + description="Recorded ticks in the whole folded row; absent for a plan pause" + ), + ] = None + missing_keys: Annotated[ + list[str], + Field(alias="missingKeys", description="Secret keys recorded as missing"), + ] + environment: Annotated[ + str | None, Field(description="Environment recorded when ticks were skipped") + ] = None + + +class SecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitors: Annotated[ + list[MonitorDto], Field(description="Monitors that reference this secret") + ] + + +class SingleValueResponseIncidentDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: IncidentDetailDto + + +class SingleValueResponseMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorDto + + +class SingleValueResponseMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: MonitorVersionDto + + +class SingleValueResponseRollbackPreviewDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RollbackPreviewDto + + +class SingleValueResponseSecretUsageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: SecretUsageDto + + +class TableValueResultMonitorDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class TableValueResultMonitorVersionDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[MonitorVersionDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class CursorPageRunRevisionMarkerDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunRevisionMarkerDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class CursorPageRunSkippedEntryDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[RunSkippedEntryDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + +class Item(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + monitor: MonitorDto + bucket: Annotated[ + str, Field(description="Display bucket: failing, flaky, or healthy") + ] + worst_region: Annotated[ + str | None, + Field( + alias="worstRegion", + description="Region deciding this cycle display verdict", + ), + ] = None + streak_started_at: Annotated[ + AwareDatetime | None, + Field( + alias="streakStartedAt", + description="Earliest recorded failure after the last retained passing group", + ), + ] = None + streak_truncated: Annotated[ + bool, + Field( + alias="streakTruncated", + description="True when retention prevents proving the failure streak start", + ), + ] + flaky_rate: Annotated[ + float | None, + Field( + alias="flakyRate", + description="Current seven-day fraction of retry-saved cycles", + ), + ] = None + + +class RunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + failing_count: Annotated[ + int, + Field( + alias="failingCount", + description="Monitors whose latest window group is complete with a failed or timed-out region", + ), + ] + flaky_count: Annotated[ + int, + Field( + alias="flakyCount", + description="Passing monitors with current seven-day flakiness", + ), + ] + healthy_count: Annotated[ + int, + Field( + alias="healthyCount", + description="Monitors whose latest window group passed without current flakiness", + ), + ] + unclassified_count: Annotated[ + int, + Field( + alias="unclassifiedCount", + description="Monitors whose latest voting group is pending or has no passing/failing verdict", + ), + ] + monitors: Annotated[ + list[Item], + Field( + description="At most 100 monitor chips; counts cover the complete population" + ), + ] + + +class SingleValueResponseRunMonitorStripDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: RunMonitorStripDto